开发者学堂课程【阿里云 AIoT 物联网开发实战:AloT 物联网开发实战02】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/328/detail/3695
AloT 物联网开发实战02 (二)
2、实战
(1)协议
平台支持的协议,包含 MQTT、CoAP、HTTPS,以及在 web 和 APP上可以运行的MQTT over WebSocket 模式,还有 LoRa 的设备记录。
(2)MQTT 在物联网的应用
MQTT 协议在物联网平台上的应用。以电表为例,电表如果发送充电器协议有两个重要的点,一个叫 topic,一个配套的 topic 是一个消息主题或者一个消息类型搭配的是具体数据。或者可以认为是一个邮件的主题,配套的是邮件内容,当发邮件的时候,比如是周报的主题还是会议纪要,主题客户拜访的一个邮件,对应的内容格式是不一样的,一个主题会有自己固定的消息格式,MQTT 的报文发送到云端之后,如果没有人订阅消息就直接在云端消费掉,正常情况业务服务器会订阅固定的一些 topic,比如当前业务服务器比较关心 topic A类型的消息,一旦有这样的消息产生,物联网平台会把 payload 的消息发给订阅的服务器。同样物联网平台还会有其他设备来接入,其他的设备也可以订阅指定的 topic,比如电表发动的 topic c 风机来订阅, topic c 就可以直接流转到风机,设备不需要经过业务系统来处理。这是 M to M 的一个过程。阿里云在里面做了 topic 的约定,需要通过规则引擎模块做消息的流转过程。,在设备端上是可以通过topic A 来认证 loT server 的合法性,阿里云平台是通过三元组来认证设备的合法性,阿里云平台和服务器的交互通过 AK 认证的。
clientld
id+"securemode=3signmethod=hmacsha1timestamp="+timestamp+"l'
id:表示客户端ID,64字符内。其中II内为扩展参数 securemode:安全模式;2为TLS加密,3为非加密 signmethod:签名算法类型。 timestamp:当前时间毫秒值。
username
deviceName+"&"+productKey
password
sign_hmac(deviceSecretcontent)
sign_hmac 为 clientld 中的 signmethod 算法类型 content 为如下拼接字符串:"clientld${id}deviceName${deviceName}productKey${productKey}timestamp${timestamp}'
基于 MQTT 的通讯,第一个很关键的是 connect。在场景下设备是作为 MQTT 的 client,阿里云的物联网平台是作为 MQTT 的 Broker。Connect 的过程中会有 client ID、username 和 password 三个数值,文档也详细地给出 client ID 的一个生成规则,首先会有一个 ID,ID 是客户端自己来标识的,不需要和云端做约定,有了这样一个 ID 再加上鲜明的规范来生成 APP 的 ID,包含了安全模式,是否用 TLS 加密,签名算法是哪一个以及当前的时间戳能保证 Client ID 可以随着时间发生变化。Username 是通过 devicename 加 productkey 生成的。password 是由前面提到的 ID 加上 devicename、productkey、timestamp 拼接起来,按前边 Client ID里的签名算法做一个签名,签名直接用 devicesecert ,通过这样的规则可以生成 devicename、productkey、timestamp 把身份传递给云平台而不是三元组本身。云平台校验通过之后会返回 connect 的 ACK code 是0,如果是其他的比如是四,代表签名运算的逻辑有一些问题需要排查。当使用阿里云 LTSDK 整个过程不需要关心,SDK 已经实现,只需要把三元组丢给 SDK,SDK 会运算出来三个参数。
名字 值 报文流动方向 描述
CONNECT 1 Client-> Broker device 连接 loT 平台
CONNACK 2 Broker-> Client loT 平台确认连接结果
PUBLISH 3 双向 发布消息
PUBACK 4 双向 QoS=1消息发布收到确认
SUBSCRIBE 8 Client-> Broker device 订阅 loT 平台 Topic
SUBACK 9 Broker -> Client loT 平台确认订阅结果
UNSUBSCRIBE 10 Client-> Broker device取消订阅 loT 平台Topic
UNSUBACK 11 Broker -> Client loT 平台确认取消订阅结果
PINGREQ 12 Client-> Broker device 发送心跳请求到 loT 平台
PINGRESP 13 Broker -> Client loT 平台响应 device 心跳
DISCONNECT 14 Client-> Broker device 断开 loT 平台连接
包含连接的请求 connect 和connack,还有数据上报 publish puback,还有订阅消息的 subscribe ,suback 以及取消订阅的 unsubscribe,unsuback ,用于心跳的 pingreq、pingresp 以及主动断开连接的 disconnect。
Topic 可以里面查到,在产品的 topic 类型下面可以看到基础的通讯 topic、模型通讯topic,还可以自定义 topic 用来通讯。
(3)物模型(sys 开头系统 Topic)
物模型属性上报 Topic
/sys/(productKey}/{deviceName}/thing/event/property/post
物模型属性上报 payload 格式
{
"id": 3536123,
"version": "1.0",
"params":{
"temperature": 23.7,
"humidity": 68
},
"method": "thing.event property.post"
}
loT 云端响应 replyTopic
/sys/{productKey}/{deviceName/thing/event/property/post_reply
云端响应 payload 格式
{
"id": 3536123,
"code": 200,"
data":{}
}
当使用某一个具体的 topic,都会对应一个固定配套的格式。当使用系统开头的 topic,都会有一个固定的配套格式,需要通过文档来了解,如果使用自定义的 topic,可以完全按照自己的规则来定义配套的,不需要参考阿里云的规则,如果用系统的 topic,比如物联通讯一定要保证数据格式是一致的。当使用阿里云 SDK 的时候,整个数据格式的包装是不需要关心的,SDK 已经做了这一部分工作,这里是模型的一个属性,上报之后云端同样会响应一个给到设备端,告知设备端是否业务处理了。
(4)设备订阅 service 的 Topic
注意:服务订阅 Topic 这里不支持+通配符/sys/(productKey]/[deviceName}/thing/service/{tslserviceidentifier
loT 云端下行的 payload 格式
{
"id": 3536123
"version": "1.0",
"params":{
"入参 key1":"入参 value1"
"入参 key2":"入参 value2"
},
"method":"thing.service.{tsl.service.identifier}"
}
设备响应 replyTopic
/sys/{productKey)/{deviceName}/thing/service/{tslservice.identifier)_reply
设备响应 payload 格式
{
"id": 3536123,
"code": 200,
"data": {
"出参 key1":"出参 value1"
"出参 key2":"出参 value2"
}
}
是物模型的服务,对于设备来说是订阅了一个服务的主题,云端一旦有人发起服务调用,设备端就可以收到的服务请求,可以做相应的处理,服务会包含入参和出参,在监听到云端指令的时候会收到云端给的执行入参,执行完成之后需要给云端一个 reply,服务执行的结果出参上报到云端。
设备上 报 pubTopic/sys/{productKey}/{deviceName}/thing/event/{tsl.event.identifier/post
设备上报 payload 格式
(
"id": 3536123,
"version":"1.0"
"params":{
"入参 key1":"入参 value1",
"入参 key2":"入参 value2"
},
"method":"thing.event.{tslevent.identifier}.post”
}
loT 云端响应 replyTopic
/sys/{productKey}/{deviceName}/thing/event/{tsleventidentifier}/postreply
云端响应 payload 格式
{
"id": 3536123,
"code": 200,
"data": {}
}
如果是事件只有一个云端的上报,只包含入参没有返回值的,云端不会给设备返回值,但是云端会给设备端一个响应,是否收到事件或者告警。