华为云IOT平台

在开发智能监测功能之前,必须先熟悉和掌握华为云IoTDA平台的使用及对接

什么是物联网

物联网(英文:Internet of Things,缩写:IoT)起源于传媒领域,是信息科技产业的第三次革命。物联网是指通过信息传感设备,按约定的协议,将任何物体与网络相连接,物体通过信息传播媒介进行信息交换和通信,以实现智能化识别、定位、跟踪、监管等功能

常见的应用场景:

  • 共享充电宝
    • 充电宝设备接入物联网平台后,可上报充电宝电量和借用状态等信息到物联网平台云端。充电宝用户扫码后,云端低延时向充电宝下发指令,使其弹出。同时,企业运营者能够实时获知充电宝的运行状况
  • 智能音箱
    • 播报音箱接入物联网平台后,用户扫码完成支付后,将支付金额实时通过音箱,向用户和商家进行语音播报
  • 智能家居
    • 智能家居技术已经成为当今家庭装潢的一大特色。比如,通过智能灯泡,可以实现远程控制灯光和电视等设备,调节温度和湿度,实现智能化生活
  • 智能农耕
    • 智能农耕可以通过物联网技术来监测、传输、分析、管理农业生产过程中的信息。比如作物的生长情况、土壤的状况等,以提高农业生产的效率,改善利润率,减少污染,节约农业资源
  • 智能医疗
    • 在智慧医疗中,可以捕捉人的生理状态信息,例如心跳频率、体力消耗、血压高低等。然后对采集数据进行备份、加工和分析,以便个人或医生快速查询。在物联网平台接入传感器设备,采集人体及周边环境参数的信息,通过数据服务处理数据后,反馈给用户

华为云IoTDA简介

产品文档:成长地图_设备接入 IoTDA-华为云

设备接入服务(IoTDA)是华为云的物联网平台,提供海量设备连接上云、设备和云端双向消息通信、批量设备管理、远程控制和监控、OTA升级、设备联动规则等能力,并可将设备数据灵活流转到华为云其他服务

作为一个开发者,要熟悉基本的设备与后台调度的思路,如下:

华为IOT1.PNG

开通IoTDA

注册华为云账号:前往华为云官网注册账号。如果已有注册账号,请跳过此步骤

开通物联网平台

登录账号以后,在产品中搜索设备接入IoTDA

b27ada9e-6974-4356-a5dc-00c62780efa0

打开之后,点击开通免费单元

9e8e5983-afa2-4cc9-ad9d-5a1fbb854ac5

然后直接创建就可以了

31ba5a4e-61fc-40e0-bdb3-156cc3327668

创建成功之后的效果:

efcfd68a-09af-4103-b54c-edec1dc7fcde

可以点击服务查看服务的基本信息:

4fbb7acd-8615-44cc-8f85-fb85ce36100e

服务内部:

4e915bfe-6dde-4df2-bc61-3a050f45f31a

到此,IoTDA服务就正式开通了

产品

创建产品

