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模組的OCLWM2MAL實現

因爲NB模組可以直接使用AT命令對接華爲雲平臺,所以直接使用AT框架實現LiteOS OCLWM2MAL層,源碼在SDK中的IoT_LINK_1.0.0iot_linkococ_lwm2mboudica150_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 \n\r",led_cmd->msgid,led_cmd->led);
                    
                    if (led_cmd->led[0] == 'o' && led_cmd->led[1] == 'n')
                    {
                        printf("--------------- LED ON! --------------------\r\n");
                    }

                    else if (led_cmd->led[0] == 'o' && led_cmd->led[1] == 'f' && led_cmd->led[2] == 'f')
                    {
                        printf("--------------- LED OFF! --------------------\r\n");
                    }
                    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= lux000;

            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”命令:

在串口助手中可以看到:

發佈了50 篇原創文章 · 獲贊 2 · 訪問量 5582
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章