首页 > 其他分享 >如何防止设备被重复控制

如何防止设备被重复控制

时间:2023-04-15 19:55:51浏览次数:29  
标签:状态 key 重复 redisTemplate 防止 上报 电控 云端 设备

1. 引言

在一个物联网的系统中,主要有三部分组成:云端、WiFi、电控。当用户在APP上控制设备时,其控制下发链路是:云端>>WIFI>> 电控。当电控收到控制指令后,执行设备控制,控制成功后,返回结果给云端,并将结果展示在APP上,其状态上报链路是: 电控 >> WIFI >> 云端。

控制与上报

在云端和电控交互之间存在着三种指令,其分别是:

  • 控制指令:属于云端发下给电控
  • 控制返回:电控控制后,将设备的状态返回给云端
  • 定时上报:电控端会定时向云端上报自身的状态

在做设备之间联动的时候,云端只解析上报,除了存在定时上报外,当控制指令下发后,也会触发状态上报(其协议头和定时上报是同一个),因此云端只会关注上报。

但是存在一个问题,云端只解析同一种协议,如何区分是控制的上报还是定时的上报的?


2. 场景联动实例

举个相关的例子,在冬天的时候,空调长时间开制热模式会导致空气湿度下降,可能会导致用户皮肤脱皮、流鼻血等情况发生。这时候就可以创建一个空调和加湿器联动的场景,当空调设置为制热模式的时候,就帮助打开用户家里的加湿器,帮助房屋保湿。

其控制逻辑是:当用户控制空调到制热模式时,APP端通过云端下发指令到电控,电控再去控制空调的模式,当模式改变后,会触发电控端上报,此时就会上报空调此时的状态到云端。

控制与上报链路图

当空调设备的状态上报到云端后,需进行逻辑判断,如果空调状态为:开机、制热模式,云端就去控制和空调绑定的加湿器,这就实现了空调联动加湿器。

在引言中提到,设备的状态存在定时主动上报,按照之前的逻辑,会再次控制加湿器开机。但这并不合理,因为该上报的状态并不是控制产生的,因此云端需进行过滤,以此来解决重复控制设备。


3. 如何解决重复控制设备

在这部分使用Redis搭建一个去重逻辑:

  • 缓存第一次状态,设置过期时间
  • 判断之后上报状态与缓存中是否一致
    • 如果一致,直接返回;
    • 如果不一致,修改缓存,控制设备。

接下来就以代码展示一下,去重逻辑。

3.1 定义一个状态状态的BO

@Data
public class StatusPushBO {
    private String applianceId;
    private String power;
    private String mode;
}

如上所示,BO中包含设备id、电源、模式,用于接收电控上报的状态。

3.2 Redis实现缓存

在这个demo中依旧使用SpringBoot作为基础框架。

  • 引入Redis依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  • 创建一个RedisClient
public class RedisClient<T> {
	private RedisTemplate<String, T> redisTemplate;
	private ValueOperations<String, T> valueOperation;
    
    public RedisClient(RedisTemplate<String, T> redisTemplate) {
        this.redisTemplate = redisTemplate;
        this.valueOperations = redisTemplate.opsForValue();
    }
    
    // 通过key 获取redis中value
    public <T> T get(String key) {
        return this.redisTemplate.opsForValue().get(key);
    }
    
    // 判断redis key是否存在
    public Boolean exists(String key) {
        return redisTemplate.hasKey(key);
    }
    
    // 设置过期时间
    public void setExpire(String key, long timeout, TimeUnit unit) {
        redisTemplate.expire(key, timeout, unit);
    }
    
    // 将数据放入redis中,并且设置过期时间
    public void setex(String key, Object value, Long timeout, TimeUnit timeUnit) {
        redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
    }
}

如上建立了一个RedisClient类,其中包含四个方法:getexistssetExpiresetex

  • 使用redis缓存状态,防止相同状态控制设备。
@Service
public class DemoLinkageService{
    // 注入redisClient
    @Autowired
    RedisClient redisClient;
    
    // 联动加湿器, linkage: 联动
    public void linkageHumidier(StatusPushBO statusPushBO){
        String applianceId = statusPushBO.getApplianceId();
        String redisKey = "linkage" + applianceId;
        // 判断该key是否已经存在redis中
        if (redisClient.exists(redisKey)) {
            // 存在就取值
            StatusPushBO statusBOByRedis = redisClient.get(redisKey);
            if (statusPushBO.equals(statusBOByRedis)) {
                // 判断上报的状态和缓存中的状态一致,就重新更新redisKey的时间。
                redisClient.setExpire(redisKey, 80L, TimeUnit.MINUTES);
                // 直接return
                return;
            }
        }
        // 将首次状态放入redis进行缓存
        redisClient.setex(redisKey, StatusPushBO, 80L, TimeUnit.MINUTES);
        
        // TODO 控制设备
    }
}

