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_reply - Alink请求数据格式:
{ "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}_reply - Alink请求数据格式:
{ "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":"411202337","params":{"a":1},"version":"1.0.0"}
查看luatool打印的DTU日志:
[2020-11-29 18:07:32.546] [I]-[订阅的消息:] /sys/a12rinVjYRa/867435056834997/thing/service/test
MCU回复信息:
查看luatool的DTU日志{ "id": "411202337", "code": 200, "data": { "b": 4 }, "method": "thing.service.test_reply" }
[2020-11-29 18:10:20.240] [I]-[-----发布的主题:] /sys/a12rinVjYRa/867435056834997/thing/service/test_reply
查看平台反馈
- 接下来继续上传,此时MCU上传一条属性上报消息:
查看luatools打印日志{ "id": "12345", "version": "1.0", "params": { "NO": { "value": 10 } }, "method": "thing.event.property.post" }
[2020-11-29 18:13:09.816] [I]-[-----发布的主题:] /sys/a12rinVjYRa/867435056834997/thing/event/property/post
可以看到此时上传的主题已经自动发生了变化,注意上面的属性消息id要变化。 - 接下来接续上传,此时再重复回复前一次的服务调用(因为DTU记录了上一次的服务调用消息id),MCU上传信息:
回复的参数变成了8,消息id还是前一次服务调用的id。查看luatool日志:{ "id": "411202337", "code": 200, "data": { "b": 8 }, "method": "thing.service.test_reply" }
[2020-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打印日志
[2020-11-29 18:23:16.516] [I]-[订阅的消息:] /sys/a12rinVjYRa/867435056834997/rrpc/request/1332993514417689600
此时需要在超时前响应数据, MCU响应:
{
"id": "1701854858",
"code": 200,
"data": {
"c": 8
},
"method": "thing.service.ttt_reply"
}
查看DTU日志:
[2020-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 then
log.error("数据流模版错误:", msg)
else
index = tonumber(index) or 1
local pub_topic = (pub[index]:sub(-1, -1) == "+" and messageId) and pub[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")
end
break
end
可以看出是根据传入的数据param内容,可以得到两个值msg, index
msg是处理后的数据类型,index可以作为topic的索引
自定义发送topic有两个步骤:
- 提前定义好多个发布topic
- 使用数据流模板,返回要发布的topic index
示例代码,通过发送数据的字段修改发送主题
-- 提前定义发布主题 /pub1;0;/pub2;0;/pub3
-- 发布数据内容{“data”:123,"tt":1},根据tt字段取出主题index
-- 数据流脚本
function
local msg= ...
local dat, res = json.decode(msg)
if res and dat and dat.tt then
return msg,dat.tt
else
return msg,nil
end
end
数据流模板,修改下发数据内容
远程脚本拦截数据,任意组包
淘宝
对我们产品感兴趣请查看淘宝,免费定制项目:
DEVELOPLINK ______ Air724核心板