自己有一个mqtt的平台
自己可以在mqtt官网下载一个
第一步:引入mqtt依赖包
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
</dependency>
这两个也可以加上,springboot配合使用的部分配置
<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>
第二步:创建一个MqttConfig.java,存放配置
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
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.*;
@Configuration
public class MqttConfig {
}
连接mqtt服务器的工厂,我这里用的是工厂的配置,我使用不了 factory.setConnectOptions(options); 这个方法,这是和其他不同的
/**
* 连接mqtt服务器的工厂
* @return
*/
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
//connect 我使用不了 factory.setConnectOptions(options);
// MqttConnectOptions options = new MqttConnectOptions();
// options.setServerURIs(new String[] { "tcp://183.193.73.222:1883" });
// options.setUserName("fudan");
// options.setPassword("fudan".toCharArray());
//工厂配置
factory.setUserName("fudan");
factory.setServerURIs("tcp://183.193.73.222:1883" );
factory.setPassword("fudan");
return factory;
}
下面是config的完整文档,注意看引入的springboot的包是否一致,否则方法不能使用
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.*;
@Configuration
public class MqttConfig {
/**
* 连接mqtt服务器的工厂
* @return
*/
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
// MqttConnectOptions options = new MqttConnectOptions();
// options.setServerURIs(new String[] { "tcp://183.193.73.222:1883" });
// options.setUserName("fudan");
// options.setPassword("fudan".toCharArray());
// factory.setConnectOptions(options);
factory.setUserName("fudan");
factory.setServerURIs("tcp://183.193.73.222:1883" );
factory.setPassword("fudan");
return factory;
}
/**
* 入站通道
* @return
*/
@Bean
public MessageChannel mqttInputChannel() {
return new DirectChannel();
}
/**
* 入站
*/
@Bean
public MessageProducer inbound( ) {
MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter("conClient-paho",mqttClientFactory(), "home");
adapter.setCompletionTimeout(5000);
adapter.setConverter(new DefaultPahoMessageConverter());
//设置一次需要应答
adapter.setQos(1);
//设置对外的通道
adapter.setOutputChannel(mqttInputChannel());
return adapter;
}
/**
* 收消息的处理器,用于如何处理消息
* mqttInputChannel 代表的是收消息的通道对象的id
* @return
*/
@Bean
@ServiceActivator(inputChannel = "mqttInputChannel")
public MessageHandler handler() {
return new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
MessageHeaders headers = message.getHeaders();
String topic =headers.get("mqtt_topic").toString();
String payload = message.getPayload().toString();
// 根据主题分别进行消息处理。
if (topic.matches("home")) { // 匹配:1/sensor
String sensorSn = topic.split("/")[0];
System.out.println("传感器" + sensorSn + ": 的消息: " + payload);
} else if (topic.equals("collector")) {
System.out.println("采集器的消息:" + payload);
} else {
System.out.println("丢弃消息:主题[" + topic + "],负载:" + payload);
}
// System.out.println(topic+"----"+payload);
}
};
}
/**
* 出站通道
* @return
*/
@Bean
public MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
//出站
@Bean
@ServiceActivator(inputChannel = "mqttOutboundChannel")
public MessageHandler outbound() {
MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler("publishClie", mqttClientFactory());
messageHandler.setAsync(true);
messageHandler.setDefaultTopic("command");
messageHandler.setDefaultQos(1);
DefaultPahoMessageConverter defaultPahoMessageConverter = new DefaultPahoMessageConverter();
messageHandler.setConverter(defaultPahoMessageConverter);
return messageHandler;
}
}
需要有个gateway 发送到mqtt消息的文件
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 MyGateway {
void sendToMqtt(String payload);
void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic,String payload);
void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic,@Header(MqttHeaders.QOS)int qos,String payload);
void sendToMqtt(@Header(MqttHeaders.TOPIC) String topic,@Header(MqttHeaders.QOS)int qos,byte[] payload);
}
message对象里面放发送的消息
public class MyMessage {
private String topic;
private String content;
public String getTopic() {
return topic;
}
public void setTopic(String topic) {
this.topic = topic;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
测试连接
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class MqttController {
@Resource
private MyGateway myGateway;
@PostMapping("/sendMsg")
public String sendMsg(@RequestBody MyMessage msg){
myGateway.sendToMqtt(msg.getTopic(),1,msg.getContent());
return "Topic : "+msg.getTopic() + " ,message : "+msg.getContent();
}
}
!!!注意,配置文件不同,是连接不通的。
如有问题,可以在评论区询问博主,为大家提供免费学习