SpringBoot+MQTT(方案二)
创始人
2025-06-01 00:43:25
0
  1. Linux安装EMQX
  2. pom.xml
    
    org.springframework.integrationspring-integration-mqtt6.0.3
    
  3. application.yml
    server:port: 8686servlet:context-path: /mqttspring:application:name: mqttmqtt:url: tcp://192.168.1.97:1883username: adminpassword: publicclient:id: mqtt-client-id
  4. MQTT配置
    @Configuration
    public class MqttConfig {@Value("${spring.mqtt.url}")private String url;@Value("${spring.mqtt.username}")private String username;@Value("${spring.mqtt.password}")private String password;@Value("${spring.mqtt.client.id}")private String clientId;@Autowiredprivate MqttReceiver mqttReceiver;@Beanpublic MessageChannel mqttInputChannel() {return new DirectChannel();}@Beanpublic MessageProducer inbound() { // 订阅主题MqttPahoMessageDrivenChannelAdapter adapter =new MqttPahoMessageDrivenChannelAdapter(url, clientId+"-"+System.currentTimeMillis(),"AAA/#", "BBB/#", "CCC/#");adapter.setCompletionTimeout(5000);adapter.setConverter(new DefaultPahoMessageConverter());adapter.setQos(1);adapter.setOutputChannel(mqttInputChannel());return adapter;}@Bean@ServiceActivator(inputChannel = "mqttInputChannel")public MessageHandler handler() {return mqttReceiver;}@Beanpublic MqttPahoClientFactory mqttClientFactory(){DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();MqttConnectOptions options = new MqttConnectOptions();options.setServerURIs(new String[] { url });options.setUserName(username);options.setPassword(password.toCharArray());options.setCleanSession(true);options.setAutomaticReconnect(true);factory.setConnectionOptions(options);return factory;}@Bean@ServiceActivator(inputChannel = "mqttOutboundChannel")public MessageHandler mqttOutbound() {MqttPahoMessageHandler messageHandler =new MqttPahoMessageHandler(clientId+"-"+System.currentTimeMillis(), mqttClientFactory());messageHandler.setAsync(true);messageHandler.setDefaultTopic("DefaultTopic");return messageHandler;}@Beanpublic MessageChannel mqttOutboundChannel() {return new DirectChannel();}@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")public interface MqttGateway {void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, String payload);void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, String payload);void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic, @Header(MqttHeaders.QOS) int qos, byte[] payload);}}
  5. 消息处理器

    @Component
    public class MqttReceiver implements MessageHandler {@AutowiredMqttSender mqttSender;@Overridepublic void handleMessage(Message message) {MessageHeaders headers = message.getHeaders();String topic = (String) headers.get(MqttHeaders.RECEIVED_TOPIC);String payload = (String) message.getPayload();if (topic.indexOf("AAA")!=-1) {System.out.println("============================AAA");mqttSender.send("BBB", "BBB测试消息");} else if (topic.indexOf("BBB")!=-1) {System.out.println("============================BBB");mqttSender.send("CCC", "CCC测试消息");} else if (topic.indexOf("CCC")!=-1) {System.out.println("============================CCC");}}}
  6. 消息发布器
    @Component
    public class MqttSender {@AutowiredMqttConfig.MqttGateway mqttGateway;/*** 发送mqtt消息* @param topic 主题* @param message 内容* @return void*/public void send(String topic, String message) {mqttGateway.sendToMqtt(topic, message);}/*** 发送包含qos的消息* @param topic 主题* @param qos 质量* 0 表示的是订阅者没收到消息不会再次发送,消息会丢失* 1 表示的是会尝试重试,一直到接收到消息,但这种情况可能导致订阅者收到多次重复消息* 2 多了一次去重的动作,确保订阅者收到的消息有一次* @param messageBody 消息体*/public void send(String topic, int qos, JSONObject messageBody){mqttGateway.sendToMqtt(topic, qos, messageBody.toString());}/*** 发送包含qos的消息* @param topic 主题* @param qos 质量* 0 表示的是订阅者没收到消息不会再次发送,消息会丢失* 1 表示的是会尝试重试,一直到接收到消息,但这种情况可能导致订阅者收到多次重复消息* 2 多了一次去重的动作,确保订阅者收到的消息有一次* @param message 消息体*/public void send(String topic, int qos, byte[] message){mqttGateway.sendToMqtt(topic, qos, message);}}
  7. MQTT接口
    @RestController
    public class MqttController {@AutowiredMqttSender mqttSender;@RequestMapping("/sendMessage")public void sendMessage(String topic, String message) throws MqttException {mqttSender.send(topic, message);}}
  8. MQTT测试

  9. 参考文档
    MQTT Support

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...