为反应系统实现MQTT客户端

news2024/10/5 16:30:48

MQTT-Reactive的目的是提供一种用C编写的可移植且无阻塞的MQTT客户端,以便在反应式嵌入式系统中使用。首先,本文说明什么是反应系统。然后,它描述了如何为这种系统设计合适的软件结构。最后,本文展示了如何通过使用状态机和事件驱动范例在反应系统中使用MQTT-Reactive库。为此,本文使用一个真实的IoT设备作为演示示例,通过使用状态机,交互和结构等UML图,从中解释其软件结构和基于状态的行为。本文还提供了使用C语言实现IoT设备的MQTT-Reactive客户端的指南。

许多嵌入式系统是反应性的,即它们对内部或外部事件有反应。这些反应完成后,软件将返回以等待下一个事件。这就是为什么将事件驱动系统称为反应系统的原因。

事件驱动编程或反应式编程是为反应式系统实现灵活,可预测和可维护的软件的最合适的编程范例之一。在这种范例中,程序的流程由事件决定。通常,反应式软件的结构由几个并发单元(称为活动对象)组成,这些单元等待并处理各种事件。每个活动对象都拥有一个控制线程和一个事件队列,通过它可以处理其传入事件。在反应系统中,活动对象通常具有在状态图中定义的基于状态的行为。

为了探索如何在具有多个并发任务的反应性系统中使用MQTT-Reactive库,并同时使用状态机和事件驱动范例,我们以IoT设备为例。

使用MQTT协议的想法是在为铁路公司开发IoT设备时诞生的。该设备是一个清晰的反应系统,能够:

检测并存储几个数字输入的变化

采集,滤波和存储多个模拟信号

定期将存储的信息发送到远程服务器

通过GSM网络上的MQTT协议发送和接收信息

选择MQTT是因为它是一种基于发布者-订阅者的轻量级消息传递协议,通常用于需要高延迟和低数据速率链接的IoT和网络应用程序中,例如GSM网络。

通过使用LiamBindle的MQTT-C的修改版,可以实现上述IoT设备的MQTT功能。由于该设备的软件被设计为响应软件,因此必须对MQTT-C进行修改,以通过交换异步事件将其与系统的其余部分进行通信。这些事件用于通过网络接收和发送流量,以及将敏感信息连接和发布到服务器。产生的软件库称为MQTT-Reactive。

状态机

如图1所示,通过状态机使用了MQTT-Reactive,该状态机为MQTT-Reactive客户端的基本行为建模。它是一个称为MqttMgr(MQTT管理器)的活动对象。图1中的状态机操作演示了如何从状态机中使用MQTT-Reactive库。即使在图1中将C语言用作操作语言,也可以使用任何计算机或形式语言。

图1. MQTT-Reactive客户端的状态机

图1中的状态机以WaitingForNetConnection状态启动。与服务器建立网络连接后,WaitingForNetConnection接收到Activate事件,然后状态机转换为WaitingForSync状态。只有在此状态下,状态机才能将MQTT消息传递给代理,例如CONNECT或PUBLISH分别通过Connect和Publish事件。Sync状态使用UML的特殊机制来推迟Publish事件,该事件由Sync状态的内部隔离专区中的defer关键字指定。如果在Sync为当前状态时发生Publish事件,它将被保存(延迟)以备将来处理,直到SM进入Publish事件不在其延迟事件列表中的状态(如WaitingForSync或WaitingForNetConnection)。进入此类状态后,状态机将自动调用任何已保存的Publish事件,然后根据转换目标状态使用或丢弃此事件。

每隔SyncTime毫秒,状态机就会转换到Sync复合状态,该状态通过将Receive和Send事件发布到网络管理器来实际从网络发送和接收流量。它是处理网络问题的并发实体。

即使引入的MqttMgr仅支持CONNECT和PUBLISH数据包,也可以通过简单的更改来支持SUBSCRIBE数据包。

状态机使用params关键字来操作对消费事件的参数的访问。例如,在以下转换中,Connect事件包含两个参数clientId和keepAlive,它们的值用于更新相应的MqttMgr对象的属性:

在此示例中,Connect(clientId,keepAlive)事件是转换的触发器,而mqtt_connect()调用是由此执行的操作的一部分。换句话说,当MqttMgr对象收到参数为'publishing_client'和'400'的Connect(clientId,keepAlive)事件,Connect(“ publishing_client”,400)时,MqttMgr的clientId和keepAlive属性将更新为值'因此,“ publishing_client”和“ 400”。

