说明这节说明一下如何让设备之间实现通信
再增加一个设备
用户根据前面说的手动计算下密码
我这台设备 最终: IP地址: a1m7er1nJbQ.iot-as-mqtt.cn-shanghai.aliyuncs.com 端口号: 1883 Client ID: 1234567890|securemode=3,signmethod=hmacsha1| 用户名: APPMqtt&a1m7er1nJbQ 密码: 671A24242E2882751F684D83B04BB9BBAAFB9162
然后测试
现在让两个设备实现通信1.我现在要做的是让Mqtt这台设备发送的消息 转发到APPMqtt上
2.规则引擎 ,云产品流转
3.选择编写 SQL
这是我上面的配置,现在解释一下 首先说整体是什么意思: 监控产品TestMqtt中名字为Mqtt这台设备的发布的主题 /a1m7er1nJbQ/Mqtt/user/update 然后把里面发布的消息全部提取出来. ① *代表提取所有消息 ② 选择自定义的主题 ③ 选择TestMqtt产品中设备 ④ 选择名字为Mqtt的这台设备 ⑤ 选择这台设备发布的主题(/a1m7er1nJbQ/Mqtt/user/update) 大白话: 监控名字为Mqtt的设备发布的主题 /a1m7er1nJbQ/Mqtt/user/update 假设设备发布的消息是:{"test":"1111"} 执行上面的配置就把这个{"test":"1111"}提取了出来 现在提取出来了,咱需要让服务器再转发到另一个设备 我想让服务器转发给下面这个设备
APPMqtt设备其中一个订阅的主题: /a1m7er1nJbQ/APPMqtt/user/get 我现在想把上面说的{"test":"1111"}这个消息转发给主题 /a1m7er1nJbQ/APPMqtt/user/get 4.在转发数据那里添加个操作
整体说下: 就是把上面配置SQL以后提取的数据{"test":"1111"} 转发到 /a1m7er1nJbQ/APPMqtt/user/get 这个主题上 ① 把上面SQL语句提取的数据转发到另一个主题上 ② 选择自定义 ③ 选择自己创建的一个产品 ④ 选择名字为APPMqtt的这台设备 ⑤ 选择要转发到这台设备订阅的某个主题 5.启动规则
6.测试
同理让APPMqtt的消息转发给Mqtt1.上面已经实现了名字为Mqtt的设备如果发布的主题是 /a1m7er1nJbQ/Mqtt/user/update 服务器就会把里面的消息提取出来,然后转发给 APPMqtt这个设备订阅的主题 /a1m7er1nJbQ/APPMqtt/user/get 上 名字为APPMqtt这个设备就收到了名字为Mqtt这台设备的消息 现在让名字为APPMqtt的这台设备的数据发送名字为Mqtt的设备 再创建个规则
2.编写SQL语句 现在是监控APPMqtt这台设备的主题 /a1m7er1nJbQ/APPMqtt/user/update
3.把数据转发给名字为Mqtt的设备
4.启动
5.测试
如何把一台设备的上报的物理模型数据传递给另一个设备1.上报这些用的是: /sys/a1m7er1nJbQ/Mqtt/thing/event/property/post 消息格式是 {"method":"thing.event.property.post","id":"1111","params":{"temp":26,"humi":50},"version":"1.0.0"}
2.再添加一个规则
3.让后台监控Mqtt这台设备的 /sys/a1m7er1nJbQ/Mqtt/thing/event/property/post 这个主题 然后提取里面的所有数据
4.把数据转发给APPMqtt这台设备 转发的主题:/a1m7er1nJbQ/APPMqtt/user/get
5.启动 6.测试
7.不过大家会发现,我发送的数据和接收的数据不一样 这是因为阿里云内部先对数据做了处理,然后再传递给云平台提取展示/转发给咱 发送的数据 {"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}}}
8.有人会问,数据这么多,我只想要温湿度数据怎么办 咱一步一步说 现在呢咱先看看怎么提取 items里面的内容 "items":{"temp":{"time":1587260050309,"value":26},"humi":{"time":1587260050309,"value":50}} 修改SQL下面的字段为 items
9.按照上面的修改以后,服务器就是从 JSON数据中提取字段为 items的内容,然后转发
10.咱呢再进一步 提取 temp这个字段 和 humi这个字段 items.temp,items.humi
items.temp 中间是个点 然后是, 逗号分开 然后是 items.humi 11.测试
12.如果大家还想往里面提取就是 items.temp.value 具体可以参考
重要的地方1.首先大家注意一下,同一个产品下阿里提供的订阅的发布的主题 发布: /a1m7er1nJbQ/XXXXXX/user/update 订阅: /a1m7er1nJbQ/XXXXXX/user/get 前后是不变的,变的是中间那个 DeviceName 2.设置规则引擎 SQL语句为
按照上面的设置以后 服务器会提取发布的主题为 : /a1m7er1nJbQ/+/user/update (+代表任意) 的消息 就是说 /a1m7er1nJbQ/XXXXXX/user/update (XXXXXX无论是什么都可以) 都会去提取里面的数据 3.转发数据这样写
${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 好了.大家现在可以把以前所有的规则都删除掉 只保留上面刚刚说的就可以 4.测试
|