【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()

检查函数是否括号加完全了

你可能感兴趣的:(LiteOS)