为了创建和发送事件,状态机的动作使用GEN()宏。例如,以下语句将Receive事件发送到Collector对象,Collector指针将其作为MqttMgr对象的属性来引用:

GEN()语句的第一个参数是接收事件的对象,而第二个参数是要发送的事件,包括事件参数(如果有)。参数必须与事件参数一致。例如,以下语句生成一个ConnRefused(code)事件,并将其作为事件参数传递给Broker返回,并将其发送到Collector对象:

使用params关键字访问消耗的事件的参数,并使用GEN()宏从操作生成事件的想法是从Rational Rhapsody Developer的代码生成器中采纳的,仅用于说明目的。

图1中状态机的默认操作设置了从代理接收到连接接受时由MQTT-Reactive调用的回调。此回调应在MqttMgr代码中实现。此回调必须生成ConnAccepted或ConnRefused(code)事件以发送到Collector对象,如下所示。

模型实施

通过使用您喜欢的软件工具或仅使用自己的状态机实现,可以用C或C ++实现图1中的模型。Internet上有许多不同的工具可以做到这一点,例如RKH框架,QP框架,Yakindu Statechart工具或Rational Rhapsody Developer等等。它们都支持Statecharts和C / C ++语言。而且,其中一些工具包括绘制Statechart图并从中生成代码的工具。

此状态机是从称为MqttMgr(MQTT管理器)的活动对象执行的,该对象提供了MQTT-Reactive代码的严格封装,并且它是唯一允许调用任何MQTT-Reactive函数或访问MQTT-Reactive数据的实体。通过与MqttMgr交换事件,系统中的其他并发实体以及所有ISR只能间接使用MQTT-Reactive。使用此机制同步并发实体并在它们之间共享数据避免了处理传统阻塞机制(如信号量,互斥量,延迟或事件标志)的危险。这些机制可能导致难以诊断和修复的繁琐的意外故障。

MqttMgr活动对象将其属性封装为一组数据项。数据项使用名称和类型来指定变量,其中该类型实际上是数据类型。MqttMgr对象的数据项被映射到对象结构的成员。成员的名称和类型与对象数据的名称和类型相同。例如,MqttMgr对象类型的client属性通过值作为数据成员嵌入在MqttMgr结构内:

MqttMgr对象的数据可以直接访问和修改,而无需使用访问器或更改器操作。例如,可通过指向MqttMgr实例的me指针访问client和localRecv。

MqttMgr的属性列表如表1所示。

表1. MqttMgr属性

图2中的结构有助于牢记相关参与者之间的关系。它们是:收集器对象,它想将信息发送给代理;NetMgr对象,用于处理网络;和MqttMgr对象。

图2.物联网系统结构草案

图3中的序列图显示了当需要打开与MQTT服务器的会话时MqttMgr对象如何与系统其余部分进行交互。在此图中,MqttMgr状态和交换的异步消息在Collector,MqttMgr和NetMgr actor之间显示。

图3.连接到MQTT代理

NetMgr对象与代理建立网络连接后,从MqttMgr发送到MQTT服务器的第一个数据包必须是CONNECT数据包。因此,收集器参与者会向MqttMgr参与者发送Connect(clientId,keepAlive)事件。此事件必须带有客户端标识符和保持活动时间间隔。如果服务器接受连接请求,则MqttMgr actor将ConnAccepted事件发送给Collector actor通知这种情况。从那时起,收集器参与者可以将信息消息发布到该代理。

如果服务器拒绝连接请求,则MqttMgr actor将ConnRefused事件发送给Collector actor。此事件带有一个代码,该代码通知拒绝原因,如图4所示。请参见MQTT v3.1.1第3.2.2.3节。

图4.代理拒绝连接请求

图5显示了发布消息时的交互流程。为此,收集器参与者发送一个Publish(data,size,topic,qos)事件,该事件包含要发布的信息(数据),信息的长度(以字节为单位)(size),主题名称,信息将被发布(主题)和传递此消息的保证级别(质量保证)。在前面提到的IoT设备中,使用JSON规范对发布的信息进行了格式化。这是一种开放的标准格式,其中包含具有人类可读文本中的属性值对的数据对象。这种格式是使用jWrite完成的,它是一个用C编写的简单轻量级的库。

