【BQ3568HM开发板】智能家居中控屏连接华为云IoTDA物联网平台
目录
引言
安装OpenHarmony的MQTT库
华为云平台的操作
建立设备
建立物模型
连接华为云平台
发布LED灯状态
代码重构
测试结果
接收平台发送的属性修改命令
设备侧API
Topic
下行请求参数说明
上行响应参数说明
程序修改
应用侧API
测试设备属性设置功能
结语
本文首发于电子发烧友论坛:https://bbs.elecfans.com/jishu_2475289_1_1.html
引言
前段时间进行了BQ3568HM开发板的测评,设计了智能家居中控屏并进行了LED灯的控制操作。今天为其加入物联网平台的功能,使其真正成为一个智能家居产品。
安装OpenHarmony的MQTT库
官方有个MQTT软件包:ohpm/mqtt,它的最新版本针对的是API12,而BQ3568HM开发板是基于OpenHarmony 4.1,可以使用老一点的版本,使用如下命令:
ohpm install @ohos/mqtt@2.0.13
上面的操作虽然可以导入老版本的MQTT包,但是当三方包发布新版本后,点击同步工程,会出现默认更新安装的三方包版本情况。为了避免这种情况,手工修改oh-package.json5,将其中@ohos/mqtt一行版本号前面的“^"符号删除掉,这样保证安装固定版本的三方包。
{"name": "myapplication","version": "1.0.0","description": "Please describe the basic information.","main": "","author": "","license": "","dependencies": {"@ohos/mqtt": "2.0.13"},"devDependencies": {"@ohos/hypium": "1.0.6"},"dynamicDependencies": {}
}
华为云平台的操作
建立设备
我需要先在平台创建产品和设备,有关产品和设备的创建,可以参考我以前的博文:【HZHY-AI300G智能盒试用连载体验】在华为IoTDA平台上建立设备_hzhy-ai300g 多少钱-CSDN博客
建立物模型
在线开发产品模型前需要创建产品。创建产品需要输入产品名称、协议类型、数据格式、所属行业和设备类型等信息,产品模型会使用这些信息作为设备能力字段取值。物联网平台提供了标准模型和厂商模型,这些模型涉及多个领域,模型中提供了已经编辑好的产品模型文件,您可以根据自己的需要对产品模型中的字段进行修改和增删;如果选择自定义产品模型,则需要完整定义产品模型。
操作步骤
- 访问设备接入服务,单击“管理控制台”进入“设备接入”控制台。选择您的实例,单击实例卡片进入。
- 单击左侧导航栏的“产品”,在产品列表中,找到对应的产品,单击产品进入产品详情页。
- 在产品详情基本信息页面,单击“自定义模型”,添加服务。
- 输入“服务ID”、“服务类型”和“服务描述”,然后单击“确定”。
- “服务ID”:采用首字母大写的命名方式。比如:WaterMeter、StreetLight。
- “服务类型”:建议和服务ID保持一致。
- “服务描述”:比如路灯上报的环境光强度和路灯开关状态的属性。
添加服务后,在“添加服务”区域,对属性和命令进行定义。每个服务下,可以包含属性和命令,也可以只包含其中之一,请根据此类设备的实际情况进行配置。
- 单击步骤4新增的服务ID,在展开的页面单击“新增属性”,在弹出窗口中配置属性的各项参数,然后单击“确定”。
参数
说明
属性名称
建议采用驼峰形式,如batteryLevel、internalTemperature。
数据类型
- int:当上报的数据为整数时,可配置为此类型。
- long: 当上报的数据为长整型时,可配置为此类型。
- decimal:当上报的数据为小数时,可配置为此类型。配置“经纬度”属性时,数据类型建议使用“decimal”。
- string:当上报的数据为字符串、枚举值时,可以配置为此类型。如果为枚举值,值之间需要用英文逗号(“,”)分隔。
- dateTime:当上报的数据为日期时,可以配置为此类型。
此类型属性上报格式推荐样例:2020-09-01T18:50:20Z或者2020-09-01T18:50:20.200Z
- jsonObject:当上报的数据为JSON结构体时,可以配置为此类型。
- enum: 当上报的数据为枚举值时,可配置为此类型。
搭配参数enumList格式填写,比如状态属性的enumList填写为OPEN,CLOSE,那么属性上报格式样例为"OPEN"或者"CLOSE"
- boolean: 当上报的数据为布尔值时,可配置为此类型。
此类型属性上报推荐格式样例:true/false 或者 0/1
- stringList: 当上报的数据为字符串数组时,可配置为此类型。
此类型属性上报推荐格式样例:["str1","str2","str3"]
访问权限
- 可读:通过接口可以查询该属性。
- 可写:通过接口可以修改该属性值。
取值范围
请根据此类设备的实际情况进行配置。
步长
单位
我建立了一个smarthome的物模型,包括温度、湿度和LED状态3个属性,其中LED状态属性是平台可以修改的,另外两个都是设备上报的。

