这个类中涉及的包有
<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>
直接上代码
package com.example.robot.util;
import com.example.config.MqttConfig;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
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.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.support.DefaultPahoMessageConverter;
import org.springframework.integration.mqtt.support.MqttHeaders;
import org.springframework.messaging.*;
import javax.annotation.Resource;
import java.util.UUID;
/**
* @Auther: suge
* @DateTime: 2022/11/15-17:02
* @Description: TODO
**/
@Configuration
@IntegrationComponentScan
@ComponentScan(basePackages = "com.example.config")
@Slf4j
public class MqttUtil {
@Resource
private MqttConfig mqttConfig;
@Bean
public MessageChannel mqttInputChannel() {
return new DirectChannel();
}
@Bean
public MqttPahoClientFactory mqttPahoClient() {
System.out.println(mqttConfig);
DefaultMqttPahoClientFactory defaultMqttPahoClientFactory = new DefaultMqttPahoClientFactory();
String[] split = mqttConfig.getUrl().split(",");
MqttConnectOptions options = new MqttConnectOptions();
options.setServerURIs(split);
options.setUserName(mqttConfig.getUsername());
options.setPassword(mqttConfig.getPassword().toCharArray());
options.setKeepAliveInterval(2); //心跳包超时设置,不设置默认是60s
//接收离线消息
options.setCleanSession(false);//客户端掉线服务端是否清除session
defaultMqttPahoClientFactory.setConnectionOptions(options);
return defaultMqttPahoClientFactory;
}
@Bean
public MessageProducer inbound() {
String[] split = mqttConfig.getTopics().split(",");
MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(mqttConfig.getUrl()
, mqttPahoClient(), split);
adapter.setCompletionTimeout(5000);
adapter.setQos(0);
adapter.setConverter(new DefaultPahoMessageConverter());
adapter.setOutputChannel(mqttInputChannel());
return adapter;
}
@Bean
@ServiceActivator(inputChannel = "mqttInputChannel")
public MessageHandler handler() {
return message -> {
Object payload = message.getPayload();
MessageHeaders headers = message.getHeaders();
UUID id = headers.getId();
Object qos = headers.get(MqttHeaders.QOS);
Object topic = headers.get(MqttHeaders.RESPONSE_TOPIC);
log.info("-----message数据{}----", payload);//这里是mqtt通道消息展示
};
}
}
上面代码中的MqttConfig代码如下
package com.example.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @Auther: suge
* @DateTime: 2022/11/15-16:55
* @Description: TODO
**/
@Component
@ConfigurationProperties(prefix = "mqtt")
public class MqttConfig {
private String url;
private String clientId;
private String topics;
private String username;
private String password;
private String timeout;
private String keepalive;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public String getTopics() {
return topics;
}
public void setTopics(String topics) {
this.topics = topics;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTimeout() {
return timeout;
}
public void setTimeout(String timeout) {
this.timeout = timeout;
}
public String getKeepalive() {
return keepalive;
}
public void setKeepalive(String keepalive) {
this.keepalive = keepalive;
}
}
地址以及一些其他需要设置的topic我都写在了yml里面如下图所示
以上呢是收消息的代码下面是发送消息的代码
package com.example.robot.util.listener.util;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
public class MqttUtil {
//mqtt服务器默认的地址和端口号
private static final String HOST = "";
//连接MQTT的客户端ID,一般以唯一标识符表示
private static final String CLIENTID = "";
//连接的用户名密码(非必需)
private String userName = "admin";
private String password = "password";
// private String password = "123";
private MqttClient mqttClient;
//构造方法,启动mqttClient
public MqttUtil() {
try {
// MemoryPersistence设置clientid的保存形式,默认为以内存保存
mqttClient = new MqttClient(HOST, CLIENTID, new MemoryPersistence());
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(true);
options.setConnectionTimeout(60);
options.setKeepAliveInterval(10);
options.setUserName(userName);
options.setPassword(password.toCharArray());
//定义回调函数
mqttClient.setCallback(new PushCallBack(mqttClient, options));
mqttClient.connect(options);
} catch (MqttException e) {
e.printStackTrace();
}
}
// private static void printEnv(){
// //获取环境变量
// Map<String, String> envs = System.getenv();
// envs.forEach( (key,value) ->{
// //System.out.println("env---key是: "+key +" ; "+"env---value是: "+ value);
// });
//
// //获取jvm属性
// Properties properties = System.getProperties();
// properties.forEach((key, value) -> {
// System.out.println("jvm---key是: "+key +" ; "+"jvm---value是: "+ value);
// });
//
//
// }这里我是当时需要获取环境变量,解决发送消息为乱码问题
//发布主题
public void publish(String topic, MqttMessage message) {
try {
mqttClient.publish(topic, message);
} catch (MqttException e) {
e.printStackTrace();
}
}
}
如果发送消息为乱码这里则需要在pom文件中给项目属性设置为UTF-8即可,上面代码中查看环境变量以及jvm属性就是为了确定打包出来的项目不是UTF-8编码的
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>