3步體驗在DAYU200開發(fā)板上完成OpenHarmony對接華為云IoT

一闺魏、前言

OpenHarmony 3.1.1 是一個開源的智能終端操作系統(tǒng)非洲,主要用于智能家居鸭限、智能手機(jī)、平板電腦怪蔑、智能穿戴設(shè)備等智能終端設(shè)備里覆。是一個分布式操作系統(tǒng),支持多種硬件平臺和多種編程語言缆瓣,可以方便地進(jìn)行移植和定制喧枷。

特點:

(1) 分布式:支持分布式計算和分布式存儲,可以在多個設(shè)備之間進(jìn)行任務(wù)調(diào)度和數(shù)據(jù)共享弓坞。
(2)可裁剪:支持根據(jù)設(shè)備的需求進(jìn)行裁剪隧甚,以滿足不同設(shè)備的資源限制。
(3)安全:提供了安全機(jī)制渡冻,保護(hù)設(shè)備的隱私和安全戚扳。
(4)可移植:支持多種硬件平臺和多種編程語言,可以方便地進(jìn)行移植和定制族吻。

當(dāng)前文章介紹在DAYU200開發(fā)板上燒寫OpenHarmony系統(tǒng)帽借,利用huaweicloud-iot-device-sdk完成華為云IOT平臺對接,完成物聯(lián)網(wǎng)數(shù)據(jù)通信超歌。

所需硬件:DAYU200開發(fā)板(RK3568)

二砍艾、DAYU200開發(fā)板

2.1 開發(fā)板介紹

基于Rockchip RK3568,集成雙核心架構(gòu)GPU以及高效能NPU巍举;
板載四核64位Cortex-A55 處理器采用22nm先進(jìn)工藝脆荷,主頻高達(dá)2.0GHz;
支持藍(lán)牙懊悯、Wi-Fi蜓谋、音頻、視頻和攝像頭等功能炭分,擁有豐富的擴(kuò)展接口桃焕,支持多種視頻輸入輸出接口;
配置雙千兆自適應(yīng)RJ45以太網(wǎng)口欠窒,可滿足NVR覆旭、工業(yè)網(wǎng)關(guān)等多網(wǎng)口產(chǎn)品需求退子。

2.2 開發(fā)板實物圖

三、環(huán)境安裝

3.1 串口終端

開發(fā)板插上串口線之后型将,打開設(shè)備管理器可以看到識別到串口COM8寂祥,這就是開發(fā)板的Debug串口。(需要提前安裝好USB轉(zhuǎn)串口驅(qū)動)七兜。

打開串口工具丸凭,新建會話,選擇串口協(xié)議腕铸。

波特率選擇1500000也就是1.5M惜犀。

創(chuàng)建完成。

選擇剛才創(chuàng)建好的會話狠裹,點擊連接虽界。

復(fù)位開發(fā)板(開發(fā)板上有一個RESET按鈕),正常情況下會在終端上看到內(nèi)核啟動過程涛菠;啟動完成后按下回車即可進(jìn)入到Linux終端命令行莉御。

從打印的命令行數(shù)據(jù)可以看出當(dāng)前設(shè)備的配置:

這是uboot打印出來的配置信息。從當(dāng)前信息里可以看出CPU型號RK3568俗冻,內(nèi)存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

內(nèi)核啟動打印的信息;從信息里可以看出當(dāng)前系統(tǒng)使用的內(nèi)核是Linux 5.10內(nèi)核迄薄。

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

在串口軟件上可以設(shè)置終端類型琅关,方便區(qū)分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下進(jìn)行燒寫涣易。

DriverAssitant_v5.1.1.zip目錄下是USB驅(qū)動,解壓后進(jìn)行安裝冶伞。如果已經(jīng)安裝舊版本的燒寫工具都毒, 需要先點擊“驅(qū)動卸載” 按鈕下載驅(qū)動, 然后再點擊“驅(qū)動安裝” 按鈕安裝驅(qū)動碰缔。

RKDevTool.exe就是燒寫工具。

【2】HiHope官方固件下載

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

下載下來解壓戳护,打開燒寫工具選擇路徑礼仗。

確認(rèn)開發(fā)板是否進(jìn)入燒寫模式

(1)如果界面顯示"發(fā)現(xiàn)一個 LOADER 設(shè)備", 說明開發(fā)板進(jìn)入 Loader 模式等待燒寫固件记餐。

(2)如果界面顯示"發(fā)現(xiàn)一個 MASKROM 設(shè)備", 說明開發(fā)板進(jìn)入 Maskrom 模式等待燒寫固 件。

(3)如果界面顯示"沒有發(fā)現(xiàn)設(shè)備", 說明開發(fā)板沒有進(jìn)入燒寫模式拴签, 需要先讓開發(fā)板進(jìn)入燒寫模式

