org.springframework.integration spring-integration-mqtt 6.0.3
server:port: 8686servlet:context-path: /mqttspring:application:name: mqttmqtt:url: tcp://192.168.1.97:1883username: adminpassword: publicclient:id: mqtt-client-id
@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);}}
消息处理器
@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");}}}
@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);}}
@RestController
public class MqttController {@AutowiredMqttSender mqttSender;@RequestMapping("/sendMessage")public void sendMessage(String topic, String message) throws MqttException {mqttSender.send(topic, message);}}
下一篇:某租房平台AES加密解密