MQTT(Message Queuing Telemetry Transport)即消息队列遥测传输,是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。MQTT协议是轻量、简单、开放和易于实现的,广泛应用于医疗设备、智能家居、及一些小型化设备中。本文对MN316标准版 OpenCPU SDK中的MQTT demo代码进行解析,并演示通过MQTT协议连接OneNET平台的实现方法。
- 代码分析
MQTT demo测试流程图如下:
图1 MQTT Demo测试流程图
在模组上电开机后,调用MQTT demo的测试指令为: CM:MQTT:ssl_enable:client_index:opt,其中ssl_enable取0-1,0代表非加密传输,1代表加密传输,demo目前仅有4通道配置了加密传输;
client_index取0-4,代表要使用的client对象通道,demo目前仅有4通道配置了加密传输,客户可自行添加修改;
opt取0-7代表操作项,0-7依次代表client初始化、连接、订阅、发布、取消订阅、获取当前订阅主题、断开连接和销毁client。
进入调用函数void cm_test_mqtt(unsigned char **cmd, int len) 后,将执行以下操作:
1.1判断输入格式及读取指令参数
len为以冒号分割的指令个数。
图2 判断输入参数
将指令中的值分别写入ssl_type、opt、index三个参数。
1.2 根据指令判断将要进行的MQTT操作
首先判断操作项,即opt参数的值。
图3 判断执行的操作
opt为0时,初始化客户端,创建客户端实例,实例取值0~4。Demo中仅有4通道配置了加密传输。
图4 初始化客户端
设置客户端参数。
图5 设置客户端参数
如果实例号为4,进行SSL设置。
图6 SSL配置
opt为1时,即进行OneNET连接,其中,会通过判断index的值,来选择使用哪个实例,判断后进行连接参数配置,并开始连接。
图7 连接服务器
opt为2时,进行订阅Topic的操作。其中QOS等级分为0~2,OneNET平台仅支持0和1,订阅时将QOS设置为0。
图8 设置QOS等级
opt为3时,发布信息,其中QOS等级设置为1,pubmessage及subtopic分别为发布的消息内容及发布的topic;index即实例号;长度为strlen(pubmessage); publish_flags为固定头部信息。
图9 发布消息
注:针对某些只可发布不可订阅的主题,需要额外定义一个pubtopic。
opt为4时,取消订阅主题。
图10 取消订阅主题
opt为5时,查看已订阅的topic。
图11 查阅订阅的topic
opt为6时,关闭连接。
图12 关闭连接
Opt为7时,释放client。
图13 释放client
- 实际操作
2.1平台侧创建产品
首先,我们要在平台侧创建产品,具体的创建步骤见OneMO线上服务平台 (onemo10086.com)。我们这里使用MQTT套件进行创建。
2.2 连接参数配置
订阅主题:
格式为:$sys/产品ID/设备名称/#。
图14 SUB订阅主题
发布主题:
格式为:$sys/产品ID/设备名称/dp/post/json。
图15 PUB发布主题
发布主题消息:
格式须严格按照OneNET要求的JSON格式。
图16 发布主题消息
服务器地址:
图17 设置服务器地址
端口号:
图18 设置服务器端口号
客户端ID即设备名称:
图19 设置客户端ID
用户名即产品ID:
图20 设置服务器端口号
密码使用Token工具计算生成:
图21 设置Token秘钥
Token工具使用可参照http://www.onemo10086.com/#/school/article/292
存活时间:
图22 设置设备存货时间
是否清除会话:
图23 是否清楚会话
注意:此选项必须设置为1。
- 执行结果
模组上电开机后依次输入指令,整个工作流程如下:
图24 工作流程
执行指令后,在OneNET平台侧可以查看到设备在线并且数据流已更新:
图25 平台收到数据
- 注意事项
- 在配置订阅和发布主题的参数时需要注意OneNET平台QOS等级仅支持0和1;
- 再次登陆前需先关闭连接并释放;
- 发布数据格式一定要满足OneNET规定的JSON格式;
- 清除会话参数即cmqtt_glob_cfgclean必须设置为1。