图5.将数据发布到代理

图6显示了一个场景,其中MQTT消息的接收和向网络的发送失败。如果网络管理员无法从网络接收流量,它将向MqttMgr actor发送ReceiveFail。同样,如果网络管理器无法将数据发送到网络,它将发送SendFail到MqttMgr actor。

图6.网络故障

表2总结了所示方案中涉及的事件。

表2.事件

结论 

通过避免传统的阻塞机制(如信号量,互斥量,延迟或事件标志)的危险,MQTT-Reactive库,状态机和本文提出的软件体系结构允许反应性嵌入式系统以新颖的方式实现MQTT客户端。道路。这是通过将MQTT-Reactive代码封装在并发单元(称为活动对象)中来实现的,该并发单元中的基于状态的行为在建议的状态机中定义。该活动对象通过交换所使用的异步事件与系统的其余部分进行通信:不仅用于通过网络接收和发送流量,还用于将信息连接和发布到物联网应用程序的服务器。

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!(点击找小助理领取)

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

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

相关文章

【校招VIP】测试技术考点之单元测试集成测试

考点介绍: 单元测试,集成测试的区别是:方式不同、粒度不同、内容不同。单元测试用用于验证编码单元的正确性。集成测试用于验证详细设计。体现了测试由小到大、又内至外、循序渐进的测试过程和分而治之的思想。 测试技术考点之单元测试&集成测试-相…

WIN11有网络但浏览器打不开

打开设置-》网络和INTERNET-》代理,将自动检测设置打开,将手动设置代理中的使用代理服务器关闭。就可以打开浏览器了。 不知道为什么会出现这样的问题

【数据分享】2009-2021年我国省份级别的轨道交通相关指标(30多项指标)

《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况,在之前的文章中,我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国省份级别的市政设施水平相关指标、2006-2021年我国省份级别的各类建设用地面积数…

vue3 搭配ElementPlus做基础表单校验 自定义表单校验

<script setup> import { ref, reactive } from vue// 表单元素 const dom ref(null) // 校验规则 const rules {name: [{ required: true, message: 请输入活动名称, trigger: blur }],//校验手机号格式phone: [{ required: true, message: "请输入电话", t…

问道管理:证券市场也有中介机构吗?他们具体干什么?

证券市场是一个很大的发行流通生意市场&#xff0c;在这个市场上&#xff0c;有许许多多不同的生意主体。而有生意就会有中介&#xff0c;证券市场上也有中介组织吗&#xff1f;如果有&#xff0c;他们具体又是干什么的&#xff1f;关于这些&#xff0c;问道管理为我们预备了以…

使命召唤中将启用AI检测仇恨言论!

“ToxMod”将自动标记口头骚扰、欺凌和歧视。 周三&#xff0c;动视宣布的它将在即将于11月10日发布的中引入实时人工智能语音聊天调节功能使命召唤:现代战争3。该公司正与调整为了实现这一特性&#xff0c;我们使用了一种叫做托西莫德识别仇恨言论、欺凌、骚扰和歧视并采取行动…

【云原生】容器编排工具Kubernetes

目录 一、 K8S介绍 官网地址&#xff1a; 1.1docker编排与k8s编排相比 1.2特性 1.3功能 二、K8S重要组件 2.1核心组件 &#xff08;1&#xff09;Kube-apiserver &#xff08;2&#xff09;Kube-controller-manager &#xff08;3&#xff09;Kube-scheduler &#x…

前端自动化部署,Devops,CI/CD

DevOps 提到 Jenkins&#xff0c;想到的第一个概念就是 CI/CD 在这之前应该再了解一个概念。 DevOps Development 和 Operations 的组合&#xff0c;是一种方法论&#xff0c;并不特指某种技术或者工具。DevOps 是一种重视 Dev 开发人员和 Ops 运维人员之间沟通、协作的流程。…

打造高效外卖外送商城系统:代码示例和关键功能介绍

随着外卖外送服务的普及&#xff0c;开发一款高效的外卖外送商城系统对于餐馆和食品供应商来说至关重要。这篇文章将为您提供一个简单的外卖外送商城系统的示例代码&#xff0c;并介绍关键功能&#xff0c;以帮助您了解这类系统的工作原理和关键部分。 1. 准备工作 首先&…

