BearPi-HM_Nano(Hi3861)上云端对接华为云IOT过程【华为云IoT+鸿蒙】

举报
DS小龙哥 发表于 2023/08/31 21:14:42 2023/08/31
【摘要】 BearPi-HM Nano开发板是一款功能齐全、易于使用、专门为HarmonyOS设计的开发板,适合用于开发基于HarmonyOS的应用程序。这篇文章演示在BearPi-HM_Nano开发板上使用MQTT协议连接华为IoT平台,使用的是E53_IA1 智慧农业扩展板与 BearPi-HM_Nano 开发板实现。

一、前言

BearPi-HM Nano开发板是一款功能齐全、易于使用、专门为HarmonyOS设计的开发板,适合用于开发基于HarmonyOS的应用程序。板载NFC电路及标准的E53接口,标准的E53接口可扩展智能加湿器、智能台灯、智能安防、智能烟感等案例。 主控MCU是Hi3861,Hi3861芯片是一款高度集成的2.4GHz WLAN SoC芯片,专门为物联网应用而设计。集成了高性能的CPU、2.4GHz无线基带和射频前端以及多种外设接口,如UART、SPI、I2C、GPIO等,可以满足各种物联网设备的需求。

这篇文章演示在BearPi-HM_Nano开发板上使用MQTT协议连接华为IoT平台,使用的是E53_IA1 智慧农业扩展板与 BearPi-HM_Nano 开发板实现。

image-20230901145647648

下面是BearPi-HM Nano开发板的功能图介绍:

image-20230901115155861

image-20230901115218139

二、开通华为云物联网平台

在进行开发板环境搭建之前,先开通物联网平台,创建一个产品方便设备上云测试。

华为云官网: https://www.huaweicloud.com/

打开官网,搜索物联网,就能快速找到 设备接入IoTDA

image-20221204193824815

2.1 物联网平台介绍

华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助我们快速构筑物联网解决方案。

使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。

物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。

设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。

业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。

img

2.2 开通物联网服务

地址: https://www.huaweicloud.com/product/iothub.html

image-20221204194233414

进来默认会提示开通标准版,在2023的1月1号年之后没有基础版了。

image-20230313171311582

image-20230313171325183

开通之后,点击总览,查看接入信息。 我们当前设备准备采用MQTT协议接入华为云平台,这里可以看到MQTT协议的地址和端口号等信息。

image-20230321154943337

总结:

端口号:   MQTT (1883)| MQTTS (8883)   
接入地址: 7445c6bcd3.st1.iotda-app.cn-north-4.myhuaweicloud.com

根据域名地址得到IP地址信息:

Microsoft Windows [版本 10.0.19044.2728]
(c) Microsoft Corporation。保留所有权利。

C:\Users\11266>ping 7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com

正在 Ping 7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字节的数据:
来自 117.78.5.125 的回复: 字节=32 时间=42ms TTL=30
来自 117.78.5.125 的回复: 字节=32 时间=35ms TTL=30
来自 117.78.5.125 的回复: 字节=32 时间=36ms TTL=30
来自 117.78.5.125 的回复: 字节=32 时间=36ms TTL=30

117.78.5.125 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 35ms,最长 = 42ms,平均 = 37ms

C:\Users\11266>

image-20230321161044723

MQTT协议接入端口号有两个,1883是非加密端口,8883是证书加密端口,单片机无法加载证书,所以使用1883端口比较合适。 接下来的ESP8266就采用1883端口连接华为云物联网平台。

2.3 创建产品

(1)创建产品

点击产品页,再点击左上角创建产品。

image-20230313171503547

(2)填写产品信息

根据自己产品名字填写。

image-20230728110839855

(3)产品创建成功

image-20230728110854861

(4)添加自定义模型

产品创建完成之后,点击进入产品详情页面,翻到最下面可以看到模型定义。

先点击自定义模型。

image-20230313171815860

再创建一个服务ID。

image-20230321155733514

接着点击新增属性。

image-20230321155756735

2.4 添加设备

产品是属于上层的抽象模型,接下来在产品模型下添加实际的设备。添加的设备最终需要与真实的设备关联在一起,完成数据交互。

(1)注册设备

image-20230313173158883

(2)根据自己的设备填写

image-20230728110745853

(3)保存设备信息

创建完毕之后,点击保存并关闭,得到创建的设备密匙信息。该信息在后续生成MQTT三元组的时候需要使用。

image-20230321160252288

(4) 设备创建完成

