2024年HarmonyOS鸿蒙最全3步体验在DAYU200开发板上完成OpenHarmony对接华为云IoT(7),百度面试笔试题

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!


img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

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\_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和设备密钥,如下图所示:

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!


img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

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

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!


[外链图片转存中…(img-cLxQuqEx-1715611259014)]
[外链图片转存中…(img-QUeAffFG-1715611259015)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值