3步体验在DAYU200开发板上完成OpenHarmony对接华为云IoT

一、前言

OpenHarmony 3.1.1 是一个开源的智能终端操作系统,主要用于智能家居、智能手机、平板电脑、智能穿戴设备等智能终端设备。是一个分布式操作系统,支持多种硬件平台和多种编程语言,可以方便地进行移植和定制。

特点:

(1) 分布式:支持分布式计算和分布式存储,可以在多个设备之间进行任务调度和数据共享。
(2)可裁剪:支持根据设备的需求进行裁剪,以满足不同设备的资源限制。
(3)安全:提供了安全机制,保护设备的隐私和安全。
(4)可移植:支持多种硬件平台和多种编程语言,可以方便地进行移植和定制。

当前文章介绍在DAYU200开发板上烧写OpenHarmony系统,利用huaweicloud-iot-device-sdk完成华为云IOT平台对接,完成物联网数据通信。

所需硬件:DAYU200开发板(RK3568)

二、DAYU200开发板

2.1 开发板介绍

基于Rockchip RK3568,集成双核心架构GPU以及高效能NPU;
板载四核64位Cortex-A55 处理器采用22nm先进工艺,主频高达2.0GHz;
支持蓝牙、Wi-Fi、音频、视频和摄像头等功能,拥有丰富的扩展接口,支持多种视频输入输出接口;
配置双千兆自适应RJ45以太网口,可满足NVR、工业网关等多网口产品需求。

2.2 开发板实物图

三、环境安装

3.1 串口终端

开发板插上串口线之后,打开设备管理器可以看到识别到串口COM8,这就是开发板的Debug串口。(需要提前安装好USB转串口驱动)。

打开串口工具,新建会话,选择串口协议。

波特率选择1500000也就是1.5M。

创建完成。

选择刚才创建好的会话,点击连接。

复位开发板(开发板上有一个RESET按钮),正常情况下会在终端上看到内核启动过程;启动完成后按下回车即可进入到Linux终端命令行。

从打印的命令行数据可以看出当前设备的配置:

这是uboot打印出来的配置信息。从当前信息里可以看出CPU型号RK3568,内存2GB。

U-Boot 2017.09-gb448fedf55-211210 #addy (Dec 20 2021 - 10:58:09 +0800)Model: Rockchip RK3568 Evaluation Board
PreSerial: 2, raw, 0xfe660000
DRAM:  2 GiB
Sysmem: init
Relocation Offset: 7d34d000
Relocation fdt: 7b9f87e8 - 7b9fecd0
CR: M/C/I
Using default environment

内核启动打印的信息;从信息里可以看出当前系统使用的内核是Linux 5.10内核。

Starting kernel ...[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x412fd050]
[    0.000000] Linux version 5.10.79 (root@ecs-58f4) (aarch64-linux-gnu-gcc (Linaro GCC 7.5-2019.12) 7.5.0, GNU ld (Linaro_Binutils-2019.12) 2.28.2.20170706) #1 SMP Thu Jun 29 09:39:49 CST 2023
[    0.000000] Machine model: rockchip,rk3568-toybrick-dev-linux-x0
[    0.000000] earlycon: uart8250 at MMIO32 0x00000000fe660000 (options '')
[    0.000000] printk: bootconsole [uart8250] enabled
[    0.000000] Zone ranges:
[    0.000000]   DMA      [mem 0x0000000000200000-0x000000007fffffff]
[    0.000000]   DMA32    empty
[    0.000000]   Normal   empty
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges

在串口软件上可以设置终端类型,方便区分Linux终端文件类型。

3.2 固件烧写

说明文档:https://gitee.com/hihope_iot/docs/blob/master/HiHope_DAYU200/docs/%E7%83%A7%E5%BD%95%E6%8C%87%E5%AF%BC%E6%96%87%E6%A1%A3.md#https://gitee.com/link?target=http%3A%2F%2Fci.openharmony.cn%2Fdailys%2Fdailybuilds

【1】烧写工具下载

https://gitee.com/hihope_iot/docs/tree/master/HiHope_DAYU200/%E7%83%A7%E5%86%99%E5%B7%A5%E5%85%B7%E5%8F%8A%E6%8C%87%E5%8D%97

