说明

前面几节只是单个的设备连接阿里云物联网平台,这一节咱说一下如何让两个设备之间实现通信


再增加一个设备

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址








ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_字段_02






根据设备的信息,获取MQTT的相关参数

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_服务器_03




ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_自定义_04








​https://help.aliyun.com/document_detail/86706.html​​ 阿里云的说明文档

MQTT: IP地址

{

"ProductKey": "a1m7er1nJbQ",

"DeviceName": "APPMqtt",

"DeviceSecret": "3PvJBYsbcCJmH12q18AMnAWU6mdW5oWI"

}


ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_服务器_05



${YourProductKey}.iot-as-mqtt.${region}.aliyuncs.com


最终IP地址:

a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com


MQTT: 端口号 1883


ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_自定义_06



MQTT: Client ID

{

"ProductKey": "a1m7er1nJbQ",

"DeviceName": "APPMqtt",

"DeviceSecret": "3PvJBYsbcCJmH12q18AMnAWU6mdW5oWI"

}

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_自定义_07



1.我就规定我的clientId是 1234567890

2.咱呢先不走SSL,否则芯片还需要设置成SSL连接 所以 securemode=3

3.最后一个呢,咱就选用 hmacsha1


最终Client ID:

1234567890|securemode=3,signmethod=hmacsha1|


MQTT: 用户名


{

"ProductKey": "a1m7er1nJbQ",

"DeviceName": "APPMqtt",

"DeviceSecret": "3PvJBYsbcCJmH12q18AMnAWU6mdW5oWI"

}


ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_服务器_08




最终用户名:

APPMqtt&a1m7er1nJbQ



MQTT: 密码


{

"ProductKey": "a1m7er1nJbQ",

"DeviceName": "APPMqtt",

"DeviceSecret": "3PvJBYsbcCJmH12q18AMnAWU6mdW5oWI"

}

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_自定义_09




用提供的软件组合计算

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_数据_10



ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_11



ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_12

所以MQTT连接的密码

671A24242E2882751F684D83B04BB9BBAAFB9162



最终:

IP地址: a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com

端口号: 1883

Client ID: 1234567890|securemode=3,signmethod=hmacsha1|

用户名: APPMqtt&a1m7er1nJbQ

密码: 671A24242E2882751F684D83B04BB9BBAAFB9162


然后测试

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_13





ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_14





现在让两个设备实现通信


我现在要做的是

监控这台设备发布的消息


ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_15








我让服务器监控名字为Mqtt这台设备的这个主题:

/a1m7er1nJbQ/Mqtt/user/update


然后把里面的消息提取出来,发给另一个设备




ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_16




ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_17




ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_数据_18





首先选择编写 SQL

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_数据_19











ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_服务器_20




这是我上面的配置,现在解释一下

首先说整体是什么意思:

监控产品TestMqtt中名字为Mqtt这台设备的发布的主题

/a1m7er1nJbQ/Mqtt/user/update

然后把里面发布的消息全部提取出来.


① *代表提取所有消息

② 选择自定义的主题

③ 选择TestMqtt产品中设备

④ 选择名字为Mqtt的这台设备

⑤ 选择这台设备发布的主题(/a1m7er1nJbQ/Mqtt/user/update)

大白话:

监控名字为Mqtt的设备发布的主题 /a1m7er1nJbQ/Mqtt/user/update

假设设备发布的消息是:{"test":"1111"}

执行上面的配置就把这个{"test":"1111"}提取了出来



现在提取出来了,咱需要让服务器再转发到另一个设备

我呢让服务器转发给下面这个设备

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_字段_21



APPMqtt这个设备呢可以订阅这个主题: /a1m7er1nJbQ/APPMqtt/user/get

我现在想把上面说的{"test":"1111"}这个消息转发给主题 /a1m7er1nJbQ/APPMqtt/user/get


ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_字段_22



在转发数据那里添加个操作

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_服务器_23






ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_字段_24





整体说下:

就是把上面配置SQL以后提取的数据{"test":"1111"}

转发到 /a1m7er1nJbQ/APPMqtt/user/get 这个主题上


① 把上面SQL语句提取的数据转发到另一个主题上

② 选择自定义

③ 选择自己创建的一个产品

④ 选择名字为APPMqtt的这台设备

⑤ 选择要转发到这台设备订阅的某个主题


然后启动规则

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_自定义_25







测试

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_数据_26



让名字为APPMqtt的这台设备的数据发送名字为Mqtt的设备

上面已经实现了名字为Mqtt的设备如果发布的主题是

