# openharmony-hint **Repository Path**: hellowoody/openharmony-hint ## Basic Information - **Project Name**: openharmony-hint - **Description**: Openharmony开源鸿蒙环境搭建和基础案例 - **Primary Language**: C - **License**: MPL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 1 - **Created**: 2025-04-10 - **Last Updated**: 2025-09-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # openharmony-hint ## WSL WSL(Windows Subsystem for Linux)和 WSL 2 是 Windows 操作系统提供的两种不同的功能,用于在 Windows 上运行原生的 Linux 命令行工具。尽管它们的目标相同,但两者之间存在一些关键区别: 1. **架构**: - **WSL**:基于翻译层,它将 Linux 系统调用转换为 Windows 系统调用。这种方式不需要虚拟化技术,因此启动速度更快且资源占用更低。 - **WSL 2**:引入了一个轻量级的虚拟机管理程序(Hyper-V),并使用真正的 Linux 内核,这使得它与传统的 Linux 发行版更为接近。相比 WSL,WSL 2 提供了更完整的 Linux 内核体验,并支持更多功能。 2. **性能**: - **WSL**:对于简单的命令行应用来说表现良好,但在处理复杂任务、文件系统操作等情况下可能会遇到性能瓶颈。 - **WSL 2**:通过使用实际的 Linux 内核极大地改进了文件系统性能,并提供了更好的系统调用兼容性,适用于需要更高性能和更复杂操作的任务。 3. **文件系统**: - **WSL**:使用的是分层文件系统,访问 Windows 文件系统中的文件时性能较好,但对于 Linux 文件系统的某些高级特性支持有限。 - **WSL 2**:采用虚拟硬盘作为其根文件系统,虽然对 Windows 文件系统的访问速度较慢,但它支持 Linux 文件系统的完整功能集。 4. **兼容性**: - **WSL**:由于不包含真正的 Linux 内核,因此在某些底层系统调用的支持上可能有所限制。 - **WSL 2**:几乎可以运行所有类型的 Linux 软件,包括那些需要特殊内核模块或服务的应用程序。 选择使用 WSL 还是 WSL 2 主要取决于您的具体需求,例如您是否需要更好的性能、更完整的 Linux 兼容性或特定的功能。随着技术的发展,WSL 2 成为了大多数用户的首选,因为它提供了更加全面和强大的 Linux 体验。 ## 安装WSL2 https://learn.microsoft.com/zh-cn/windows/wsl/install ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/wsl-setting.png) 1. 管理员身份运⾏PowerShell,执⾏: ```shell wsl -l -v ``` 2. 停⽌正在运⾏虚拟系统 ```shell wsl --shutdown ``` 3. 将需要迁移的Linux,进⾏导出 ```shell wsl --export Ubuntu D:/ubuntu.tar ``` 4. 导出完成之后,将原有的Linux卸载 ```shell wsl --unregister Ubuntu ``` 5. 将导出的⽂件放到需要保存的地⽅,进⾏导⼊即可 ```shell wsl --import Ubuntu D:\ubuntu\ D:\ubuntu.tar --version 2 ``` 6. 设置默认⽤户 ```shell ubuntu.exe config --default-user ``` 7. 启动虚拟环境 wsl -d Ubuntu-20.04(这个名字可以从 wsl -l -v 找) ```shell wsl -d Ubuntu-20.04 # 这个名字可以从 wsl -l -v 找 wsl -d Ubuntu-20.04 -u root # 指定用户启动 ``` 8. 停止指定的虚拟机 ``` wsl --terminate 虚拟机名字 ``` 9. 设置默认启动的发行版 ``` wsl --setdefault 虚拟机名字 ``` 10. 设置/修改root密码 ```shell sudo passwd root ``` ## Ubuntu Ubuntu系统要求:Ubuntu18.04~21.10版本。推荐使用20.04版本,内存16GB及以上,硬盘100GB及以上。 1. 用root用户操作 2. 更换软件源,先备份配置文件,再修改 ```shell # 先备份配置文件 sudo cp -a /etc/apt/sources.list /etc/apt/sources.list.bak # 更换软件源 sudo sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list sudo sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list # 更新软件包列表 apt-get update ``` 3. 将Ubuntu Shell 环境修改为bash,在终端输入如下命令: 3.1. 执行如下命令,确认输出结果为bash。如果输出结果不是bash,请根据后面步骤,将Ubuntu shell修改为bash。 ```shell ls -l /bin/sh ``` 3.2. 打开终端工具,执行如下命令,输入密码,然后选择No!! 将Ubuntu shell由dash修改为bash。 ```shell sudo dpkg-reconfigure dash ``` ## 基于命令行开发 1. 使用命令行进行设备开发时,可以通过以下步骤安装编译OpenHarmony需要的库和工具。 相应操作在Ubuntu环境中进行。 1.1 使用如下apt-get命令安装后续操作所需的库和工具: ```bash sudo apt-get install git git-lfs ninja-build curl python3-pip ``` ```bash # 可先不执行 sudo apt-get update && sudo apt-get install binutils binutils-dev git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libc6-dev-amd64 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby genext2fs device-tree-compiler make libffi-dev e2fsprogs pkg-config perl openssl libssl-dev libelf-dev libdwarf-dev u-boot-tools mtd-utils cpio doxygen liblz4-tool openjdk-8-jre gcc g++ texinfo dosfstools mtools default-jre default-jdk libncurses5 apt-utils wget scons python3.8-distutils tar rsync git-core libxml2-dev lib32z-dev grsync xxd libglib2.0-dev libpixman-1-dev kmod jfsutils reiserfsprogs xfsprogs squashfs-tools pcmciautils quota ppp libtinfo-dev libtinfo5 libncurses5-dev libncursesw5 libstdc++6 gcc-arm-none-eabi vim ssh locales libxinerama-dev libxcursor-dev libxrandr-dev libxi-dev ``` 1.2 将Python 3.8设置为默认Python版本。 查看Python 3.8的位置: ```bash which python3.8 ``` 我的电脑输出/usr/bin/python3.8 将Python和Python3切换为Python 3.8: ```bash # sudo update-alternatives --install /usr/bin/python python {Python 3.8 路径} 1 {Python 3.8 路径}为上一步查看的Python 3.8的位置 # sudo update-alternatives --install /usr/bin/python3 python3 {Python 3.8 路径} 1 {Python 3.8 路径}为上一步查看的Python 3.8的位置 # 这条命令的作用是将 /usr/bin/python3.8 注册为 python 命令的一个可选项,并设置其优先级为 1。 # 通过 update-alternatives,你可以轻松管理和切换多个版本的 Python,避免版本冲突问题。 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 1 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1 ``` 2. 获取源码 在Ubuntu环境下通过以下步骤获取OpenHarmony源码。 2.1 注册码云gitee帐号。 2.2 配置用户信息。 ```bash git config --global user.name "yourname" git config --global user.email "your-email-address" git config --global credential.helper store ``` ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/gitee_account.png) 2.3 执行如下命令安装码云repo工具。 下述命令中的安装路径以"~/bin"为例,请用户自行创建所需目录。 ```shell mkdir ~/bin curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/bin/repo chmod a+x ~/bin/repo pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests ``` 2.4 将repo添加到环境变量。 ```bash vim ~/.bashrc # 编辑环境变量 export PATH=~/bin:$PATH # 在环境变量的最后添加一行repo路径信息 source ~/.bashrc # 应用环境变量 ``` 3. 获取方式 下载OpenHarmony-v4.1-Release版本hi3861源码 ```bash cd /root # 可选 mkdir openharmony cd openharmony # 这条命令的作用是: # 初始化一个 OpenHarmony 项目的工作区。 # 使用 OpenHarmony 4.1 版本的清单文件(OpenHarmony-v4.1-Release)。 # 指定了一个自定义的清单文件 chipsets/hispark_pegasus.xml,可能针对 HiSpark Pegasus 芯片组。 # 只同步与 OpenHarmony "mini" 系统相关的子仓库。 # repo init -u https://gitee.com/openharmony/manifest -b refs/tags/OpenHarmony-v4.1-Release -m chipsets/hispark_pegasus.xml -g ohos:mini repo init -u https://gitee.com/openharmony/manifest -b refs/tags/OpenHarmony-v4.1-Release -g ohos:mini repo sync -c repo forall -c 'git lfs pull' # 安装依赖库,此步骤会安装一系列编译需要的依赖库 ./build/build_scripts/env_setup.sh source ~/.bashrc ``` 4. 执行prebuilts 在源码根目录下执行prebuilts脚本,安装编译器及二进制工具。 ```bash bash build/prebuilts_download.sh # 如果出现下面这个错误 Exception: /root/openharmony/developtools/ace_ets2bundle/compiler not exist, it shouldn't happen, pls check... # 该错误可以忽略 ``` 5. 安装编译工具(可先不做) 安装hb 在源码根目录运行如下命令安装hb并更新至最新版本。 ```bash python3 -m pip install --user build/hb ``` 设置环境变量。 ```bash vim ~/.bashrc ``` 将以下命令拷贝到.bashrc文件的最后一行,保存并退出。 ```bash export PATH=~/.local/bin:$PATH ``` 执行如下命令更新环境变量。 ```bash source ~/.bashrc ``` 查看是否安装成功 ```bash hb help ``` 6. 安装Hi3861开发板特有环境 相关操作在Ubuntu环境下进行。 6.1 安装Scons 运行如下命令,安装SCons安装包。 ```bash python3 -m pip install scons # pip install scons -i https://pypi.tuna.tsinghua.edu.cn/simple ``` 运行如下命令,查看是否安装成功。如果安装成功,查询结果下图所示。 ```bash scons -v ``` 6.2 安装python模块 安装pycryptodome ```bash sudo pip3 install pycryptodome # pip install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple ``` 安装ecdsa ```bash sudo pip3 install ecdsa pip install ecdsa -i https://pypi.tuna.tsinghua.edu.cn/simple ``` 6.3 安装gcc_riscv32(WLAN模组类编译工具链) 下载gcc_riscv32-linux-7.3.0 https://repo.huaweicloud.com/harmonyos/compiler/gcc_riscv32/7.3.0/linux/gcc_riscv32-linux-7.3.0.tar.gz 将压缩包拷贝到ubuntu的/root中 请先执行以下命令将压缩包解压到根目录 ```bash # 将压缩包解压到/root文件夹中 tar -xvf gcc_riscv32-linux-7.3.0.tar.gz -C ~ # 打开.bashrc文件。 # 将以下命令拷贝到的最后一行,保存并退出。 # export PATH=/root/gcc_riscv32/bin:$PATH vim ~/.bashrc source ~/.bashrc ``` Shell命令行中输入如下命令,如果能正确显示编译器版本号,表明编译器安装成功。 ```bash riscv32-unknown-elf-gcc -v ``` 7. 开始编译环境 ```bash cd openharmony ./build.sh --product-name wifiiot_hispark_pegasus --ccache --no-prebuilt-sdk ``` 如果出现下图的内容,证明环境安装成功 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/build_success.png) 编译完成之后的镜像文件所在位置如下图 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/ohos_image.png) 这个OHOS_Image.bin就是烧录文件,它所在的路径根据自己ubuntu的实际代码路径来。 8. 编写“Hello World”程序 下方将通过修改源码的方式展示如何编写简单程序,输出“Hello world”。 8.1 确定目录结构。 开发者编写业务时,务必先在./applications/sample/wifi-iot/app路径下新建一个目录(或一套目录结构),用于存放业务源码文件。 例如:在app下新增业务my_first_app,其中hello_world.c为业务代码,BUILD.gn为编译脚本,具体规划目录结构如下: ``` . └── applications └── sample └── wifi-iot └── app └── my_first_app │── hello_world.c └── BUILD.gn ``` 8.2 编写业务代码。 新建./applications/sample/wifi-iot/app/my_first_app下的hello_world.c文件,在hello_world.c中新建业务入口函数HelloWorld,并实现业务逻辑。并在代码最下方,使用OpenHarmony启动恢复模块接口SYS_RUN()启动业务。(SYS_RUN定义在ohos_init.h文件中) ```c #include #include "ohos_init.h" #include "ohos_types.h" void HelloWorld(void) { printf("[DEMO] Hello world.\n"); } SYS_RUN(HelloWorld); ``` 8.3 编写用于将业务构建成静态库的BUILD.gn文件。 新建./applications/sample/wifi-iot/app/my_first_app下的BUILD.gn文件,并完成如下配置。 如步骤1所述,BUILD.gn文件由三部分内容(目标、源文件、头文件路径)构成,需由开发者完成填写。 ```c static_library("myapp") { sources = [ "hello_world.c" ] include_dirs = [ "//utils/native/lite/include" ] } ``` - static_library中指定业务模块的编译结果,为静态库文件libmyapp.a,开发者根据实际情况完成填写。 - sources中指定静态库.a所依赖的.c文件及其路径,若路径中包含"//“则表示绝对路径(此处为代码根路径),若不包含”//"则表示相对路径。 - include_dirs中指定source所需要依赖的.h文件路径。 8.4 编写模块BUILD.gn文件,指定需参与构建的特性模块。 配置./applications/sample/wifi-iot/app/BUILD.gn文件,在features字段中增加索引,使目标模块参与编译。features字段指定业务模块的路径和目标,以my_first_app举例,features字段配置如下。 ```gn import("//build/lite/config/component/lite_component.gni") lite_component("app") { features = [ "my_first_app:myapp", ] } ``` - my_first_app是相对路径,指向./applications/sample/wifi-iot/app/my_first_app/BUILD.gn。 - myapp是目标,指向./applications/sample/wifi-iot/app/my_first_app/BUILD.gn中的static_library("myapp")。 8.5 开始编译环境 ```bash cd openharmony ./build.sh --product-name wifiiot_hispark_pegasus --ccache --no-prebuilt-sdk ``` 9. 烧录编译的hi3861固件 9.1 使用HiBurn工具烧录二进制程序到Hi3861芯片 https://gitee.com/hihope_iot/docs/blob/master/HiSpark_WiFi_IoT/Software/tools/HiBurn.exe 9.2 使用USB线连接到3861开发板,打开下载好的HiBurn工具 在windows设备管理器中查看usb线连接的com号 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/com.png) 勾选相应复选框 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/hb_checkbox.png) 修改写入速度 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/hb_setting.png) 选择文件 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/hb_selectfile.png) 点击connect按钮,然后按钮变为Disconnect ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/connect.png) 点击核心开发板上的RST按钮 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/rst.jpg) 烧录过程 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/burn1.jpg) 烧录结束 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/burn2.jpg) 10. 修改 HiSilicon(海思)芯片的配置文件 - usr_config.mk 文件的主要作用是提供用户自定义的编译配置选项。功能模块开关,例如是否启用 Wi-Fi、蓝牙、文件系统、网络协议栈等功能。 - 配置文件地址:openharmony/device/soc/hisilicon/hi3861v100/sdk_liteos/build/config/usr_config.mk ```mk # # BSP Settings # CONFIG_I2C_SUPPORT=y # CONFIG_I2C_SUPPORT is not set CONFIG_I2S_SUPPORT=y # CONFIG_I2S_SUPPORT is not set CONFIG_SPI_SUPPORT=y # CONFIG_SPI_SUPPORT is not set CONFIG_DMA_SUPPORT=y # CONFIG_DMA_SUPPORT is not set # CONFIG_SDIO_SUPPORT is not set CONFIG_SPI_DMA_SUPPORT=y # CONFIG_SPI_DMA_SUPPORT is not set CONFIG_UART_DMA_SUPPORT=y # CONFIG_UART_DMA_SUPPORT is not set CONFIG_PWM_SUPPORT=y # CONFIG_PWM_SUPPORT is not set CONFIG_PWM_HOLD_AFTER_REBOOT=y # CONFIG_PWM_HOLD_AFTER_REBOOT is not set CONFIG_AT_SUPPORT=y CONFIG_FILE_SYSTEM_SUPPORT=y CONFIG_UART0_SUPPORT=y CONFIG_UART1_SUPPORT=y CONFIG_UART2_SUPPORT=y ``` ## MobaXTerm 1. 打开MobaXTerm,点击会话按钮session ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/moba01.png) 2. 点击串口按钮serial ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/moba02.png) 3. 选择传输速度115200 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/moba03.png) ## 华为云物联网平台操作 1. 打开华为云官网地址https://www.huaweicloud.com/,然后点击右上角的登录按钮 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud01.png) 2. 进入到登录页面,输入对应的华为云账号或者华为账号进行登录 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud02.png) 3. 登录成功之后,点击右上角的“控制台” ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud03.png) 4. 进入到控制台之后,点击控制台页面中的菜单按钮,即可弹出搜索输入框 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud04.png) ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud05.png) 5. 在输入框中,输入“iotda”,即可弹出“IOT物联网”入口 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud06.png) 6. 进入物联网控制台,创建免费实例 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud07.png) 7. 在物联网控制台,点击左侧菜单中的“产品”,然后点击页面右侧的“创建产品”按钮 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud08.png) ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud09.png) ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud10.png) ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud11.png) ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud12.png) 8. **编辑产品模型定义** 创建完成产品之后,可以进入到产品列表,点击“查看”或者<产品名称>链接 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud13.png) 9. 然后进入到模型定义页面,点击“自定义模型”按钮 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud14.png) 10. 然后会弹出自定义模型窗口,在窗口中根据自己业务实际需要填写“服务ID”即可 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud15.png) 11. 添加完成服务之后,需要在服务下添加属性,点击“添加属性”按钮 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud16.png) 12. 然后弹出“新增属性”的窗口,根据实际业务需要填写相应参数即可 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud17.png) 13. 如果该产品模型还支持下发命令进行控制,那么还可以在服务下添加命令,即点击页面中的“添加命令”按钮 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud18.png) 14. 然后弹出“新增命令”的窗口,根据实际业务需要填写相应参数即可 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud19.png) ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud20.png) 15. 添加完服务、属性、命令操作之后,控制台页面截图 这里可以根据实际业务需要,可以继续添加多个服务、多个属性、多个命令。 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud21.png) 16. **注册设备** 完成产品创建之后,可以在产品下面添加设备,点击控制台左侧菜单中的“所有设备”,然后点击右上方的“注册设备”按钮 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud22.png) 17. 然后会弹出“注册设备”的输入框,根据实际业务填写完成相应参数即可 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud23.png) 18. 然后提示创建设备成功,这里需要主要的是要保存好自己的密钥,因为只在创建的时候会下载一次,后面没有地方可以查阅,但是支持重置密钥 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud24.png) 19. 设备注册完成之后,会显示的是“未激活”状态,待后期设备连接上物联网平台之后,就自动激活了,后续不会再有“未激活”状态,只会是“离线”或者“在线”。 20. **查阅MQTT和AMQP接入地址** 后期在进行物联网功能开发的时候,需要使用到MQTT接入地址和AMQP接入地址, 点击控制台左侧菜单中的“总览”,然后点击页面中的“接入信息”按钮 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud25.png) 21. 然后就可以从中获取MQTT\HTTP\AMQP等相关协议的接入地址 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud26.png) - AMQP(高级消息队列协议)和 MQTT(消息队列遥测传输)都是用于在不同应用程序或设备之间进行消息传递的协议,但它们的设计目标、功能集和适用场景有所不同。以下是两者的主要区别: a. 设计目标: - MQTT 是一种轻量级的消息协议,专为资源受限的设备和不可靠网络环境设计,适用于物联网(IoT)应用。 - AMQP 是一种更复杂且功能丰富的协议,提供了高度可靠性、安全性和互操作性,适合企业级应用。 b. 消息模式: - MQTT 主要使用发布/订阅模型,通过主题(topics)来路由消息,简化了消息分发机制。 - AMQP 支持多种消息模式,包括点对点、发布/订阅以及更为复杂的路由规则,例如通过交换机和队列实现的消息路由。 c. 灵活性与复杂性: - MQTT 注重简洁性和易用性,通常需要较少的资源和开销。 - AMQP 提供了更多的特性和灵活性,如事务支持、消息排序等,但这也带来了更高的复杂性和资源需求。 d. 性能与开销: - MQTT 因其轻量级设计,在带宽和计算资源方面的需求较小,更适合于低功耗设备。 - AMQP 由于其丰富的特性集,可能会消耗更多的网络带宽和处理能力。 e. 安全性: - MQTT 支持基本的安全机制,如TLS/SSL加密,但在协议层面上的安全特性相对有限。 - AMQP 提供了更全面的安全特性,包括消息加密和认证机制,更适合安全性要求高的企业环境。 f. 适用场景: - MQTT 更适合用于智能家居、传感器网络等物联网领域。 - AMQP 则更多应用于银行系统、电子商务平台等需要严格消息管理和高可靠性的企业级应用中。 22. **查看MQTT中的TOPIC** 后面设备端会使用MQTT与物联网平台进行通信,将会使用到相关TOPIC,设备默认支持的TOPIC查阅方式是进入到产品中进行查看 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud27.png) ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud28.png) 23. 生成MQTT连接的必要参数 (已废弃) 在进行mqtt连接物联网平台的时候,除了mqtt接入地址(之前已经获取到)之外,还需要ClientId,Username和Password,于是通过下面工具可以生成这3个关键参数, 工具地址为https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/ 打开工具之后, 输入DeviceId(设备id)和DeviceSecret(设备密钥,在之前创建设备的时候生成并下载保存的), 然后点击“Generate”按钮即可以 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud29.png) 23. 查看MQTT连接的必要参数(新) 在设备详情页面中查看MQTT连接参数 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud41.png) 端口如果8883不行,可以试试1883 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud42.png) 24. **通过mqtt.fx连接物联网平台进行测试** 打开mqtt .fx工具,并且点击设置按钮 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud30.png) 然后会打开设置页面,点击“+”按钮 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud31.png) 然后编写相关参数,注意clientid username password需要每天重新生成!如果用前一天的信息会报bad username等信息 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud32.png) 编写完成之后点击“OK”,然后在mqtt .fx的首页的下拉框中选择刚创建的连接名,并且点击“Connect”按钮 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud33.png) ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud34.png) 连接成功之后,“DisConnect”按钮会亮起,并且可以查看log里面是否报错 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud35.png) 然后打开物联网平台,可以看到该设备显示“在线”状态 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud36.png) 25. mqtt.fx模拟设备上报数据到物联网平台 待mqtt .fx连接上平台之后,在Publish页面中的下拉输入框中输入上报属性数据对应的TOPIC,请参照前面的“查看MQTT中的TOPIC”小节进行获取。 比如我这里的设备ID为67eb96a85367f573f77e8956_DEVICE-TEST-001, ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud37.png) 那么这里的上报属性的topic填写为$oc/devices/67eb96a85367f573f77e8956_DEVICE-TEST-001/sys/properties/report,然后在下面的空白输入框中填写要上报的属性数据,之前上报的属性数据需要根据之前创建产品模型时定义的数据结构进行定义,这里上报的数据如下 ```json { "services": [{ "service_id": "service01", "properties": { "p1": "hello IoT" } } ] } ``` 该数据中的services,service_id和properties是关键字,其他的为自定义模型中的数据可根据实际情况进行填充。 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud38.png) 填写完成之后点击“Publish”按钮发送数据即可 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud39.png) 发送完成之后,可以在物联网平台的设备详情中实时查看到刚上报过来的数据 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud40.png) ## 华为云物联网平台操作(北向) 1. 将鼠标移至页面右上角的用户名处,在下拉列表中单击“我的凭证”。进入该页面后点击左侧“访问密钥”。单击“新增访问密钥”,进入“新增访问密钥”页面。输入描述信息,单击“确定”。创建成功后,在“创建成功”弹窗中,单击“立即下载”下载密钥,并妥善保管。 可以参考: https://support.huaweicloud.com/devg-apisign/api-sign-provide-aksk.html ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud43.png) ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud44.png) ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud45.png) ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud46.png) 2. 通过AK/SK测试获取token接口 https://console.huaweicloud.com/apiexplorer/#/openapi/IAM/debug?api=KeystoneCreateAgencyToken&version=v3 ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud47.png) ```json { "auth": { "identity": { "methods": [ "hw_ak_sk" ], "hw_ak_sk": { "access": { "key": "你的AK" }, "secret": { "key": "你的SK" } } }, "scope": { "project": { "name": "cn-north-4" } } } } ``` ```ts getAccessToken(callback: Function) { let httpRequest = http.createHttp(); httpRequest.request( 'https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens', { method: http.RequestMethod.POST, header: { 'Content-Type': 'application/json' }, extraData: this.getTokenRequestParam(), connectTimeout: 60000, readTimeout: 60000, }, (err, data) => { if (!err) { let access_token: string = data.header['x-subject-token'] console.info("access_token:" + access_token) callback(access_token) } else { console.info('Result1_error:' + JSON.stringify(err)); httpRequest.destroy(); } }) } getTokenRequestParam(): Record < string, Auth > { //自行替换 API Key和 Secret Key return { "auth": { "identity": { "methods": [ "hw_ak_sk" ], "hw_ak_sk": { "access": { "key": AK }, "secret": { "key": SK } } }, "scope": { "project": { "name": "cn-north-4" // 所属区域:华北-北京四 } } } } } ``` 3. 获取设备属性数据(获取影子设备数据) https://console.huaweicloud.com/apiexplorer/#/openapi/IoTDA/debug?api=ShowDeviceShadow ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud48.png) ```ts //获取温湿度 getTemAndHumDeviceInfo(access_token: string, callback: Function){ let httpRequest = http.createHttp(); httpRequest.request( `https://59e62b5755.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/${projectId}/devices/${deviceId}/shadow`, { method: http.RequestMethod.GET, header: { 'Content-Type': 'application/json', 'X-Auth-Token': access_token //需要在请求头中加入之前获取的token }, connectTimeout: 60000, readTimeout: 60000, }, (err, data) => { if (!err) { try { const parsedData: Record = JSON.parse(data.result.toString()); let TemAndHumValue: Record = parsedData.shadow[0].reported.properties; callback(TemAndHumValue) } catch (parseError) { console.info('Result1_error: Unable to parse JSON - ' + JSON.stringify(parseError)); } } else { console.info('Result1_error:' + JSON.stringify(err)); } httpRequest.destroy(); }) } ``` 4. 下发指令 https://console.huaweicloud.com/apiexplorer/#/openapi/IoTDA/debug?api=CreateCommand ![image](https://gitee.com/hellowoody/openharmony-hint/raw/main/assets/imgs/huaweicloud49.png) ```ts //风扇下发控制命令 sendFanCmd(access_token: string, flag: string, callback: Function) { let httpRequest = http.createHttp(); httpRequest.request( `https://59e62b5755.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/${projectId}/devices/${deviceId}/commands`, // 'https://9ba2353c03.iotda.cn-north-4.myhuaweicloud.com:443/v5/iot/'+projectId+'/devices/'+fanDeviceID+'/commands', { method: http.RequestMethod.POST, header: { 'Content-Type': 'application/json', 'X-Auth-Token': access_token //需要在请求头中加入之前获取的token }, connectTimeout: 60000, readTimeout: 60000, extraData: { "service_id": "service01", //云平台上配置的交通灯产品的服务id "command_name": "FanFlag", //云平台上配置的交通灯产品的命令名称 "paras": { "flagValue": flag } } }, (err, data) => { if (!err) { callback(data.result) // if (errorMessage) { // promptAction.showToast({ // message: errorMessage, // duration:2500 // }); // } } else { console.info('Result1_error:' + JSON.stringify(err)); } httpRequest.destroy(); }) } ```