下来下来之后打开HiHope_DAYU200文件夹。

我这里在windows下进行烧写。

DriverAssitant_v5.1.1.zip目录下是USB驱动,解压后进行安装。如果已经安装旧版本的烧写工具, 需要先点击“驱动卸载” 按钮下载驱动, 然后再点击“驱动安装” 按钮安装驱动。

RKDevTool.exe就是烧写工具。

【2】HiHope官方固件下载

地址:https://gitee.com/hihope_iot/images/tree/master/HiHope_DAYU200

下载下来解压,打开烧写工具选择路径。

确认开发板是否进入烧写模式

(1)如果界面显示"发现一个 LOADER 设备", 说明开发板进入 Loader 模式等待烧写固件。

(2)如果界面显示"发现一个 MASKROM 设备", 说明开发板进入 Maskrom 模式等待烧写固 件。

(3)如果界面显示"没有发现设备", 说明开发板没有进入烧写模式, 需要先让开发板进入烧写模式

进入烧写模式的步骤

(1)先按住 VOL-/RECOVERY 按键 和 RESET 按钮不松开, 烧录工具此时显示“没有发现设备”

(2)然后再 松开 RESER 键, 烧录工具显示“发现一个 LOADER 设备” , 说明此时已经进入烧写模式。

3.3 huaweicloud-iot-device-sdk-c 介绍

说明文档:https://gitee.com/openharmony-sig/iot_device_sdk_c/blob/master/README_CN.md#5

Huawei Cloud IOT Device SDK for C 是华为云推出的一套面向嵌入式设备的物联网开发套件,支持 C 语言开发。该套件提供了一系列 API,可以方便地实现设备与云端的连接、数据上报、远程控制等功能。

该套件主要包括以下组件:

  • Huawei LiteOS:一个轻量级的操作系统,提供了内核级别的任务调度、内存管理、网络协议栈等功能。
  • Huawei Cloud IOT Agent:一个设备端的物联网代理程序,负责与云端的物联网平台进行连接,实现设备注册、数据上报、远程控制等功能。
  • Huawei Cloud IOT SDK for C:一个 C 语言的开发包,提供了一系列 API,可以方便地实现设备与云端的连接、数据上报、远程控制等功能。

使用 Huawei Cloud IOT Device SDK for C 可以大大简化物联网设备的开发流程,提高开发效率,同时也可以保证设备与云端之间的连接稳定性和安全性。该套件适用于各种类型的嵌入式设备,例如智能家居、智能家电、智能穿戴等。

Huawei Cloud IOT SDK for C SDK面向运算、存储能力较强的嵌入式终端设备,开发者通过调用SDK接口,便可实现设备与物联网平台的上下行通讯。SDK当前支持的功能有:

  • 支持物模型:设备消息/属性/事件上报,设备命令/消息/属性/事件接收
  • 支持子设备消息转发、子设备管理
  • 支持OTA升级
  • 支持密码认证和证书认证两种设备接入方式
  • 支持自定义topic
  • 支持设备影子查询
  • 支持自定义日志收集能力
  • 支持端侧规则引擎
  • 支持SSH远程登录
  • 支持对接边缘M2M

四、上云实验

4.1 物联网平台介绍

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

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

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

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

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

4.2 开通物联网服务

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

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

总结:

端口号: MQTT (1883)| MQTTS (8883)
接入地址: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com

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

Microsoft Windows [版本 10.0.19045.2965]
© Microsoft Corporation。保留所有权利。

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

4.3 创建产品

(1)创建产品

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

(2)填写产品信息

根据自己产品名字填写。

(3)产品创建成功

(4)添加自定义模型

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

这个模型就是定义自己设备接下来需要向服务器上传那些数据类型。根据自己的数据类型进行编写。

先点击自定义模型。

再创建一个服务ID。

接着点击新增属性。

4.4 添加设备

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

(1)注册设备

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

(3)保存设备信息

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

(4)设备创建完成

可以点击设备进入到设备详情页面。

4.5 OpenHarmony环境构建

在文件Harmony源码路径/build/subsystem_config.json中添加构建脚本:

"iot-device-sdk-c" : {
"path": "third\_party/iot-device-sdk-c",
"name": "iot-device-sdk-c"
},

