前言:项目为智能家居物联网项目,需要与嵌入式对接,通过MQTT短消息队列进行通信。
本项目为springboot+springcloud,辅助工具mqtt.fx,下载链接https://pan.baidu.com/s/130giQTKQhwSp4qeWKisrrA
//MQTT详细介绍简介稍后整理
依赖
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.0</version>
</dependency>
mqtt生产者
@Configuration
public class MqttFunTestProducer {
@Value("${mqtt.producer.servers}")
private String servers;
@Value("${mqtt.producer.client-id}")
private String clientId;
@Value("${mqtt.producer.default-topic}")
private String defaultTopic;
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setServerURIs(servers);
return factory;
}
@Bean
@ServiceActivator(inputChannel = "mqttOutboundChannel")
public MessageHandler mqttOutbound() {
MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId, mqttClientFactory());
messageHandler.setAsync(false);
messageHandler.setDefaultTopic(defaultTopic);
return messageHandler;
}
@Bean
public MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
}
mqtt调用生产者
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface TestGateway {
void sendToMqtt(String data,@Header(MqttHeaders.TOPIC) String topic);
}
测试mqtt消息发送
@RestController
@RequestMapping("/fun")
public class MqttFunController {
@Autowired
private TestGateway mqttGateway;
@RequestMapping("/testMqtt")
public String sendMqtt(@RequestParam(value = "topic") String topic, @RequestParam(value = "message") String message) {
mqttGateway.sendToMqtt(message, topic);
return "SUCCESS";
}
}
mqtt.fx链接配置
mqtt.fx订阅主题
这里的主题以“FUN”为例,订阅后
利用postman调用消费者,发布消息
这个时候我们看下mqtt.fx的订阅界面
下面编写mqtt消费者,来接收生产者发布的消息
mqtt消费者
@Component
@ComponentScan({ "com.hiss.service.*" })
@Configuration
public class MqttFunConsumer {
@Value("${mqtt.producer.servers}")
private String servers;
@Value("${mqtt.producer.client-id}")
private String clientId;
@Value("${mqtt.producer.default-topic}")
private String defaultTopic;
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setServerURIs(servers);
return factory;
}
@Bean
public MessageChannel mqttTestInputChannel() {
return new DirectChannel();
}
@Bean
public MessageProducer inbound() {
MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(clientId, mqttClientFactory(), defaultTopic);
adapter.setCompletionTimeout(5000);
adapter.setConverter(new DefaultPahoMessageConverter());
adapter.setQos(1);
adapter.setOutputChannel(mqttTestInputChannel());
return adapter;
}
@Bean
@ServiceActivator(inputChannel = "mqttTestInputChannel")
public MessageHandler handlerTest() {
return new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
try {
//这里拿到发布的消息内容,做具体的业务逻辑处理
String string = message.getPayload().toString();
JsonParser jsonParser = new JsonParser();
JsonObject object = jsonParser.parse(string).getAsJsonObject();
String asString = object.get("game").getAsString();
} catch (MessagingException ex) {
logger.info(ex.getMessage());
}
}
};
}
}
** 生产配置详解**
—client-id:客户端id
—url:代理URL
—topics:适配器会接受到消息的一组以逗号分隔的主题
—qos:以逗号分隔的一组QoS值,可以是所有主题运用单一值,或者每一个主题一个值(列表必须同样长度)
—converter:MqttMessageConverter(可选项),默认DefaultPahoMessageConverter生成消息带字符串载荷(默认),携带头部包括:
mqtt_topic 接收消息主题
mqtt_duplicate 如果消息重复,值为true
mqtt_qos 业务质量
— DefaultPahoMessageConverter可配置为返回载荷原始byte[]类型,通过将其声明为一个实体类,并且设定payloadAsBytes属性
—client-factory:客户端工厂
—send-timeout: 发送超时-如果通道可能会阻塞,才会运用(例如当前已满的边界QueueChannel)
—error-channel:错误通道–如果使用的话,ErrorMessage消息下行异常会发送至该通道,载荷为MessagingException,包含错误消息与原因
—recovery-interval:恢复间隔–控制在故障之后适配器会尝试重新连接的时间间隔,默认为10000ms(10s)
消费配置详解
1) client-id:客户端id
2)url:代理URL
3)topics:适配器会接受到消息的一组以逗号分隔的主题
4)qos:以逗号分隔的一组QoS值,可以是所有主题运用单一值,或者每一个主题一个值(列表必须同样长度)
5)converter:MqttMessageConverter(可选项),默认DefaultPahoMessageConverter生成消息带字符串载荷(默认),携带头部包括:
mqtt_topic 接收消息主题
mqtt_duplicate 如果消息重复,值为true
mqtt_qos 业务质量
DefaultPahoMessageConverter可配置为返回载荷原始byte[]类型,通过将其声明为一个实体类,并且设定payloadAsBytes属性
6) client-factory:客户端工厂
7)send-timeout:发送超时-如果通道可能会阻塞,才会运用(例如当前已满的边界QueueChannel)
8)error-channel:错误通道–如果使用的话,ErrorMessage消息下行异常会发送至该通道,载荷为MessagingException,包含错误消息与原因
9)recovery-interval:恢复间隔–控制在故障之后适配器会尝试重新连接的时间间隔,默认为10000ms(10s)