如何防止设备被重复控制

news2025/1/20 16:30:26

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中间件,避免了相同的状态,重复控制设备。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/414552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用Midjourney辅助建筑平面设计,常用的建筑平面效果图提示和使用效果展示(内附Midjourney提示词网站)

文章目录一、室内建筑平面设计1.AutoCAD图纸&#xff08;别墅首层图&#xff09;2.平面效果图3.三维平面透视图二、建筑室内设计1.现代简约2.波西米亚风格3.工业风格4.沿海风格5.法国风格6.现代风格7.提示增加颜色倾向8.提示中增加设计师9.其它一些尝试三、好用的Midjourney提示…

Redis 6.x哨兵模式部署(五)

目录 一、主从复架构搭建 二、哨兵模式搭建 2.1背景 2.2哨兵模式介绍 2.3 Sentinel三大工作任务 1监控&#xff08;Monitoring&#xff09; 2提醒&#xff08;Notification&#xff09; 3自动故障迁移&#xff08;Automatic failover&#xff09; 4核心流程 2.4 安装…

企业如何实现数字化转型?

企业如何实现数字化转型&#xff1f; 首先&#xff0c;我需要先跟各位明确&#xff0c;企业数字化转型中很重要的3个“先行”条件&#xff1a; 第一、企业一把手的眼光和格局 一把手的视野、格局、定力是最重要的因素&#xff0c;没有之一。能不能放下自己过去的执念与经验&a…

信息与计算科学有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是信息与计算科学领域的一些知名SCI期刊推荐&#xff1a; Information Sciences&#xff1a; 该期刊是信息科学领域的重要期刊&#xff0c;涵盖了信息科学、计算科学、人工智能、数据挖掘、模式识别、多媒体技术、网络通信、智能系统等方面的研究。 IEEE Transactions on…

电子文件的线上存储工具,你了解多少?

信息化时代的来临&#xff0c;企业也纷纷跟随时代步伐进入现代化办公。信息时代最显著的特征就是纸质文件到电子文件的转变。企业一天的办公中&#xff0c;可能就会产出无数的电子文件&#xff0c;其中很多文件都是珍贵的业务经验&#xff0c;因此线上存储是企业需要考虑的问题…

网页解析--bs4--01

python爬虫之bs4模块&#xff08;超详细&#xff09; Beautiful Soup 4.4.0 文档 — Beautiful Soup 4.2.0 documentation (crummy.com) 可以看到bs4库将网页文件变成了一个soup的类型&#xff0c; 事实上&#xff0c;bs4库 是解析、遍历、维护、“标签树“的功能库。 通俗一点…

redis基础总结-常用命令

redis常用指令3. 常用指令3.1 key 操作分析3.1.1 key应该设计哪些操作&#xff1f;3.1.2 key 基本操作3.1.3 key 扩展操作&#xff08;时效性控制&#xff09;3.1.4 key 扩展操作&#xff08;查询模式&#xff09;3.2 数据库指令3.2.1 key 的重复问题3.2.2 解决方案3.2.3 数据库…

001:Mapbox GL加载基础的地图

第001个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载最基础的 Mapbox GL地图 。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共59行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置…

无限制翻译软件-中英互译字数无限

翻译软件是我们工作及学习中必不可少的工具&#xff0c;然而许多翻译软件在使用时常常会出现字数限制的问题,这使得用户在处理长文本和大量文本时变得十分麻烦。如果你也遇到了类似的问题&#xff0c;那么哪个翻译软件不限制字数将为您带来全新的翻译体验。 以下是我们的哪个翻…

人人都是ChatGPT prompt 工程师

关于 Prompt ​ 解释这个词之前&#xff0c;首先需要解释 prompt 这个词&#xff1a; 简单的理解它是给 AI 模型的指令。 它可以是一个问题、一段文字描述&#xff0c;甚至可以是带有一堆参数的文字描述。AI 模型会基于 prompt 所提供的信息&#xff0c;生成对应的文本&…

Spark SQL join操作详解