(1)添加子系统编译构建

在文件OpenHarmony源码路径/build/subsystem_config.json中添加如下构建脚本:

"iot-device-sdk-c" : {
"path": "third\_party/iot-device-sdk-c",
"name": "iot-device-sdk-c"
},

在产品配置文件中添加子系统,其子系统名称与文件中添加内容对应,就是iot-device-sdk-c:iot-device-sdk-c

配置文件位于`MY_OHOS_

(2)编译依赖的动态库

此sdk主要依赖于libboundscheck.so,libpaho-mqtt3as.so,libssh.so,libnopoll.so这些动态库,其间接依赖于libz.so,libssl.so,libcrypto.so

(3)编译第三方动态库

对于libboundscheck.solibpaho-mqtt3as.solibssh.solibnopoll.so, 这些库对应的源码没有在OpenHarmony中集成,如果开发板中没有这些动态库,需要自行下载并编译。

执行以下命令拉取对应源码:

cd $MY\_OHOS\_DIR/third\_party/iot\_device\_sdk\_c
mkdir third\_party
cd third\_party
git clone https://gitee.com/Janisa/huawei\_secure\_c.git \\ && git clone -b v1.3.12 --single-branch https://github.com/eclipse/paho.mqtt.c.git  \\ && git clone -b libssh-0.9.6 --single-branch https://git.libssh.org/projects/libssh.git  \\ && git clone -b 0.4.8 --single-branch https://github.com/ASPLes/nopoll.git  \\

分别在OpenHarmony源码路径/third_party/iot_device_sdk_c/third_party/huawei_secure_c,OpenHarmony源码路径/third_party/iot_device_sdk_c/third_party/paho.mqtt.c, OpenHarmony源码路径/third_party/iot_device_sdk_c/third_party/libssh, OpenHarmony源码路径/third_party/iot_device_sdk_c/third_party/nopoll文件夹中放入或替换BUILD.gn文件,

内容如下:

\# 放入 $MY\_OHOS\_DIR/third\_party/iot\_device\_sdk\_c/third\_party/huawei\_secure\_c
#
# Copyright (c) \[2020\] Huawei Technologies Co.,Ltd.All rights reserved.
#
# OpenArkCompiler is licensed under the Mulan PSL v1.
# You can use this software according to the terms and conditions of the Mulan PSL v1.
# You may obtain a copy of Mulan PSL v1 at:
#
#     http://license.coscl.org.cn/MulanPSL
#
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR
# FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v1 for more details.
#
import("//build/ohos.gni")src\_libHWSecureC = \["src/vsprintf\_s.c","src/wmemmove\_s.c","src/strncat\_s.c","src/vsnprintf\_s.c","src/fwscanf\_s.c","src/scanf\_s.c","src/strcat\_s.c","src/sscanf\_s.c","src/secureprintoutput\_w.c","src/wmemcpy\_s.c","src/wcsncat\_s.c","src/secureprintoutput\_a.c","src/secureinput\_w.c","src/memcpy\_s.c","src/fscanf\_s.c","src/vswscanf\_s.c","src/secureinput\_a.c","src/sprintf\_s.c","src/memmove\_s.c","src/swscanf\_s.c","src/snprintf\_s.c","src/vscanf\_s.c","src/vswprintf\_s.c","src/wcscpy\_s.c","src/vfwscanf\_s.c","src/memset\_s.c","src/wscanf\_s.c","src/vwscanf\_s.c","src/strtok\_s.c","src/wcsncpy\_s.c","src/vfscanf\_s.c","src/vsscanf\_s.c","src/wcstok\_s.c","src/securecutil.c","src/gets\_s.c","src/swprintf\_s.c","src/strcpy\_s.c","src/wcscat\_s.c","src/strncpy\_s.c",
\]include\_common = \["include","src",
\]ohos\_static\_library("libHWSecureC") {sources = src\_libHWSecureCinclude\_dirs = include\_common
}ohos\_shared\_library("libboundscheck") {sources = src\_libHWSecureCinclude\_dirs = include\_common
}
# 放入 $MY\_OHOS\_DIR/third\_party/iot\_device\_sdk\_c/third\_party/paho.mqtt.c
#
# Copyright (c) \[2020\] Huawei Technologies Co.,Ltd.All rights reserved.
#
# OpenArkCompiler is licensed under the Mulan PSL v1.
# You can use this software according to the terms and conditions of the Mulan PSL v1.
# You may obtain a copy of Mulan PSL v1 at:
#
#     http://license.coscl.org.cn/MulanPSL
#
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR
# FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v1 for more details.
#import("//build/ohos.gni")
MQTT\_SRC\_DIR = "src"MQTT\_AS\_SOURCE\_FILES = \["${MQTT\_SRC\_DIR}/Base64.c","${MQTT\_SRC\_DIR}/Clients.c","${MQTT\_SRC\_DIR}/Heap.c","${MQTT\_SRC\_DIR}/LinkedList.c","${MQTT\_SRC\_DIR}/Log.c","${MQTT\_SRC\_DIR}/Messages.c","${MQTT\_SRC\_DIR}/MQTTAsync.c","${MQTT\_SRC\_DIR}/MQTTAsyncUtils.c","${MQTT\_SRC\_DIR}/MQTTPacket.c","${MQTT\_SRC\_DIR}/MQTTPacketOut.c","${MQTT\_SRC\_DIR}/MQTTPersistence.c","${MQTT\_SRC\_DIR}/MQTTPersistenceDefault.c","${MQTT\_SRC\_DIR}/MQTTProperties.c","${MQTT\_SRC\_DIR}/MQTTProtocolClient.c","${MQTT\_SRC\_DIR}/MQTTProtocolOut.c","${MQTT\_SRC\_DIR}/MQTTReasonCodes.c","${MQTT\_SRC\_DIR}/MQTTTime.c","${MQTT\_SRC\_DIR}/OsWrapper.c","${MQTT\_SRC\_DIR}/Proxy.c","${MQTT\_SRC\_DIR}/SHA1.c","${MQTT\_SRC\_DIR}/Socket.c","${MQTT\_SRC\_DIR}/SocketBuffer.c","${MQTT\_SRC\_DIR}/SSLSocket.c","${MQTT\_SRC\_DIR}/StackTrace.c","${MQTT\_SRC\_DIR}/Thread.c","${MQTT\_SRC\_DIR}/Tree.c","${MQTT\_SRC\_DIR}/utf-8.c","${MQTT\_SRC\_DIR}/WebSocket.c",
\]ohos\_shared\_library("libpaho-mqtt3as") {sources = MQTT\_AS\_SOURCE\_FILESinclude\_dirs = \["./src", "./build"\]deps=\["//third\_party/openssl:libcrypto\_static","//third\_party/openssl:ssl\_source"\]cflags = \["-w", "-fPIC", "-Os", "-fvisibility=hidden", "-DOPENSSL", "-D\_GNU\_SOURCE", "-DPAHO\_MQTT\_EXPORTS=1"\]libs= \["pthread", "dl"\]ldflags = \["-Wl,-init,MQTTAsync\_init"\]
}
# 放入 $MY\_OHOS\_DIR/third\_party/iot\_device\_sdk\_c/third\_party/libssh
#
# Copyright (c) \[2020\] Huawei Technologies Co.,Ltd.All rights reserved.
#
# OpenArkCompiler is licensed under the Mulan PSL v1.
# You can use this software according to the terms and conditions of the Mulan PSL v1.
# You may obtain a copy of Mulan PSL v1 at:
#
#     http://license.coscl.org.cn/MulanPSL
#
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR
# FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v1 for more details.
#import("//build/ohos.gni")src\_libHWSecureC = \[
"src/agent.c",
"src/auth.c",
"src/base64.c",
"src/bignum.c",
"src/buffer.c",
"src/callbacks.c",
"src/channels.c",
"src/client.c",
"src/config.c",
"src/connect.c",
"src/connector.c",
"src/curve25519.c",
"src/dh.c",
"src/ecdh.c",
"src/error.c",
"src/getpass.c",
"src/init.c",
"src/kdf.c",
"src/kex.c",
"src/known\_hosts.c",
"src/knownhosts.c",
"src/legacy.c",
"src/log.c",
"src/match.c",
"src/messages.c",
"src/misc.c",
"src/options.c",
"src/packet.c",
"src/packet\_cb.c",
"src/packet\_crypt.c",
"src/pcap.c",
"src/pki.c",
"src/pki\_container\_openssh.c",
"src/poll.c",
"src/session.c",
"src/scp.c",
"src/socket.c",
"src/string.c",
"src/threads.c",
"src/wrapper.c",
"src/external/bcrypt\_pbkdf.c",
"src/external/blowfish.c",
"src/external/chacha.c",
"src/external/poly1305.c",
"src/chachapoly.c",
"src/config\_parser.c",
"src/token.c",
"src/pki\_ed25519\_common.c",
"src/threads/noop.c",
"src/threads/pthread.c",
"src/threads/libcrypto.c",
"src/pki\_crypto.c",
"src/ecdh\_crypto.c",
"src/libcrypto.c",
"src/dh\_crypto.c",
"src/pki\_ed25519.c",
"src/external/ed25519.c",
"src/external/fe25519.c",
"src/external/ge25519.c",
"src/external/sc25519.c",
"src/sftp.c",
"src/sftpserver.c",
"src/server.c",
"src/bind.c",
"src/bind\_config.c",
"src/dh-gex.c",
"src/external/curve25519\_ref.c",
\]include\_common = \["./build","./include/","//third\_party/openssl/include","./include/libssh","./build/include","./build/src",
\]
ohos\_shared\_library("libssh") {sources = src\_libHWSecureCinclude\_dirs = include\_commondeps=\["//third\_party/openssl:libcrypto\_static","//third\_party/openssl:ssl\_source"\]cflags = \["-w", "-std=gnu99", "-fPIC", "-DLIBSSH\_EXPORTS", "-D\_GNU\_SOURCE"\]
}
# 放入 $MY\_OHOS\_DIR/third\_party/iot\_device\_sdk\_c/third\_party/nopoll
#
# Copyright (c) \[2020\] Huawei Technologies Co.,Ltd.All rights reserved.
#
# OpenArkCompiler is licensed under the Mulan PSL v1.
# You can use this software according to the terms and conditions of the Mulan PSL v1.
# You may obtain a copy of Mulan PSL v1 at:
#
#     http://license.coscl.org.cn/MulanPSL
#
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR
# FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v1 for more details.
#
import("//build/ohos.gni")src\_nopoll = \["src/nopoll.c","src/nopoll\_conn.c","src/nopoll\_conn\_opts.c","src/nopoll\_ctx.c","src/nopoll\_decl.c","src/nopoll\_io.c","src/nopoll\_listener.c","src/nopoll\_log.c","src/nopoll\_loop.c","src/nopoll\_msg.c","src/nopoll\_win32.c",
\]include\_common = \["include","../../include/","src",
\]
ohos\_shared\_library("libnopoll") {sources = src\_nopollinclude\_dirs = include\_commondeps=\["//third\_party/openssl:libcrypto\_static","//third\_party/openssl:ssl\_source"\]cflags = \["-w"\]
}

由于libssh需要cmake生成一些包含各种配置的头文件,所以此处先用cmake命令生成中间文件。

此处需要根据开发板支持的功能向cmake传入参数,以便开启或关闭对应特性,如示例中的-DHAVED_GLOB=0

命令如下:

cd $MY\_OHOS\_DIR/third\_party/iot\_device\_sdk\_c/third\_party/libssh \\&& mkdir -p build \\&& cd build \\&& cmake .. \\-DCMAKE\_BUILD\_TYPE=Release -DWITH\_ZLIB=OFF \\-DOPENSSL\_ROOT\_DIR=$MY\_OHOS\_DIR/third\_party/openssl \\-DOPENSSL\_INCLUDE\_DIR=$MY\_OHOS\_DIR/third\_party/openssl/include \\-DOPENSSL\_CRYPTO\_LIBRARY=$MY\_OHOS\_DIR/out/rk3568/packages/phone/system/lib/libcrypto.z.so \\-DHAVE\_STRTOULL=1 -DUNIX=1 -DHAVE\_POLL=0 -DHAVE\_GLOB=0 \\-DHAVE\_OPENSSL\_CRYPTO\_CTR128\_ENCRYPT=1

paho.mqtt.c需要用make生成VersionInfo.h,执行如下命令生成:

cd $MY\_OHOS\_DIR/third\_party/iot\_device\_sdk\_c/third\_party/paho.mqtt.c
make build/VersionInfo.h

nopoll需要对应的OpenHarmony源码路径/third_party/iot_device_sdk_c/third_party/nopoll/src/nopoll_config.h:

/\*\* Nopoll Library nopoll\_config.h\* Platform dependant definitions.\*\* This is a generated file.  Please modify 'configure.in'\*/#ifndef
\_\_NOPOLL\_CONFIG\_H\_\_
#define
\_\_NOPOLL\_CONFIG\_H\_\_/\*\*\* \\addtogroup nopoll\_decl\_module\* @{\*//\*\*\* @brief Allows to convert integer value (including constant values)\* into a pointer representation.\*\* Use the oposite function to restore the value from a pointer to a\* integer: \\ref PTR\_TO\_INT.\*\* @param integer The integer value to cast to pointer.\*\* @return A \\ref noPollPtr reference.\*/
#ifndef
INT\_TO\_PTR
#define
INT\_TO\_PTR(integer)   ((noPollPtr) (long) ((int)integer))
#endif/\*\*\* @brief Allows to convert a pointer reference (\\ref noPollPtr),\* which stores an integer that was stored using \\ref INT\_TO\_PTR.\*\* Use the oposite function to restore the pointer value stored in the\* integer value.\*\* @param ptr The pointer to cast to a integer value.\*\* @return A int value.\*/
#ifndef
PTR\_TO\_INT
#define
PTR\_TO\_INT(ptr) ((int) (long) (ptr))
#endif/\*\*\* @brief Allows to get current platform configuration. This is used\* by Nopoll library but could be used by applications built on top of\* Nopoll to change its configuration based on the platform information.\*/
#define
NOPOLL\_OS\_UNIX (1)/\*\*\* @internal Allows to now if the platform support vasprintf\* function. Do not use this macro as it is supposed to be for\* internal use.\*/
#define
NOPOLL\_HAVE\_VASPRINTF (1)/\*\*\* @brief Indicates that this platform have support for 64bits.\*/
#define
NOPOLL\_64BIT\_PLATFORM (1)
/\*\*\* @brief Indicates where we have support for TLSv1.0 support.\*/
#define
NOPOLL\_HAVE\_TLSv10\_ENABLED (1)/\*\*\* @brief Indicates where we have support for TLSv1.1 support.\*/
#define
NOPOLL\_HAVE\_TLSv11\_ENABLED (1)/\*\*\* @brief Indicates where we have support for TLSv1.2 support.\*/
#define
NOPOLL\_HAVE\_TLSv12\_ENABLED (1)/\*\*\* @brief Indicates where we have support for TLS flexible method where the highest TLS version will be negotiated.\*/
#define
NOPOLL\_HAVE\_TLS\_FLEXIBLE\_ENABLED (1)/\* @} \*/#endif

最后修改文件OpenHarmony源码路径/third_party/iot_device_sdk_c/BUILD.gn,在executable(“mqtt_device_demo”)的deps中加入以下依赖:

"third\_party/huawei\_secure\_c:libboundscheck",
"third\_party/paho.mqtt.c:libpaho-mqtt3as",
"third\_party/libssh:libssh",
"third\_party/nopoll:libnopoll",

结果如图所示:

(4)其它三方库依赖

libz.so和libssl.so对应的源码在拉取OpenHarmony时会自获取,其分别对应OpenHarmony源码路径/third_party/libz,则属于OpenHarmony源码路径/third_party/openssl。 这些库在编译libboundscheck.so等动态库时会以依赖的方式来驱使其编译,所以只需要将对应的产物拷贝到目标设备中。

部分产物位于OpenHarmony源码路径/out/{产品型号}/common/common/目录下,部分则位于特殊的位置。这些动态库通常.z.so结尾。以rk3568为例,其`libssh.so和libz.so分别处于:

