【mica-mqtt】低延迟、高性能的 mqtt 物联网组件
1、引入依赖
<dependency>
<groupId>net.dreamlu</groupId>
<artifactId>mica-mqtt-client-spring-boot-starter</artifactId>
<version>2.2.9</version>
</dependency>
2、添加yml配置
mqtt:
client:
enabled: true # 是否开启客户端,默认:true
ip: 127.0.0.1 # 连接的服务端 ip ,默认:127.0.0.1
port: 1883 # 端口:默认:1883
name: Mica-Mqtt-Client # 名称,默认:Mica-Mqtt-Client
client-id: 000001 # 客户端Id(非常重要,一般为设备 sn,不可重复)
user-name: admin # 认证的用户名
password: 123456 # 认证的密码
global-subscribe: # 全局订阅的 topic,可被全局监听到,保留 session 停机重启,依然可以接受到消息。(2.2.9开始支持)
timeout: 5 # 超时时间,单位:秒,默认:5秒
reconnect: true # 是否重连,默认:true
re-interval: 5000 # 重连时间,默认 5000 毫秒
version: mqtt_3_1_1 # mqtt 协议版本,可选 MQTT_3_1、mqtt_3_1_1、mqtt_5,默认:mqtt_3_1_1
read-buffer-size: 8KB # 接收数据的 buffer size,默认:8k
max-bytes-in-message: 10MB # 消息解析最大 bytes 长度,默认:10M
buffer-allocator: heap # 堆内存和堆外内存,默认:堆内存
keep-alive-secs: 60 # keep-alive 时间,单位:秒
clean-session: true # mqtt clean session,默认:true
ssl:
enabled: false # 是否开启 ssl 认证,2.1.0 开始支持双向认证
keystore-path: # 可选参数:ssl 双向认证 keystore 目录,支持 classpath:/ 路径。
keystore-pass: # 可选参数:ssl 双向认证 keystore 密码
truststore-path: # 可选参数:ssl 双向认证 truststore 目录,支持 classpath:/ 路径。
truststore-pass: # 可选参数:ssl 双向认证 truststore 密码
3、代码示例
(1)客户端连接状态监听
@Slf4j
@Service
public class MqttClientConnectListener {
@Resource
private MqttClientCreator mqttClientCreator;
@EventListener
public void onConnected(MqttConnectedEvent event){
log.info("MqttConnectedEvent:{}", event);
log.info("Mqtt 启动成功");
}
@EventListener
public void onDisconnected(MqttDisconnectEvent event){
// 离线时更新重连时的密码,适用于类似阿里云 mqtt clientId 连接带时间戳的方式
log.info("MQtt 重连....");
log.info("MqttDisconnectEvent:{}", event);
// 在断线时更新 clientId、username、password
mqttClientCreator.clientId("newClient" + System.currentTimeMillis())
.username("admin")
.password("123456");
}
}
(2)订阅示例
@Slf4j
@Service
public class MqttClientSubscribeListener {
@MqttClientSubscribe(value = "/test", qos = MqttQoS.EXACTLY_ONCE)
public void subQos2(String topic, byte[] payload) {
String message = new String(payload, StandardCharsets.UTF_8);
log.info("topic:{} payload:{}", topic, message);
}
}
(3)MqttClientTemplate 使用示例
@Slf4j
@Service
public class MicaMqttService {
@Resource
private MqttClientTemplate mqttClientTemplate;
public String sub(String topicFilter) {
mqttClientTemplate.subQos2(topicFilter, (context, topic, message, payload) -> {
log.info("topic:" + topic);
log.info(new String(payload, StandardCharsets.UTF_8));
});
return "success";
}
public String publish(String topic, String msg){
boolean flag = mqttClientTemplate.publish(topic, msg.getBytes(StandardCharsets.UTF_8), MqttQoS.EXACTLY_ONCE);
return flag ? "success" : "fail";
}
}
@Slf4j
@RestController
@RequestMapping("/mqtt")
public class MqttController {
@Resource
private MicaMqttService micaMqttService;
@GetMapping("/publish")
public String publish(String topic, String msg){
return micaMqttService.publish(topic, msg);
}
@GetMapping("/sub")
public String sub(String topic){
return micaMqttService.sub(topic);
}
}