本帖最后由 小熊派开源社区 于 2020-2-27 09:42 编辑
1. 在云端添加测试设备
打开之前教程新建的LWM2M产品,进入设备管理界面新建真实设备,设备标识符要填写NB模组的IMEI号,可以使用如下命令查看:
测试结果如下:获取到IMEI号之后创建设备:
创建之后会自动进入调试界面,接下来开始调试。
2. NB模组使用LWM2M直接对接华为云
BC35-G模组可以直接对接华为云平台,步骤如下。
设置自动注册模式
使用该命令设置模组开机后自动注册到华为云平台:
使用该命令设置服务器的ip和端口:华为云平台LWM2M对接信息可以在平台上查看:
重启模组
第一步设置了模组开机自动连接云平台,所以使用如下命令重启模组:
复位后可以看到设备已经上线:
在串口助手中可以看到,模组返回信息如下:
- +QLWEVtiND:0
- +QLWEVTIND:3
这两个信息表示 设备成功注册,IoT平台已观察到对象19,当模块报告此消息时,数据可以发送到 IoT 平台。
模组向华为云平台发送数据
使用如下指令向华为云平台发送数据,模拟亮度值上报:
在云端可以看到模组上报的数据:
模组接收华为云平台下发数据
在华为云平台点击下发命令“on”:
可以在串口助手中看到如下信息:
该信息表示模组从物联网平台接收的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_lwm2mboudica150_oc
目录下:
BC35-G设备配置
在工程目录中的OS_CONFIG/iot_link_config.h文件中,配置BC35-G设备的波特率和设备名称:
编写实验文件
在 Demo 文件夹下创建cloud_test_demo文件夹,在其中创建oc_lwm2m_demo.c文件。
编写以下代码:
- #include
- #include
- #include
- #include
- #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 nr",led_cmd->msgid,led_cmd->led);
-
- if (led_cmd->led[0] == 'o' && led_cmd->led[1] == 'n')
- {
- printf("--------------- LED ON! --------------------rn");
- }
- else if (led_cmd->led[0] == 'o' && led_cmd->led[1] == 'f' && led_cmd->led[2] == 'f')
- {
- printf("--------------- LED OFF! --------------------rn");
- }
- 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”命令:
在串口助手中可以看到: