”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Go IoT 平台确保物联网数据完整性

使用 Go IoT 平台确保物联网数据完整性

发布于2024-11-08
浏览:875

Securing IoT Data Integrity with Go IoT Platform

翻译:

Go IoT 开发平台是使用 Go 编程语言开发的免费、高效、可扩展的物联网 (IoT) 解决方案。平台支持MQTT、HTTP、WebSocket、COAP、TCP/IP等数据传输协议,并提供基于JavaScript的报警功能和数据统计服务的轻量级配置工具。

官网:http://iot-dev-egi.pages.dev/

仓库地址:https://github.com/iot-ecology/go-iot-platform

我们正在寻找React开发工程师;欢迎您的参与。

活动说明

EMQX 可以随时接收来自多个设备的秒级数据报告,但这可能不符合正常的业务流程。例如,正常情况下,设备可能每5分钟上报一次数据。为了识别上报设备是否合法,我们需要一种方法来检测该设备是否可能是恶意设备,故意频繁上报数据,影响 EMQX 的稳定性。

Go物联网开发平台解决方案

物理设备详细信息:物理设备详细信息(DeviceInfo)中有两个关键字段:推送间隔(秒)和推送时间错误(秒)。通过这两个字段,我们可以判断设备的上报行为是否异常,并进行后续的逻辑处理。

计算方法

要计算设备的上报率是否在推送间隔和误差之内,以及是否在误差之外,我们首先需要定义一些变量和条件:

  1. 设备的推送间隔表示为 ( T )(秒)。
  2. 设备的推送时间误差表示为 ( E )(秒)。
  3. 设备的实际推送间隔表示为 ( T_{\text{actual}} )(秒)。

0. 实际推送间隔的计算

  1. 首次推送时间戳:设备首次推送数据的时间( T_{\text{1}} )。
  2. 第二次推送时间戳:设备第二次推送数据的时间( T_{\text{2}} )。
  3. 实际推送间隔: ( T_{\text{实际}} = T_2 - T_1 )

1. 是否在推送间隔内以及误差的计算

如果实际推送间隔( T_{\text{actual}} )满足以下条件,则认为设备的速率在推送间隔内并且存在错误:
[ T - E \leq T_{\text{实际}} \leq T E ]

2. 是否外部误差的计算

如果实际推送间隔( T_{\text{actual}} )不满足上述条件,则设备的速率被认为在误差之外,即:
[ T_{\text{实际}} T E ]

计算示例

认为:

  • 推送间隔(T = 60)秒
  • 推送时间误差(E = 5)秒
  • 设备于2024年9月20日10:00:00发送第一条数据(即( T_1 ))
  • 设备于2024年9月20日10:01:05(即( T_2 ))发送第二条数据

计算 ( T_{\text{实际}} )

[ T_{\text{实际}} = (10:01:05 - 10:00:00) = 65 \text{秒} ]

检查是否在推送间隔内以及错误:

[ 60 - 5 \leq 65 \leq 60 5 ]
[ 55 \leq 65 \leq 65 ]
由于 ( 55 \leq 65 \leq 65 ) 成立,因此设备的速率在推送间隔和误差范围内。

检查是否有外部错误:

由于 ( 65 ) 不小于 ( 60 5 ),因此设备的速率不在误差范围内。

通过该方法,可以准确计算出设备的实际推送间隔,并进一步分析是否符合设定的推送间隔以及错误规则。

问题处理

通过前面提到的计算方法,我们可以判断上报的数据是否符合预期的推送间隔和误差范围。一般来说,符合这个范围的数据被认为是正常的,需要进行处理,而超出这个范围的数据可能被认为是异常的,应该被丢弃。在Go物联网开发平台中,针对此类异常数据,我们将采取以下措施:

  1. 数据丢弃:直接丢弃超出推送间隔和错误范围的数据。消费消息队列中的消息时,直接ACK(Acknowledge)这些数据,无需持久化存储。

  2. 通过 EMQX 服务器管理工​​具进行维护

1. 通过 EMQX 黑名单排除客户端

利用 EMQX 的黑名单功能,我们可以限制恶意或异常举报客户端。下面详细分析禁用对象的优缺点及其用例:

