1、配置JAR包
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-stream</artifactId>
</dependency>
<!-- Spring Integration 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>
</dependency>
2、在yml配置中增加MQTT的相关配置信息
3、设置mqtt配置类
@Configuration
@IntegrationComponentScan
@EnableConfigurationProperties({MqttProperties.class})
public class MqttConfig {
private static final String RANDOM_ID = CommonConstant.Symbol.UNDERSCORE + RandomUtil.randomString(8);
@Resource
private MqttProperties mqttProperties;
@Bean
public MessageChannel mqttInputChannel() {
return new DirectChannel();
}
@Bean
public MessageChannel mqttOutputChannel() {
return new DirectChannel();
}
@Bean
public MessageProducer mqttInbound() {
// set default receive topic
String topicName = "dc3/mc/" + mqttProperties.getClient();
if (null == mqttProperties.getReceiveTopics()) {
mqttProperties.setReceiveTopics(new ArrayList<>());
}
boolean match = mqttProperties.getReceiveTopics().stream().anyMatch(topic -> topic.getName().equals(topicName));
if (!match) {
mqttProperties.getReceiveTopics().add(new MqttProperties.Topic(topicName, 2));
}
MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(
mqttProperties.getClient() + RANDOM_ID + "_in",
mqttClientFactory(),
mqttProperties.getReceiveTopics().stream().map(MqttProperties.Topic::getName).toArray(String[]::new));
adapter.setQos(mqttProperties.getReceiveTopics().stream().mapToInt(MqttProperties.Topic::getQos).toArray());
adapter.setOutputChannel(mqttInputChannel());
DefaultPahoMessageConverter convert = new DefaultPahoMessageConverter();
convert.setPayloadAsBytes(true);
adapter.setConverter(convert);
adapter.setCompletionTimeout(mqttProperties.getCompletionTimeout());
return adapter;
}
@Bean
@ServiceActivator(inputChannel = "mqttOutputChannel")
public MessageHandler outbound() {
MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(
mqttProperties.getClient() + "_out",
mqttClientFactory());
messageHandler.setAsync(true);
messageHandler.setDefaultQos(mqttProperties.getDefaultSendTopic().getQos());
messageHandler.setDefaultTopic(mqttProperties.getDefaultSendTopic().getName());
return messageHandler;
}
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setConnectionOptions(getMqttConnectOptions());
return factory;
}
@Bean
public MqttConnectOptions getMqttConnectOptions() {
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
// username & password
if (mqttProperties.getAuthType().equals(MqttProperties.AuthTypeEnum.USERNAME)) {
mqttConnectOptions.setUserName(mqttProperties.getUsername());
mqttConnectOptions.setPassword(mqttProperties.getPassword().toCharArray());
}
// tls x509
if (mqttProperties.getAuthType().equals(MqttProperties.AuthTypeEnum.X509)) {
mqttConnectOptions.setSocketFactory(X509Util.getSSLSocketFactory(
mqttProperties.getCaCrt(),
mqttProperties.getClientCrt(),
mqttProperties.getClientKey(),
StrUtil.isBlank(mqttProperties.getClientKeyPass()) ? "" : mqttProperties.getClientKeyPass()
));
if (!StrUtil.isBlank(mqttProperties.getUsername()) && !StrUtil.isBlank(mqttProperties.getPassword())) {
mqttConnectOptions.setUserName(mqttProperties.getUsername());
mqttConnectOptions.setPassword(mqttProperties.getPassword().toCharArray());
}
}
// disable https hostname verification
mqttConnectOptions.setHttpsHostnameVerificationEnabled(false);
mqttConnectOptions.setServerURIs(new String[]{mqttProperties.getUrl()});
mqttConnectOptions.setKeepAliveInterval(mqttProperties.getKeepAlive());
return mqttConnectOptions;
}
}
在这个代码中
DefaultPahoMessageConverter convert = new DefaultPahoMessageConverter();
convert.setPayloadAsBytes(true);
这两个行用于配置接收MQTT的字节码信息。如果不进行这个配置,当MQTT发送字节码时,会自动转换为字符串。
4、设置接收MQTT消息类方法
@Bean
@ServiceActivator(inputChannel = "mqttInputChannel")
public MessageHandler handlerValue() {
return new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
byte[] by = (byte[])message.getPayload();
System.out.println(by.length);
}
};
}