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.0\iot_link\oc\oc_lwm2m\boudica150_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= 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”命令:
在串口助手中可以看到: