springboot 集成mqtt,且订阅和推送消息全部以bytes
- maven加入依赖
<!--mqtt,其余依赖省略-->
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
</dependency>
- application.yml添加配置参数
spring:
# mqtt
mqtt:
url: tcp://127.0.0.1:1883
client:
id: iot-think
default:
topic: topic
completionTimeout: 3000
- mqtt配置
@Configuration
@IntegrationComponentScan
public class MQTTConfig {
@Value("${spring.mqtt.url}")
private String hostUrl;
@Value("${spring.mqtt.client.id}")
private String clientId;
@Value("${spring.mqtt.default.topic}")
private String defaultTopic;
@Value("${spring.mqtt.completionTimeout}")
private int completionTimeout ;
// 消息处理器
@Resource
private MessageHandler messageHandler;
// 配置mqtt连接信息
@Bean
public MqttConnectOptions getMqttConnectOptions(){
MqttConnectOptions mqttConnectOptions=new MqttConnectOptions();
// mqttConnectOptions.setUserName(username);
// mqttConnectOptions.setPassword(password.toCharArray());
mqttConnectOptions.setServerURIs(new String[]{hostUrl});
mqttConnectOptions.setKeepAliveInterval(2);
return mqttConnectOptions;
}
// mqtt客户端工厂类
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setConnectionOptions(getMqttConnectOptions());
return factory;
}
// 发送消息处理器(推送),配置发送消息客户端
@Bean
@ServiceActivator(inputChannel = "mqttOutboundChannel")
public MessageHandler mqttOutbound() {
MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(clientId + +"_outbound", mqttClientFactory());
messageHandler.setAsync(true);
messageHandler.setDefaultTopic(defaultTopic);
// 设置转换器,发送bytes
DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter();
converter.setPayloadAsBytes(true);
messageHandler.setConverter(converter);
return messageHandler;
}
// 发送通道(消息生产者)
@Bean
public MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
// 接收通道(消息消费者)
@Bean
public MessageChannel mqttInputChannel() {
return new DirectChannel();
}
// 配置消息适配器,配置订阅客户端
@Bean
public MessageProducer inbound() {
MqttPahoMessageDrivenChannelAdapter adapter =
new MqttPahoMessageDrivenChannelAdapter(clientId+"_inbound", mqttClientFactory(), defaultTopic);
adapter.setCompletionTimeout(completionTimeout);
// 设置转换器,接收bytes
DefaultPahoMessageConverter converter = new DefaultPahoMessageConverter();
converter.setPayloadAsBytes(true);
adapter.setConverter(converter);
adapter.setQos(1);
adapter.setOutputChannel(mqttInputChannel());
return adapter;
}
// 通过通道获取数据
// 接收消息处理器(订阅)
@Bean
@ServiceActivator(inputChannel = "mqttInputChannel")
public MessageHandler handler() {
return messageHandler;
}
}
- 配置订阅消息处理器
@Component("messageHandler")
@Slf4j
public class MQTTMessageHandler implements MessageHandler {
@Resource
private IotConcentratorMapper iotConcentratorMapper;
@Override
public void handleMessage(Message<?> message) {
log.info("收到订阅消息: {}", message);
String topic = message.getHeaders().get("mqtt_receivedTopic").toString();
log.info("消息主题:{}", topic);
Object payLoad = message.getPayload();
// 如果不设置转换器这里强转byte[]会报错
byte[] data = (byte[]) payLoad;
// 这里对数据进行处理
}
}
- 配置发送消息网关
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface MqttGateway {
// 不设置转换器这里以byte[]做参数会报错,需要发送消息,直接调用这个方法即可
/**
* 推送消息
* @param data 数据
* @param topic 主题
*/
void sendToMqtt(byte[] data, @Header(MqttHeaders.TOPIC) String topic);
}