SpringBoot 整合MQTT
阿新 • • 發佈:2019-01-10
本文參考spring官方給的文件,地址:
採用Gateway繫結的方式,網上也有采用paho Mqtt client庫實現的,但是比較麻煩。
1. 引入相關依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-integration</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-stream</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> </dependency>
2. 配置MQTT伺服器基本資訊,在springBoot配置檔案application.yml中配置,新增如下:
#MQTT配置資訊 #MQTT-使用者名稱 spring.mqtt.username=admin #MQTT-密碼 spring.mqtt.password=password #MQTT-伺服器連線地址,如果有多個,用逗號隔開,如:tcp://127.0.0.1:61613,tcp://192.168.2.133:61613 spring.mqtt.url=tcp://127.0.0.1:61613 #MQTT-連線伺服器預設客戶端ID spring.mqtt.client.id=mqttId #MQTT-預設的訊息推送主題,實際可在呼叫介面時指定 spring.mqtt.default.topic=topic
3. 配置MQTT訊息推送配置類,
** * 〈一句話功能簡述〉<br> * 〈MQTT傳送訊息配置〉 * * @author AnswerChang * @create 2018/6/4 * @since 1.0.0 */ @Configuration @IntegrationComponentScan public class MqttSenderConfig { @Value("${spring.mqtt.username}") private String username; @Value("${spring.mqtt.password}") private String password; @Value("${spring.mqtt.url}") private String hostUrl; @Value("${spring.mqtt.client.id}") private String clientId; @Value("${spring.mqtt.default.topic}") private String defaultTopic; @Bean public MqttConnectOptions getMqttConnectOptions(){ MqttConnectOptions mqttConnectOptions=new MqttConnectOptions(); mqttConnectOptions.setUserName(username); mqttConnectOptions.setPassword(password.toCharArray()); mqttConnectOptions.setServerURIs(new String[]{hostUrl}); mqttConnectOptions.setKeepAliveInterval(2); return mqttConnectOptions; } @Bean public MqttPahoClientFactory mqttClientFactory() { DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); factory.setConnectionOptions(getMqttConnectOptions()); return factory; } @Bean @ServiceActivator(inputChannel = "mqttOutboundChannel") public MessageHandler mqttOutbound() { MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId, mqttClientFactory()); messageHandler.setAsync(true); messageHandler.setDefaultTopic(defaultTopic); return messageHandler; } @Bean public MessageChannel mqttOutboundChannel() { return new DirectChannel(); } }
4. 配置MqttGateway訊息推送介面類,在sendToMqtt(String data,@Header(MqttHeaders.TOPIC)String topic)介面中,data為傳送的訊息內容,topic為主題。指定topic,則我們的介面可以根據需要,向不同的主題傳送訊息,方便靈活應用。如果不指定,則使用預設配置的主題。
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface MqttGateway {
void sendToMqtt(String data,@Header(MqttHeaders.TOPIC) String topic);
}
5. 最後,寫個介面類測試下功能,用Postman呼叫sendMqtt.do介面,往hello主題傳送訊息,用MQTTLens訂閱hello主題,從下面截圖,可以看出可以正常往MQTT服務傳送訊息了,而且可以訂閱到。
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private MqttGateway mqttGateway;
@RequestMapping("/sendMqtt.do")
public String sendMqtt(String sendData){
mqttGateway.sendToMqtt(sendData,"hello");
return "OK";
}
}
最後使用Google瀏覽器 MQTTLens外掛進行測試
轉自:
https://blog.csdn.net/qq_41018959/article/details/80592444
https://blog.csdn.net/qq_41018959/article/details/80564347