端侧对接流程

设备接入IoT平台后,IoT平台才可以对设备进行管理。设备接入平台时,需要保证IoT平台已经有对应应用,并且已经在该应用下注册了此设备。本节介绍端侧设备是如何通过端云互通组件与IoT平台实现对接的。首先给出端侧设备对接IoT平台的整体示意图。

图 1 端侧设备对接IoT平台的整体示意图
端侧对接流程 - 图1

本小节将根据上图所示的流程,向开发者介绍终端设备是如何一步步地接入IoT平台,并进行数据上报与命令执行的。

环境准备

在开发之前,需要提前获取如下信息:

  • Huawei LiteOS及LiteOS SDK源代码。工程整体结构如下。

├── arch //架构相关文件

│ ├── arm

│ └── msp430

├── build

│ └── Makefile

├── components //LiteOS各类组件

│ ├── connectivity

│ ├── fs

│ ├── lib

│ ├── log

│ ├── net

│ ├── ota

│ └── security

├── demos //示例程序

│ ├── agenttiny_lwm2m //本章中列出的所有示例程序,均来自该目录下的agent_tiny_demo.c文件

│ ├── agenttiny_mqtt

│ ├── dtls_server

│ ├── fs

│ ├── kernel

│ └── nbiot_without_atiny

├── doc //说明文档

│ ├── Huawei_LiteOS_Developer_Guide_en.md

│ ├── Huawei_LiteOS_Developer_Guide_zh.md

│ ├── Huawei_LiteOS_SDK_Developer_Guide.md

│ ├── LiteOS_Code_Info.md

│ ├── LiteOS_Commit_Message.md

│ ├── LiteOS_Contribute_Guide_GitGUI.md

│ ├── LiteOS_Supported_board_list.md

│ └── meta

├── include //工程需要的头文件

│ ├── at_device

│ ├── at_frame

│ ├── atiny_lwm2m

│ ├── atiny_mqtt

│ ├── fs

│ ├── log

│ ├── nb_iot

│ ├── osdepends

│ ├── ota

│ ├── sal

│ └── sota

├── kernel //系统内核

│ ├── base

│ ├── extended

│ ├── include

│ ├── los_init.c

│ └── Makefile

├── LICENSE //许可

├── osdepends //依赖项

│ └── liteos

├── README.md

├── targets //BSP工程

│ ├── Cloud_STM32F429IGTx_FIRE

│ ├── Mini_Project

│ ├── NXP_LPC51U68

│ └── STM32F103VET6_NB_GCC

└── tests //测试用例

├── cmockery

├── test_agenttiny

├── test_main.c

├── test_sota

└── test_suit

源代码托管在GitHub,地址为https://github.com/LiteOS/LiteOS

  • 集成开发工具:

    • MDK 5.18版本或者以上版本,从MDK官方网站下载。

    • MDK依赖的pack包

      端侧对接流程 - 图2 说明:
      MDK工具需要license,请从MDK官方获取。

LiteOS SDK端云互通组件入口函数

使用LiteOS SDK端云互通组件agent tiny对接IoT平台,首先需要一个入口函数agent_tiny_entry()。

接口名

描述

void agent_tiny_entry(void)

LiteOS SDK端云互通组件的入口函数。该接口将进行agent tiny的初始化相关操作,创建上报任务,并调用agent tiny主函数体。

参数列表:空

返回值:空

开发者可以通过LiteOS内核提供的任务机制,创建一个主任务main_task。在主任务中调用入口函数agent_tiny_entry(),开启agent tiny工作流程。

  1. UINT32 creat_main_task()
  2. {
  3. UINT32 uwRet = LOS_OK;
  4. TSK_INIT_PARAM_S task_init_param;
  5. task_init_param.usTaskPrio = 0;
  6. task_init_param.pcName = "main_task";
  7. task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)main_task;
  8. task_init_param.uwStackSize = 0x1000;
  9. uwRet = LOS_TaskCreate(&g_TskHandle, &task_init_param);
  10. if(LOS_OK != uwRet)
  11. {
  12. return uwRet;
  13. }
  14. return uwRet;
  15. }

LiteOS SDK端云互通组件初始化

在入口函数中,需要调用atiny_init()进行agent tiny的初始化相关操作。

接口名

描述

int atiny_init(atiny_param_t atiny_params, void* phandle)

LiteOS SDK端云互通组件的初始化接口,由LiteOS SDK端云互通组件实现,设备调用。

参数列表:参数atiny_params为入参,包含初始化操作所需的各个变量,具体请参考服务器参数结构体atiny_param_t;参数phandle为出参,表示当前创建的agent tiny的句柄。

返回值:整形变量,标识初始化成功或失败的状态。