连接华为云平台
先建立IoTDA.ets,内容如下:
import { MqttAsync, MqttClient, MqttPublishOptions, MqttResponse, MqttSubscribeOptions } from '@ohos/mqtt'export class MQTT{private serverUrl: string = 'tcp://bde4cbe7aa.st1.iotda-device.cn-north-4.myhuaweicloud.com:1883'private clientId: string = 'xxxxx_test_0_0_2025020502'private userName: string = 'xxxxx_test'private password: string = 'xxxxxxxxxxxxxx'public mqttAsyncClient: MqttClient = MqttAsync.createMqtt({url: this.serverUrl,clientId: this.clientId,persistenceType: 1,})private topic: string = "light002"connectMqtt() {this.mqttAsyncClient.connect({userName: this.userName,password: this.password,}).then(() => {this.mqttAsyncClient.isConnected().then((data: boolean) => {console.log("连接状态: " + data)});}).catch(() => {console.warn('连接失败')})}subscribeMqtt(topic: string) {let subscribeOption: MqttSubscribeOptions = {topic: topic,//主题名称qos: 0 //消息的服务质量设置}this.mqttAsyncClient.subscribe(subscribeOption).then((data: MqttResponse) => {console.log("订阅成功 " + JSON.stringify(data));}).catch((err: MqttResponse) => {console.log("订阅失败" + JSON.stringify(err));})}messageArrived() {this.mqttAsyncClient.messageArrived((err, data) => {if (err) {console.error("接收消息时发生错误:", err);} else {console.log("接收到的消息:",JSON.stringify(data));}});}publish(topic:string, message:string) {let publishOption: MqttPublishOptions = {topic: topic, //主题名称qos: 0, //消息的服务质量设置payload: message,//发布的消息};this.mqttAsyncClient.publish(publishOption).then((data: MqttResponse) => {console.log("推送成功" + JSON.stringify(data));}).catch((err: Error) => {console.log("推送失败" + JSON.stringify(err));});}disconnect() {this.mqttAsyncClient.disconnect().then((data: MqttResponse) => {console.log("断开成功:" + JSON.stringify(data));}).catch((err: MqttResponse) => {console.log("断开失败:" + JSON.stringify(err));})}
}
export const mqtt = new MQTT();
在index.ets开头加上下面的语句:
import {mqtt} from './IoTDA'
在SmartHomeControlPanel部分加上:
deviceId: string = "XXXX_test";aboutToAppear() {// 创建MQTT客户端mqtt.connectMqtt()}
这样就可以在程序一启动时先连接上华为云的服务器。
发布LED灯状态
代码重构
我们将原来的LED灯控制逻辑进行一下重构,添加如下函数:
// 控制LED灯的状态并发布消息private setLedStatusAndPublish() {if (this.lightStatus) {console.info("this toggle is On.");let res: string = testNapi.gpio_on(this.ledPath);console.info(res);} else {console.info("this.toggle is Off.");let res: string = testNapi.gpio_off(this.ledPath);console.info(res);}let ledstatus: string = this.lightStatus ? 'ON' : 'OFF';const topic = `$oc/devices/${this.deviceId}/sys/properties/report`;const message = `{"services": [{"serviceId": "smarthome", "properties": {"LED状态": "${ledstatus}"}}]}`;mqtt.publish(topic, message);}
然后将灯光控制按钮修改为:
// 灯光控制按钮Button({type: ButtonType.Capsule,stateEffect: true,}) {Row() {Image(this.lightStatus ? $r('app.media.light_off_icon') : $r('app.media.light_on_icon')).width(48).height(48).margin({ right: 10 })Text(this.lightStatus ? '关闭灯光' : '打开灯光').fontSize(20).fontColor('#FFFFFF')}}.width('80%').height(80).margin({ top: 20 }).onClick(() => {this.lightStatus = !this.lightStatus;this.setLedStatusAndPublish();})
这样我们每按下灯光控制按钮,就会自动向云平台发送一下最新的状态。
测试结果
我们可以测试一下,看到云平台显示的状态信息如下:

接收平台发送的属性修改命令
设备侧API
当平台向设备设置属性信息时,首先设备必须在线。
设备侧会自动收到特定Topic的查询请求(无需订阅),设备收到属性查询请求后,需要将设备的属性数据返回给平台,如果设备没回响应平台会认为属性查询请求执行超时。
有关文档可以参考:平台设置设备属性_设备接入 IoTDA_华为云
Topic
下行: $oc/devices/{device_id}/sys/properties/set/request_id={request_id}
上行: $oc/devices/{device_id}/sys/properties/set/response/request_id={request_id}
下行请求参数说明
| 字段名 | 必选/可选 | 类型 | 参数描述 |
|---|---|---|---|
| object_device_id | 可选 | String | 参数解释:
|
| services | 必选 | List<ServiceProperty> | 设备服务数据列表。 |
ServiceProperty结构定义:
| 字段名 | 必选/可选 | 类型 | 参数描述 |
|---|---|---|---|
| service_id | 必选 | String | 参数解释: 设备的服务ID,由创建的产品模型确定。 |
| properties | 必选 | Object | 参数解释: 设备服务的属性列表,具体字段在产品模型里定义,可以设置多个字段。 |
上行响应参数说明
| 字段名 | 必选/可选 | 类型 | 参数描述 |
|---|---|---|---|
| result_code | 可选 | Integer | 参数解释: 命令的执行结果,0表示成功,其他表示失败。不带默认认为成功。 |
| result_desc | 可选 | String | 参数解释: 属性设置的响应描述。 |
程序修改
我们需要在aboutToAppear中加上接收云端消息的函数,同时在其中进行JSON解析。ArkTS的JSON解析有点特殊,参见我写的博文。下面就是修改好的代码:
// 定义设备属性类
class DeviceProperties {温度: number;湿度: number;LED状态: string;constructor(温度: number, 湿度: number, LED状态: string) {this.温度 = 温度;this.湿度 = 湿度;this.LED状态 = LED状态;}
}// 定义服务类
class Service {serviceId: string;properties: DeviceProperties;constructor(serviceId: string, properties: DeviceProperties) {this.serviceId = serviceId;this.properties = properties;}
}// 定义整个数据结构类
class ServiceData {services: Service[];constructor(services: Service[]) {this.services = services;}
}@Entry
@Component
struct SmartHomeControlPanel {
……aboutToAppear() {// 创建MQTT客户端mqtt.connectMqtt()mqtt.mqttAsyncClient.messageArrived((err, data) => {if (err) {console.error("接收消息时发生错误:", err);} else {console.log("接收到的消息:",JSON.stringify(data));// 处理接收到的消息if(data.topic.indexOf('sys/properties/set')) {let upTopic = this.getUpstreamTopic(data.topic)let resultString = '{"result_code": 0, "result_desc": "success" }'mqtt.publish(upTopic, resultString);}// 解析 JSON 字符串const parsedData = JSON.parse(data.payload) as ServiceData;const ledStatus = parsedData.services[0].properties.LED状态;// 打印结果console.log(`Service ID: ${parsedData.services[0].serviceId}`);console.log(`LED状态: ${parsedData.services[0].properties.LED状态}`);if(ledStatus === 'ON'){this.lightStatus = true;}else {this.lightStatus = false;}this.setLedStatusAndPublish();}});}
应用侧API
华为的物联网平台提供了应用侧API,实现设备数据采集、命令下发、设备管理等业务场景。

有关应用侧API参见:应用侧API参考_设备接入 IoTDA_华为云。
为了简化应用侧程序的开发,华为提供了各种语言的SDK:SDK概述_设备接入 IoTDA_华为云。不过,今天不介绍SDK,只介绍如何用API Explorer进行API测试和学习。
华为云API Explorer为开发者提供一站式API 解决方案 统一平台,集成华为 云服务 所有开放API,支持全量快速检索、可视化调试、帮助文档、代码示例等能力,帮助开发者快速查找、学习API和使用API开发代码。API Explorer致力于帮助您更快地查找华为云Open API,您可以使用API Explorer来检索华为云开放的API并查看相应的文档,同时应用于API调试、 故障排查 等场景。
API Explorer的网站:https://console.huaweicloud.com/apiexplorer/#/openapi/overview
测试设备属性设置功能
我在API Explorer中对test设备的“LED状态”属性进行了修改。

程序可以正常收到下发的指令,并根据指令进行开灯和关灯操作。

结语
至此,我们完成了智能中控屏接入物联网的操作。我们的测试仍然将继续。
相关文章:
【BQ3568HM开发板】智能家居中控屏连接华为云IoTDA物联网平台
目录 引言 安装OpenHarmony的MQTT库 华为云平台的操作 建立设备 建立物模型 连接华为云平台 发布LED灯状态 代码重构 测试结果 接收平台发送的属性修改命令 设备侧API Topic 下行请求参数说明 上行响应参数说明 程序修改 应用侧API 测试设备属性设置功能 结语…...
mac 安装 dotnet 环境
目录 一、安装准备 二、安装方法(两种任选) 方法 1:使用官方安装包(推荐新手) 方法 2:使用 Homebrew(适合开发者) 1. 安装 Homebrew(如未安装) 2. 通过 …...
Python爬虫--requests库
一、安装 requests pip install requests二、基础用法 1. 发送 GET 请求 import requestsresponse requests.get("https://www.example.com") print(response.status_code) # 状态码(200表示成功) print(response.text) # 响应内…...
java 8 在 idea 无法创建 java spring boot 项目的 变通解决办法
java 8 在 idea 无法创建 java spring boot 项目的 变通解决办法 spring boot 3 官方强制 要用 java 17 ,但是 不想安装java 17的 ,但是又想 使用 spring boot ,可以这样 : 在这个网站 https://start.aliyun.com/ 选择 你相对…...
web-文件上传-CTFHub
前言 在众多的CTF平台当中,作者认为CTFHub对于初学者来说,是入门平台的不二之选。CTFHub通过自己独特的技能树模块,可以帮助初学者来快速入门。具体请看官方介绍:CTFHub。 作者更新了CTFHub系列,希望小伙伴们多多支持…...
langchain教程-5.DocumentLoader/多种文档加载器
前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…...
SQLAlchemy-2.0中模型定义和alembic的数据库迁移工具
SQLAlchemy-2.0中模型定义和alembic的数据库迁移工具 一、SQLAIchemy的介绍二、数据库引擎1、支持的数据库1.1、sqlite数据库1.2、MySQL数据库1.3、数据库引擎的参数 三、定义模型类1、定义模型2、engine负责数据库迁移 四、alembic数据库迁移⼯具1、安装alembic2、初始化alemb…...
C# OpenCV机器视觉:图像风格迁移
在一个充满奇思妙想的创意工作室里,小李正像只热锅上的蚂蚁,为客户的项目挠破了脑袋,急需寻找灵感的火花。他望着眼前那幅平淡无奇的风景图像,心想:“这玩意儿也太普通啦,就像一杯白开水,怎么能…...
6955BA/C/E信号收发仪
6955BA/C/E信号收发仪 6955BA/C/E信号收发仪为符合PXIe总线标准的3U模块化产品,该模块频率范围覆盖40MHz~8GHz/12GHz/26.5GHz、最大信号带宽1GHz、单边带相位噪声为-120dBc/Hz20kHz频偏(载波10GHz,典型值),具有矢量信…...
语言月赛 202311【基因】题解(AC)
》》》点我查看「视频」详解》》》 [语言月赛 202311] 基因 题目描述 有一个长度为 n n n 的字符串 S S S。其只包含有大写字母。 小 A 将 S S S 进行翻转后,得到另一个字符串 S ′ S S′。两个字符串 S S S 与 S ′ S S′ 对应配对。例如说,对…...
Spring @PropertySource:让你的应用配置更加模块化和可维护
PropertySource注解在Spring中的作用,就像是给Spring应用配了一个“外部配置箱”。 想象一下,你在开发一个Spring应用时,有很多配置信息需要设置,比如数据库的连接信息、应用的某些功能开关等。如果这些信息都硬编码在代码中&…...
Deep Sleep 96小时:一场没有硝烟的科技保卫战
2025年1月28日凌晨3点,当大多数人还沉浸在梦乡时,一场没有硝烟的战争悄然打响。代号“Deep Sleep”的服务器突遭海量数据洪流冲击,警报声响彻机房,一场针对中国关键信息基础设施的网络攻击来势汹汹! 面对美国发起的这场…...
快速搭建GPU环境 | docker、k8s中使用gpu
目录 一、裸机部署安装 GPU Driver安装 CUDA Toolkit测试 二、Docker 环境安装 nvidia-container-toolkit配置使用该 runtime 三、 k8s 环境安装 device-plugin安装 GPU 监控 一、裸机部署 裸机中要使用上 GPU 需要安装以下组件: GPU DriverCUDA Toolkit 二者的关…...
【戒抖音系列】短视频戒除-1-对推荐算法进行干扰
如今推荐算法已经渗透到人们生活的方方面面,尤其是抖音等短视频核心就是推荐算法。 【短视频的危害】 1> 会让人变笨,慢慢让人丧失注意力与专注力 2> 让人丧失阅读长文的能力 3> 让人沉浸在一个又一个快感与嗨点当中。当我们刷短视频时&#x…...
DeepSeek写的lammps反应势断键动态显示程序
最近DeepSeek比较火,跟风试用了一下。 让DeepSeek写了一个lammps反应势模拟的断键动态显示代码。 假如你是一名lammps专家,现在用reaxff反应势模拟一个聚乙烯裂解的分子动力学模拟,模拟的轨迹文件为:dump.lammpstrj,反应产物信息文件为:bonds.reaxff,bonds.reaxff文件包…...
npm中央仓库
1、官网地址 npm | Home 2、搜索依赖包...
2025年软考考试时间及考试科目如何安排?附考试注意事项!
一、考试时间 2025年软考举行两次考试,分别安排在上半年和下半年。根据最新公布的信息,2025年软考考试的具体时间安排如下: 上半年考试时间:5月24日至5月27日 下半年考试时间:11月8日至11月11日 考生需要在规定的时间内…...
4.PPT:日月潭景点介绍【18】
目录 NO1、2、3、4 NO5、6、7、8 NO9、10、11、12 表居中或者水平/垂直居中单元格内容居中或者水平/垂直居中 NO1、2、3、4 新建一个空白演示文稿,命名为“PPT.pptx”(“.pptx”为扩展名)新建幻灯片 开始→版式“PPT_素材.doc…...
HTML排版标签、语义化标签、块级和行内元素详解
目录 前言 一、HTML中的排版标签 1. 文本相关标签 1.1 标题标签 ~ 1.2 段落标签 1.3 强调和加粗 1.4 换行标签 1.5 水平线标签 二、HTML中的语义化标签 2.1 语义化标签概述 2.2 常见的语义化标签 示例(核心代码部分): 三、HTM…...
机器学习中的关键概念:通过SKlearn的MNIST实验深入理解
欢迎来到我的主页:【Echo-Nie】 本篇文章收录于专栏【机器学习】 1 sklearn相关介绍 Scikit-learn 是一个广泛使用的开源机器学习库,提供了简单而高效的数据挖掘和数据分析工具。它建立在 NumPy、SciPy 和 matplotlib 等科学计算库之上,支持…...
河洛理数【陈抟】论天地两数
从文中说天数属阳、地数属阴可知如何确定天数和地数的确定,也就是奇数属天数、偶数属地数。当然这只是其中的一个特性,而天地两数都有具体的数字,分别是25和30。利于阳的主要有男性、阳爻、冬至到四月终;利于阴的主要是女性、阴爻、夏至到十月终。 另前文中有说到天数和地数…...
Linux 中为什么进程是休眠的,但是还是处理了数据
在 Linux 中,进程的状态可以是多种多样的,S(休眠状态)是其中之一。即使进程处于休眠状态,它仍然可以继续处理数据。这是因为 休眠状态 并不意味着进程完全停止工作,它通常指的是进程正在等待某些事件&#…...
弹性盒子的学习
/*弹性盒子内其他的属性和作用*/ 1、flex-grow 定义项目的放大比例,默认值为 0。如果有剩余空间,项目将根据该值进行放大。 2、flex-shrink 定义项目的缩小比例,默认值为 1。如果空间不足,项目将根据该值进行缩小。 3、flex-bas…...
用NeuralProphet预测股价:AI金融新利器(附源码)
作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话:我用NeuralProphet模型预测了股票价格,发现其通过结合时间序列分析和神经网络算法,确实能提供比传统Last Value方法更精准的预测。经过一系列超参数调优…...
深度学习-103-RAG技术之通过分块技术提升RAG的效果
文章目录 1 RAG中的分块技术1.1 RAG是什么1.2 分块chunking是什么1.3 分块的重要性1.4 分块的技巧2 固定字符大小分块2.1 固定字符大小分块的优缺点2.2 自定义分块代码2.3 LangChain的CharacterTextSplitter3 递归字符文本分割3.1 递归字符文本分割的优缺点3.2 LangChain的Recu…...
【B站保姆级视频教程:Jetson配置YOLOv11环境(六)PyTorchTorchvision安装】
Jetson配置YOLOv11环境(6)PyTorch&Torchvision安装 文章目录 1. 安装PyTorch1.1安装依赖项1.2 下载torch wheel 安装包1.3 安装 2. 安装torchvisiion2.1 安装依赖2.2 编译安装torchvision2.2.1 Torchvisiion版本选择2.2.2 下载torchvisiion到Downloa…...
【Vitest】单元测试
文章目录 测试:Vitest一、安装二、断言三、回调测试四、对象方法五、模拟第三库 测试:Vitest 一、安装 npm install vitest创建文件:example.test.ts 运行测试: npx vitest example二、断言 import { expect, test } from vi…...
使用conda创建自己的python虚拟环境,与其他python版本独立区分
使用 Conda 创建和使用自己的运行环境非常简单,以下是详细步骤: 1. 安装 Anaconda 或 Miniconda 如果你尚未安装 Anaconda 或 Miniconda,可以访问 Anaconda 官网 或 Miniconda 官网 下载并安装。 2. 创建新的 Conda 虚拟环境 创建虚拟环境…...
Java进阶14 TCP日志枚举
Java进阶14 TCP&日志&枚举 一、网络编程TCP Java对基于TCP协议得网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。 1、TCP协议发数据 1.1 构造方法 方法 说明 Socket(InetAddress address…...
Vue混入(Mixins)与插件开发深度解析
Vue混入(Mixins)与插件开发深度解析 Vue混入(Mixins)与插件开发深度解析1. Vue混入(Mixins)核心概念1.1 什么是混入1.2 基础使用方式1.3 选项合并策略1.4 全局混入及其风险1.5 混入的优缺点分析 2. 混入实战…...