image-20230728110819739

2.5 MQTT协议主题订阅与发布

(1)MQTT协议介绍

当前的设备是采用MQTT协议与华为云平台进行通信。

MQTT是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。目前MQTT拥有各种平台和设备上的客户端,已经形成了初步的生态系统。

MQTT是一种消息队列协议,使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合,相对于其他协议,开发更简单;MQTT协议是工作在TCP/IP协议上;由TCP/IP协议提供稳定的网络连接;所以,只要具备TCP协议栈的网络设备都可以使用MQTT协议。 本次设备采用的ESP8266就具备TCP协议栈,能够建立TCP连接,所以,配合STM32代码里封装的MQTT协议,就可以与华为云平台完成通信。

华为云的MQTT协议接入帮助文档在这里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

img

业务流程:

img

(2)华为云平台MQTT协议使用限制

描述 限制
支持的MQTT协议版本 3.1.1
与标准MQTT协议的区别 支持Qos 0和Qos 1支持Topic自定义不支持QoS2不支持will、retain msg
MQTTS支持的安全等级 采用TCP通道基础 + TLS协议(最高TLSv1.3版本)
单帐号每秒最大MQTT连接请求数 无限制
单个设备每分钟支持的最大MQTT连接数 1
单个MQTT连接每秒的吞吐量,即带宽,包含直连设备和网关 3KB/s
MQTT单个发布消息最大长度,超过此大小的发布请求将被直接拒绝 1MB
MQTT连接心跳时间建议值 心跳时间限定为30至1200秒,推荐设置为120秒
产品是否支持自定义Topic 支持
消息发布与订阅 设备只能对自己的Topic进行消息发布与订阅
每个订阅请求的最大订阅数 无限制

(3)主题订阅格式

帮助文档地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

image-20221207153310037

对于设备而言,一般会订阅平台下发消息给设备 这个主题。

设备想接收平台下发的消息,就需要订阅平台下发消息给设备 的主题,订阅后,平台下发消息给设备,设备就会收到消息。

如果设备想要知道平台下发的消息,需要订阅上面图片里标注的主题。

以当前设备为例,最终订阅主题的格式如下:
$oc/devices/{device_id}/sys/messages/down

最终的格式:
$oc/devices/6419627e40773741f9fbdac7_dev1/sys/messages/down

(4)主题发布格式

对于设备来说,主题发布表示向云平台上传数据,将最新的传感器数据,设备状态上传到云平台。

这个操作称为:属性上报。

帮助文档地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html

image-20221207153637391

根据帮助文档的介绍, 当前设备发布主题,上报属性的格式总结如下:

发布的主题格式:
$oc/devices/{device_id}/sys/properties/report
 
最终的格式:
$oc/devices/6419627e40773741f9fbdac7_dev1/sys/properties/report
发布主题时,需要上传数据,这个数据格式是JSON格式。

上传的JSON数据格式如下:

{
  "services": [
    {
      "service_id": <填服务ID>,
      "properties": {
        "<填属性名称1>": <填属性值>,
        "<填属性名称2>": <填属性值>,
        ..........
      }
    }
  ]
}
根据JSON格式,一次可以上传多个属性字段。 这个JSON格式里的,服务ID,属性字段名称,属性值类型,在前面创建产品的时候就已经介绍了,不记得可以翻到前面去查看。

根据这个格式,组合一次上传的属性数据:
{"services": [{"service_id": "stm32","properties":{"DS18B20":18,"motor_water":1,"motor_oxygen":1,"temp_max":10,"water_hp":130,"motor_food":0,"time_food":0,"oxygen_food":3}}]}

2.6 MQTT三元组

MQTT协议登录需要填用户ID,设备ID,设备密码等信息,就像我们平时登录QQ,微信一样要输入账号密码才能登录。MQTT协议登录的这3个参数,一般称为MQTT三元组。

接下来介绍,华为云平台的MQTT三元组参数如何得到。

(1)MQTT服务器地址

要登录MQTT服务器,首先记得先知道服务器的地址是多少,端口是多少。

帮助文档地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home

image-20230302135718882

MQTT协议的端口支持1883和8883,它们的区别是:8883 是加密端口更加安全。但是单片机上使用比较困难,所以当前的设备是采用1883端口进连接的。

根据上面的域名和端口号,得到下面的IP地址和端口号信息: 如果设备支持填写域名可以直接填域名,不支持就直接填写IP地址。 (IP地址就是域名解析得到的)

