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

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...