• LiteOS云端对接教程10-LiteOS使用NB模组基于LWM2M对接华为OC平台实战


    1. 在云端添加测试设备

    打开之前教程新建的LWM2M产品,进入设备管理界面新建真实设备,设备标识符要填写NB模组的IMEI号,可以使用如下命令查看:

    AT+CGSN=1
    

    测试结果如下:

    +CGSN:867725038317248
    
    OK
    

    获取到IMEI号之后创建设备:

    创建之后会自动进入调试界面,接下来开始调试。

    2. NB模组使用LWM2M直接对接华为云

    BC35-G模组可以直接对接华为云平台,步骤如下。

    设置自动注册模式

    使用该命令设置模组开机后自动注册到华为云平台:

    AT+QREGSWT=1
    

    设置CDP服务器ip和端口

    使用该命令设置服务器的ip和端口:

    AT+NCDP=49.4.85.232,5683
    

    华为云平台LWM2M对接信息可以在平台上查看:

    重启模组

    第一步设置了模组开机自动连接云平台,所以使用如下命令重启模组:

    AT+NRB
    

    复位后可以看到设备已经上线:

    在串口助手中可以看到,模组返回信息如下:

    +QLWEVTIND:0
    
    +QLWEVTIND:3
    

    这两个信息表示 设备成功注册,IoT平台已观察到对象19,当模块报告此消息时,数据可以发送到 IoT 平台。

    模组向华为云平台发送数据

    使用如下指令向华为云平台发送数据,模拟亮度值上报:

    AT+QLWULDATA=3,000006
    

    在云端可以看到模组上报的数据:

    模组接收华为云平台下发数据

    在华为云平台点击下发命令“on”:

    可以在串口助手中看到如下信息:

    +NNMI:3,016F6E
    

    该信息表示模组从物联网平台接收的3个字节的数据,数据为0x016F6E,最前面的01为msgid,后面的两个字节为"on",命令接收成功。

    3. LiteOS使用NB模组+LWM2M对接华为云

    基于NB模组的OC_LWM2M_AL实现

    因为NB模组可以直接使用AT命令对接华为云平台,所以直接使用AT框架实现LiteOS OC_LWM2M_AL层,源码在SDK中的IoT_LINK_1.0.0iot_linkococ_lwm2moudica150_oc目录下:

    BC35-G设备配置

    在工程目录中的OS_CONFIG/iot_link_config.h文件中,配置BC35-G设备的波特率和设备名称:

    编写实验文件

    在 Demo 文件夹下创建cloud_test_demo文件夹,在其中创建oc_lwm2m_demo.c文件。

    编写以下代码:

    #include <osal.h>
    #include <oc_lwm2m_al.h>
    #include <link_endian.h>
    #include <string.h>
    
    #define cn_endpoint_id        "867725038317248"
    #define cn_app_server         "49.4.85.232"
    #define cn_app_port           "5683"
    
    #define cn_app_light           0
    #define cn_app_ledcmd          1
    
    #pragma pack(1)
    
    typedef struct
    {
        int8_t msgid;
        int16_t intensity;
    }app_light_intensity_t;
    
    
    typedef struct
    {
        int8_t msgid;
        char led[3];
    }app_led_cmd_t;
    
    #pragma pack()
    
    #define cn_app_rcv_buf_len 128
    static int8_t          s_rcv_buffer[cn_app_rcv_buf_len];
    static int             s_rcv_datalen;
    static osal_semp_t     s_rcv_sync;
    
    static void           *s_lwm2m_handle = NULL;
    
    static int app_msg_deal(void *usr_data,en_oc_lwm2m_msg_t type, void *msg, int len)
    {
        int ret = -1;
    
        if(len <= cn_app_rcv_buf_len)
        {
            memcpy(s_rcv_buffer,msg,len);
            s_rcv_datalen = len;
    
            osal_semp_post(s_rcv_sync);
    
            ret = 0;
    
        }
        return ret;
    }
    
    
    static int app_cmd_task_entry()
    {
        int ret = -1;
        app_led_cmd_t *led_cmd;
        int8_t msgid;
    
        while(1)
        {
            if(osal_semp_pend(s_rcv_sync,cn_osal_timeout_forever))
            {
                msgid = s_rcv_buffer[0];
                switch (msgid)
                {
                    case cn_app_ledcmd:
                        led_cmd = (app_led_cmd_t *)s_rcv_buffer;
                        printf("LEDCMD:msgid:%d msg:%s 
    
    ",led_cmd->msgid,led_cmd->led);
                        
                        if (led_cmd->led[0] == 'o' && led_cmd->led[1] == 'n')
                        {
                            printf("--------------- LED ON! --------------------
    ");
                        }
    
                        else if (led_cmd->led[0] == 'o' && led_cmd->led[1] == 'f' && led_cmd->led[2] == 'f')
                        {
                            printf("--------------- LED OFF! --------------------
    ");
                        }
                        else
                        {
    
                        }
                        break;
                    default:
                        break;
                }
            }
        }
    
        return ret;
    }
    
    
    
    static int app_report_task_entry()
    {
        int ret = 0;
        int lux = 0;
    
        oc_config_param_t      oc_param;
        app_light_intensity_t  light;
    
        memset(&oc_param,0,sizeof(oc_param));
    
        oc_param.app_server.address = cn_app_server;
        oc_param.app_server.port = cn_app_port;
        oc_param.app_server.ep_id = cn_endpoint_id;
        oc_param.boot_mode = en_oc_boot_strap_mode_factory;
        oc_param.rcv_func = app_msg_deal;
    
        s_lwm2m_handle = oc_lwm2m_config(&oc_param);
        if(NULL != s_lwm2m_handle)  
        {
            while(1)
            {
                lux++;
                lux= lux%10000;
    
                light.msgid = cn_app_light;
                light.intensity = htons(lux);
                oc_lwm2m_report(s_lwm2m_handle,(char *)&light,sizeof(light),1000);
                osal_task_sleep(2*1000);
            }
        }
    
        return ret;
    }
    
    int standard_app_demo_main()
    {
        osal_semp_create(&s_rcv_sync,1,0);
    
        osal_task_create("app_report",app_report_task_entry,NULL,0x1000,NULL,2);
        osal_task_create("app_command",app_cmd_task_entry,NULL,0x1000,NULL,3);
    
        return 0;
    }
    
    
    
    
    

    添加路径

    在user_demo.mk中添加如下:

    	#example for oc_lwm2m_demo
    	ifeq ($(CONFIG_USER_DEMO), "oc_lwm2m_demo")	
    		user_demo_src  = ${wildcard $(TOP_DIR)/targets/STM32L431_BearPi/Demos/cloud_test_demo/oc_lwm2m_demo.c}
    	endif
    

    添加位置如下:

    配置.sdkconfig

    上报数据实验结果

    编译,下载,在云端的实验现象如下:

    在串口助手中可以看到:

    命令下发实验结果

    在云端下发“on”命令:

    在串口助手中可以看到:

    下发“off”命令:

    在串口助手中可以看到:

  • 相关阅读:
    Python多版本共存
    Windows下安装glumy过程
    安卓手机刷机
    动态规划学习
    Linux下载源
    背包问题扩展
    mongol学习
    云爬虫测试
    arc的安装
    Centos
  • 原文地址:https://www.cnblogs.com/bearpi/p/12383284.html
Copyright © 2020-2023  润新知