進(jìn)入燒寫模式的步驟

(1)先按住 VOL-/RECOVERY 按鍵 和 RESET 按鈕不松開, 燒錄工具此時顯示“沒有發(fā)現(xiàn)設(shè)備”

(2)然后再 松開 RESER 鍵洗显, 燒錄工具顯示“發(fā)現(xiàn)一個 LOADER 設(shè)備” 棱貌, 說明此時已經(jīng)進(jìn)入燒寫模式禀晓。

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 是華為云推出的一套面向嵌入式設(shè)備的物聯(lián)網(wǎng)開發(fā)套件,支持 C 語言開發(fā)坝锰。該套件提供了一系列 API粹懒,可以方便地實現(xiàn)設(shè)備與云端的連接、數(shù)據(jù)上報顷级、遠(yuǎn)程控制等功能凫乖。

該套件主要包括以下組件:

  • Huawei LiteOS:一個輕量級的操作系統(tǒng),提供了內(nèi)核級別的任務(wù)調(diào)度弓颈、內(nèi)存管理帽芽、網(wǎng)絡(luò)協(xié)議棧等功能。
  • Huawei Cloud IOT Agent:一個設(shè)備端的物聯(lián)網(wǎng)代理程序翔冀,負(fù)責(zé)與云端的物聯(lián)網(wǎng)平臺進(jìn)行連接导街,實現(xiàn)設(shè)備注冊、數(shù)據(jù)上報纤子、遠(yuǎn)程控制等功能搬瑰。
  • Huawei Cloud IOT SDK for C:一個 C 語言的開發(fā)包,提供了一系列 API计福,可以方便地實現(xiàn)設(shè)備與云端的連接跌捆、數(shù)據(jù)上報、遠(yuǎn)程控制等功能象颖。

使用 Huawei Cloud IOT Device SDK for C 可以大大簡化物聯(lián)網(wǎng)設(shè)備的開發(fā)流程佩厚,提高開發(fā)效率,同時也可以保證設(shè)備與云端之間的連接穩(wěn)定性和安全性说订。該套件適用于各種類型的嵌入式設(shè)備抄瓦,例如智能家居、智能家電陶冷、智能穿戴等钙姊。

Huawei Cloud IOT SDK for C SDK面向運算、存儲能力較強(qiáng)的嵌入式終端設(shè)備埂伦,開發(fā)者通過調(diào)用SDK接口煞额,便可實現(xiàn)設(shè)備與物聯(lián)網(wǎng)平臺的上下行通訊。SDK當(dāng)前支持的功能有:

  • 支持物模型:設(shè)備消息/屬性/事件上報沾谜,設(shè)備命令/消息/屬性/事件接收
  • 支持子設(shè)備消息轉(zhuǎn)發(fā)膊毁、子設(shè)備管理
  • 支持OTA升級
  • 支持密碼認(rèn)證和證書認(rèn)證兩種設(shè)備接入方式
  • 支持自定義topic
  • 支持設(shè)備影子查詢
  • 支持自定義日志收集能力
  • 支持端側(cè)規(guī)則引擎
  • 支持SSH遠(yuǎn)程登錄
  • 支持對接邊緣M2M

四、上云實驗

4.1 物聯(lián)網(wǎng)平臺介紹

華為云物聯(lián)網(wǎng)平臺(IoT 設(shè)備接入云服務(wù))提供海量設(shè)備的接入和管理能力基跑,將物理設(shè)備聯(lián)接到云婚温,支撐設(shè)備數(shù)據(jù)采集上云和云端下發(fā)命令給設(shè)備進(jìn)行遠(yuǎn)程控制,配合華為云其他產(chǎn)品媳否,幫助我們快速構(gòu)筑物聯(lián)網(wǎng)解決方案栅螟。

使用物聯(lián)網(wǎng)平臺構(gòu)建一個完整的物聯(lián)網(wǎng)解決方案主要包括3部分:物聯(lián)網(wǎng)平臺荆秦、業(yè)務(wù)應(yīng)用和設(shè)備。

物聯(lián)網(wǎng)平臺作為連接業(yè)務(wù)應(yīng)用和設(shè)備的中間層力图,屏蔽了各種復(fù)雜的設(shè)備接口步绸,實現(xiàn)設(shè)備的快速接入;同時提供強(qiáng)大的開放能力搪哪,支撐行業(yè)用戶構(gòu)建各種物聯(lián)網(wǎng)解決方案靡努。