禁用对象 优点 缺点 用例
客户端 ID - 精度高,可以直接限制特定客户端。
- 易于实现,通常客户端ID是唯一的,易于管理和跟踪。
- 如果客户端改变了ID,需要重新加入黑名单。
- 需要有机制来识别和记录客户端ID。
- 适用于需要精确控制单个设备或客户端的场景。
- 当易于识别和记录上报设备的 MQTT 客户端 ID 时。
用户名 - 可以使用同一用户名管理一组设备。
- 简化一组设备的管理。
- 不适合需要精确控制单个设备的场景。
- 如果设备共享用户名,合法设备可能会受到错误的限制。
- 适用于设备批量或按规则使用相同账号密码的场景。
- 当设备管理更加集中,不需要对单个设备进行细粒度控制时。
IP 地址 - 可以快速限制来自特定 IP 地址的所有请求。
- 对于固定 IP 地址的设备简单有效。
- 对动态 IP 或移动设备无效。
- 可能会错误地限制同一 IP 下的其他合法设备。
- 适用于设备有固定IP地址的场景。
- 当您需要快速限制来自特定IP的流量,且该IP下没有其他合法设备时。

以上三者应优先考虑Client ID。

2. 通过 EMQX 提供的 API 接口排除客户端

EMQX 提供了一个 API 接口,允许管理员从服务器上删除特定的 MQTT 客户端。需要注意的是,如果MQTT客户端实现了重连机制,单纯删除可能并不能完全删除客户端。

参考:EMQX 文档 - 客户端排除