$MY\_OHOS\_DIR/out/rk3568/common/common/libz.z.so
$MY\_OHOS\_DIR/out/rk3568/packages/phone/system/lib/libssl.z.so

对于示例开发板rk3861,其内部已经存在这些动态库,所以示例中无需拷贝这些库。如果目标设备缺少这些库,可以使用以下命令来查找动态库位置:

find $MY\_OHOS\_DIR/out -name {动态库名称}.z.so
find $MY\_OHOS\_DIR/out -name {动态库名称}.so

(5)配置华为云接入参数并编译主程序

打开OpenHarmony源码路径/third_party/iot_device_sdk_c/src/device_demo/device_demo.c,修改接入地址,设备id和设备密钥,如下图所示:

最后执行编译:

cd $OpenHarmony源码路径
./build.sh --product-name 使用的产品 --build-target iot\_device\_sdk\_c

输出如下内容则表示编译成功;

(6)验证对接华为云

将需要的动态库和主程序./MQTT_Demo拷贝到目标设备的同一路径下,执行export LD_LIBRARY_PATH=. && ./MQTT_Demo,出现MqttBase_OnConnectSuccess则表示成功连接华为云:

为了能让大家更好的学习鸿蒙 (OpenHarmony) 开发技术,这边特意整理了《鸿蒙 (OpenHarmony)开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙 (OpenHarmony)开发学习手册》

