AIR724 4G模块云平台接入教程(2)- 阿里云物联网平台

阿里云物联网平台支持三种接入认证方式,分别是

  1. 自动注册: 无需提前注册设备,新设备即插即用。
  2. 一型一密: 需要提前注册设备,同一个产品使用相同认证信息。
  3. 一机一密: 需要提前注册设备,每个设备都有不用的认证信息。

设备配置和接入

下面分别介绍三种认证方式的配置,配置页面如下图在这里插入图片描述
通用属性包含:

  • 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必须和下发指令一致,平台才能识别
  • 重要,服务调用的逻辑
    1. 正常运行中,平台下发了一条调用指令透传给MCU,MCU收到数据后响应指令,回复json中需要包含下发的指令id。
    2. DTU端会自动检测收到的消息的主题,如果是服务调用会进行标记,并记录service的identifier和消息id
    3. 每当收到一条服务调用指令后,DTU会进行响应模式,此时收到MCU上发的数据后会自动发送到/{tsl.service.identifier}_reply响应主题,发送后会把服务标记置0,此时若MCU继续上传数据,会上传到属性上报主题;
    4. 即使服务标记置0后,DTU仍会保存上一次收到的服务调用主题和消息id, 若在上传服务调用响应消息,DTU会检测回复的消息id, 若id和保存的前一次服务下发id一致,依然会发布到对应的服务响应主题;
    5. 结论: 若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"}

查看响应
在这里插入图片描述

异步服务调用

  1. 针对异步服务调用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回复信息:
    {
      "id": "411202337",
      "code": 200,
      "data": {
        "b": 4
      },
      "method": "thing.service.test_reply"
    }
    
    查看luatool的DTU日志
    [2020-11-29 18:10:20.240] [I]-[-----发布的主题:] /sys/a12rinVjYRa/867435056834997/thing/service/test_reply
    查看平台反馈
    在这里插入图片描述
  2. 接下来继续上传,此时MCU上传一条属性上报消息:
    {
      "id": "12345",
      "version": "1.0",
      "params": {
        "NO": {
          "value": 10
        }
      },
      "method": "thing.event.property.post"
    }
    
    查看luatools打印日志
    [2020-11-29 18:13:09.816] [I]-[-----发布的主题:] /sys/a12rinVjYRa/867435056834997/thing/event/property/post
    可以看到此时上传的主题已经自动发生了变化,注意上面的属性消息id要变化。
  3. 接下来接续上传,此时再重复回复前一次的服务调用(因为DTU记录了上一次的服务调用消息id),MCU上传信息:
    {
      "id": "411202337",
      "code": 200,
      "data": {
        "b": 8
      },
      "method": "thing.service.test_reply"
    }
    
    回复的参数变成了8,消息id还是前一次服务调用的id。查看luatool日志:
    [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",![在这里插入图片描述](https://img-blog.csdnimg.cn/20201129182640375.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日志:
[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核心板

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值