搭建harbor

1.安装docker curl -sfL https://get.rainbond.com/install_docker | bash2.安装docker-compose yum install -y docker-compose3.安装harbor 在线离线包下载 选一个喜欢的右击复制链接下载地址 wget https://ghproxy.com/https://github.com/goharbor/harbor/releases/dow…

opencv-4.5.2-android-sdk.zip安装教程

opencv-4.5.2-android-sdk.zip&#xff1a; 下载链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;s0p2 导入模块的方法: ①、导入模块 ②、定位到sdk目录 点击ok就行&#xff0c;就导入成功了。导入成功后会多出一个可展开的opencv文件夹(自己命名的),一定要能展…

MyBatis中至关重要的关系映射----全方面介绍

目录 一 对于映射的概念 1.1 三种关系映射 1.2 resultType与resultMap的区别 resultType&#xff1a; resultMap&#xff1a; 二&#xff0c;一对一关联查询 2.1 嵌套结果集编写 2.2 案例演示 三&#xff0c;一对多关联查询 3.1 嵌套结果集编写 3.3 案例演示 四&…

使用命令行创建仓库

如果你还没有任何代码&#xff0c;可以通过命令行工具创建一个全新的Git仓库并初始化到本项目仓库中。 git clone https://e.coding.net/***/neurosens.git cd neurosens echo "# neurosens" >> README.md git add README.md git commit -m "first commi…

Springboot使用hikari连接池进行Kerberos认证访问Impala

springboot-kerberos-hikari-impala Springboot使用hikari连接池并进行Kerberos认证访问Impala的演示项目 Springboot使用hikari连接池并进行Kerberos认证访问Impala的demo地址:https://github.com/Raray-chuan/springboot-kerberos-hikari-impala 修改后的Hikari源码地址:h…

详解4种类型的爬虫技术

聚焦网络爬虫是“面向特定主题需求”的一种爬虫程序&#xff0c;而通用网络爬虫则是捜索引擎抓取系统&#xff08;Baidu、Google、Yahoo等&#xff09;的重要组成部分&#xff0c;主要目的是将互联网上的网页下载到本地&#xff0c;形成一个互联网内容的镜像备份。 增量抓取意…

sqli-labs闯关

less-01: less-08: less-11: less-18: less-19: less-20: Sqli-labs项目地址—Github 使用HackBar插件 less-01: Sqli-labs前20关均为数字型注入 Sqli-labs前四关较为类似以less-01为模板 将网址导入HackBar中&#xff1a; 1.根据提示&#xff0c;输入http://127.0.0.…

laragon 为 php 安装 Xdebug 扩展

众所周知&#xff0c;php 自带的 var_dump() 输出格式很不直观 而 laragon 作为很好的 windos 下开发环境很受欢迎&#xff0c;本文就介绍如何快速为 laragon 的 php 安装 Xdebug&#xff0c;方便开发调试 一&#xff1a;启动开发环境&#xff0c;在任意可访问 php 页面中输出 …

Matlab中fdatool结合STM32F4设计滤波器

数字滤波器的原理 1.从功能上分&#xff1b;低通、带通、高通、带阻。滤波器口诀&#xff1a;低通滤高频&#xff1b;高通滤低频&#xff1b;带通滤两边&#xff1b;带阻阻中间&#xff1b; 2.从实现方法上分:FIR、IIR 3.从设计方法上来分&#xff1a;Chebyshev(切比雪夫&…

哪家证券公司能做股票的量化交易?

一般证券公司都是能做股票的量化交易的&#xff0c;证券公司主流使用的量化软件一般是P-trade或QMT。其中P-trade普通版更适合没有太多编程经验的投资者使用&#xff0c;可以直接应用软件中现成的程序进行交易&#xff0c;QMT适合专业的投资者&#xff0c;有一定学编程语言基础…

34k*16 薪,3年自动化测试历经3轮面试成功拿下字节Offer....

前言 转眼过去&#xff0c;距离读书的时候已经这么久了吗&#xff1f;&#xff0c;从18年5月本科毕业入职了一家小公司&#xff0c;到现在快4年了&#xff0c;前段时间社招想着找一个新的工作&#xff0c;前前后后花了一个多月的时间复习以及面试&#xff0c;前几天拿到了字节…