入门必看:https://qr21.cn/FV7h05

  1. 应用开发导读(ArkTS)
  2. ……

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系统定义
  2. 技术架构
  3. 技术特性
  4. 系统安全

如何快速入门?:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. 构建第一个JS应用
  4. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654596.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java类和对象详解

文章目录 一、面向对象初步认识1.1 什么是面向对象 二、类的定义和使用2.1 简单认识类2.2 类的定义格式 三、类的实例化3.1 什么是类的实例化3.2 类和对象的说明 四、对象的构造及初始化4.1 如何初始化对象4.2 构造方法(1) 概念(2) 特性 4.3 默认初始化4.4 就地初始化 本文章&a…

图片中的水印怎么去掉?教你三个去水印方法

在拍摄照片时,有时候会遇到不期而遇的路人出现在镜头中,给照片带来不必要的干扰。这时候我们就需要把路人给去掉,让照片变的更加完美。下面我将给大家分享三个把照片中的路人去掉的小妙招。 一、水印云 水印云是一款非常实用的图片处理工具…

腾讯发表多模态大模型最新综述,从26个主流大模型看多模态效果提升关键方法

在大规模语言模型(LLMs)通往通用人工智能(AGI)的道路中,从传统的单一的“语言模态”扩展到“图像”、“语音”等等的“多模态”必然是大模型进化的必经之路。 在过去的 2023 年,多模态大规模语言模型&…

