端侧对接流程
设备接入IoT平台后,IoT平台才可以对设备进行管理。设备接入平台时,需要保证IoT平台已经有对应应用,并且已经在该应用下注册了此设备。本节介绍端侧设备是如何通过端云互通组件与IoT平台实现对接的。首先给出端侧设备对接IoT平台的整体示意图。
图 1 端侧设备对接IoT平台的整体示意图
本小节将根据上图所示的流程,向开发者介绍终端设备是如何一步步地接入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包
说明:
MDK工具需要license,请从MDK官方获取。
LiteOS SDK端云互通组件入口函数
使用LiteOS SDK端云互通组件agent tiny对接IoT平台,首先需要一个入口函数agent_tiny_entry()。
LiteOS SDK端云互通组件的入口函数。该接口将进行agent tiny的初始化相关操作,创建上报任务,并调用agent tiny主函数体。 |
开发者可以通过LiteOS内核提供的任务机制,创建一个主任务main_task。在主任务中调用入口函数agent_tiny_entry(),开启agent tiny工作流程。
UINT32 creat_main_task()
{
UINT32 uwRet = LOS_OK;
TSK_INIT_PARAM_S task_init_param;
task_init_param.usTaskPrio = 0;
task_init_param.pcName = "main_task";
task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)main_task;
task_init_param.uwStackSize = 0x1000;
uwRet = LOS_TaskCreate(&g_TskHandle, &task_init_param);
if(LOS_OK != uwRet)
{
return uwRet;
}
return uwRet;
}
LiteOS SDK端云互通组件初始化
在入口函数中,需要调用atiny_init()进行agent tiny的初始化相关操作。
LiteOS SDK端云互通组件的初始化接口,由LiteOS SDK端云互通组件实现,设备调用。 参数列表:参数atiny_params为入参,包含初始化操作所需的各个变量,具体请参考服务器参数结构体atiny_param_t;参数phandle为出参,表示当前创建的agent tiny的句柄。 |
对于入参atiny_params的设定,要根据具体的业务来进行。开发者可以参考下面的代码。
#ifdef CONFIG_FEATURE_FOTA
hal_init_ota(); //若定义FOTA功能,则需进行FOTA相关初始化
#endif
#ifdef WITH_DTLS
device_info->endpoint_name = g_endpoint_name_s; //加密设备验证码
#else
device_info->endpoint_name = g_endpoint_name; //非加密设备验证码
#endif
#ifdef CONFIG_FEATURE_FOTA
device_info->manufacturer = "Lwm2mFota"; //设备厂商
device_info->dev_type = "Lwm2mFota"; //设备类型
#else
device_info->manufacturer = "Agent_Tiny";
#endif
atiny_params = &g_atiny_params;
atiny_params->server_params.binding = "UQ"; //绑定方式
atiny_params->server_params.life_time = 20; //生命周期
atiny_params->server_params.storing_cnt = 0; //缓存数据报文个数
atiny_params->server_params.bootstrap_mode = BOOTSTRAP_FACTORY; //引导模式
atiny_params->server_params.hold_off_time = 10; //等待时延
//pay attention: index 0 for iot server, index 1 for bootstrap server.
iot_security_param = &(atiny_params->security_params[0]);
bs_security_param = &(atiny_params->security_params[1]);
iot_security_param->server_ip = DEFAULT_SERVER_IPV4; //服务器地址
bs_security_param->server_ip = DEFAULT_SERVER_IPV4;
#ifdef WITH_DTLS
iot_security_param->server_port = "5684"; //加密设备端口号
bs_security_param->server_port = "5684";
iot_security_param->psk_Id = g_endpoint_name_iots; //加密设备验证码
iot_security_param->psk = (char *)g_psk_iot_value; //PSK码
iot_security_param->psk_len = sizeof(g_psk_iot_value); //PSK码长度
bs_security_param->psk_Id = g_endpoint_name_bs;
bs_security_param->psk = (char *)g_psk_bs_value;
bs_security_param->psk_len = sizeof(g_psk_bs_value);
#else
iot_security_param->server_port = "5683"; //非加密设备端口号
bs_security_param->server_port = "5683";
iot_security_param->psk_Id = NULL; //非加密设备,无需PSK相关参数设置
iot_security_param->psk = NULL;
iot_security_param->psk_len = 0;
bs_security_param->psk_Id = NULL;
bs_security_param->psk = NULL;
bs_security_param->psk_len = 0;
#endif
设定好atiny_params后,即可根据设定的参数对agent tiny进行初始化。
if(ATINY_OK != atiny_init(atiny_params, &g_phandle))
{
return;
}
对于初始化接口atiny_init()内部,主要进行入参合法性的检验,agent tiny所需资源的创建等工作,一般不需要开发者进行修改。
创建数据上报任务
在完成agent tiny的初始化后,需要通过调用creat_report_task()创建一个数据上报的任务app_data_report()。
UINT32 creat_report_task()
{
UINT32 uwRet = LOS_OK;
TSK_INIT_PARAM_S task_init_param;
UINT32 TskHandle;
task_init_param.usTaskPrio = 1;
task_init_param.pcName = "app_data_report";
task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)app_data_report;
task_init_param.uwStackSize = 0x400;
uwRet = LOS_TaskCreate(&TskHandle, &task_init_param);
if(LOS_OK != uwRet)
{
return uwRet;
}
return uwRet;
}
在app_data_report()中应该完成对数据上报数据结构data_report_t的赋值,包括数据缓冲区地址buf,收到平台ack响应后的回调函数callback,数据cookie,数据长度len,以及数据上报类型type(在这里固定为APP_DATA)。
uint8_t buf[5] = {0, 1, 6, 5, 9};
data_report_t report_data;
int ret = 0;
int cnt = 0;
report_data.buf = buf;
report_data.callback = ack_callback;
report_data.cookie = 0;
report_data.len = sizeof(buf);
report_data.type = APP_DATA;
完成对report_data的赋值后,即可通过接口atiny_data_report()上报数据。
示例代码中的上报任务实现方法如下。
while(1)
{
report_data.cookie = cnt;
cnt++;
ret = atiny_data_report(g_phandle, &report_data); //数据上报接口
ATINY_LOG(LOG_DEBUG, "data report ret: %d\n", ret);
(void)LOS_TaskDelay(250 * 8);
}