本文分享自華爲雲社區《DAYU200+OpenHarmony 3.1.1對接華爲雲IOT【華爲雲IoT+鴻蒙】》,作者:DS小龍哥。
一、前言
OpenHarmony 3.1.1 是一個開源的智能終端操作系統,主要用於智能家居、智能手機、平板電腦、智能穿戴設備等智能終端設備。是一個分佈式操作系統,支持多種硬件平臺和多種編程語言,可以方便地進行移植和定製。
特點:
(1) 分佈式:支持分佈式計算和分佈式存儲,可以在多個設備之間進行任務調度和數據共享。
(2)可裁剪:支持根據設備的需求進行裁剪,以滿足不同設備的資源限制。
(3)安全:提供了安全機制,保護設備的隱私和安全。
(4)可移植:支持多種硬件平臺和多種編程語言,可以方便地進行移植和定製。
當前文章介紹在DAYU200開發板上燒寫OpenHarmony系統,利用huaweicloud-iot-device-sdk
完成華爲雲IOT平臺對接,完成物聯網數據通信。
所需硬件:DAYU200開發板(RK3568)
二、DAYU200開發板
2.1 開發板介紹
關於開發板的介紹在這裏:https://gitee.com/hihope_iot/docs/tree/master/HiHope_DAYU200
基於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 固件燒寫
【1】燒寫工具下載
下來下來之後打開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] (c) Microsoft Corporation。保留所有權利。 C:\Users\11266>ping a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com 正在 Ping a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com [121.36.42.100] 具有 32 字節的數據: 來自 121.36.42.100 的回覆: 字節=32 時間=38ms TTL=94 來自 121.36.42.100 的回覆: 字節=32 時間=37ms TTL=94 來自 121.36.42.100 的回覆: 字節=32 時間=38ms TTL=94 來自 121.36.42.100 的回覆: 字節=32 時間=36ms TTL=94 121.36.42.100 的 Ping 統計信息: 數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失), 往返行程的估計時間(以毫秒爲單位): 最短 = 36ms,最長 = 38ms,平均 = 37ms C:\Users\11266>
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.so
,libpaho-mqtt3as.so
,libssh.so
,libnopoll.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_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("//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=[ "//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_libHWSecureC include_dirs = include_common deps=[ "//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_nopoll include_dirs = include_common deps=[ "//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則表示成功連接華爲雲: