发 帖  
原厂入驻New
LiteOS云端对接教程10-LiteOS使用NB模组基于LWM2M对接华为OC平台实战
2020-2-27 09:34:32  501 单片机 华为云 Liteos 小熊派BearPi 嵌入式
分享
本帖最后由 小熊派开源社区 于 2020-2-27 09:42 编辑

1. 在云端添加测试设备

打开之前教程新建的LWM2M产品,进入设备管理界面新建真实设备,设备标识符要填写NB模组的IMEI号,可以使用如下命令查看:
  1. AT+CGSN=1
复制代码
测试结果如下:
  1. +CGSN:867725038317248

  2. OK
复制代码
获取到IMEI号之后创建设备:
创建之后会自动进入调试界面,接下来开始调试。

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

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

设置自动注册模式

使用该命令设置模组开机后自动注册到华为云平台:
  1. AT+QREGSWT=1
复制代码
使用该命令设置服务器的ip和端口:
  1. AT+NCDP=49.4.85.232,5683
复制代码
华为云平台LWM2M对接信息可以在平台上查看:

重启模组

第一步设置了模组开机自动连接云平台,所以使用如下命令重启模组:
  1. AT+NRB
复制代码
复位后可以看到设备已经上线:

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

  2. +QLWEVTIND:3
复制代码
这两个信息表示 设备成功注册,IoT平台已观察到对象19,当模块报告此消息时,数据可以发送到 IoT 平台。

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

使用如下指令向华为云平台发送数据,模拟亮度值上报:
在云端可以看到模组上报的数据:

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

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

可以在串口助手中看到如下信息:
  1. +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文件。
编写以下代码:
  1. #include <osal.h>
  2. #include <oc_lwm2m_al.h>
  3. #include <link_endian.h>
  4. #include <string.h>

  5. #define cn_endpoint_id        "867725038317248"
  6. #define cn_app_server         "49.4.85.232"
  7. #define cn_app_port           "5683"

  8. #define cn_app_light           0
  9. #define cn_app_LEDcmd          1

  10. #pragma pack(1)

  11. typedef struct
  12. {
  13.     int8_t msgid;
  14.     int16_t intensity;
  15. }app_light_intensity_t;


  16. typedef struct
  17. {
  18.     int8_t msgid;
  19.     char led[3];
  20. }app_led_cmd_t;

  21. #pragma pack()

  22. #define cn_app_rcv_buf_len 128
  23. static int8_t          s_rcv_buffer[cn_app_rcv_buf_len];
  24. static int             s_rcv_datalen;
  25. static osal_semp_t     s_rcv_sync;

  26. static void           *s_lwm2m_handle = NULL;

  27. static int app_msg_deal(void *usr_data,en_oc_lwm2m_msg_t type, void *msg, int len)
  28. {
  29.     int ret = -1;

  30.     IF(len <= cn_app_rcv_buf_len)
  31.     {
  32.         memcpy(s_rcv_buffer,msg,len);
  33.         s_rcv_datalen = len;

  34.         osal_semp_post(s_rcv_sync);

  35.         ret = 0;

  36.     }
  37.     return ret;
  38. }


  39. static int app_cmd_task_entry()
  40. {
  41.     int ret = -1;
  42.     app_led_cmd_t *led_cmd;
  43.     int8_t msgid;

  44.     while(1)
  45.     {
  46.         if(osal_semp_pend(s_rcv_sync,cn_osal_timeout_forever))
  47.         {
  48.             msgid = s_rcv_buffer[0];
  49.             switch (msgid)
  50.             {
  51.                 case cn_app_ledcmd:
  52.                     led_cmd = (app_led_cmd_t *)s_rcv_buffer;
  53.                     printf("LEDCMD:msgid:%d msg:%s \n\r",led_cmd->msgid,led_cmd->led);
  54.                     
  55.                     if (led_cmd->led[0] == 'o' && led_cmd->led[1] == 'n')
  56.                     {
  57.                         printf("--------------- LED ON! --------------------\r\n");
  58.                     }

  59.                     else if (led_cmd->led[0] == 'o' && led_cmd->led[1] == 'f' && led_cmd->led[2] == 'f')
  60.                     {
  61.                         printf("--------------- LED OFF! --------------------\r\n");
  62.                     }
  63.                     else
  64.                     {

  65.                     }
  66.                     break;
  67.                 default:
  68.                     break;
  69.             }
  70.         }
  71.     }

  72.     return ret;
  73. }



  74. static int app_report_task_entry()
  75. {
  76.     int ret = 0;
  77.     int lux = 0;

  78.     oc_config_param_t      oc_param;
  79.     app_light_intensity_t  light;

  80.     memset(&oc_param,0,sizeof(oc_param));

  81.     oc_param.app_server.address = cn_app_server;
  82.     oc_param.app_server.port = cn_app_port;
  83.     oc_param.app_server.ep_id = cn_endpoint_id;
  84.     oc_param.boot_mode = en_oc_boot_strap_mode_factory;
  85.     oc_param.rcv_func = app_msg_deal;

  86.     s_lwm2m_handle = oc_lwm2m_config(&oc_param);
  87.     if(NULL != s_lwm2m_handle)  
  88.     {
  89.         while(1)
  90.         {
  91.             lux++;
  92.             lux= lux%10000;

  93.             light.msgid = cn_app_light;
  94.             light.intensity = htons(lux);
  95.             oc_lwm2m_report(s_lwm2m_handle,(char *)&light,sizeof(light),1000);
  96.             osal_task_sleep(2*1000);
  97.         }
  98.     }

  99.     return ret;
  100. }

  101. int standard_app_demo_main()
  102. {
  103.     osal_semp_create(&s_rcv_sync,1,0);

  104.     osal_task_create("app_report",app_report_task_entry,NULL,0x1000,NULL,2);
  105.     osal_task_create("app_command",app_cmd_task_entry,NULL,0x1000,NULL,3);

  106.     return 0;
  107. }
复制代码
添加路径

在user_demo.mk中添加如下:
  1.         #example for oc_lwm2m_demo
  2.         ifeq ($(CONFIG_USER_DEMO), "oc_lwm2m_demo")        
  3.                 user_demo_src  = ${wildcard $(TOP_DIR)/targets/STM32L431_BearPi/Demos/cloud_test_demo/oc_lwm2m_demo.c}
  4.         endif
复制代码
添加位置如下:

配置.sdkconfig


上报数据实验结果

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

在串口助手中可以看到:

命令下发实验结果

在云端下发“on”命令:

在串口助手中可以看到:

下发“off”命令:

在串口助手中可以看到:




0
分享淘帖 显示全部楼层

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发资料
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表