对于入参atiny_params的设定,要根据具体的业务来进行。开发者可以参考下面的代码。

  1. #ifdef CONFIG_FEATURE_FOTA
  2. hal_init_ota(); //若定义FOTA功能,则需进行FOTA相关初始化
  3. #endif
  4. #ifdef WITH_DTLS
  5. device_info->endpoint_name = g_endpoint_name_s; //加密设备验证码
  6. #else
  7. device_info->endpoint_name = g_endpoint_name; //非加密设备验证码
  8. #endif
  9. #ifdef CONFIG_FEATURE_FOTA
  10. device_info->manufacturer = "Lwm2mFota"; //设备厂商
  11. device_info->dev_type = "Lwm2mFota"; //设备类型
  12. #else
  13. device_info->manufacturer = "Agent_Tiny";
  14. #endif
  15. atiny_params = &g_atiny_params;
  16. atiny_params->server_params.binding = "UQ"; //绑定方式
  17. atiny_params->server_params.life_time = 20; //生命周期
  18. atiny_params->server_params.storing_cnt = 0; //缓存数据报文个数
  19. atiny_params->server_params.bootstrap_mode = BOOTSTRAP_FACTORY; //引导模式
  20. atiny_params->server_params.hold_off_time = 10; //等待时延
  21. //pay attention: index 0 for iot server, index 1 for bootstrap server.
  22. iot_security_param = &(atiny_params->security_params[0]);
  23. bs_security_param = &(atiny_params->security_params[1]);
  24. iot_security_param->server_ip = DEFAULT_SERVER_IPV4; //服务器地址
  25. bs_security_param->server_ip = DEFAULT_SERVER_IPV4;
  26. #ifdef WITH_DTLS
  27. iot_security_param->server_port = "5684"; //加密设备端口号
  28. bs_security_param->server_port = "5684";
  29. iot_security_param->psk_Id = g_endpoint_name_iots; //加密设备验证码
  30. iot_security_param->psk = (char *)g_psk_iot_value; //PSK码
  31. iot_security_param->psk_len = sizeof(g_psk_iot_value); //PSK码长度
  32. bs_security_param->psk_Id = g_endpoint_name_bs;
  33. bs_security_param->psk = (char *)g_psk_bs_value;
  34. bs_security_param->psk_len = sizeof(g_psk_bs_value);
  35. #else
  36. iot_security_param->server_port = "5683"; //非加密设备端口号
  37. bs_security_param->server_port = "5683";
  38. iot_security_param->psk_Id = NULL; //非加密设备,无需PSK相关参数设置
  39. iot_security_param->psk = NULL;
  40. iot_security_param->psk_len = 0;
  41. bs_security_param->psk_Id = NULL;
  42. bs_security_param->psk = NULL;
  43. bs_security_param->psk_len = 0;
  44. #endif

设定好atiny_params后,即可根据设定的参数对agent tiny进行初始化。

  1. if(ATINY_OK != atiny_init(atiny_params, &g_phandle))
  2. {
  3. return;
  4. }

对于初始化接口atiny_init()内部,主要进行入参合法性的检验,agent tiny所需资源的创建等工作,一般不需要开发者进行修改。

创建数据上报任务

在完成agent tiny的初始化后,需要通过调用creat_report_task()创建一个数据上报的任务app_data_report()。

  1. UINT32 creat_report_task()
  2. {
  3. UINT32 uwRet = LOS_OK;
  4. TSK_INIT_PARAM_S task_init_param;
  5. UINT32 TskHandle;
  6. task_init_param.usTaskPrio = 1;
  7. task_init_param.pcName = "app_data_report";
  8. task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)app_data_report;
  9. task_init_param.uwStackSize = 0x400;
  10. uwRet = LOS_TaskCreate(&TskHandle, &task_init_param);
  11. if(LOS_OK != uwRet)
  12. {
  13. return uwRet;
  14. }
  15. return uwRet;
  16. }

在app_data_report()中应该完成对数据上报数据结构data_report_t的赋值,包括数据缓冲区地址buf,收到平台ack响应后的回调函数callback,数据cookie,数据长度len,以及数据上报类型type(在这里固定为APP_DATA)。

  1. uint8_t buf[5] = {0, 1, 6, 5, 9};
  2. data_report_t report_data;
  3. int ret = 0;
  4. int cnt = 0;
  5. report_data.buf = buf;
  6. report_data.callback = ack_callback;
  7. report_data.cookie = 0;
  8. report_data.len = sizeof(buf);
  9. report_data.type = APP_DATA;

完成对report_data的赋值后,即可通过接口atiny_data_report()上报数据。

接口名

描述

int atiny_data_report(void phandle, data_report_t report_data)

LiteOS SDK端云互通组件数据上报接口,由LiteOS SDK端云互通组件实现,设备调用,设备应用数据使用该接口上报。该接口为阻塞接口,不允许在中断中使用。

参数列表:参数phandle为调用初始化接口atiny_init()得到的agent tiny的句柄;参数report_data为数据上报数据结构。

返回值:整形变量,标识数据上报成功或失败的状态。

示例代码中的上报任务实现方法如下。

  1. while(1)
  2. {
  3. report_data.cookie = cnt;
  4. cnt++;
  5. ret = atiny_data_report(g_phandle, &report_data); //数据上报接口
  6. ATINY_LOG(LOG_DEBUG, "data report ret: %d\n", ret);
  7. (void)LOS_TaskDelay(250 * 8);
  8. }