設(shè)備可以通過固網(wǎng)、2G/3G/4G/5G晓折、NB-IoT惑朦、Wifi等多種網(wǎng)絡(luò)接入物聯(lián)網(wǎng)平臺,并使用LWM2M/CoAP漓概、MQTT漾月、HTTPS協(xié)議將業(yè)務(wù)數(shù)據(jù)上報到平臺,平臺也可以將控制命令下發(fā)給設(shè)備胃珍。

業(yè)務(wù)應(yīng)用通過調(diào)用物聯(lián)網(wǎng)平臺提供的API梁肿,實現(xiàn)設(shè)備數(shù)據(jù)采集、命令下發(fā)觅彰、設(shè)備管理等業(yè)務(wù)場景吩蔑。

4.2 開通物聯(lián)網(wǎng)服務(wù)

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

點擊總覽,查看接入信息填抬。 我們當(dāng)前設(shè)備準(zhǔn)備采用MQTT協(xié)議接入華為云平臺烛芬,這里可以看到MQTT協(xié)議的地址和端口號等信息。

總結(jié):

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

根據(jù)域名地址得到IP地址信息:

Microsoft Windows [版本 10.0.19045.2965]
(c) Microsoft Corporation飒责。保留所有權(quán)利赘娄。

MQTT協(xié)議接入端口號有兩個,1883是非加密端口宏蛉,8883是證書加密端口遣臼,單片機(jī)無法加載證書,所以使用1883端口比較合適拾并。 接下來的ESP8266就采用1883端口連接華為云物聯(lián)網(wǎng)平臺揍堰。

4.3 創(chuàng)建產(chǎn)品

(1)創(chuàng)建產(chǎn)品

點擊產(chǎn)品頁,再點擊左上角創(chuàng)建產(chǎn)品嗅义。

(2)填寫產(chǎn)品信息

根據(jù)自己產(chǎn)品名字填寫个榕。

(3)產(chǎn)品創(chuàng)建成功

(4)添加自定義模型

產(chǎn)品創(chuàng)建完成之后,點擊進(jìn)入產(chǎn)品詳情頁面芥喇,翻到最下面可以看到模型定義。

這個模型就是定義自己設(shè)備接下來需要向服務(wù)器上傳那些數(shù)據(jù)類型凰萨。根據(jù)自己的數(shù)據(jù)類型進(jìn)行編寫继控。

先點擊自定義模型械馆。

再創(chuàng)建一個服務(wù)ID。

接著點擊新增屬性武通。

4.4 添加設(shè)備

產(chǎn)品是屬于上層的抽象模型霹崎,接下來在產(chǎn)品模型下添加實際的設(shè)備。添加的設(shè)備最終需要與真實的設(shè)備關(guān)聯(lián)在一起冶忱,完成數(shù)據(jù)交互尾菇。

(1)注冊設(shè)備

(2)根據(jù)自己的設(shè)備填寫

(3)保存設(shè)備信息

創(chuàng)建完畢之后,點擊保存并關(guān)閉囚枪,得到創(chuàng)建的設(shè)備密匙信息派诬。該信息在后續(xù)生成MQTT三元組的時候需要使用。

(4)設(shè)備創(chuàng)建完成

可以點擊設(shè)備進(jìn)入到設(shè)備詳情頁面链沼。

4.5 OpenHarmony環(huán)境構(gòu)建

在文件Harmony源碼路徑/build/subsystem_config.json中添加構(gòu)建腳本:

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

(1)添加子系統(tǒng)編譯構(gòu)建

在文件OpenHarmony源碼路徑/build/subsystem_config.json中添加如下構(gòu)建腳本:

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

在產(chǎn)品配置文件中添加子系統(tǒng)默赂,其子系統(tǒng)名稱與文件中添加內(nèi)容對應(yīng),就是iot-device-sdk-c:iot-device-sdk-c括勺。

