1. 物联网设备对接
1.1 修改设备
前言
修改的逻辑是:先修改华为云iot平台上的设备,然后再修改数据库中的设备。
@PutMapping
@Operation(summary = "修改设备")
public AjaxResult edit(@RequestBody DeviceDto deviceDto){
Device device = deviceMapper.selectById(deviceDto.getId());
if(ObjectUtil.isEmpty(device)){
throw new BaseException("设备不存在");
}
//修改华为云平台的信息
UpdateDeviceRequest request = new UpdateDeviceRequest();
request.withDeviceId(device.getIotId());
UpdateDevice body = new UpdateDevice();
body.withDeviceName(deviceDto.getDeviceName());
request.withBody(body);
try {
client.updateDevice(request);
} catch (Exception e) {
log.error("物联网接口 - 修改设备,调用失败:{}", e.getMessage());
throw new BaseException("物联网接口 - 修改设备,调用失败");
}
//更新数据库中设备信息
BeanUtil.copyProperties(deviceDto, device);
int i = deviceMapper.updateById(device);
return i>0?AjaxResult.success("操作成功"):AjaxResult.error("修改失败");
}
测试数据:

1.2 删除设备
前言
删除设备的逻辑是:先删除华为云iot平台上的设备,然后再删除数据库中的设备。
@DeleteMapping("/{iotId}")
@Operation(summary = "删除设备")
public AjaxResult detele(@Parameter(description = "物联网设备id") @PathVariable("iotId") String iotId){
DeleteDeviceRequest request = new DeleteDeviceRequest();
request.withDeviceId(iotId);
try {
client.deleteDevice(request);
} catch (Exception e) {
throw new BaseException("物联网接口 - 删除设备,调用失败");
}
//从数据库删除设备
deviceMapper.delete(new QueryWrapper<Device>().eq("iot_id", iotId));
return AjaxResult.success();
}
测试数据:

2. 物联网设备数据对接
2.1 数据同步之基础概念(拓展需求,自行探索)
前言
前一天我们已经完成了设备的管理,今天,我们就来处理设备联网之后上报数据的处理。 我们再来回顾一下IOT基本的工作原理
从图中,我们可以看到,当设备上报数据到IOT平台之后,业务系统可以从IOT平台中拉取数据到自己的数据库,方便在业务应用中去展示。
接下来的目标:
- 能够熟悉AMQP协议的特点
- 能够完成使用AMQP消费IOT中设备上报的数据
- 能够清楚线程池的使用方式及使用场景
- 异步处理基础概念
在接收设备数据之前,我们需要先来熟悉一些基本的概念,来方便大家理解接收设备数据的基本思路

同步和异步 同步和异步的概念,在我们之前讲解js课程的时候已经学习过,基本的思路是一样的
同步(Background Synchronous)是指任务在后台进行处理,但需要等待任务完成后才能继续执行其他操作
异步(Asynchronous)是指任务的提交和执行是相互独立的,任务的执行不会阻塞程序的继续执行
- 同步模式下,任务1完成后才能执行任务2,任务2需要等待任务1的完成。这种顺序执行的方式称为同步。
- 异步模式下,任务1和任务2可以并行执行,彼此之间相互独立,不需要等待对方的完成。这种并行执行的方式称为异步。
优缺点:
- 好处:
- 提高系统的并发性
- 改善系统的响应性
- 缺点:
- 复杂性增加
- 资源消耗增加

消息队列的基本概念
我们知道了同步和异步的区别之后,我们来理解一下消息队列的概念,消息队列都是以异步的方式进行请求
- 生产者:负责将消息发送到消息队列中
- 消费者:负责从消息队列中获取消息并进行处理
- 队列:存储消息
- broker:负责接收、存储和分发消息的中间件组件,实现了发送者和接收者之间的解耦和异步通信
- topic:消息的分类 在IOT中数据流转是这样的,如下图
- 生产者:设备负责将消息发送到IOT中(队列)
- 每个产品可以绑定不同的topic来进行消息分类,比如有手表topic、烟雾topic
- IOT本身相当于是一个队列
- 消费者可以从指定的topic中获取数据
- 如果有多个消费者都要接收同一类消息,可以设置多个消费者,称为消费者组