如上,如果设备第一次上报状态,此时Redis里面是没有该设备的状态,就跳过状态相等判断逻辑,之后将这次的状态添加进Redis缓存一段时间;如果之后的状态没有变换,来自于设备的主动上报,此时就会进入状态是否相同判断逻辑中,并且状态相等,那就重新更新过期时间,并直接返回,不进行后续逻辑处理。


结语

如上使用Redis中间件,避免了相同的状态,重复控制设备。

标签:状态,key,重复,redisTemplate,防止,上报,电控,云端,设备
From: https://www.cnblogs.com/CodeJames/p/17321727.html

相关文章

  • 故障设备扫码报修,一招打破企业报修困局
    很多行业都实现了机械化自动化的生产阶段,但是设备出现故障还是需要设备管理者进行报修,传统的报修方式又累又麻烦,如今微信扫码报修就能打破企业报修困局,从而提高了企业的管理水平。一、快速扫码报修故障扫码报修系统,区别于传统的电话、纸质报修的方式,故障报修人通过手机故障报修系统......
  • 网络设备安全审核策略配置
    配置日志服务器和ASA,将ASA的日志发送到日志服务器,并使用Splunk分析、管理ASA日志 网络拓扑图 网络角色功能与版本LOG:日志服务器,ubuntu20.04serverFW:防火墙,Ciscoasav9.17Other:控制Splunkweb端,win10步骤1、LOG开启远程日志服务,在8090/UDP端......
  • 如何保证RabbitMQ消息不重复消费
    如何保证RabbitMQ消息不重复消费消息中间件是无法保证消息重复消费,所以只能从业务上来保证消费不重复消费,在消费端保证接口的幂等性。什么是幂等性幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口,多次发出同一个请求,必须保证操作只执行一次。调用接口发生异常并且......
  • 印刷机械设备远程监控智能运维
    方案背景近些年,印刷行业的飞速发展,印刷机械设备已经成为了现代印刷加工中不可或缺的工具,现代的印刷机械正进一步朝着远程自动化、联动化、系列化方向发展。随着市场竞争的日益激烈以及环保问题日益突出,印刷企业对于设备的监控和维护也越来越重视。如果印刷机械设备出现故障而无法正......
  • MAUI之Android记录设备号+动态授权
    一、获取Android唯一标识的方法android10以前的版本可以通过获取imei得到设备的唯一标识,但是android10以后的系统已无法获取到imei。那么我们该如何确定设备呢?查阅了一些资料,个人看来下面的方法最为稳妥:通过在app外部保存一个guid,每次打开app时读取该guid确定为设备号。保存......
  • oracle查找重复数据和删除重复数据sql
    查找重复数据sql(思路就是根据需要判断重复数据的字段分组,根据having大于2的就是重复的)--查找某表重复数据selectBUSS_TYPE_ID,BUSS_TYPE,TRADE_VARIETY_ID,TRADE_VARIETY,TRADE_SUBVARIETY_ID,TRADE_SUBVARIETY,......
  • 安科瑞无线测温系统在高压电气设备上的应用
      关键词: 高压开关柜无线测温;无线测温系统;温度传感器  随着科学技术的不断进步,许多技术被应用到了钢铁企业电气控制系统中。众所周知,在电力系统运转的过程中,会产生大量的热量,如何对整个系统的温度进行调控,是发展电力要解决的问题。在变电站中,由于工作的特殊性会涉及到许......
  • 网络设备安全加固
    0x00前言目的:对网络设备进行加固,包括基础设备安全功能配置和账户登录、密码安全策略配置。网络设备版本路由器:CiscoIOS15.5(5)M交换机:CiscoIOS15.2(4)E防火墙:CiscoASA9.17网络设备配置文档CiscoIOS15.5(5)M:https://www.cisco.com/c/en/us/support......
  • [Linux]回环设备的作用是什么?
    在计算机网络中,回环设备(loopbackdevice)是指一种虚拟网络接口,通常装备在操作系统中,用于向系统本身发送网络数据包,而不需要使用物理网络接口。它可以使应用程序像使用网络接口一样访问本地主机,这样可以方便的测试、开发和调试应用程序,确保应用程序的可靠性和正确性。回环设备的作......
  • [Linux]字符设备、块设备、网络设备、虚拟设备
    在Linux系统中,设备可以分为以下几种类型:1.字符设备字符设备是一种流设备,它以字符为单位进行传输和处理,例如串口、终端和声卡等。它的主要特点是按照顺序访问数据,不支持随机访问和任意长度的读写操作。2.块设备块设备是以块为单位进行读写的设备,例如硬盘、闪存器和CD-ROM......