文档章节

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

 小熊派开源社区
发布于 02/27 09:27
字数 1068
阅读 134
收藏 0

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

在串口助手中可以看到:

© 著作权归作者所有

粉丝 1
博文 27
码字总数 46983
作品 0
南京
私信 提问
加载中

评论(0)

物联网操作系统华为超轻量LiteOS解读

物联网终端设备开发遇到瓶颈 物联网经过这些年的发展,在终端设备开发中显现出诸多问题。 1、终端设备需要低成本、低功耗。由于多为小型便携产品,因而电池寿命和硬件成本就成了关键问题,降...

linuxCool
2018/09/29
271
0
解码超轻量的华为LiteOS:为什么IoT需要专门的OS?

IoT设备真的需要OS吗?这是个问题。 物联网(IoT)作为拥有千亿级设备连接量的庞大市场,已经远超PC和移动手机市场体量。国内巨头在物联网平台已然较量了多个回合,而在此过程中,操作系统也...

王金旺
2018/09/01
0
0
华为物联网操作系统 - LiteOS

Huawei LiteOS 是华为面向IoT领域,构建的"统一物联网操作系统和中间件软件平台",以轻量级(内核小于10k)、低功耗(1节5号电池最多可以工作5年),快速启动,互联互通,安全等关键能力,为...

匿名
2016/11/15
4.4W
9
豌豆机器小组发布最新 WRTnode2R,支持华为 Liteos、QQ物联与AllJoyn

5月26日,WRTnode在官方微博简单地曝光了新产品——WRTnode2R开发板。它在继续使用OpenWrt的同时,还嵌入了华为刚发布不久的物联网操作系统Liteos,封装了QQ物联的部分功能,并支持AllJoyn协...

观海yangquan
2015/06/09
5K
3
21页报告解密华为鸿蒙系统,七年沉淀、称霸IoT时代的野心

上周,华为于开发者大会发布基于微内核的全场景分布式鸿蒙操作系统,同时宣布方舟编译器开源。从技术角度看,操作系统作为管理分配硬件资源、实现应用软件功能的重要载体,技术含金量之高决定...

程序师
前天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python什么情况下会生成pyc文件?

作为Python爱好者,需要了解.py脚本的基本运行机制及特性: 在很多工作上Python的运行流程基本上取决于用户,因此源码不需要编译成二进制代码(否则无法实现大部分贴近用户的特性),而直接从...

Python圈子
27分钟前
21
0
Python正则表达式,这一篇就够了!

之前我们讲解了 正则表达式语法与引擎 的起源、发展、流派、语法、引擎、优化等相关知识,今天我们主要来学习一下 正则表达式在 Python语言 中的应用! 大多数编程语言的正则表达式设计都师从...

猪哥66
29分钟前
21
0
linux chattr命令的使用

chattr命令用来改变文件属性。这项指令可改变存放在ext2文件系统上的文件或目录属性 , 用chattr命令防止系统中某个关键文件被修改 添加属性i:不得任意更动文件或目录。 chattr +i /home/ww...

imzchloe
29分钟前
19
0
基于三维GIS技术的符号化表达系统的设计及实现

随着三维GIS技术的发展,人们在其可视化能力方面要求不断提高,在部分应用中,人们不仅要求将场景中物体位置准确描述表达出来,同时还需要保证其逼真性和美观性在智慧城市阶段,三维GIS的构建...

ZTMAP
32分钟前
15
0
技术分享 | 排序(filesort)详细解析(8000 字长文)

作者:高鹏(网名八怪) 文章末尾有他著作的《深入理解 MySQL 主从原理 32 讲》,深入透彻理解 MySQL 主从,GTID 相关技术知识。 本文来源:转载自公众号-老叶茶馆 *爱可生开源社区出品,原创...

爱可生
35分钟前
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部