Springboot集成MQTT

版权声明:转载请注明出处——大道迷途 https://blog.csdn.net/qq_41018959/article/details/80592444

        这几天在弄后端管理系统向指定的Android客户端推送消息的功能模块,查阅了网上很多博客介绍的许多方式,最终选择基于MQTT协议来实现,MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。

        实现MQTT协议的中间件有很多,我用的是Apollo服务器,如何搭建MQTT服务器,请查阅其他资料。这里,主要介绍SpringBoot2.0集成MQTT实现消息推送的功能。好,正式开始:

        本文采用Gateway绑定的方式,网上也有介绍但不全面,还有其他采用Paho MQTT Client库的方式实现的。

         第一,pom配置,我们需要引入相关jar:        

 


 
 
  1. <dependency>
  2. <groupId>org.springframework.integration </groupId>
  3. <artifactId>spring-integration-stream </artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.integration </groupId>
  7. <artifactId>spring-integration-mqtt </artifactId>
  8. </dependency>

        第二,配置MQTT服务器基本信息,在springBoot配置文件application.properties中配置,添加如下:

 


 
 
  1. #MQTT配置信息
  2. #MQTT-用户名
  3. spring.mqtt.username=admin
  4. #MQTT-密码
  5. spring.mqtt.password=password
  6. #MQTT-服务器连接地址,如果有多个,用逗号隔开,如:tcp://127.0.0.1:61613,tcp://192.168.2.133:61613
  7. spring.mqtt.url=tcp://127.0.0.1:61613
  8. #MQTT-连接服务器默认客户端ID
  9. spring.mqtt.client.id=mqttId
  10. #MQTT-默认的消息推送主题,实际可在调用接口时指定
  11. spring.mqtt.default.topic=topic

    第三,配置MQTT消息推送配置类,

 


 
 
  1. /**
  2. * 〈一句话功能简述〉 <br>
  3. * 〈MQTT发送消息配置〉
  4. *
  5. * @author AnswerChang
  6. * @create 2018/6/4
  7. * @since 1.0.0
  8. */
  9. @Configuration
  10. @IntegrationComponentScan
  11. public class MqttSenderConfig {
  12. @Value("${spring.mqtt.username}")
  13. private String username;
  14. @Value("${spring.mqtt.password}")
  15. private String password;
  16. @Value("${spring.mqtt.url}")
  17. private String hostUrl;
  18. @Value("${spring.mqtt.client.id}")
  19. private String clientId;
  20. @Value("${spring.mqtt.default.topic}")
  21. private String defaultTopic;
  22. @Bean
  23. public MqttConnectOptions getMqttConnectOptions(){
  24. MqttConnectOptions mqttConnectOptions=new MqttConnectOptions();
  25. mqttConnectOptions.setUserName(username);
  26. mqttConnectOptions.setPassword(password.toCharArray());
  27. mqttConnectOptions.setServerURIs(new String[]{hostUrl});
  28. mqttConnectOptions.setKeepAliveInterval(2);
  29. return mqttConnectOptions;
  30. }
  31. @Bean
  32. public MqttPahoClientFactory mqttClientFactory() {
  33. DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
  34. factory.setConnectionOptions(getMqttConnectOptions());
  35. return factory;
  36. }
  37. @Bean
  38. @ServiceActivator(inputChannel = "mqttOutboundChannel")
  39. public MessageHandler mqttOutbound() {
  40. MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId, mqttClientFactory());
  41. messageHandler.setAsync(true);
  42. messageHandler.setDefaultTopic(defaultTopic);
  43. return messageHandler;
  44. }
  45. @Bean
  46. public MessageChannel mqttOutboundChannel() {
  47. return new DirectChannel();
  48. }
  49. }

        第四,配置MqttGateway消息推送接口类,在sendToMqtt(String data,@Header(MqttHeaders.TOPIC)String topic)接口中,data为发送的消息内容,topic为主题。指定topic,则我们的接口可以根据需要,向不同的主题发送消息,方便灵活应用。如果不指定,则使用默认配置的主题。

 


 
 
  1. @MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
  2. public interface MqttGateway {
  3. void sendToMqtt(String data,@Header(MqttHeaders.TOPIC) String topic);
  4. }

        最后,写个接口类测试下功能,用Postman调用sendMqtt.do接口,往hello主题发送消息,用MQTTLens订阅hello主题,从下面截图,可以看出可以正常往MQTT服务发送消息了,而且可以订阅到。

 


 
 
  1. @RestController
  2. @RequestMapping("/test")
  3. public class TestController {
  4. @Autowired
  5. private MqttGateway mqttGateway;
  6. @RequestMapping("/sendMqtt.do")
  7. public String sendMqtt(String sendData){
  8. mqttGateway.sendToMqtt(sendData,"hello");
  9. return "OK";
  10. }
  11. }

【转载请注明出处——大道迷途】

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值