相关链接

阿里云物联网平台CSDK源码剖析(1)
阿里云物联网平台CSDK源码剖析(2)
阿里云物联网平台CSDK源码剖析(3)

物模型三要素之属性功能(property)

属性功能:一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等。属性支持GETSET请求方式。应用系统可发起对属性的读取和设置请求。
属性基础功能涉及的MQTT topic如下:

功能func主题topic
设备上报数据/sys/${product_key}/${device_name}/thing/event/property/post
云端向下设置数据/sys/${product_key}/${device_name}/thing/service/property/set
数据向云端获取数据/sys/${product_key}/${device_name}/thing/service/property/get

本文我们详细解析属性上报post属性上报回复post_reply具体流程,set与get流程类似。

调用流程如上图所示,IOT_Linkkit_Connect主要核心分为连接connect订阅subcribe两大部分,其中订阅的topic均为物模型所需的topic。

IOT_Linkkit_Report属性上报调用流程及剖析

属性上报post的流程如下图所示:
property_post
上报前,云端的控制台必须建立相符合的属性参数,如本例中payload报文为"{“Counter”: 0}",那么云端必须有一个名为“Counter”并且能够容纳json_number格式的属性。

用户传入的payload报文为"{“Counter”: 0}",最终通过封装产生MQTT的payload为"{“id”:"%d",“version”:"%s",“params”:{“Counter”: 0},“method”:"%s"}",传至云端后,云端会解析出Counter = 0,并将值设置在控制台之上。

此处小编不明白的是,属性的上报MQTT服务等级都是QOS0,万一有些情况下需求属性值必须抵达服务器,那么还得用户自己去实现。

IOT_Linkkit_Yield属性上报回复流程及剖析

IOT_Linkkit_Yield函数会接收并处理各种事件、服务等,因此该函数一定是在线程中循环调用,本章仅描述属性上报后的回复事件。
调用流程如下:
post_reply1
这边有两个关键的函数,分别是iot_dm_yield与iotx_dm_dispatch。iot_dm_yield负责接收来自服务端的数据包并解析后上传给上层消息链表;iotx_dm_dispatch则负责依次执行消息链表中的事件,完成各个功能。接下来分别详述这两个函数是如何接收数据并完成最终用户设置的回调函数。

iotx_dm_yield属性报文接收流程

post_reply2

iotx_dm_yield函数接收了来自服务端的/…/thing/event/property/post_reply主题的消息,并且将MQTT的payload中的json元素一一解析出来,组成新的msg报文(供上层使用),最终将对应的event事件及新的msg报文加入ipc消息链表当中。

iotx_dm_dispatch消息处理流程

post_reply3
iotx_dm_dispatch函数首先处理了超时未回复的消息,若超时则向上层发送信息,告知用户。其次依次处理ipc链表内的消息,根据event事件选择不同的处理函数,最终会调用到用户使用IOT_RegisterCallback注册的回调函数。

总结

属性的收发流程其实就是MQTT的两个publish操作而已,当然一个是发送,一个是接收。

更多推荐