1. 引入jar包
<!-- 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>
<!-- mqtt end -->
2. application.yml
#mqtt
mqtt:
host: tcp://***.***.**.**:1883
clientinid: test
topic: topic
qoslevel: 2
username:
password:
async: true
keepaliveinterval: 2
还可以有别的属性,比如timeout、clientoutid… 自己定义,看心情(需要)。
这里的配置主要为了在下方MqttConfig类中使用,比如 @Value("${mqtt.username}")。
3. MqttConfig
import org.apache.commons.lang3.StringUtils;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.IntegrationComponentScan;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
@Configuration
@IntegrationComponentScan
public class MqttConfig {
@Value("${mqtt.username}")
private String username;
@Value("${mqtt.password}")
private String password;
@Value("${mqtt.host}")
private String hostUrl;
@Value("${mqtt.clientinid}")
private String clientId;
@Value("${mqtt.topic}")
private String defaultTopic;
@Value("${mqtt.qoslevel}")
private int qosLevel;
@Value("${mqtt.async}")
private boolean async;
@Value("${mqtt.keepaliveinterval}")
private int keepAliveInterval;
public MqttConnectOptions getMqttConnectOptions(){
MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
if (StringUtils.isNotBlank(username)) {
mqttConnectOptions.setUserName(username);
}
if (StringUtils.isNotBlank(password)) {
mqttConnectOptions.setPassword(password.toCharArray());
}
mqttConnectOptions.setServerURIs(new String[]{hostUrl});
mqttConnectOptions.setKeepAliveInterval(keepAliveInterval);
return mqttConnectOptions;
}
@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, mqttClientFactory());
messageHandler.setAsync(async);
messageHandler.setDefaultTopic(defaultTopic);
messageHandler.setDefaultQos(qosLevel);
return messageHandler;
}
@Bean
public MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
}
这里都是为了能够连接上mqtt。
接下来是向mqtt发送数据
4. MqttGateway
import org.springframework.integration.annotation.MessagingGateway;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.messaging.handler.annotation.Header;
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface MqttGateway {
void sendToMqtt(String data,@Header(MqttHeaders.TOPIC) String topic);
}
这个接口必须要单独放,不能和config放一起!!!!!!
这个接口必须要单独放,不能和config放一起!!!!!!
这个接口必须要单独放,不能和config放一起!!!!!!
参数很清楚的吧,
data:要发送的信息
topic:就是客户端要接收的topic
结束!!!
调用示例:
要查看消息是否发送,需要用到一个mqtt工具,我用的是mqtt.fx
参考文章:MQTT.fx的安装和使用
over。