版本声明 本文转载于:https://dev.to/beck_moulton/securing-iot-data-integrity-with-go-iot-platform-42gf?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Next.js 中间件简介:它如何工作并提供示例
    Next.js 中间件简介:它如何工作并提供示例
    我们来谈谈Nextjs中的路由。今天,我们来谈谈最强大的事物中间件之一。 Nextjs 中的中间件提供了一种强大而灵活的方法来拦截来自服务器的请求并控制请求流(重定向、URL 重写)并全局增强身份验证、标头、cookie 持久性等功能。 创建中间件 让我们创建 Middleware ...
    编程 发布于2024-11-08
  • 道具基础知识:第 1 部分
    道具基础知识:第 1 部分
    这是一个关于如何使用道具的初学者友好教程。在阅读之前了解什么是解构以及如何使用/创建组件非常重要。 Props,properties的缩写,props允许我们从父组件向子组件发送信息,还需要注意的是它们可以是任何数据类型。 必须了解为任何组件创建 prop 的语法。在 React 中,您必须使用...
    编程 发布于2024-11-08
  • Hibernate 与 Spring Boot 有何不同?
    Hibernate 与 Spring Boot 有何不同?
    Hibernate 与 Spring Boot 有何不同? Hibernate 和 Spring Boot 都是 Java 生态系统中流行的框架,但它们有不同的用途并具有不同的功能。 休眠 Hibernate 是一个对象关系映射 (ORM) 框架,它允许开发人员使用...
    编程 发布于2024-11-08
  • C++ 如何处理十进制数据类型?
    C++ 如何处理十进制数据类型?
    C 中的十进制数据类型 C 提供了各种数据类型来处理数值,但令人惊讶的是,十进制数据类型本身并不支持。在处理精确的十进制值或与使用十进制格式的系统交互时,这可能是一个限制。实现选项虽然 C 不提供内置十进制类型,但有两种与他们合作的方法:1。 C Decimal TR 扩展:某些编译器(例如 gcc...
    编程 发布于2024-11-08
  • 为什么我的 Python 中的凯撒密码函数只显示最后一个移位的字符?
    为什么我的 Python 中的凯撒密码函数只显示最后一个移位的字符?
    Python 中的凯撒密码函数:加密字符串在 Python 中实现凯撒密码函数时,会出现一个常见问题,即最终的加密文本仅显示最后移动的字符。要解决此问题,有必要了解导致此行为的问题。在提供的代码中,循环迭代明文中的每个字符。对于字母字符,它根据提供的移位值来移位字符的 ASCII 代码。但是,每个移...
    编程 发布于2024-11-08
  • 4 快速​​部署PHP
    4 快速​​部署PHP
    Servbay 已成为轻松配置开发环境的首要工具。在本指南中,我们将演示如何快速、安全地部署 PHP 8.2,强调 Servbay 致力于简化部署过程。 先决条件 开始之前,请确保您的设备上安装了 Servbay。您可以直接从Servbay官方网站下载。安装直观;只需按照提示操作,就...
    编程 发布于2024-11-08
  • AngularJS 指令中的 Replace 属性何时被弃用?
    AngularJS 指令中的 Replace 属性何时被弃用?
    为什么 AngularJS 已弃用指令中的替换属性AngularJS 指令中的替换属性由于其复杂性和更好的出现而被弃用替代方案。根据官方 AngularJS API 文档,在未来的版本中它将默认为 false。弃用的原因AngularJS 团队发现了替换属性的几个问题:困难的语义: 它导致了属性合并...
    编程 发布于2024-11-08
  • 释放 Claude AI:用于经济实惠且灵活的 AI 集成的非官方 API
    释放 Claude AI:用于经济实惠且灵活的 AI 集成的非官方 API
    由 Anthropic 开发的 Claude AI 以其令人印象深刻的能力在人工智能界掀起了波澜。然而,官方 API 对于许多开发人员和小型企业来说可能过于昂贵。这就是我们的非官方 Claude AI API 的用武之地,它提供了一个更实惠、更灵活的解决方案,将 Claude 的力量集成到您的项目中...
    编程 发布于2024-11-08
  • 如何使用时间包确定 Go 中一个月的最后一天?
    如何使用时间包确定 Go 中一个月的最后一天?
    使用 Time.Time 确定给定月份的最后一天处理基于时间的数据时,通常需要确定指定月份的最后一天。无论该月有 28 天、29 天(闰年)还是 30 天或 31 天,这都会使这成为一项具有挑战性的任务。时间包解决方案Go 时间包其日期函数提供了一个方便的解决方案。 Date 的语法为:func D...
    编程 发布于2024-11-08
  • 如何在不支持的浏览器中实现“背景滤镜”效果?
    如何在不支持的浏览器中实现“背景滤镜”效果?
    CSS:为不可用的背景过滤器提供替代方案CSS 中的背景过滤器功能在大多数现代浏览器中仍然无法访问。虽然我们预计其未来的支持,但发现替代解决方案势在必行。实现类似效果的一种方法是采用具有微妙透明度的背景。下面的 CSS 代码演示了这种方法:/* Slightly transparent fallba...
    编程 发布于2024-11-08
  • Python 的 len() 函数对于不同的数据结构有多高效?
    Python 的 len() 函数对于不同的数据结构有多高效?
    理解Python内置数据结构中len()函数的成本Python中内置len()函数是确定各种数据结构长度的重要工具。它的效率至关重要,尤其是在处理大型数据集时。本文深入研究了 len() 对于不同内置数据类型(例如列表、元组、字符串和字典)的计算成本。O(1) 跨内置类型的复杂性关键要点是 len(...
    编程 发布于2024-11-08
  • 如何在 Python 中访问 Windows 剪贴板文本?
    如何在 Python 中访问 Windows 剪贴板文本?
    在 Python 中访问 Windows 剪贴板文本从 Windows 剪贴板检索文本是编程中的常见任务。本文探讨了如何使用 Python 的 win32clipboard 模块来实现此目的。pywin32 和 win32clipboardwin32clipboard 模块是 pywin32 的一部...
    编程 发布于2024-11-08
  • 如何修复 CentOS 5 上由于文件权限问题导致的 Nginx 403 Forbidden 错误?
    如何修复 CentOS 5 上由于文件权限问题导致的 Nginx 403 Forbidden 错误?
    Nginx 403 Forbidden:文件访问权限故障排除当在 Nginx 中遇到令人沮丧的“403禁止”错误时,确定根本原因可以是一个挑战。此错误通常表示对文件或目录的访问被拒绝。在该特定场景中,用户在 CentOS 5 上使用 PHP-FPM 配置了 Nginx,但无法提供指定源目录中的任何文...
    编程 发布于2024-11-08
  • React 中的函数和类组件与 TypeScript
    React 中的函数和类组件与 TypeScript
    在使用 TypeScript 的 React 中,我们可以使用两种主要方法来创建组件:功能组件和类组件。两种方法都允许使用 props 和 state,但使用的范例略有不同。 TypeScript 通过提供静态类型进一步增强了开发安全性,这使我们能够精确定义 props 和 state 的形状。 ...
    编程 发布于2024-11-08
  • 如何使用 Clang 检查编译器生成的 C++ 模板实例化代码?
    如何使用 Clang 检查编译器生成的 C++ 模板实例化代码?
    检查 C 语言中编译器生成的模板实例化 在 C 语言中,模板函数和类允许通过定义通用功能来重用代码专门针对不同类型。要了解编译器为模板实例化生成的代码,了解这些实例化的函数或类会很有帮助。Clang 的 AST 打印功能一个工具提供这种可见性的是 Clang 的抽象语法树 (AST) 打印功能,Cl...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3