华为云的MQTT服务器地址:114.116.232.138
域名:7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com
华为云的MQTT端口号:1883

(2)生成MQTT三元组

华为云提供了一个在线工具,用来生成MQTT鉴权三元组: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

打开这个工具,填入设备的信息(也就是刚才创建完设备之后保存的信息),点击生成,就可以得到MQTT的登录信息了。

下面是打开的页面:

image-20221207154917230

填入设备的信息: (上面两行就是设备创建完成之后保存得到的)

直接得到三元组信息。

image-20230321160708924

image-20230321160718302

得到三元组之后,设备端通过MQTT协议登录鉴权的时候,填入参数即可。

ClientId 6419627e40773741f9fbdac7_dev1_0_0_2023032108
Username 6419627e40773741f9fbdac7_dev1
Password 861ac9e6a579d36888b2aaf97714be7af6c77017b017162884592bd68b086a6e

3.7 模拟设备登录测试

经过上面的步骤介绍,已经创建了产品,设备,数据模型,得到MQTT登录信息。 接下来就用MQTT客户端软件模拟真实的设备来登录平台。测试与服务器通信是否正常。

(1)填入登录信息

打开MQTT客户端软件,对号填入相关信息(就是上面的文本介绍)。然后,点击登录,订阅主题,发布主题。

image-20230321161132971

(2)打开网页查看

完成上面的操作之后,打开华为云网页后台,可以看到设备已经在线了。

点击详情页面,可以看到上传的数据。

到此,云平台的部署已经完成,设备已经可以正常上传数据了。

三、BearPi-HM_Nano开发板环境搭建

3.1 环境介绍

在嵌入式开发中,很多开发者习惯于使用Windows进行代码编辑、编译、调试下载。比如,使用keil、IAR、或者Visual Studio Code等IDE。

但当前阶段,OpenHarmony源码还不支持在Windows环境下进行编译,如Hi3861、Hi3516系列开发板。需要在Linux系统下进行,建议使用Ubuntu的编译环境对源码进行编译。

搭建Ubuntu系统的开发环境也相对比较麻烦的,需要安装很多的库,可能遇到网络问题或者Ubuntu系统本身仓库源的问题导致下载不下来,等等的各种问题。对Linux不熟悉的初学者可能就有点头大。

在官方的教程里提供了两种方式快速搭建环境。

(1)自己安装虚拟机、安装Ubuntu系统、然后根据教程进行安装各种库,完成编译环境的搭建。

(2)自己安装虚拟机,下载官方的镜像,解压直接打开运行。–这种就是最简单的,相当于把别人搭建好环境的电脑直接搬过来用,不用管环境搭建问题了,是最方便的。

教程地址:https://gitee.com/bearpi/bearpi-hm_nano/blob/master/applications/BearPi/BearPi-HM_Nano/docs/quick-start/BearPi-HM_Nano%E5%8D%81%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8B.md

3.2 下载所需镜像

3.3 运行Ubuntu系统

(1)要先安装虚拟机VMware Workstation,安装最新版即可。

(2)解压百度云下载的HarmonyOSUbuntu18.4镜像OVF.zip文件到某个目录。

在这里插入图片描述

(3)打开VMware Workstation工具

img

(4)选择第2步解压的Ubuntu18.4镜像OVF文件夹中,点击打开

在这里插入图片描述

(5)导入镜像到本地磁盘(选择一个磁盘空间大小≥ 10G的盘),点击导入

在这里插入图片描述

(6)点击开启此虚拟机,来开启虚拟机电源
在这里插入图片描述

(7)此时虚拟机进入登录界面,点击HarmonyOS
在这里插入图片描述

(8)输入密码:bearpi,然后点击登录

在这里插入图片描述

(9)进入桌面后,点击桌面空白处右键,点击打开终端(E)

在这里插入图片描述

  1. 在终端中输入ifconfig,然后点击回车,除lo外,另外一个就是你的网卡信息,记录你获取到的IP地址。
    在这里插入图片描述

(11)最小化VMware Workstation,回到Windows桌面上。

(12)附加:如果连不上网络 在VMware Workstation中,点击虚拟机>> 设置

在这里插入图片描述

然后在网络适配器中,改成NAT 模式,点击确定

img

然后再恢复步骤9

3.4 在Windows上远程连接服务器

(1)打开MobaXterm工具,并依次点击:SessionSSH 按钮。

在这里插入图片描述

(2)输入连接信息,远程地址,并点击OK
在这里插入图片描述

