Raspberry Pi 3B+接收和响应IoTDA下发命令的过程分析及验证Demo
引言:在之前将Raspberry Pi 3B+接入IoTDA时,完成了简单的数据上传的功能。在这个基础上,使用IoT Device SDK(C)的快速体验产品模型TTU,在IoTDA中新建产品,导入这个产品模型完成产品的功能定义。之后分析和修改设备端IoT Device SDK(C)中的Device_Demo.c代码,编译运行。最后在IoTDA中发送命令验证Demo能正确的实现下发命令的接收和响应。具体内容过程如下。
1. IoTDA中建立产品模型和设备
这次采用了TTU产品模型,建立方便快捷很多。在IoTDA中创建产品,如下图示例。
在创建好产品后,进入产品的详情,如下图示例。
在功能定义中可以看到,上传模型文件的按钮。点击这个按钮弹出如下选择文件对话框图
导入的产品模型文件中文件夹和文件的顺序、名称需要满足一定的要求。这个要求在IoTDA的文档中有具体描述,这里就不在多说。附上文档的链接
https://support.huaweicloud.com/devg-iothub/iot_02_4012.html
这样一个TTU产品就建立成功了。建好产品后,还需要注册设备。注册后的设备如下图所示
图中的最新上传数据是在刚注册好之后是没有值的。在设备激活连接后,Demo程序会上传这些数据值。在IoTDA中注册好的设备,还没有激活,需要设备端的程序开发完成,并成功连接后才会在IoTDA中看到设备激活和在线状态。
2.Raspberry Pi 3B+ 端的程序分析和修改
这次主要是在设备端实现对IoTDA发送过来的命令的解析和响应。在IoT Device SDK(C)中的Device_Demo.c程序中,有如下相关部分。
1)void HandleCommandRequest(void *context, int messageId, int code, char *message, char *requestId)
在这个函数中,程序处理从IoTDA平台发送过来的信息内容,即message. 通过调用cJSON程序包中的函数,对message内容进行解析。平台下发的命令解析可以在这个函数中处理。本文将以响应TTU模型中的 parameter_Set命令为例,修改这个函数中的代码后如下。
修改部分,主要是图中红框中的内容。
2)void Test_BatchPropertiesReport()
这个函数中,实现了批量上传属性信息的功能。在本文中,想通过分析出IoTDA下发指令中具体的参数的值,根据参数的值,更新相关的属性值。例如分析parameter_Set命令中的参数 Load 的值 和 ImbA_strVal的值,然后在把这两个参数的值作为它们的属性值,传递给IoTDA平台,以表示设备端根据要求已经更改好了这两个参数值,把更改好的值传递上去。这跟实际中很多设备的远程控制相求相似。修改这个函数中的程序代码如下。
修改的部分主要是红框中的内容。为了保持原来的程序代码,在修改时更多用了//注释,没有删除掉,以防后续在使用这些代码。
3)void Test_PropertiesReport()
这个函数中在Device_Demo.c中用来发送属性值,包括了Load和ImbA_strVal的属性值。为了达到本文的命令响应需求,这个程序做了如下修改。
修改主要是图中红色框中内容。主要是将从命令中分析得到的属性值,赋值给要上传的属性。
4)全局变量 ST_IOTA_DEVICE_DATA_INFO devices[DeviceNum];
为了存储从IoTDA平台下发的命令中解析出来的参数值,将devices设置为全局变量,这样在上述三个函数中都可以使用。这里仅仅是个验证程序,暂时这么设计。如果需要存储的设备数据比较多的时候,可以考虑更好设计更好的数据结构来存储相关参数值。这个全局变量中的 DeviceNum通过宏定义为1. 便于多个设备时修改数量。
致此,Raspberry Pi 3B+端的程序分析和修改完成后。本文没有讲解连接相关的程序修改,这部分内容参照如下这个连接的博客文章https://bbs.huaweicloud.com/blogs/169353。所有程序修改完成后,编译后运行./MQTT_Demo.o进行验证。
3.运行验证
在Raspberry Pi 3B+中成功运行MQTT_Demo.o之后,在第一部分注册的设备就会被激活并在线了。在IoTDA中查看设备在线状态如下图。
发送命令 parameter_Set. 如下图操作,发送parameter_Set命令,设置Load值为1, ImbA_strVal值为2,并确定。
命令发送成功或者失败,可以在类似如下的图
命令成功发送时,在Raspberry Pi 3B+端可以看到如下信息
红色框中的信息,就是Raspberry Pi 3B+端接收到的信息,里面的 Load 后面的1 就是发送命令时设置的1.同理ImbA_strVal 后面的 2也是发送命令时这是的值。在接收命令信息并解析后,可以看到 Load 1 和 ImbA_strVal 2. 这说明设备端已经成功接收和解析了IoTDA端下发过来的命令。但是命令响应如何呢,是否将要求的参数的值设定并更新返回到IoTDA中呢?看下图
图中的 Load 的值已经变更为 1 , ImbA_strVal的值也已经变更为 2。这说明命令响应也被正确的执行了。
4.总结
在IoTDA中创建产品,导入TTU的产品模型定义产品功能。分析命令解析和响应相关示例程序,并修改程序,完成了对parameter_Set命令的解析和响应,并将解析的Load 和 ImbA_strVal的值再次传送给IoTDA. 通过最后的测试验证,说明了分析和程序修改的正确性。通过这个过程,有助于理解下发命令的解析和响应过程,为后续更多功能的开发提供参考。程序代码的具体设计和修改可能会有更好更多的方法,改得不好的地方请多多指教,有好的方法欢迎分享.
- 点赞
- 收藏
- 关注作者
评论(0)