先介绍一下MQTT是什么
MQTT是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一个极其轻量级的发布/订阅消息传输协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用,是专为受限设备和低带宽、高延迟或不可靠的网络而设计。这些原则也使该协议成为新兴的“机器到机器”(M2M)或物联网(IoT)世界的连接设备,以及带宽和电池功率非常高的移动应用的理想选择。例如,它已被用于通过卫星链路与代理通信的传感器、与医疗服务提供者的拨号连接,以及一系列家庭自动化和小型设备场景。它也是移动应用的理想选择,因为它体积小,功耗低,数据包最小,并且可以有效地将信息分配给一个或多个接收器。
特点
开放消息协议,简单易实现
发布订阅模式,一对多消息发布
基于TCP/IP网络连接,提供有序,无损,双向连接。
1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量。
消息QoS支持,可靠传输保证。
应用领域
MQTT协议广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等领域。
物联网M2M通信,物联网大数据采集
Android消息推送,WEB消息推送
移动即时消息,例如Facebook Messenger
智能硬件、智能家具、智能电器
车联网通信,电动车站桩采集
智慧城市、远程医疗、远程教育
电力、石油与能源等行业市场
废话不多说上干货
在网上找搭建MQTT
搭建完之后
在Springboot项目加上mqtt依赖包
<dependency>
<groupId>net.dreamlu</groupId>
<artifactId>mica-mqtt-spring-boot-starter</artifactId>
<mqtt-version>1.2.0</mqtt-version>
</dependency>
配置数据源
mqtt:
server:
enabled: false
client:
enabled: true # 是否开启客户端,默认:false
#ip: 120.46.157.141 # 连接的服务端 ip ,默认:127.0.0.1
ip: 120.46.157.141 # 连接的服务端 ip ,默认:127.0.0.1
port: 1883 # 端口:默认:1883
name: Mica2-Mqtt2-Client # 名称,默认:Mica-Mqtt-Client
clientId: 0200001222 # 客户端Id(非常重要,一般为设备 sn,不可重复)
user-name: 你的用户名 # 认证的用户名 你的用户名
password:你的密码 # 认证的密码
timeout: 5 # 连接超时时间,单位:秒,默认:5秒
reconnect: false # 是否重连,默认:true
re-interval: 5000 # 重连时间,默认 5000 毫秒
version: MQTT_3_1 # mqtt 协议版本,默认:3.1.1
read-buffer-size: 8092 # 接收数据的 buffer size,默认:8092
max-bytes-in-message: 8092 # 消息解析最大 bytes 长度,默认:8092
buffer-allocator: heap # 堆内存和堆外内存,默认:堆内存
keep-alive-secs: 60 # keep-alive 心跳维持时间,单位:秒
clean-session: false # mqtt clean session,默认:true
will-message:
qos: at_least_once
按照自己的实际情况测试方法
@Autowired
private MqttClientMattPublisher mqttClientMattPublisher;
/**
* mqtt测试——topic-cmdSubTopic
*/
//参数 topic:是你的消息类型
/**
* mqtt测试——topic-cmdSubTopic
*/
@GetMapping("/cmdSubTopic")
public void cmdSubTopic(String topic,String jsonname,String value )
{
// 设置的你JSON格式
JSONObject jsonObject = new JSONObject();
jsonObject.put("ver","1.1.0");
jsonObject.put("jsonname",jsonname);
jsonObject.put("value",value);
mqttClientMattPublisher.cmdSubTopic(topic,jsonObject.toJSONString());
}
@Service
public class MqttClientMattPublisher {
@Autowired
private MqttClientTemplate client;
/**
* mqtt测试发布消息
* @param json
* @return
*/
public boolean cmdSubTopic(String topic,String json) {
Map map = JSONObject.parseObject(json, Map.class);
boolean a=client.publish(topic,ByteBuffer.wrap(JSONObject.toJSONString(map).getBytes(StandardCharsets.UTF_8)),MqttQoS.AT_LEAST_ONCE);
return a;
}
}
使用Postman测试看效果
在控制台可以看出我们的消息是否成功
MQTT Topic:/test/44E48AED4ADB4B04A9A7AE4B9435EB9E/a qos:AT_LEAST_ONCE retain:false publish result:true 就是发布成功 false 发布不成功
咱们在看MQTT.xf(是一个mqtt客户端工具)链接:https://pan.baidu.com/s/1ukUoLIizmUp2XnGewvB73Q
提取码:20tv
我现在再试在我们Springboot订阅消息
首先我们先发布消息 注意要是json格式的
点击Log 我们已经发布消息
/**
* 订阅
*/
@Service
public class MqttClientSubscribeMattListener {
private static final Logger logger = LoggerFactory.getLogger(MqttClientSubscribeMattListener.class);
@MqttClientSubscribe("/test/44E48AED4ADB4B04A9A7AE4B9435EB9E/a")
public void info(String topic, ByteBuffer payload) {
System.out.println("*****************gc**************************************"+topic);
JSONObject jsonObject = JSONObject.parseObject(ByteBufferUtil.toString(payload));
//业务的处理
System.out.println("*****************test**************************************"+jsonObject);
}
}
- BUG乱码问题待解决
到这里MQTT发布和订阅就完成了。