(3)输入账号:bearpi,点击回车

在这里插入图片描述

(4)输入密码:bearpi,注意,输入密码的时候屏幕不会显示,输完之后点击回车在这里插入图片描述

(5)在弹出的界面上,点击Yes保存账号信息,以免下次输入

在这里插入图片描述

3.5 把ubuntu文件远程映射到Windows上

(1)安装RaiDrive软件

根据提示,点击下一步安装,全部选项默认。

(2)切换为中文语言

img

(3)添加链接信息

  • 取消勾选只读
  • SFTP://______ 输入前面获取到的IP地址
  • 账户:账号和密码皆为 bearpi
  • 其他默认
  • 点击确定

img

(4)查看本地映射的ubuntu文件路径

在这里插入图片描述

3.6 在ubuntu获取源码

(1)鼠标焦点移到MobaXterm

(2)在MobaXterm中输入:

cd /home/bearpi

然后回车

(3)在MobaXterm中输入:

mkdir project && cd project

然后回车

(4)在MobaXterm中输入:

hpm init -t default

然后回车

(5)在MobaXterm中输入:

hpm i @bearpi/bearpi_hm_nano

然后回车,等待1-3分钟(根据不同网速)

(6)当屏幕中出现Installed.意味着代码获取完成

在这里插入图片描述

源码也可以直接在Gitee上直接下载。通过git clone单个代码仓库,进入代码仓库主页:https://gitee.com/bearpi/bearpi-hm_nano,选择需要克隆的代码仓库,执行命令,如:

git clone https://gitee.com/bearpi/bearpi-hm_nano.git -b master

image-20230901143951252

执行以下命令编译源码

python build.py BearPi-HM_Nano

3.7 编译代码

(1)在MobaXterm中输入:

hpm dist

然后回车,等待直到屏幕出现:BUILD SUCCESS字样,说明编译成功。

(2)查看编译出的固件位置

当编译完后,在Windows中可以直接查看到最终编译的固件,具体路径在:

在这里插入图片描述

3.8 连接开发板

(1)通过TypeC数据线,把电脑与BearPi-HM Nano连接。

(2)安装CH340驱动。

(3)如果虚拟机把USB给抢占进去了,可以先挂起虚拟机,重新拔插USB。

(4)查看开发板的串口

在这里插入图片描述

3.9 下载程序

(1)在Windows打开Hiburn工具,并点击Refresh,在COM中选择第八-4看到的COM号

在这里插入图片描述

然后点击Setting,并选择 Com settings

(2)在Com settings中设置Baud为:921600,点击确定

img

(3)点击 Hiburn工具中的Select file按钮,选中:Hi3861_wifiiot_app_allinone.bin 文件。

在这里插入图片描述

(4)点击Auto burn复选框,然后点击Connect

在这里插入图片描述

此时Connect按钮变成Disconnect,等待下载

(5)复位开发板RESET按键,开始下载程序

在这里插入图片描述在这里插入图片描述

(6)直到出现Execution Successful字样,程序下载完成。

(7)下载完后,点击Disconnect按钮,便于后面调测使用。

3.10 MobaXterm 查看串口打印日志

(1)打开MobaXterm,

(2)点击:SessionSerial按钮

(3)设置Seral port为 Hiburn 同一个串口

(4)设置Speed为 115200

(5)点击OK

在这里插入图片描述

(6)复位开发板,此时COM打印出对应日志信息

在这里插入图片描述

四、连接华为云IOT平台

4.1 MQTT相关函数功能介绍

(1)设置设备信息
void device_info_init(char *client_id, char * username, char *password);
设置设备信息,在调用oc_mqtt_init()前要先设置设备信息

(2)华为IoT平台 初始化
int oc_mqtt_init(void);
华为IoT平台初始化函数,需要在使用 华为IoT平台 功能前调用。

(3)设置命令响应函数
void oc_set_cmd_rsp_cb(void(*cmd_rsp_cb)(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size));
设置命令响应回调函数。


(4)设备消息上报
int oc_mqtt_profile_msgup(char *deviceid,oc_mqtt_profile_msgup_t *payload);
是指设备无法按照产品模型中定义的属性格式进行数据上报时,可调用此接口将设备的自定义数据上报给平台,平台将设备上报的消息转发给应用服务器或华为云其他云服务上进行存储和处理。


(5)设备上报属性数据
int oc_mqtt_profile_propertyreport(char *deviceid,oc_mqtt_profile_service_t *payload);
用于设备按产品模型中定义的格式将属性数据上报给平台。


