/s/1K7DQz5d__Z4C6aYmKDKsrw 提取码:if14
一、什么是MQTT MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布订阅范式的消息协议。它工作在 TCP/IP协议之上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
二、MQTT 特点 轻量级协议:
设计简单,占用带宽少,特别适合嵌入式设备和不稳定的网络环境。 发布/订阅模型:
客户端通过主题(Topic)发布消息,订阅者通过主题接收消息,彼此不直接通信。 可靠性保障:
提供三种服务质量(QoS)等级,确保消息可靠传输: QoS 0:至多一次(不确认,可能丢失)。 QoS 1:至少一次(需要确认,但可能重复)。 QoS 2:仅一次(确保消息不丢失且不重复)。 持续连接:
使用 TCP/IP 连接,通过心跳包(Keep-Alive)保持连接稳定。 支持离线消息:
使用“保留消息”和“持久会话”功能,实现离线设备接收消息。 安全性:
支持 SSL/TLS 加密,结合用户名和密码进行身份验证。
三、项目需求: 在开发管理系统时,需要在项目中 控制一些物联网设备,因为我们开发的是管理系统,所以在管理设备的时候 需要有通用性和扩展性! 比如空调设备A客户用的是 美的品牌B客户用的是格力 ,过两天又来一个供应商,我们怎么扩展,这个时候 在页面上控制这些设备的时候 就需要 根据 设备品牌的不同 调用不同的 实现类来操作空调,不止空调比如断路器、 门禁等等供应商不同控制他们的设备方法不同、 参数不同、 协议也有可能不同,但是经过我的观察我发现 : 比如空调设备虽然空调设备的供应商不一样,但是空调设备提供的功能 一般都是一样的只有个别的有区别 :开关,调节风速、模式基本的设备功能,那别的设备肯定也有这种特性,利用这种特性我觉得觉得可以给我们对接的设备定义一个 接口类。
四、springboot项目中集成mqtt服务 为了模拟的更加真实点儿,我这边做了两个端,分别是客户端和服务端,代码基本都一样,客户端就是将服务端复制过来改了下关键部分。 除了springboot 的依赖,其他的都有注释,如果mqtt的依赖引入报错的话,在重新引入一下就行. 在application.yml文件中加入mqtt的配置
MQTT配置
mqtt: host: tcp://127.0.0.1:1883 userName: admin1 passWord: 1234567 qos: 1 clientId: serve timeout: 10 keepalive: 20 注意一定要改clientId,不然启动的时候会报错连接失败,然后一直在重新连接。 改一下回调类MyMQTTCallback中的messageArrived方法: /**
* @param topic
* @param mqttMessage
* @throws Exception
* subscribe后得到的消息会执行到这里面
* 订阅者收到消息之后执行
*/
@Override
public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
System.out.println("客户端接收到消息之后调用");
log.info("接收消息主题 : {},接收消息内容 : {}", topic, new String(mqttMessage.getPayload()));
}