此笔记由个人整理
华为IOT LiteOS开发实战营
第五天
一、LWM2M协议
- LWM2M是一套适用于物联网的协议
- 轻量级
- 适用于物联网
- LWM2M主要面向基于蜂窝的窄带物联网场景下的物联网应用,具有覆盖广、连接多、速率低、成本低、功耗低、框架优等特点
- LWM2M实现了三个逻辑实体
- LWM2M Server:接入机,平台服务器
- LWM2M client:客户端,负责执行服务器的命令和上报结果
- Bootstrap server:引导机,负责配置LWM2M客户端
- 在这些实体中定义了,协议定义了4个接口
- 引导接口(Bootstrap):向LwM2M客户端提供注册到LwM2M服务器的必要信息,比如LWM2M server 的URL 地址。
- 客户端注册接口(Client Registration)使LwM2M客户端与LwM2M服务器互联,将相关信息存储在LwM2M服务器上。
- 设备管理与服务实现接口(Device Management and Service Enablement)LwM2M服务器向客户端发送指令,客户端对指令做出回应并将回应消息发送给服务器。
- 信息上报接口(Information Reporting)允许客户端上报资源信息到LwM2M服务器端,比如传感器温度。
二、具体步骤
- 数据接收
static int app_msg_deal(void *usr_data, en_oc_lwm2m_msg_t type, void *data, int len)
{
unsigned char *msg;
msg = data;
int ret = -1;
if(len <= cn_app_rcv_buf_len)
{
if (msg[0] == 0xaa && msg[1] == 0xaa)
{
printf("OC respond message received! \n\r");
return ret;
}
memcpy(s_rcv_buffer,msg,len);
s_rcv_datalen = len;
(void) osal_semp_post(s_rcv_sync);
ret = 0;
}
return ret;
}
- 定义相关内容
#define cn_app_rcv_buf_len 128//接收数组的长度
static int s_rcv_buffer[cn_app_rcv_buf_len];//接收的数组
static int s_rcv_datalen;//接收的数据长度
static osal_semp_t s_rcv_sync;//信号量
- 控制部分代码
static int app_cmd_task_entry()
{
int ret = -1;
tag_Res_Con_Light Response_Agriculture_Control_Light;
tag_Res_Con_Motor Response_Agriculture_Control_Motor;
tag_app_Con_Light *Agriculture_Control_Light;
tag_app_Con_Motor *Agriculture_Control_Motor;
int8_t msgid;
while(1)
{
if(osal_semp_pend(s_rcv_sync,cn_osal_timeout_forever))
{
msgid = s_rcv_buffer[0] & 0x000000FF;
switch (msgid)
{
case cn_Con_Light:
Agriculture_Control_Light = (tag_app_Con_Light *)s_rcv_buffer;
printf("Agriculture_Control_Light:msgid:%d mid:%d,state:%s\n", Agriculture_Control_Light->messageId, ntohs(Agriculture_Control_Light->mid),Agriculture_Control_Light->Light);
/********** code area for cmd from IoT cloud **********/
if (Agriculture_Control_Light->Light[0] == 'O' && Agriculture_Control_Light->Light[1] == 'N')
{
HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_SET);
}
if (Agriculture_Control_Light->Light[0] == 'O' && Agriculture_Control_Light->Light[1] == 'F' && Agriculture_Control_Light->Light[2] == 'F')
{
HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_RESET);
}
/********** code area end **********/
break;
case cn_Con_Motor:
Agriculture_Control_Motor = (tag_app_Con_Motor *)s_rcv_buffer;
printf("Agriculture_Control_Motor:msgid:%d mid:%d,state:%s\n", Agriculture_Control_Motor->messageId, ntohs(Agriculture_Control_Motor->mid),Agriculture_Control_Motor->Motor);
/********** code area for cmd from IoT cloud **********/
if (Agriculture_Control_Motor->Motor[0] == 'O' && Agriculture_Control_Motor->Motor[1] == 'N')
{
HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_SET);
}
if (Agriculture_Control_Motor->Motor[0] == 'O' && Agriculture_Control_Motor->Motor[1] == 'F' && Agriculture_Control_Motor->Motor[2] == 'F')
{
HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_RESET);
}
/********** code area end **********/
break;
default:
break;
}
}
}
return ret;
}
- 定义结构体变量到预编译部分
typedef struct
{
int8_t messageId;
uint16_t mid;
int8_t errcode;
int8_t Light_State;
} tag_Res_Con_Light;
typedef struct
{
int8_t messageId;
uint16_t mid;
int8_t errcode;
int8_t Motor_State;
} tag_Res_Con_Motor;
typedef struct
{
int8_t messageId;
uint16_t mid;
char Light[3];
} tag_app_Con_Light;
typedef struct
{
uint8_t messageId;
uint16_t mid;
char Motor[3];
} tag_app_Con_Motor;
- 在主函数中添加任务
osal_task_create("sensor command",app_cmd_task_entry,NULL,0x400,NULL,3);
出现error: invalid storage class for function ‘app_report_task_entry’
static int app_report_task_entry()
检查函数是否括号加完全了