(6)网关批量上报属性数据
int oc_mqtt_profile_gwpropertyreport(char *deviceid,oc_mqtt_profile_device_t *payload);
用于批量设备上报属性数据给平台。网关设备可以用此接口同时上报多个子设备的属性数据。


(7)属性设置的响应结果
int oc_mqtt_profile_propertysetresp(char *deviceid,oc_mqtt_profile_propertysetresp_t *payload);

(8)
属性查询响应结果
int oc_mqtt_profile_propertygetresp(char *deviceid,oc_mqtt_profile_propertygetresp_t *payload);


(9)将命令的执行结果返回给平台
int oc_mqtt_profile_cmdresp(char *deviceid,oc_mqtt_profile_cmdresp_t *payload); 平台下发命令后,需要设备及时将命令的执行结果返回给平台,如果设备没回响应,平台会认为命令执行超时。

4.2 连接平台

在连接平台需要在device_info_init函数里填入CLIENT_ID、USERNAME、PASSWORD。这个信息前面第2章节已经介绍了。

WifiConnect("da_666","12345678");
device_info_init(CLIENT_ID,USERNAME,PASSWORD);
oc_mqtt_init();
oc_set_cmd_rsp_cb(oc_cmd_rsp_cb);

修改iot_cloud_oc_sample.c文件。

image-20230901145234245

4.3 上传数据

当需要上传数据时,需要先拼装数据,然后通过oc_mqtt_profile_propertyreport上报数据。

代码示例如下:

static void deal_report_msg(report_t *report)
{
    oc_mqtt_profile_service_t    service;
    oc_mqtt_profile_kv_t         temperature;
    oc_mqtt_profile_kv_t         humidity;
    oc_mqtt_profile_kv_t         luminance;
    oc_mqtt_profile_kv_t         led;
    oc_mqtt_profile_kv_t         motor;


    service.event_time = NULL;
    service.service_id = "Agriculture";
    service.service_property = &temperature;
    service.nxt = NULL;

    temperature.key = "Temperature";
    temperature.value = &report->temp;
    temperature.type = EN_OC_MQTT_PROFILE_VALUE_INT;
    temperature.nxt = &humidity;

    humidity.key = "Humidity";
    humidity.value = &report->hum;
    humidity.type = EN_OC_MQTT_PROFILE_VALUE_INT;
    humidity.nxt = &luminance;

    luminance.key = "Luminance";
    luminance.value = &report->lum;
    luminance.type = EN_OC_MQTT_PROFILE_VALUE_INT;
    luminance.nxt = &led;

    led.key = "LightStatus";
    led.value = g_app_cb.led?"ON":"OFF";
    led.type = EN_OC_MQTT_PROFILE_VALUE_STRING;
    led.nxt = &motor;

    motor.key = "MotorStatus";
    motor.value = g_app_cb.motor?"ON":"OFF";
    motor.type = EN_OC_MQTT_PROFILE_VALUE_STRING;
    motor.nxt = NULL;

    oc_mqtt_profile_propertyreport(USERNAME,&service);
    return;
}

4.4 云平台下发的命令接收

华为IoT平台支持下发命令,命令是用户自定义的。接收到命令后会将命令数据发送到队列中,task_main_entry函数中读取队列数据并调用deal_cmd_msg函数进行处理,代码示例如下:

