此筆記由個人整理
華爲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()
檢查函數是否括號加完全了