SpringBoot如何进行Mqtt协议的连接
程序员文章站
2024-03-21 23:18:58
...
之前使用了Netty来获取设备传输以及交互,后来换了Mqtt协议来控制设备,在网上查找了很多的资料,最终下面的方法可以运行
一、先在POM文件中添加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>
二、在application.properties文件中定义好Mqtt的相关配置
#MQTT配置信息
#MQTT-用户名
spring.mqtt.username=admin
#MQTT-密码
spring.mqtt.password=password
#MQTT-服务器连接地址,如果有多个,用逗号隔开,如:tcp://127.0.0.1:61613,tcp://192.168.2.133:61613
spring.mqtt.url=tcp://127.0.0.1:61613
#MQTT-连接服务器默认客户端ID
spring.mqtt.client.id=mqttId
#MQTT-默认的消息推送主题,实际可在调用接口时指定
spring.mqtt.default.topic=Hello,Hello1
#连接超时
spring.mqtt.completionTimeout=3000
三、创建MqttSenderConfig配置类
@Configuration
@IntegrationComponentScan
public class MqttSenderConfig {
@Value("${spring.mqtt.username}")
private String username;
@Value("${spring.mqtt.password}")
private String password;
@Value("${spring.mqtt.url}")
private String hostUrl;
@Value("${spring.mqtt.client.id}")
private String clientId;
@Value("${spring.mqtt.default.topic}")
private String defaultTopic;
@Bean
public MqttConnectOptions getMqttConnectOptions(){
MqttConnectOptions mqttConnectOptions=new MqttConnectOptions();
mqttConnectOptions.setUserName(username);
mqttConnectOptions.setPassword(password.toCharArray());
mqttConnectOptions.setServerURIs(new String[]{hostUrl});
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(true);
messageHandler.setDefaultTopic(defaultTopic);
return messageHandler;
}
@Bean
public MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
@Value("${spring.mqtt.consumer.defaultTopic}")
private String consumerDefaultTopic;
@Value("${spring.mqtt.consumer.clientId}")
private String consumerClientId;
/**
* MQTT消息订阅绑定(消费者)
*
* @return {@link org.springframework.integration.core.MessageProducer}
*/
@Bean
public MessageProducer inbound() {
// 可以同时消费(订阅)多个Topic
MqttPahoMessageDrivenChannelAdapter adapter =
new MqttPahoMessageDrivenChannelAdapter(
consumerClientId, mqttClientFactory(),
StringUtils.split(consumerDefaultTopic, ","));
adapter.setCompletionTimeout(5000);
adapter.setConverter(new DefaultPahoMessageConverter());
adapter.setQos(1);
// 设置订阅通道
adapter.setOutputChannel(mqttInboundChannel());
return adapter;
}
/**
* MQTT信息通道(消费者)
*
* @return {@link org.springframework.messaging.MessageChannel}
*/
@Bean(name = "mqttInboundChannel")
public MessageChannel mqttInboundChannel() {
return new DirectChannel();
}
/**
* MQTT消息处理器(消费者)
*
* @return {@link org.springframework.messaging.MessageHandler}
*/
@Bean
@ServiceActivator(inputChannel = "mqttInboundChannel")
public MessageHandler handler() {
return new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
System.out.println("MqttSenderConfigClass.handleMessage"+message.getPayload()+message.toString());
}
};
}
}
创建MqttGateway进行传输
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel")
public interface MqttGateway {
void sendToMqtt(String data, @Header(MqttHeaders.TOPIC) String topic);
}
我由于是通过Mqtt协议来控制设备,所以运行成功后是这样的
这样我就能控制设备的开关了,其他的我也没怎么解除,有时间再慢慢学
上一篇: PAT乙级 1030 完美数列(25)分测试点4和测试点五
下一篇: postman接口测试六
推荐阅读
-
SpringBoot如何进行Mqtt协议的连接
-
springboot+idea+maven 多模块项目搭建的详细过程(连接数据库进行测试)
-
pycharm如何连接远程服务器的docker容器进行运行和调试代码(二)
-
关于在使用SSH协议进行远程连接时遇到的一些问题
-
springBoot2数据库连接池自动装配原理,以及如何配置使用其他的数据库连接池(druid)为例
-
springboot+idea+maven 多模块项目搭建的详细过程(连接数据库进行测试)
-
springboot如何进行简单的测试
-
SpringBoot如何进行简单的打包部署?
-
SpringBoot如何进行简单的打包部署?
-
PHP 如何进行socket套节字的连接