YangeIT大约 8 分钟中州养老AIIOT版本MysqlApifoxHTTPGETPOST

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("修改失败");
}

测试数据:

image
image

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();


}

测试数据:

image
image

2. 物联网设备数据对接

2.1 数据同步之基础概念(拓展需求,自行探索)

前言

前一天我们已经完成了设备的管理,今天,我们就来处理设备联网之后上报数据的处理。​ 我们再来回顾一下IOT基本的工作原理​

image

​ 从图中,我们可以看到,当设备上报数据到IOT平台之后,业务系统可以从IOT平台中拉取数据到自己的数据库,方便在业务应用中去展示。​

接下来的目标:​

  • 能够熟悉AMQP协议的特点​
  • 能够完成使用AMQP消费IOT中设备上报的数据​
  • 能够清楚线程池的使用方式及使用场景​
  • 异步处理基础概念​

在接收设备数据之前,我们需要先来熟悉一些基本的概念,来方便大家理解接收设备数据的基本思路​

同步和异步​ 同步和异步的概念,在我们之前讲解js课程的时候已经学习过,基本的思路是一样的​

  • 同步(Background Synchronous)是指任务在后台进行处理,但需要等待任务完成后才能继续执行其他操作​

  • 异步(Asynchronous)是指任务的提交和执行是相互独立的,任务的执行不会阻塞程序的继续执行​

image

  • 同步模式下,任务1完成后才能执行任务2,任务2需要等待任务1的完成。这种顺序执行的方式称为同步。​
  • 异步模式下,任务1和任务2可以并行执行,彼此之间相互独立,不需要等待对方的完成。这种并行执行的方式称为异步。​

优缺点:​

  • 好处:​
    • 提高系统的并发性​
    • 改善系统的响应性​
  • 缺点:​
    • 复杂性增加​
    • 资源消耗增加​

消息队列的基本概念​

​我们知道了同步和异步的区别之后,我们来理解一下消息队列的概念,消息队列都是以异步的方式进行请求​

image

  • 生产者:负责将消息发送到消息队列中​
  • 消费者:负责从消息队列中获取消息并进行处理​
  • 队列:存储消息​
  • broker:负责接收、存储和分发消息的中间件组件,实现了发送者和接收者之间的解耦和异步通信​
  • topic:消息的分类​ ​ 在IOT中数据流转是这样的,如下图​

image

  • 生产者:设备负责将消息发送到IOT中(队列)​
  • 每个产品可以绑定不同的topic来进行消息分类,比如有手表topic、烟雾topic​
  • IOT本身相当于是一个队列​
  • 消费者可以从指定的topic中获取数据​
  • 如果有多个消费者都要接收同一类消息,可以设置多个消费者,称为消费者组​

什么是AMQP​

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

image
image

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

创建数据转发规则​

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

image
image
  • 订阅(AMQP): 用户可以通过控制台或调用API创建订阅,以获取设备的变更信息,如设备状态、数据上报等。订阅时需要指定具体的AMQP消息通道。​
  • 推送: 一旦订阅成功,物联网平台会根据用户选择的数据类型,自动将相关变更推送到指定的AMQP消息队列中。用户使用AMQP客户端(Apache Qpid)连接到IoT平台即可接收这些更新信息。​

按照上述流程,我们需要在IOT平台中创建转发规则,才能让AMQP客户端接收到数据​

配置规则参考官方说明:https://support.huaweicloud.com/usermanual-iothub/iot_01_00101.html​open in new window

1. 找到规则->数据转发->创建规则​

image

2. 创建规则,其中数据来源为:设备属性,配置完成后,点击右下角的 [创建规则]​​ ​ ​image

3. 添加转发目标,转发目标选择:AMQP推送消息队列

image
image

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

image
image

至此,我们已经在IOT平台中创建了转发规则,接下来我们使用Apache Qpid来接收数据。​

2.2 数据同步之AMQP客户端(拓展需求,自行探索)

前言

上面已经完成了数据转发,接下来我们使用AMQP客户端来接收数据,如下图: image

1. 导入基础代码

image
image

代码压缩包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表的变化

image
image
image
image