/a1m7er1nJbQ/Mqtt/user/update

服务器就会把里面的消息提取出来,然后转发给

APPMqtt这个设备订阅的主题 /a1m7er1nJbQ/APPMqtt/user/get 上

名字为APPMqtt这个设备就收到了名字为Mqtt这台设备的消息


现在让名字为APPMqtt的这台设备的数据发送名字为Mqtt的设备

再创建个规则

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_数据_27




ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_数据_28






编写SQL

现在是监控APPMqtt这台设备的主题 /a1m7er1nJbQ/APPMqtt/user/update

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_数据_29






把数据转发给名字为Mqtt的设备

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_自定义_30





启动

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_数据_31




测试

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_32





测试APP和网络模块(Wi-Fi)通过阿里云物联网平台实现通信控制

1.打开单片机程序

连接的信息修改为其中一台设备的

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_自定义_33





提醒:按照上面配置的转发规则需要把发布的主题设置为:/a1m7er1nJbQ/Mqtt/user/update

用户填写上上面的MQTT三元组信息以后,程序默认组合,用户不需要修改

我这里只是提醒用户!

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_服务器_34




提醒:按照上面配置的转发规则需要把订阅的主题设置为:/a1m7er1nJbQ/Mqtt/user/get

用户填写上上面的MQTT三元组信息以后,程序默认组合,用户不需要修改

我这里只是提醒用户!

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_字段_35





2.打开此节的APP,设置连接信息为另一台设备的

修改成另一台设备的

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_字段_36






编译安装到手机,点击测试阿里云平台

注:我默认增加的

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_服务器_37







测试

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_数据_38


页面显示当前温湿度数据,显示当前设备的状态

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_39




远程控制继电器吸合

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_字段_40ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_41







远程控制继电器断开

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_服务器_42ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_43







请自行控制家电(最大支持10A,注意安全!)

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_自定义_44





提醒:

提醒:

提醒:


按照上面的方式其实就是阿里云平台两个MQTT设备连接上阿里云

然后各自订阅和发布各自的主题

然后发送信息的时候通过规则引擎把消息转给了另一个设备而已!


注:两个设备都固定死了,以上方式是鸡肋,玩玩还可以!

想知道更好的方式大家接着跟着我学,听我慢慢道来!





如何把一台设备物理模型上报的数据转发给另一台设备

大家是否还记得咱的设备上报这些

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_自定义_45




上报这些用的是: /sys/a1m7er1nJbQ/Mqtt/thing/event/property/post

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_服务器_46




消息格式是

{"method":"thing.event.property.post","id":"1111","params":{"temp":26,"humi":50},"version":"1.0.0"}



再添加一个规则

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_字段_47






让后台监控Mqtt这台设备的 /sys/a1m7er1nJbQ/Mqtt/thing/event/property/post 这个主题

然后提取里面的所有数据

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_48





把数据转发给APPMqtt这台设备

转发的主题:/a1m7er1nJbQ/APPMqtt/user/get

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_数据_49





启动

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_服务器_50

测试


ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_51



不过大家会发现,我发送的数据和接收的数据不一样

这是因为阿里云内部先对数据做了处理,然后再传递给云平台提取展示/转发给咱

发送的数据


{"method":"thing.event.property.post","id":"1111","params":{"temp":26,"humi":50},"version":"1.0.0"}



接收的数据


{"deviceType":"Lighting","iotId":"GaB2xAbUo7i36ag59HnN000100","requestId":"1111","productKey":"a1m7er1nJbQ","gmtCreate":1587260050305,"deviceName":"Mqtt","items":{"temp":{"time":1587260050309,"value":26},"humi":{"time":1587260050309,"value":50}}}




有人会问,数据这么多,我只想要温湿度数据怎么办

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_52





咱一步一步说

现在呢咱先看看怎么提取 items里面的内容

"items":{"temp":{"time":1587260050309,"value":26},"humi":{"time":1587260050309,"value":50}}


修改SQL下面的字段为 items

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_53




按照上面的修改以后,服务器就是从 JSON数据中提取字段为 items的内容,然后转发


测试

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_服务器_54





咱呢再进一步 提取 temp这个字段 和 humi这个字段

items.temp,items.humi

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_55




items.temp 中间是个点

然后是, 逗号分开

然后是

items.humi



测试

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_mac地址_56




如果大家还想往里面提取就是 items.temp.value

具体可以参考

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_数据_57






再说一个事情(十分重要!)

上面的设置只是小小不然的东西

大家看看别人做的教程也就做到上面那种样子,其实没有多大应用价值!


