- Linux安装EMQX
- pom.xml
<!-- https://mvnrepository.com/artifact/org.springframework.integration/spring-integration-mqtt --> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> <version>6.0.3</version> </dependency>
- application.yml
server: port: 8686 servlet: context-path: /mqtt spring: application: name: mqtt mqtt: url: tcp://192.168.1.97:1883 username: admin password: public client: id: mqtt-client-id
- 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; @Autowired private MqttReceiver mqttReceiver; @Bean public MessageChannel mqttInputChannel() { return new DirectChannel(); } @Bean public 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; } @Bean public 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; } @Bean public 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); } }
-
消息处理器
@Component public class MqttReceiver implements MessageHandler { @Autowired MqttSender mqttSender; @Override public 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"); } } }
- 消息发布器
@Component public class MqttSender { @Autowired MqttConfig.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); } }
- MQTT接口
@RestController public class MqttController { @Autowired MqttSender mqttSender; @RequestMapping("/sendMessage") public void sendMessage(String topic, String message) throws MqttException { mqttSender.send(topic, message); } }
- MQTT测试
- 参考文档
MQTT Support
SpringBoot+MQTT(方案二)
于 2023-03-21 16:35:07 首次发布