产品(https://support.huaweicloud.com/usermanual-iothub/iot_01_0015.html):某一类具有相同能力或特征的设备的集合称为一款产品。帮助开发者快速进行产品模型和插件的开发,同时提供端侧集成、在线调试、自定义Topic等多种能力。比如,手表、大门通道门禁、紧急呼叫报警器、滞留报警器、跌倒报警器等

在平台上创建产品,找到产品–>创建产品

d93bf271-7691-48d9-b72a-a108ee10c5cc

如下图,先创建智能定位报警手表的产品,输入信息如下:

77b83e4f-05c1-428f-9c62-06693213bec6

创建成功之后,在产品列表中可以看到刚刚创建的产品

2fb7a4f0-aca9-4b63-87ab-db00629913a2

产品模型

产品模型(Product Model),也称物模型,用于描述设备具备的能力和特性。开发者通过定义产品模型,在物联网平台构建一款设备的抽象模型,使平台理解该款设备支持的服务属性命令等信息

  • 手表本身:耗电量,使用时间
  • 指标数据:身体血压、血氧、体温数据

耗电量、血压、血氧这类数据都属于产品的功能,也叫做物模型

在IOT平台中,物模型分为三类:

功能类型 说明
服务 即Service,产品模型的一部分,描述设备具备的业务能力。将设备业务能力拆分成若干个服务后,再定义每个服务具备的属性、命令以及命令的参数。
属性 即Property,产品模型的一部分,一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等。
命令 设备的功能模型之一,设备能够被外部调用的能力或方法。

创建手表产品的物模型

进入产品的详情,选择自定义模型

2f2d444a-d977-4a30-a57a-d6268736ec5f

创建服务信息

2f9a2529-88f6-42f9-930b-b564a3c7091e

然后可以给这个服务添加具体的物模型

e8ff4469-2f75-4beb-aac0-289aa2b989d0

目前创建的智能手表产品,可以定义四个物模型,如下:

属性名称 属性描述 数据类型 访问权限 取值范围
BodyTemp 体温 int 读写 0~50
xueyang 血氧 int 读写 0~150
HeartRate 心率 int 读写 0~200
BatteryPercentage 用电量 int 读写 0~100

下面是创建了一个体温的物模型,其他物模型创建类似

7b9fda3c-f38a-4cce-8e4d-799f2c4de18b

创建成功之后的效果:

ea5606a4-2716-46fa-b693-e2e8d3a9316f

设备

归属于某个产品下的设备实体,每个设备具有一个唯一的标识码。设备可以是直连物联网平台的设备,也可以是代理子设备连接物联网平台的网关

前提条件:设备是绑定在产品上的,所以必须先创建产品才行

操作步骤:

  1. 在左侧导航栏,选择设备–>所有设备
  2. 设备页面,单击注册设备
  3. 添加设备对话框中,输入设备信息,单击确认

如下图:

c2b6e4a2-9573-4e84-9388-d2d95b7fb50e

创建成功之后,会分配一个设备的信息,非常重要,需要保存下来,方便后面调试使用

8f883b10-f893-4bb3-9c7c-0246853da861

在所有设备中可以查看创建好的设备

f8fc6048-29d4-4691-b543-7206d4791b6b

设备详情

54a17032-af55-485e-8e69-530bb9dbfee8

设备接入-数据上报

概述

属性数据上报是一种需要平台解析、缓存,通过数据流转功能将数据转发到应用侧或华为云其他云服务的一种方式。需要在平台建立产品模型。对于属性上报的数据,平台会记录属性的最新一次上报值,对符合产品模型定义的属性数据进行存储

官方案例-设备接入:基于NB-IoT小熊派的智慧烟感

06306a45-9727-490b-8693-d6a4c276564c

在开发阶段可以使用联网的电脑,来模拟设备的数据上报,官方sdk下载

Java SDK使用示例

  1. 前提:需要提前创建好产品和对应的物模型,以及该产品的设备
  2. SDK代码获取:SDK下载
  3. 解压之后,使用idea打开,找到iot-device-demo模块中的PropertySample类,如下图

bfb47b50-7228-4d22-a0fa-8526c7e0997c

  1. 完整代码,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package com.huaweicloud.sdk.iot.device.demo.device;

import com.huaweicloud.sdk.iot.device.IoTDevice;
import com.huaweicloud.sdk.iot.device.client.requests.ServiceProperty;
import com.huaweicloud.sdk.iot.device.transport.ActionListener;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;

/**
* 演示如何直接使用DeviceClient进行设备属性的上报和读写
*/
public class PropertySample {

private static final String IOT_ROOT_CA_RES_PATH = "ca.jks";

private static final String IOT_ROOT_CA_TMP_PATH = "huaweicloud-iotda-tmp-" + IOT_ROOT_CA_RES_PATH;

private static final Logger log = LogManager.getLogger(PropertySample.class);

public static void main(String[] args) throws InterruptedException, IOException {

// 加载iot平台的ca证书,进行服务端校验
File tmpCAFile = new File(IOT_ROOT_CA_TMP_PATH);
try (InputStream resource = CommandSample.class.getClassLoader().getResourceAsStream(IOT_ROOT_CA_RES_PATH)) {
Files.copy(resource, tmpCAFile.toPath(), REPLACE_EXISTING);
}

// 创建设备并初始化. 用户请替换为自己的接入地址。-->watch01
IoTDevice device = new IoTDevice(
// 接入地址获取方式:登录华为云IoTDA控制台左侧导航栏“总览”页签,在选择的实例基本信息中,单击“接入信息”-->设备接入-->MQTT。选择8883端
"ssl://230590aa95.st1.iotda-device.cn-east-3.myhuaweicloud.com:8883",
// 设备id
"67ab39f1bab900244b1e64a6_watch01",
// 设备秘钥 设备创建成功后会自动生成
"5f71b853642b8ccab767890a5b148f02", tmpCAFile);
if (device.init() != 0) {
return;
}

/*// 接收平台下发的属性读写 注释掉,用不到
device.getClient().setPropertyListener(new PropertyListener() {
// 处理写属性
@Override
public void onPropertiesSet(String requestId, List<ServiceProperty> services) {
// 遍历service
for (ServiceProperty serviceProperty : services) {
log.info("OnPropertiesSet, serviceId is {}", serviceProperty.getServiceId());
// 遍历属性
for (String name : serviceProperty.getProperties().keySet()) {
log.info("property name is {}", name);
log.info("set property value is {}", serviceProperty.getProperties().get(name));
}
}
// 修改本地的属性值
device.getClient().respondPropsSet(requestId, IotResult.SUCCESS);
}

*//**
* 处理读属性。多数场景下,用户可以直接从平台读设备影子,此接口不用实现。
* 但如果需要支持从设备实时读属性,则需要实现此接口。
*//*
@Override
public void onPropertiesGet(String requestId, String serviceId) {
log.info("OnPropertiesGet, the serviceId is {}", serviceId);
Map<String, Object> json = new HashMap<>();
Random rand = new SecureRandom();
json.put("alarm", 1);
json.put("temperature", rand.nextFloat() * 100.0f);
json.put("humidity", rand.nextFloat() * 100.0f);
json.put("smokeConcentration", rand.nextFloat() * 100.0f);

ServiceProperty serviceProperty = new ServiceProperty();
serviceProperty.setProperties(json);
serviceProperty.setServiceId("smokeDetector");

device.getClient().respondPropsGet(requestId, Arrays.asList(serviceProperty));
}
});*/

// 定时上报属性
while (true) {

Map<String, Object> json = new HashMap<>();
Random rand = new SecureRandom();

// 按照物模型设置属性,根据实际情况设置,下面是智能报警手表的物模型
json.put("BodyTemp", 36);
json.put("xueyang", rand.nextFloat()*100.0f);
json.put("HeartRate", rand.nextFloat()*100.0f);
json.put("BatteryPercentage", rand.nextFloat() * 100.0f);

ServiceProperty serviceProperty = new ServiceProperty();
serviceProperty.setProperties(json);
serviceProperty.setServiceId("watch_services"); // serviceId要和物模型一致

device.getClient().reportProperties(Arrays.asList(serviceProperty), new ActionListener() {
@Override
public void onSuccess(Object context) {
log.info("pubMessage success");
}

@Override
public void onFailure(Object context, Throwable var2) {
log.error("reportProperties failed" + var2.toString());
}
});

Thread.sleep(10000);
}
}
}

PixPin_2025-09-10_23-19-18

PixPin_2025-09-10_23-19-49

消息发送成功后,可以在华为云IoTDA平台中查看该设备上报的数据

37eb8e59-1c40-41bb-a46f-e1eab6281d1e