咱如果是把设备进行出售,然后用户用APP和购买的设备绑定

如果做到动态绑定呢???

接着看:



首先大家注意一下,同一个产品下阿里提供的订阅的发布的主题


发布: /a1m7er1nJbQ/XXXXXX/user/update


订阅: /a1m7er1nJbQ/XXXXXX/user/get

前后是不变的,变的是中间那个 DeviceName

咱添加设备的时候自己自定义的




设置规则引擎 SQL语句为

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_数据_58









按照上面的设置以后

服务器会提取发布的主题为 : /a1m7er1nJbQ/+/user/update (+代表任意)

的消息


就是说 /a1m7er1nJbQ/XXXXXX/user/update (XXXXXX无论是什么都可以)

都会去提取里面的数据



转发数据这样写

ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_自定义_59




${TargetDevice}





解释一下







假设有个这样的数据

{"TargetDevice":"Mqtt","ttt":123}

那么按照上面的配置以后其实是这个样子


提取发布的主题: /a1m7er1nJbQ/+/user/update 里面的整个消息

{"TargetDevice":"Mqtt","ttt":123}


然后把里面的字段为TargetDevice的字段值 Mqtt 提取出来

/a1m7er1nJbQ/${TargetDevice}/user/get

替换掉上面的 ${TargetDevice}

所以最终消息会被转发到

主题:/a1m7er1nJbQ/Mqtt/user/get



再更近一步,

我设备如何返回给APP呢??这样两者就实现双向通信了


APP发布的消息携带上自己的 DeviceName


其实最终APP发送的消息就变为了

{"TargetDevice":"Mqtt","DeviceName","APPMqtt","ttt":123}



设备端接收到消息以后,提取字段DeviceName里面的APPMqtt

然后发送的消息为

{"TargetDevice":"APPMqtt","aaaa":666666}


这条消息发出去以后

经过规则引擎




提取发布的主题: /a1m7er1nJbQ/+/user/update 里面的整个消息


{"TargetDevice":"APPMqtt","aaaa":666666}




然后把里面的字段为TargetDevice的字段值 APPMqtt 提取出来


/a1m7er1nJbQ/${TargetDevice}/user/get


替换掉上面的 ${TargetDevice}


所以最终消息会被转发到


主题:/a1m7er1nJbQ/APPMqtt/user/get


也就发给了APP





好了.大家现在可以把以前所有的规则都删除掉

只保留上面刚刚说的就可以


ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_数据_60











测试



ESA2GJK1DH1K基础篇: 阿里云物联网平台: 阿里云物联网平台加入规则引擎(云产品流转),让两个MQTT设备之间实现通信_数据_61









结语

现在用户看上去上面还是两个设备通信而已

我现在想做的是,可以动态的增加设备,动态的绑定!

就和自建服务器那样!

下几节就可以实现了!


下几节咱将使用阿里云的https API接口动态增加设备

先提示一下

发布: /a1m7er1nJbQ/XXXXXX/user/update

订阅: /a1m7er1nJbQ/XXXXXX/user/get

中间的XXXXXX咱使用API添加的时候可以自定义


咱可以用单片机控制Wi-Fi模块使用https 的 API接口注册设备

然后把注册设备的名字设置为它的MAC地址

这样这个设备发布的主题就是:/a1m7er1nJbQ/Wi-Fi模块的MAC地址/user/update

订阅的主题就是 : /a1m7er1nJbQ/Wi-Fi模块的MAC地址/user/get


然后咱APP启动的时候也是使用https 的 API接口注册设备

然后把注册设备的名字设置为它的手机的唯一码


这样这个设备发布的主题就是:/a1m7er1nJbQ/手机的唯一码/user/update


订阅的主题就是 : /a1m7er1nJbQ/手机的唯一码/user/get


手机APP用SmartConfig或者Airkiss或者APUConfig配网绑定WI-Fi模块

这样手机就获取到了WI-Fi模块的MAC地址



手机APP发送信息的时候,发送的消息是

{"TargetDevice":"Wi-Fi模块的MAC地址","APPName","手机的唯一码","info":"666666"}


这样的话配合上面的规则引擎,消息就会发给绑定的Wi-Fi设备

Wi-Fi设备收到信息以后

解析下APPName

然后回复的消息是

{"TargetDevice":"手机的唯一码","DeviceName","Wi-Fi模块的MAC地址","info":"8888888"}


这样的话消息就会发给APP

APP也能通过

"DeviceName","Wi-Fi模块的MAC地址"

知道是哪个设备过来的消息