一、 数据准备 本文主要介绍 Spark SQL 的多表连接&#xff0c;需要预先准备测试数据。分别创建员工和部门的 Datafame&#xff0c;并注册为临时视图&#xff0c;代码如下&#xff1a; val spark SparkSession.builder().appName("aggregations").master("lo…

腾讯云服务器CVM标准型S5和S6区别性能评测

腾讯云服务器CVM标准型S5是次新一代云服务器规格&#xff0c;标准型S6是最新一代的云服务器&#xff0c;S6实例的CPU处理器主频性能要高于S5实例&#xff0c;同CPU内存配置下的标准型S6实例要比S5实例性能更好一些&#xff0c;但是目前标准型S5实例活动较多&#xff0c;云服务器…

【ChatGPT】预训练模型微调及其应用(ChatGLM-6B、duckduckgo_search、GPT在科研的应用等)

note instructGPT&#xff08;基于提示学习的系列模型&#xff09;——>GPT3.5&#xff08;大规模预训练语言模型&#xff09;——>ChatGPT模型&#xff08;高质量数据标注反馈学习&#xff09;。chatGPT三大技术&#xff1a;情景学习、思维链、自然指令学习。GPT4飞跃式…

ASEMI代理AD9833BRMZ-REEL原装ADI车规级AD9833BRMZ-REEL

编辑&#xff1a;ll ASEMI代理AD9833BRMZ-REEL原装ADI车规级AD9833BRMZ-REEL 型号&#xff1a;AD9833BRMZ-REEL 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;MSOP-10 批号&#xff1a;2023 引脚数量&#xff1a;10 安装类型&#xff1a;表面贴装型 AD9833BRMZ-REEL汽车…

【都2023年了,还在问网络安全怎么入门】

前言 【都2023年了&#xff0c;还在问网络安全怎么入门】所以这一期就出一一个怎么学习网络安全的学习路线和方法&#xff0c;觉得有用的话点赞收藏下 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有…

数据库系统概论--第二章课后习题

1.试述关系模型的三个组成部分。 答&#xff1a; 关系模型由关系数据结构、&#xff08;关系操作集合&#xff09;和&#xff08;关系完整性约束&#xff09;三部分组成。 2. 简述关系数据语言的特点和分类。 答:特点:1)集合操作方式; 2)高度非过程化; 3)集查询、DDL、DML、…

【C++STL精讲】string类的基本使用与常用接口

文章目录&#x1f490;专栏导读&#x1f490;文章导读&#x1f337;为什么要学习string类&#xff1f;&#x1f337;string类的基本使用&#x1f337;string类的常用接口&#x1f33a;数据访问函数&#x1f33a;容量相关函数&#x1f33a;操作函数&#x1f337;迭代器与范围for…

“三步走”推动云原生转型之路

对于企业而言&#xff0c;如何平稳的从传统研发模式过渡到云原生时代&#xff0c;除了坚持结合云原生应用的特点&#xff0c;持续推动基础架构和应用架构的转型&#xff0c;还需要围绕“深度融合云技术能力、做厚业务基础能力、提升内建质量”等三个步骤&#xff0c;推进云原生…

SpringBoot 防护XSS攻击

目录 一、前言 1.1、XSS攻击流程 1.2、XSS攻击分类 1.3、攻击方式 二、解决方案 2.1、SPRINGBOOT XSS过滤插件&#xff08;MICA-XSS&#xff09; 2.2、MICA-XSS 配置 三、项目实战 3.1、项目环境 3.2、测试 3.2.1、测试GET请求 3.2.2、测试POST请求 3.2.3、测试POS…

优秀测试工程师必须掌握的关系型和非关系型数据库

写在前面 如果平时没有接触到数据库&#xff0c;或者接触数据库不够深入&#xff0c;那么这篇文章很适合你&#xff0c;这篇文章主要从关系性和非关系型数据库的适用场景出发&#xff0c;介绍了MySQL,MongoDB,Redis数据库的安装&#xff0c;备份和常用命令以及MySQL的性能测试…