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

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...