SpringBoot整合MQTT⼩结汇总
⽬录
前⾔:
⼀、什么是mqtt
⼆、主要思想
发布/订阅模式
三、MQTT重要概念
3.1MQTTClient
3.2MQTTBroker
3.3MQTTConnection
3.4MQTT主要参数
四、软件和Apollo
4.1安装Apollo
4.2 安装Postman
4.3安装MQTTBox
五、代码实现
5.1配置l
5.2配置MQTT服务器基本信息
5.3配置读取yml⽂件的类MqttConfiguration
5.4 MQTT⽣产端的Handler处理
5.5 MQTT消费端的Handler处理
5.6写个Controller类来进⾏访问控制测试
六、测试
6.1测试⽣产端的Handler
6.2测试消费端的Handler
后⾔:
前⾔:
这⼏天在准备⾯试的过程中做的⼀个⼩demo,主要是⽤通过SpringBoot实现⼀个与MQTT服务交互通信,也是看着别⼈的项⽬改的,这两个技术之前都没有接触过,希望记录⼀下可以分享给⼤家,也好久没更新了,借此机会更新⼀波blog。在正式的开始这个项⽬前还是学了⼀下SSM和SpringBoot的基础,上⼿起来不会这么的⽆⼒。期间也是查阅了很多的资料和询问了诸多⼤佬。
好了话不多说,⼀步步的搭建项⽬和原理详解就在下⾯了
⼀、什么是mqtt
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是⼀种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于 TCP/IP 协议上,由 IBM 于 1999 年发明。MQTT 协议的主要特征是开放、简单、轻量级和易于实现,这些特征使得它适⽤于受约束的应⽤环境,如:
⽹络受限:⽹络带宽较低且传输不可靠
终端受限:协议运⾏在嵌⼊式设备上,嵌⼊式终端的处理器、内存等是受限的
通过 MQTT 协议,⽬前已经扩展出了数⼗种 MQTT 服务器端程序,可以通过 PHP、Java、Python、C、C# 等语⾔向 MQTT 发送消息。由于开放源代码、耗电量⼩等特
点,MQTT ⾮常适⽤于物联⽹领域,如传感器与服务器的通信、传感器信息采集等。
⼆、主要思想
发布/订阅模式
订阅发布模式定义了⼀种⼀对多的依赖关系,让多个订阅者对象同时监听某⼀个主题对象。这个主题对象在⾃⾝状态变化时,会通知所有订阅者对象,使它们能够⾃动更新⾃⼰的状态。
将⼀个系统分割成⼀系列相互协作的类有⼀个很不好的副作⽤,那就是需要维护相应对象间的⼀致性,这样会给维护、扩展和重⽤都带来不便。当⼀个对象的改变需要同时改变其他对象,⽽且它不知道具体有多少对象需要改变时,就可以使⽤订阅发布模式了。
⼀个抽象模型有两个⽅⾯,其中⼀⽅⾯依赖于另⼀⽅⾯,这时订阅发布模式可以将这两者封装在独⽴的对象中,使它们各⾃独⽴地改变和复⽤。订阅发布模式所做的⼯作其实就是在解耦合。让耦合的双⽅都依赖于抽象,⽽不是依赖于具体,从⽽使得各⾃的变化都不会影响另⼀边的变化。
发布/订阅模式并不是 MQTT 协议特有的模式,像我们很多消息中间件都有使⽤发布/订阅模式,这⾥你是不是想说,这不就是我们所说的观察者模式嘛,还真不是,这两个模式很容易混淆。观察者模式只有观察者 + 被观察者两个⾓⾊,⽽发布/订阅模式还有⼀个经纪⼈ Broker;往更深层次的讲观察者和被观察者,是松耦合的关系,⽽发布者和订阅者,则完全不存在耦合。
在我们⽇常写程序时,经常遇到下⾯这种情况:
public void 前端业务/硬件业务()
{
刷新界⾯();
更新数据库();
对界⾯更新数据();
………………………………
}
当有前端和硬件业务产⽣时,需要依次要去执⾏:刷新界⾯()、更新数据库()、对界⾯更新数据()等操作。表⾯上看代码写得很⼯整,其实这⾥⾯有很多的问题:
⾸先,这完全是⾯向过程开发,根本不适合⼤型项⽬。
第⼆,代码维护量太⼤。设想⼀下,如果产⽣业务后要执⾏10多个操作,那这将是个多么⼤,多少复杂的类呀,时间⼀长,可能连开发者⾃⼰都不知道如何去维护了。
第三,扩展性差。如果产⽣业务后,要增加⼀个声⾳提⽰()功能,怎么办呢?没错,只能加在前端业务/
硬件业务()这个函数中,这样⼀来,就违反了“开放-关闭原则”。⽽且修改了原有的函数,那么在测试时,除了要测新增功能外,还要做原功能的回归测试;在⼀个⼤型项⽬中,做⼀次回归测试可能要花费⼤约两周左右的时间,⽽且前提是新增功能没有影响原来功能及产⽣新的bug。
那么如何把前端业务/硬件业务()函数同其他函数进⾏解耦合呢?别着急,下⾯就介绍今天的主⾓----订阅发布模式。见下图:ssm框架简单吗
上⾯的流程就是对有告警信息产⽣()这个函数的描述。我们要做的,就是把产⽣告警和它需要通知的事件进⾏解耦,让它们之间没有相互依赖的关系,解耦合图如下:
事件触发者被抽象出来,称为消息发布者,即图中的P。事件接受都被抽象出来,称为消息订阅者,即图中的S。P与S之间通过Broker(即订阅器)连接。这样就实现了P与S的解耦。⾸先,P就把消息发送到指定的订阅器上,从始⾄终,它并不知道也不关⼼要把消息发向哪个S。S如果想接收消息,就要向订阅器进⾏订阅,订阅成功后,S就可以接收来⾃Broker的消息了,从始⾄终,S并不知道也不关⼼消息来源于哪个具体的P。同理,S还可以向Broker进⾏退订操作,成功退订后,S就⽆法接收到来⾃指定Broker的消息了。这样就完美的解决了P与S之间的解耦。
三、MQTT重要概念
3.1 MQTT Client
publisher 和 subscriber 都属于 MQTT Client,之所以有发布者和订阅者这个概念,其实是⼀种相对的概念,就是指当前客户端是在发布消息还是在接收消息,发布和订阅的功能也可以由同⼀个 MQTT Client 实现。
MQTT 客户端是运⾏ MQTT 库并通过⽹络连接到 MQTT 代理的任何设备(从微控制器到成熟的服务器)。例如,MQTT 客户端可以是⼀个⾮常⼩的、资源受限的设备,它通过⽆线⽹络进⾏连接并具有⼀个最低限度的库。基本上,任何使⽤ TCP/IP 协议使⽤ MQTT 设备的都可以称之为 MQTT Client。MQTT 协议的客户端实现⾮常简单直接,易于实施是MQTT ⾮常适合⼩型设备的原因之⼀。MQTT 客户
端库可⽤于多种编程语⾔。例如,Android、Arduino、C、C++、C#、Go、iOS、Java、JavaScript 和 .NET。
3.2 MQTT Broker
与 MQTT Client 对应的就是 MQTT Broker,Broker 是任何发布/订阅协议的核⼼,根据实现的不同,代理可以处理多达数百万连接的 MQTT Client。
Broker 负责接收所有消息,过滤消息,确定是哪个Client 订阅了每条消息,并将消息发送给对应的 Client,Broker 还负责保存会话数据,这些数据包括订阅的和错过的消息。Broker 还负责客户端的⾝份验证和授权。
3.3 MQTT Connection
MQTT 协议基于 TCP/IP。客户端和代理都需要有⼀个 TCP/IP 协议⽀持。
MQTT 连接始终位于⼀个客户端和代理之间。客户端从不直接相互连接。要发起连接,客户端向代理发送 CONNECT 消息。代理使⽤ CONNACK 消息和状态代码进⾏响应。建⽴连接后,代理将保持打开状态,直到客户端发送断开连接命令或连接中断。
3.4 MQTT主要参数
ClientId:ClientId 的长度可以是 1-23 个字符,在⼀个服务器上 ClientId 不能重复。如果超过 23 个字符,则服务器返回 CONNACK 消息中的返回码为 Identifier Rejected。在MQTT 3.1.1 中,如果您不需要代理持有状态,您可以发送⼀个空的 ClientId。空的 ClientId 导致连接没有任何状态。在这种情况下,clean session 标志必须设置为 true,否则代理将拒绝连接。
Clean Session:Clean Session 标志告诉代理客户端是否要建⽴持久会话。在持久会话 (CleanSession = false) 中,代理存储客户端的所有订阅以及以服务质量(QoS)级别 1 或2 订阅的客户端的所有丢失消息。如果会话不是持久的 (CleanSession = true ),代理不为客户端存储任何内容,并清除任何先前持久会话中的所有信息。
Username/Password:MQTT 可以发送⽤户名和密码进⾏客户端认证和授权。但是,如果此信息未加密或散列,则密码将以纯⽂本形式发送。我们强烈建议将⽤户名和密码与安全传输⼀起使⽤。像 HiveMQ 这样的代理可以使⽤ SSL 证书对客户端进⾏⾝份验证,因此不需要⽤户名和密码。
Will Message:LastWillxxx 表⽰的是遗愿,client 在连接 broker 的时候将会设⽴⼀个遗愿,这个遗愿会保存在 broker 中,当 client 因为⾮正常原因断开与 broker 的连接
时,broker 会将遗愿发送给订阅了这个 topic(订阅遗愿的 topic)的 client。
KeepAlive:keepAlive 是 client 在连接建⽴时与 broker 通信的时间间隔,通常以秒为单位。这个时间指的是 client 与 broker 在不发送消息下所能承受的最⼤时长。
QOS:此数字表⽰消息的服务质量 (QoS)。有三个级别:0、1 和 2。服务级别决定了消息到达预期接收者(客户端或代理)的保证类型。
Payload:这个是每条消息的实际内容。MQTT 是数据⽆关性的。可以发送任何⽂本、图像、加密数据以及⼆进制数据。
timeout:MQTT会尝试接收数据,直到timeout时间到后才会退出。
四、软件和Apollo
4.1 安装Apollo
Apollo()是携程框架部门研发的分布式配置中⼼,能够集中化管理应⽤不同环境、不同集的配置,配置修改后能够实时推送到应⽤端,并且具备规范的权限、流程治理等特性,适⽤于微服务配置管理场景。
服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运⾏,不需要额外安装Tomcat等应⽤容器。
Java客户端不依赖任何框架,能够运⾏于所有Java运⾏时环境,同时对Spring/Spring Boot环境也有较好的⽀持。
Apollo下载地址
相关链接:
4.1.1 解压,进⼊到D:\java\apache-apollo-1.7.1\bin ⽬录下,执⾏命令
.\d create mybroker2
4.1.2 进⼊刚刚创
4.1.2 进⼊刚刚创建好的mybroker/bin⽬录,执⾏:
.\d run
4.2 安装Postman
4.3 安装MQTTBox
Microsoft Store⾥⾯就有。账号密码输⼊即可
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论