配置文件位于`MY_OHOS_

(2)編譯依賴的動態(tài)庫

此sdk主要依賴于libboundscheck.so,libpaho-mqtt3as.so,libssh.so,libnopoll.so這些動態(tài)庫缆八,其間接依賴于libz.so,libssl.so,libcrypto.so

(3)編譯第三方動態(tài)庫

對于libboundscheck.so疾捍,libpaho-mqtt3as.so奈辰,libssh.solibnopoll.so乱豆, 這些庫對應(yīng)的源碼沒有在OpenHarmony中集成奖恰,如果開發(fā)板中沒有這些動態(tài)庫,需要自行下載并編譯咙鞍。

執(zhí)行以下命令拉取對應(yīng)源碼:

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文件翰守,

內(nèi)容如下:

\# 放入 $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("http://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\_libHWSecureC
  include\_dirs = include\_common
}

ohos\_shared\_library("libboundscheck") {
  sources = src\_libHWSecureC
  include\_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("http://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\_FILES
  include\_dirs = \["./src", "./build"\]
  deps=\[
    "http://third\_party/openssl:libcrypto\_static",
    "http://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("http://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/",
  "http://third\_party/openssl/include",
  "./include/libssh",
  "./build/include",
  "./build/src",
\]
ohos\_shared\_library("libssh") {
  sources = src\_libHWSecureC
  include\_dirs = include\_common
  deps=\[
    "http://third\_party/openssl:libcrypto\_static",
    "http://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("http://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\_nopoll
  include\_dirs = include\_common
  deps=\[
    "http://third\_party/openssl:libcrypto\_static",
    "http://third\_party/openssl:ssl\_source"
  \]
  cflags = \["-w"\]
}

由于libssh需要cmake生成一些包含各種配置的頭文件,所以此處先用cmake命令生成中間文件疲酌。

此處需要根據(jù)開發(fā)板支持的功能向cmake傳入?yún)?shù)蜡峰,以便開啟或關(guān)閉對應(yīng)特性,如示例中的-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朗恳,執(zhí)行如下命令生成:

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

nopoll需要對應(yīng)的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",

結(jié)果如圖所示:

(4)其它三方庫依賴

libz.so和libssl.so對應(yīng)的源碼在拉取OpenHarmony時會自獲取,其分別對應(yīng)OpenHarmony源碼路徑/third_party/libz粥诫,則屬于OpenHarmony源碼路徑/third_party/openssl油航。 這些庫在編譯libboundscheck.so等動態(tài)庫時會以依賴的方式來驅(qū)使其編譯,所以只需要將對應(yīng)的產(chǎn)物拷貝到目標(biāo)設(shè)備中怀浆。

部分產(chǎn)物位于OpenHarmony源碼路徑/out/{產(chǎn)品型號}/common/common/目錄下谊囚,部分則位于特殊的位置怕享。這些動態(tài)庫通常.z.so結(jié)尾。以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

對于示例開發(fā)板rk3861函筋,其內(nèi)部已經(jīng)存在這些動態(tài)庫,所以示例中無需拷貝這些庫奠伪。如果目標(biāo)設(shè)備缺少這些庫跌帐,可以使用以下命令來查找動態(tài)庫位置:

find $MY\_OHOS\_DIR/out -name {動態(tài)庫名稱}.z.so
find $MY\_OHOS\_DIR/out -name {動態(tài)庫名稱}.so

(5)配置華為云接入?yún)?shù)并編譯主程序

打開OpenHarmony源碼路徑/third_party/iot_device_sdk_c/src/device_demo/device_demo.c,修改接入地址绊率,設(shè)備id和設(shè)備密鑰谨敛,如下圖所示:

最后執(zhí)行編譯:

cd $OpenHarmony源碼路徑
./build.sh --product-name 使用的產(chǎn)品 --build-target iot\_device\_sdk\_c

輸出如下內(nèi)容則表示編譯成功;

(6)驗證對接華為云

將需要的動態(tài)庫和主程序./MQTT_Demo拷貝到目標(biāo)設(shè)備的同一路徑下即舌,執(zhí)行export LD_LIBRARY_PATH=. && ./MQTT_Demo佣盒,出現(xiàn)MqttBase_OnConnectSuccess則表示成功連接華為云:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市顽聂,隨后出現(xiàn)的幾起案子肥惭,更是在濱河造成了極大的恐慌,老刑警劉巖紊搪,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜜葱,死亡現(xiàn)場離奇詭異,居然都是意外死亡耀石,警方通過查閱死者的電腦和手機(jī)牵囤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滞伟,“玉大人揭鳞,你說我怎么就攤上這事“鹉危” “怎么了野崇?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長亩钟。 經(jīng)常有香客問我乓梨,道長,這世上最難降的妖魔是什么清酥? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任扶镀,我火速辦了婚禮,結(jié)果婚禮上焰轻,老公的妹妹穿的比我還像新娘臭觉。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布蝠筑。 她就那樣靜靜地躺著忆肾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪菱肖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天旭从,我揣著相機(jī)與錄音稳强,去河邊找鬼。 笑死和悦,一個胖子當(dāng)著我的面吹牛退疫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸽素,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼褒繁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了馍忽?” 一聲冷哼從身側(cè)響起棒坏,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遭笋,沒想到半個月后坝冕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡瓦呼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年喂窟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片央串。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡磨澡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出质和,到底是詐尸還是另有隱情稳摄,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布侦另,位于F島的核電站秩命,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏褒傅。R本人自食惡果不足惜弃锐,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望殿托。 院中可真熱鬧霹菊,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至饶碘,卻和暖如春目尖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扎运。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工瑟曲, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人豪治。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓洞拨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親负拟。 傳聞我的和親對象是個殘疾皇子烦衣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容