【Node-RED】node-red-contrib-opcua-server模块使用(2)

这里写自定义目录标题 前言示例简单介绍变量产生opcuaServe配置 地址空间的配置创建opcua服务器获取命名空间初始化变量定义文件夹定义文件夹中的变量view文件夹增加view文件夹中查阅信息定义最终效果 加密设置opcuaServe组件配置客户端配置 参考官网博文 前言 上期博文【Node…

零基础学编程,中文编程入门视频教程

零基础学编程,中文编程入门视频教程 一、前言 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载——常用工具下载——编程工具免费版下载及实例源码下载。 如上图为编程工具构件…

c语言实战之贪吃蛇

文章目录 前言效果展示游戏用到的图片游戏思路一览游戏前准备一、贪吃蛇、食物、障碍物节点坐标的结构体二、枚举游戏状态、和贪吃蛇的方向三、维护运行的结构体 游戏开始前的初始化一、学习图形库相关知识二、设置背景三、欢迎界面四、初始化贪吃蛇五、生成障碍物六、生成食物…

SharedPreferences卡顿分析

SP的使用及存在的问题 SharedPreferences(以下简称SP)是Android本地存储的一种方式,是以key-value的形式存储在/data/data/项目包名/shared_prefs/sp_name.xml里,SP的使用示例及源码解析参见:Android本地存储之SharedPreferences源码解析。以…

