AIR724 4G模块云平台接入教程(2)- 阿里云物联网平台 Aliyun IOT
设备配置和接入自动注册一型一密一机一密 消息通信通信主题通信流程 使用实战属性上报异步服务调用同步服务调用 高级使用方法数据流模板,自定义发布主题数据流模板,修改下发数据内容远程脚本拦截数据,任意组包淘宝阿里云物联网平台支持三种接入认证方式,分别是
自动注册: 无需提前注册设备,新设备即插即用。一型一密: 需要提前注册设备,同一个产品使用相同认证信息。一机一密: 需要提前注册设备,每个设备都有不用的认证信息。
设备配置和接入
下面分别介绍三种认证方式的配置,配置页面如下图
通用属性包含:
MQTT 回话标志位(reatin):消息QOSL绑定的串口通道订阅主题
默认配置:
/sys/${productid}/${deviceName}/thing/event/property/post_reply;0; /sys/${productid}/${deviceName}/thing/service/property/set;0;
发布主题:
默认配置:
/sys/${productid}/${deviceName}/thing/event/property/post
自动注册
注意事项:需要在产品详情里面打开动态注册自动注册需要填写三个参数
ProductKey: 产品ID
来源:阿里云物联网后台,产品信息
AccessKey ID
Access Key Secret
AccessKey 来源:
点击阿里云后台右上角用户图标,选择用户AccessKey 管理;如果提示是否使用子账户AccessKey 请选择是,使用子账户AccessKey 可以隔离账户权限,更加安全;进入子账户管理后选择创建用户,点击对应用户选择添加权限,如图所示,为新建用户添加物联网平台管理权限,更多复杂策略参考阿里云子账户配置。
分配好权限后点击该用户详情,选择新建AccessKey 即可。
一型一密
注意事项:需要提前注册设备,设备名称必须为设备IMEI号码一型一密方式适合对一种产品的全部设备进行配置,需要配置的参数有:
ProductKey: 产品ID,阿里云后台产品详情点击查看获取ProductSecret: 产品密钥,阿里云后台产品详情点击查看获取
一机一密
注意事项:需要提前注册设备,设备名称必须为设备IMEI号码一机一密需要给每个设备单独配置密钥,需要配置的参数有
ProductKey: 产品密钥DeviceSecret: 设备密钥DeviceName: 设备名称(必须是设备IMEI码)
获取方式为点击阿里云物联网后台对应设备详情,点击查看获取
消息通信
通信主题
主题的配置格式为{topic};qos
每条订阅包含topic名称和qos,用分号隔离;多条主题之前也用分号隔离;最后一条主题可以不需要写qos,则默认是0。主题最后不要加多余的分号如下:
/sys/${productid}/${deviceName}/thing/event/property/post_reply;0 /sys/${productid}/${deviceName}/thing/service/property/set
主题里面的 ${productid} 和 ${deviceName} 会自动替换成设备对应配置的产品ID和设备IMEI码
阿里云物联网物模型支持的主题:
DTU默认配置订阅主题为:
/sys/${productid}/${deviceName}/thing/event/property/post_reply;0;/sys/${productid}/${deviceName}/thing/service/property/set;0
登录上阿里云后平台会自动订阅所有service的主题这里订阅了属性设置主题和属性上报响应主题,可以替换成自己的主题;默认没有订阅服务主题,使用服务需要订阅对应主题,注意不能使用通配符订阅service主题
原因:如果订阅了
/sys/a12rinVjYRa/${deviceName}/thing/service/#
当你响应服务的时候,发布的主题为
/sys/a12rinVjYRa/${deviceName}/thing/service/${tsl.service.identifier}_reply
这样会出现你发出去的数据又发给设备,如果你觉得没问题,那可以忽略,继续使用。正常的服务主题订阅, 可以多条订阅:
/sys/${productid}/${deviceName}/thing/event/property/post_reply;0; /sys/${productid}/${deviceName}/thing/service/property/set;0; /sys/${productid}/${deviceName}/thing/service/test1;0; /sys/${productid}/${deviceName}/thing/service/test2;0
另外,阿里云物联网的同步服务调用RRPC支持会默认订阅
/sys/${YourProductKey}/${YourDeviceName}/rrpc/request/+
关于RRPC信息请参考:阿里云
DTU默认发布主题为属性上报:
/sys/${productid}/${deviceName}/thing/event/property/post
通信流程
属性上报
DTU默认订阅了属性上报主题;MCU通过串口上传Alink Json格式数据:上行(Alink JSON):
请求Topic: /sys/{productKey}/{deviceName}/thing/event/property/post
响应Topic: /sys/{productKey}/{deviceName}/thing/event/property/post_replyAlink请求数据格式:
{"id": "123","version": "1.0","params": {"Power": {"value": "on","time": 1524448722000},"WF": {"value": 23.6,"time": 1524448722000}},"method": "thing.event.property.post"}
属性设置
下行(Alink JSON):
请求Topic:/sys/{productKey}/{deviceName}/thing/service/property/set
响应Topic:/sys/{productKey}/{deviceName}/thing/service/property/set_reply (无需回复,没有内置此发布主题)Alink请求数据格式:
{"id": "123","version": "1.0","params": {"temperature": "30.5"},"method": "thing.service.property.set"}
设备服务调用(异步调用)
下行(Alink JSON):
请求Topic:/sys/{productKey}/{deviceName}/thing/service/{tsl.service.identifier}
响应Topic:/sys/{productKey}/{deviceName}/thing/service/{tsl.service.identifier}_replyAlink请求数据格式:
{"id": "123","version": "1.0","params": {"Power": "on","WF": "2"},"method": "thing.service.{tsl.service.identifier}"}
注意:响应数据的id
必须和下发指令一致,平台才能识别重要,服务调用的逻辑: 正常运行中,平台下发了一条调用指令透传给MCU,MCU收到数据后响应指令,回复json中需要包含下发的指令id。DTU端会自动检测收到的消息的主题,如果是服务调用会进行标记,并记录service的identifier
和消息id
;每当收到一条服务调用指令后,DTU会进行响应模式,此时收到MCU上发的数据后会自动发送到/{tsl.service.identifier}_reply
响应主题,发送后会把服务标记置0,此时若MCU继续上传数据,会上传到属性上报主题;即使服务标记置0后,DTU仍会保存上一次收到的服务调用主题和消息id, 若在上传服务调用响应消息,DTU会检测回复的消息id, 若id和保存的前一次服务下发id一致,依然会发布到对应的服务响应主题;结论: 若MCU上传服务调用响应,id必须和下发的一致;若MCU上传属性上报,消息id必须独特不能和之前任何消息重复。 如何发布消息到任意注意,参考后文使用实战。
设备服务调用(同步调用)
RRPC通信相关Topic格式如下:
RRPC请求消息Topic:/sys/${YourProductKey}/${YourDeviceName}/rrpc/request/${messageId}
RRPC响应消息Topic:/sys/${YourProductKey}/${YourDeviceName}/rrpc/response/${messageId}
RRPC订阅Topic:sys/${YourProductKey}/${YourDeviceName}/rrpc/request/+
该主题是默认订阅的同步调用平台响应时间为8秒,超过8s未返回平台会认为调用失败此调用使用方式和异步完全一致,除了有响应时间限制。
使用实战
首先在阿里云物联网平台新建了以下产品
主题订阅配置:
/sys/${productid}/${deviceName}/thing/event/property/post_reply;0;/sys/${productid}/${deviceName}/thing/service/property/set;0;/sys/${productid}/${deviceName}/thing/service/test;0
主题发布配置:
/sys/${productid}/${deviceName}/thing/event/property/post
属性上报
针对继电器触点属性NO进行调试,MCU上传数据, id建议使用时间戳或者随机数:
{"id": "123","version": "1.0","params": {"NO": {"value": 1,"time": 1524448722000}},"method": "thing.event.property.post"}
收到服务器响应:
{"code":200,"data":{},"id":"123","message":"success","method":"thing.event.property.post","version":"1.0"}
查看响应
异步服务调用
针对异步服务调用test
进行调试,打开平台设备在线调试:下发参数为:{"a":1}
,点击下发,查看MCU从串口1收到的消息
{"method":"thing.service.test","id":"41137","params":{"a":1},"version":"1.0.0"}
查看luatool打印的DTU日志:
[-11-29 18:07:32.546] [I]-[订阅的消息:] /sys/a12rinVjYRa/867435056834997/thing/service/test
MCU回复信息:
{"id": "41137","code": 200,"data": {"b": 4},"method": "thing.service.test_reply"}
查看luatool的DTU日志
[-11-29 18:10:20.240] [I]-[-----发布的主题:] /sys/a12rinVjYRa/867435056834997/thing/service/test_reply
查看平台反馈
接下来继续上传,此时MCU上传一条属性上报消息:
{"id": "12345","version": "1.0","params": {"NO": {"value": 10}},"method": "thing.event.property.post"}
查看luatools打印日志
[-11-29 18:13:09.816] [I]-[-----发布的主题:] /sys/a12rinVjYRa/867435056834997/thing/event/property/post
可以看到此时上传的主题已经自动发生了变化,注意上面的属性消息id要变化。接下来接续上传,此时再重复回复前一次的服务调用(因为DTU记录了上一次的服务调用消息id),MCU上传信息:
{"id": "41137","code": 200,"data": {"b": 8},"method": "thing.service.test_reply"}
回复的参数变成了8,消息id还是前一次服务调用的id。查看luatool日志:
[-11-29 18:18:12.469] [I]-[-----发布的主题:] /sys/a12rinVjYRa/867435056834997/thing/service/test_reply
查看平台反馈,可以看到前一次的调用结果已经被覆盖了。
同步服务调用
同步服务调用和异步使用完全一致,只是有了8S的响应时间限制。
点击下发同步服务指令
MCU收到信息:
{"method":"thing.service.ttt","id":"1701854858","params":{},"version":"1.0.0"}
查看luatools打印日志
[-11-29 18:23:16.516] [I]-[订阅的消息:] /sys/a12rinVjYRa/867435056834997/rrpc/request/1332993514417689600
此时需要在超时前响应数据, MCU响应:
{"id": "1701854858",![在这里插入图片描述](https://img-/2029182640375.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ExMTM3NDc1NTUw,size_16,color_FFFFFF,t_70#pic_center)"code": 200,"data": {"c": 8},"method": "thing.service.ttt_reply"}
查看DTU日志:
[-11-29 18:23:19.667] [I]-[-----发布的主题:] /sys/a12rinVjYRa/867435056834997/rrpc/response/1332993514417689600
查看平台响应
高级使用方法
数据流模板,自定义发布主题
-- 数据流模板的代码片段local res, msg, index = pcall(upprotFnc, param)if not res or not msg thenlog.error("数据流模版错误:", msg)elseindex = tonumber(index) or 1local pub_topic = (pub[index]:sub(-1, -1) == "+" and messageId) andpub[index]:sub(1, -2) .. messageId or pub[index]log.info("-----发布的主题:", pub_topic)if not mqttc:publish(pub_topic, res and msg or param, tonumber(pub[index + 1]) or qos, retain) then if passon then sys.publish("UART_SENT_RDY_" .. uid, uid, "SEND_ERROR\r\n") endbreak end
可以看出是根据传入的数据param内容,可以得到两个值msg, index
msg是处理后的数据类型,index可以作为topic的索引
自定义发送topic有两个步骤:
提前定义好多个发布topic使用数据流模板,返回要发布的topic index
示例代码,通过发送数据的字段修改发送主题
-- 提前定义发布主题 /pub1;0;/pub2;0;/pub3-- 发布数据内容{“data”:123,"tt":1},根据tt字段取出主题index-- 数据流脚本functionlocal msg= ...local dat, res = json.decode(msg)if res and dat and dat.tt thenreturn msg,dat.ttelsereturn msg,nilendend
数据流模板,修改下发数据内容
远程脚本拦截数据,任意组包
淘宝
对我们产品感兴趣请查看淘宝,免费定制项目:
DEVELOPLINK ______ Air724核心板