Raspberry Pi 3B+接收和响应IoTDA下发命令的过程分析及验证Demo

举报
Jasonchenbj 发表于 2020/06/28 21:37:22 2020/06/28
【摘要】 引言:在之前将Raspberry Pi 3B+接入IoTDA时,完成了简单的数据上传的功能。在这个基础上,使用IoT Device SDK(C)的快速体验产品模型TTU,在IoTDA中新建产品,导入这个产品模型完成产品的功能定义。之后分析和修改设备端IoT Device SDK(C)中的Device_Demo.c代码,编译运行。最后在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中创建产品,如下图示例。

image.png

    在创建好产品后,进入产品的详情,如下图示例。

1593350867173060212.png

    在功能定义中可以看到,上传模型文件的按钮。点击这个按钮弹出如下选择文件对话框图

image.png

    导入的产品模型文件中文件夹和文件的顺序、名称需要满足一定的要求。这个要求在IoTDA的文档中有具体描述,这里就不在多说。附上文档的链接

       https://support.huaweicloud.com/devg-iothub/iot_02_4012.html

    这样一个TTU产品就建立成功了。建好产品后,还需要注册设备。注册后的设备如下图所示

1593350958033068549.png

图中的最新上传数据是在刚注册好之后是没有值的。在设备激活连接后,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命令为例,修改这个函数中的代码后如下。1593350994713069531.png

修改部分,主要是图中红框中的内容。

2void Test_BatchPropertiesReport()

这个函数中,实现了批量上传属性信息的功能。在本文中,想通过分析出IoTDA下发指令中具体的参数的值,根据参数的值,更新相关的属性值。例如分析parameter_Set命令中的参数 Load 的值 和 ImbA_strVal的值,然后在把这两个参数的值作为它们的属性值,传递给IoTDA平台,以表示设备端根据要求已经更改好了这两个参数值,把更改好的值传递上去。这跟实际中很多设备的远程控制相求相似。修改这个函数中的程序代码如下。

image.png

修改的部分主要是红框中的内容。为了保持原来的程序代码,在修改时更多用了//注释,没有删除掉,以防后续在使用这些代码。

3void Test_PropertiesReport()

这个函数中在Device_Demo.c中用来发送属性值,包括了LoadImbA_strVal的属性值。为了达到本文的命令响应需求,这个程序做了如下修改。

1593351073548043302.png

修改主要是图中红色框中内容。主要是将从命令中分析得到的属性值,赋值给要上传的属性。

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中查看设备在线状态如下图。

1593351115969036411.png

 发送命令 parameter_Set. 如下图操作,发送parameter_Set命令,设置Load值为1, ImbA_strVal值为2,并确定。

1593351154244031035.png

命令发送成功或者失败,可以在类似如下的图

1593351182812069312.png

命令成功发送时,在Raspberry Pi 3B+端可以看到如下信息

1593351221434083583.png

红色框中的信息,就是Raspberry Pi 3B+端接收到的信息,里面的 Load 后面的就是发送命令时设置的1.同理ImbA_strVal 后面的 2也是发送命令时这是的值。在接收命令信息并解析后,可以看到 Load 1 和  ImbA_strVal   2. 这说明设备端已经成功接收和解析了IoTDA端下发过来的命令。但是命令响应如何呢,是否将要求的参数的值设定并更新返回到IoTDA中呢?看下图

1593351250430076271.png

图中的 Load 的值已经变更为 , ImbA_strVal的值也已经变更为 2。这说明命令响应也被正确的执行了。

4.总结

    在IoTDA中创建产品,导入TTU的产品模型定义产品功能。分析命令解析和响应相关示例程序,并修改程序,完成了对parameter_Set命令的解析和响应,并将解析的Load 和 ImbA_strVal的值再次传送给IoTDA. 通过最后的测试验证,说明了分析和程序修改的正确性。通过这个过程,有助于理解下发命令的解析和响应过程,为后续更多功能的开发提供参考。程序代码的具体设计和修改可能会有更好更多的方法,改得不好的地方请多多指教,有好的方法欢迎分享.

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200