什么是AMQP
我们现在已经清楚了消息队列的基础概念,在IOT中数据接收用到的是AMQP来处理消息。 AMQP全称Advanced Message Queuing Protocol,是一种网络协议,用于在应用程序之间传递消息。它是一种开放标准的消息传递协议,可以在不同的系统之间实现可靠、安全、高效的消息传递。 AMQP协议的实现包括多种消息队列软件,例如RabbitMQ、Apache ActiveMQ、Apache Qpid等。这些软件提供了可靠、高效的消息传递服务,广泛应用于分布式系统、云计算、物联网等领域。 我们这次课程并不会详细讲解这些软件的使用,其中关于RabbitMQ我们后期的课程中会详细的,重点的去讲解。 今天我们会在课程中快速使用Apache Qpid软件来接收IOT中的数据,如下图

在IOT官方文档中,已经提供了对应的数据转发的解决方案,如下链接:AMQP转发

创建数据转发规则
设备接入物联网平台后,可以通过自定义Topic或产品模型将数据上报给平台。在控制台上设置订阅后,平台会将包括设备生命周期变更、属性上报、消息上报及状态变更等信息,通过订阅推送的方式转发到您指定的服务器。

- 订阅(AMQP): 用户可以通过控制台或调用API创建订阅,以获取设备的变更信息,如设备状态、数据上报等。订阅时需要指定具体的AMQP消息通道。
- 推送: 一旦订阅成功,物联网平台会根据用户选择的数据类型,自动将相关变更推送到指定的AMQP消息队列中。用户使用AMQP客户端(Apache Qpid)连接到IoT平台即可接收这些更新信息。
按照上述流程,我们需要在IOT平台中创建转发规则,才能让AMQP客户端接收到数据
配置规则参考官方说明:https://support.huaweicloud.com/usermanual-iothub/iot_01_00101.html
1. 找到规则->数据转发->创建规则
2. 创建规则,其中数据来源为:设备属性,配置完成后,点击右下角的 [创建规则]
3. 添加转发目标,转发目标选择:AMQP推送消息队列

4. 上述操作完成后,可以启动规则

至此,我们已经在IOT平台中创建了转发规则,接下来我们使用Apache Qpid来接收数据。
2.2 数据同步之AMQP客户端(拓展需求,自行探索)
前言
上面已经完成了数据转发,接下来我们使用AMQP客户端来接收数据,如下图:
1. 导入基础代码

代码压缩包
job消息同步到本地.zip
在微信群里,自行下载即可
2. 导入yaml配置信息
# 华为云相关 顶格写
huaweicloud:
#IOT相关配置
ak: HPUAQGTEUVRVRP0ZOTCR # 鼠标悬停右上角账户名 -> 我的凭证 -> 访问秘钥
sk: bHfv2HIpy3oNYtt3oEtpq7VTZNdWXE3ytvSdM4cz # 鼠标悬停右上角账户名 -> 我的凭证 -> 访问秘钥
projectId: c72110da677a49179e0f849fc4253ec4 # # 鼠标悬停右上角账户名 -> 我的凭证 -> API凭证 -> 所属区域对应的项目ID
regionId: cn-north-4 #如果是上海一,请填写"cn-east-3";如果是北京四,请填写"cn-north-4";
endpoint: ce67dcf391.st1.iotda-app.cn-north-4.myhuaweicloud.com # IOT控制台 -> 总览 -> 接入信息 -> 应用接入 -> HTTPS (443) -> 接入地址
#amqp相关配置
host: ce67dcf391.s用自己的-4.myhuaweicloud.com # IOT控制台 -> 总览 -> 接入信息 -> 应用接入 -> AMQPS (5671) -> 接入地址
accessKey: Lr用自己的Wy7 # IOT控制台 -> 总览 -> 接入信息 -> 应用接入 -> AMQPS (5671) -> 拖到右侧:访问控制对应的 凭证KEY
accessCode: Coj09xtr8D用自己的i7qB1ejQFn2JsxTqX # IOT控制台 -> 总览 -> 接入信息 -> 应用接入 -> AMQPS (5671) -> 拖到右侧:访问控制对应的 凭证CODE
queueName: DefaultQueue #默认,无需改动
3. 同时启动模拟设备和应用程序,观察控制台输出和设备数据表devicedata表的变化