void oc_cmd_rsp_cb(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size)
{
	app_msg_t *app_msg;

	int    ret = 0;
	app_msg = malloc(sizeof(app_msg_t));
	app_msg->msg_type = en_msg_cmd;
	app_msg->msg.cmd.payload = (char *)recv_data;

    printf("recv data is %.*s\n", recv_size, recv_data);
    ret = osMessageQueuePut(mid_MsgQueue,&app_msg,0U, 0U);
    if(ret != 0){
        free(recv_data);
    }
    *resp_data = NULL;
    *resp_size = 0;
}
static int task_main_entry( void )
{
    app_msg_t *app_msg;

	WifiConnect("TP-LINK_65A8","0987654321");
	device_info_init(CLIENT_ID,USERNAME,PASSWORD);
	oc_mqtt_init();
	oc_set_cmd_rsp_cb(oc_cmd_rsp_cb);

    while(1){
        app_msg = NULL;
        (void)osMessageQueueGet(mid_MsgQueue,(void **)&app_msg,NULL, 0U);
        if(NULL != app_msg){
            switch(app_msg->msg_type){
                case en_msg_cmd:
                    deal_cmd_msg(&app_msg->msg.cmd);
                    break;
                case en_msg_report:
                    deal_report_msg(&app_msg->msg.report);
                    break;
                default:
                    break;
            }
            free(app_msg);
        }
    }
    return 0;
}
static void deal_cmd_msg(cmd_t *cmd)
{
    cJSON *obj_root;
    cJSON *obj_cmdname;
    cJSON *obj_paras;
    cJSON *obj_para;

    int cmdret = 1;
    oc_mqtt_profile_cmdresp_t  cmdresp;
    obj_root = cJSON_Parse(cmd->payload);
    if(NULL == obj_root){
        goto EXIT_JSONPARSE;
    }

    obj_cmdname = cJSON_GetObjectItem(obj_root,"command_name");
    if(NULL == obj_cmdname){
        goto EXIT_CMDOBJ;
    }
    if(0 == strcmp(cJSON_GetStringValue(obj_cmdname),"Agriculture_Control_light")){
        obj_paras = cJSON_GetObjectItem(obj_root,"paras");
        if(NULL == obj_paras){
            goto EXIT_OBJPARAS;
        }
        obj_para = cJSON_GetObjectItem(obj_paras,"Light");
        if(NULL == obj_para){
            goto EXIT_OBJPARA;
        }
        ///< operate the LED here
        if(0 == strcmp(cJSON_GetStringValue(obj_para),"ON")){
            g_app_cb.led = 1;
            Light_StatusSet(ON);
            printf("Light On!");
        }
        else{
            g_app_cb.led = 0;
            Light_StatusSet(OFF);
            printf("Light Off!");
        }
        cmdret = 0;
    }
    else if(0 == strcmp(cJSON_GetStringValue(obj_cmdname),"Agriculture_Control_Motor")){
        obj_paras = cJSON_GetObjectItem(obj_root,"Paras");
        if(NULL == obj_paras){
            goto EXIT_OBJPARAS;
        }
        obj_para = cJSON_GetObjectItem(obj_paras,"Motor");
        if(NULL == obj_para){
            goto EXIT_OBJPARA;
        }
        ///< operate the Motor here
        if(0 == strcmp(cJSON_GetStringValue(obj_para),"ON")){
            g_app_cb.motor = 1;
            Motor_StatusSet(ON);
            printf("Motor On!");
        }
        else{
            g_app_cb.motor = 0;
            Motor_StatusSet(OFF);
            printf("Motor Off!");
        }
        cmdret = 0;
    }

EXIT_OBJPARA:
EXIT_OBJPARAS:
EXIT_CMDOBJ:
    cJSON_Delete(obj_root);
EXIT_JSONPARSE:
    ///< do the response
    cmdresp.paras = NULL;
    cmdresp.request_id = cmd->request_id;
    cmdresp.ret_code = cmdret;
    cmdresp.ret_name = NULL;
    (void)oc_mqtt_profile_cmdresp(NULL,&cmdresp);
    return;
}

4.6 平台地址修改

据自己使用的平台版本修改oc_mqtt.h中第47行附近的平台对接地址。

这个根据自己的产品确定,2023年1月1日新开通的都是标准版了。

image-20230901145035363

#ifndef LITEOS_LAB_IOT_LINK_OC_OC_MQTT_OC_MQTT_PROFILE_OC_MQTT_PROFILE_H_
#define LITEOS_LAB_IOT_LINK_OC_OC_MQTT_OC_MQTT_PROFILE_OC_MQTT_PROFILE_H_

#include <stdint.h>


#define OC_SERVER_URL              "tcp://183.230.40.39:6002"

// #define OC_SERVER_IP                "121.36.42.100"         //基础版平台对接地址
#define OC_SERVER_IP                "117.78.5.125"          //标准版平台对接地址

#define OC_SERVER_PORT              1883
#define OC_CLIENT_ID_LEN          128
#define OC_USERNAME_LEN         128
#define OC_PASSWORD_LEN          128

4.7 编译、烧写代码

代码修改之后编译烧录,按下开发板的RESET按键,通过串口助手查看日志,会打印温湿度及光照强度信息,打开云平台的后台可以看到设备已经在线。



我正在参加【有奖征文 第25期】深度体验OpenHarmony对接华为云IoT,输出优质体验文章,赢开发者定制大礼包!https://bbs.huaweicloud.com/blogs/406570

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。