- 创建好springboot工程,添加maven依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
</dependency>
- properties文件配置:
mqtt.username=XXXXXXXX
mqtt.password=XXXXXXXX
mqtt.url=tcp://XXXXXXXX:1883
mqtt.producer.clientId=XXXXXXXX
mqtt.producer.defaultTopic=XXXXXXXX
mqtt.consumer.clientId=XXXXXXXX
mqtt.consumer.defaultTopic=XXXXXXXX
- MQTT连接配置:
import org.apache.commons.lang3.StringUtils;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.core.MessageProducer;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.MessagingException;
@Configuration
public class MqttConfig {
@Autowired
private CacheUtil cacheUtil;
@SuppressWarnings("unused")
private static final byte[] WILL_DATA;
static {
WILL_DATA = "offline".getBytes();
}
public static final String CHANNEL_NAME_IN = "mqttInboundChannel";
public static final String CHANNEL_NAME_OUT = "mqttOutboundChannel";
@Value("${mqtt.username}")
private String username;
@Value("${mqtt.password}")
private String password;
@Value("${mqtt.url}")
private String url;
@Value("${mqtt.producer.clientId}")
private String producerClientId;
@Value("${mqtt.producer.defaultTopic}")
private String producerDefaultTopic;
@Value("${mqtt.consumer.clientId}")
private String consumerClientId;
@Value("${mqtt.consumer.defaultTopic}")
private String consumerDefaultTopic;
@Bean
public MqttConnectOptions getMqttConnectOptions() {
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);
options.setUserName(username);
options.setMaxInflight(1000);
options.setPassword(password.toCharArray());
options.setServerURIs(StringUtils.split(url, ","));
options.setConnectionTimeout(10);
options.setKeepAliveInterval(20);
return options;
}
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setConnectionOptions(getMqttConnectOptions());
return factory;
}
@Bean(name = CHANNEL_NAME_OUT)
public MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
@Bean
@ServiceActivator(inputChannel = CHANNEL_NAME_OUT)
public MessageHandler mqttOutbound() {
MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(
producerClientId,
mqttClientFactory());
messageHandler.setAsync(true);
messageHandler.setDefaultTopic(producerDefaultTopic);
return messageHandler;
}
@Bean
public MessageProducer inbound() {
MqttPahoMessageDrivenChannelAdapter adapter =
new MqttPahoMessageDrivenChannelAdapter(
consumerClientId, mqttClientFactory(),
StringUtils.split(consumerDefaultTopic, ","));
adapter.setCompletionTimeout(5000);
adapter.setConverter(new DefaultPahoMessageConverter());
adapter.setQos(2);
adapter.setOutputChannel(mqttInboundChannel());
return adapter;
}
@Bean(name = CHANNEL_NAME_IN)
public MessageChannel mqttInboundChannel() {
return new DirectChannel();
}
@Bean
@ServiceActivator(inputChannel = CHANNEL_NAME_IN)
public MessageHandler handler() {
return new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
cacheUtil.add(message.getHeaders().get("mqtt_receivedTopic").toString(), message.getPayload().toString());
}
};
}
}
- 定义MQTT发送快捷方法:
import org.springframework.integration.annotation.MessagingGateway;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;
@Component
@MessagingGateway(defaultRequestChannel = MqttConfig.CHANNEL_NAME_OUT)
public interface IMqttSender {
void sendToMqtt(String data);
void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic,
String payload);
void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic,
@Header(MqttHeaders.QOS) int qos,
String payload);
}
- 消息接收缓存件:
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Async;
@Configuration
public class CacheUtil {
private ConcurrentHashMap<String, String> cmap= new ConcurrentHashMap<String, String>();
@Async
public void add(String topic, String news)
{
cmap.put(topic, news);
}
public void delete(String topic)
{
cmap.remove(topic);
}
public String query(String topic)
{
return cmap.get(topic);
}
}