【JAVA语言-第16话】集合框架(三)——Set、HashSet、LinkedHashSet、TreeSet集合的详细解析

目录 Set集合 1.1 概述 1.2 特点 1.3 HashSet集合 1.3.1 概述 1.3.2 哈希表 1.3.3 哈希值 1.3.4 练习 1.3.5 HashSet存储自定义类型元素 1.4 LinkedHashSet集合 1.4.1 概述 1.4.2 特点 1.4.3 练习 1.5 TreeSet集合 1.5.1 概述 1.5.2 练习 1.6 HashSet、Lin…

【论文复现】

code: paper: 论文 介绍 方法 实验 结论 复现 Image generation 问题1:No models "dcface/dcface/pretrained_models/adaface_ir101_webface4m.ckpt Traceback (most recent call last):File "/data/dcface/dcface/src/r…

如何通俗解释Docker是什么?

要想弄懂Docker,咱们得先从“容器化”讲起。 一、容器化技术及Docker的出现 容器化,它是一种轻量级、可移植的软件打包方式,你就想象成一个快递箱子,里面装着你的应用和所有需要运行的环境,这个箱子能在任何支持容器…

Redisson分布式锁介绍及实战应用(防止缓存击穿)

本地锁 浏览器把100w请求由网关随机往下传,在集群情况下,每台服务都放行10w请求过来,这时候每台服务都用的是本地锁是跨JVM的, 列如这些服务都没有49企业,此时有几个服务进行回原了打击在DB上面,那后期把这…

