12.腾讯云物联网设备端学习---NTP功能及实现

2021-10-07 20:42:09 浏览数 (2)

本系列主要目的在于记录腾讯云物联网设备端的学习笔记,并且对设备端SDK进行补充说明。

简介

ntp功能ntp功能

ntp功能是简单的上下行topic配合的功能,设备端订阅下行主题,往上行主题发送消息,触发服务器下发下行消息,并根据下行消息进行处理。

下面主要以NTP功能为例子,介绍下如何基于iot-hub-device-c-sdk 实现该功能。

模块添加

在services/hub/system/新增模块,需要实现

  • src:模块源码,提供sdk外部接口
  • inc:模块内部使用头文件,本功能中无
  • sample:示例代码,调用接口的示例
  • test:单元测试用例编写
  • CMakeLists.txt:cmake脚本,简单设置下源码和头文件路径,添加示例和单元测试即可(后续可以简化不需针对服务进行修改)

NTP功能主要实现两个接口:

  • IOT_Sys_GetTime:该接口用于从服务器获取时间,主要做以下三个事情
    • _system_mqtt_result_topic_check_and_sub:检测下行topic订阅情况,如果未订阅则订阅
    • _system_mqtt_get_resource_time_publish:向上行topic发布消息,去获取时间
    • _system_mqtt_result_wait:超时等待服务器回复
  • IOT_Sys_SyncNTPTime:和IOT_Sys_GetTime类似,区别在于会根据接收消息前后的时间通过HAL_Timer_SetSystimeSecHAL_Timer_SetSystimeMs设置系统时间。

源码实现(见system_mqtt.c),以下简单说明下这类服务的开发思路:

  1. 同步订阅:大部分服务需要保证订阅的成功,为了保证订阅的成功,可以调用IOT_MQTT_SubscribeSync
  2. 消息处理:旧版本的服务都会在mqtt client结构体中添加新的成员,显然这样是不利于代码的维护以及后续功能开发的,所以可以通过订阅的usr_data来传入需要服务需要处理的上下文,同时需要将usr_data的释放函数注册进去,因为这部分内容是跟着mqtt client生命周期存在的,当mqtt client被销毁时,需要主动释放掉usr_data。
  3. 接口封装:不同服务需要用户感知到的逻辑有所区别,针对这种协议已确定的服务,一般由SDK进行封装,只提供用户需要感知的数据,比如时间。

对外头文件添加

在include/services/common中添加对外头文件qcloud_iot_system.h,主要提供对外接口

编译添加

在config/settings/iot_hub_setting.cmake中添加模块编译,简单将对应目录添加到编译即可,会自动检测目录下的CMakeLists.txt

代码语言:c复制
add_subdirectory(${PROJECT_SOURCE_DIR}/services/common/system)

0 人点赞