【LiteOS】11-移植-通信協議

此筆記由個人整理

華爲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()

檢查函數是否括號加完全了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章