Blender教程(基础)-物体的移动、旋转与缩放-04

一、新建一个立方体 ShiftA新建一个立方体用来演示。 二、物体的移动 xyz轴移动 点击下图图左侧的移动选项后,选中要移动的物体,会出现三个箭头的方向,这分别代表沿着x、y、z轴移动。xyz平面移动 这个小正方体代表沿着某一个面移动&#…

AWS 专题学习 P14 (Security Encryption)

文章目录 专题总览为什么需要加密?AWS KMS(密钥管理服务)KMS 密钥类型AWS KMS(密钥管理服务)Copying Snapshots across regionsKMS Key Policies在不同账户之间复制快照KMS Multi-Region Keys (多区域密钥)DynamoDB 全…

ElasticSearch 学习笔记

基本概念 术语 文档(document):每条记录就是一个文档,会以 JSON 格式进行存储 映射(mapping):索引中文档字段的约束信息,类似 RDBMS 中的表结构约束(schema&#xff09…

在linux上进行编译调试

1.相关疑问 1. 为什么在代码里使用了一个未定义过的函数(如add()),在编译阶段不会报错,在链接阶段会报错呢? 答:先说几个代码编译的结论: 单个\.c源文件文件被编译成机器码文件时&#xff0c…

LVS 工作模式

1、LVS DR模式 DR 模式是通过改写请求报文的目标 MAC 地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。DR 模式可以极大的提高集群系统的伸缩性。但是要求调度器 LB 与真实服务器 RS 都有一块网卡连接到同一物理网段上…

Codeforces Round 785 C. Palindrome Basis

C. Palindrome Basis 题意 定义一个正整数 a a a 是回文的(没有前导 0 0 0)当且仅当: a a a 的十进制表示形式回文 给定一个正整数 n n n ,求出将 n n n 拆分成若干个回文数之和的方案数 思路 这是一个经典模型&#xff0…

媒体邀约:怎么吸引总体目标受众?

新闻媒体影响力日益扩大。不论是公司、机构还是其他,都希望能够通过新闻媒体的曝光来吸引更多总体目标受众。要想真正吸引住总体目标受众并非易事,需要一定的方案和方法。下面我们就深入探究媒体邀约推广的真相,共享怎么吸引总体目标受众的方…

秋招面试—计算机网络安全

2021 计算机网络安全 1.Get 和 Post 的区别 get 用于获取数据,post用于提交数据; get 的缓存保存在浏览器和web服务器日志中; get 使用明文传输,post请求保存在请求体中; get 长度限制在2048以内 2.常见的HTTP请…

Android P 屏保和休眠相关知识

Android P添加屏保功能,如果休眠时间设定大于屏保时间,则先进入屏保,达到休眠时间后再进入休眠 需求: 添加屏幕互保开关,默认关闭。只保留时钟,可设定指针和数字、夜间模式。启用时间改多长时间无操作进入…