Spring boot 集成 MQTT详情
目录
一、简介二、主要特性三、集成步骤1.引入相关jar包2.核心配置类3.网关配置4.编写测试类5.yml配置信息一、简介
MQTT
(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,可以以极少的代码和有限的带宽为连接远程设备提供实时可靠的消息服务。目前在物联网、小型设备、移动应用等方面有较广泛的应用。
二、主要特性
(1)使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。(2)对负载内容屏蔽的消息传输。(3)使用TCP/IP提供网络连接。(4)有三种消息发布服务质量:“至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。
“至少一次”,确保消息到达,但消息重复可能会发生。
“只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。
(5)小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。(6)使用Last Will和Testament特性通知有关各方客户端异常中断的机制。Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。
Testament:遗嘱机制,功能类似于Last Will。
三、集成步骤
1.引入相关jar包
org.springframework.integration spring-integration-stream org.springframework.integration spring-integration-mqtt
2.核心配置类
@Configuration public class MqttConfig { @Autowired private MqttProperties mqttProperties; /** * 连接器 * @return */ @Bean public MqttConnectOptions getMqttConnectOptions() { MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); // 设置是否清空session,false表示服务器会保留客户端的连接记录,true表示每次连接到服务器都以新的身份连接 mqttConnectOptions.setCleanSession(true); // 设置超时时间,默认30秒 mqttConnectOptions.setConnectionTimeout(mqttProperties.getConnectionTimeOut()); mqttConnectOptions.setKeepAliveInterval(mqttProperties.getKeepAlive()); mqttConnectOptions.setAutomaticReconnect(true); // 设置连接的用户名 mqttConnectOptions.setUserName(mqttProperties.getUsername()); // 设置连接的密码 mqttConnectOptions.setPassword(mqttProperties.getPassword().toCharArray()); //服务器地址 mqttConnectOptions.setServerURIs(new String[]{mqttProperties.getUrl()}); mqttConnectOptions.setKeepAliveInterval(2); return mqttConnectOptions; } /*** * MQTT客户端 * @return */ @Bean("mqttClientFactory") public MqttPahoClientFactory mqttClientFactory() { DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); factory.setConnectionOptions(getMqttConnectOptions()); return factory; } /*----------------- 消息生产者的配置 ---------------------*/ /** * MQTT生产端发布处理器 * * @return {@link org.springframework.messaging.MessageHandler} */ @Bean @ServiceActivator(inputChannel = "mqttOutboundChannel") public MessageHandler mqttOutbound() { MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler(mqttProperties.getProducerClientId(), mqttClientFactory()); messageHandler.setAsync(true); return messageHandler; } /** * MQTT生产端发布通道 * @return */ @Bean("mqttOutboundChannel") public MessageChannel mqttOutboundChannel() { return new DirectChannel(); } /*----------------- 消息消费者的配置 ---------------------*/ /** * MQTT消费端订阅通道 * * @return {@link org.springframework.messaging.MessageChannel} */ @Bean(name = "mqttInboundChannel") public MessageChannel mqttInboundChannel() { return new DirectChannel(); } /** * MQTT消费端连接配置 * * @param channel {@link org.springframework.messaging.MessageChannel} * @param factory {@link org.springframework.integration.mqtt.core.MqttPahoClientFactory} * @return {@link org.springframework.integration.core.MessageProducer} */ @Bean public MessageProducer inbound( @Qualifier("mqttInboundChannel") MessageChannel channel, @Qualifier("mqttClientFactory") MqttPahoClientFactory factory) { MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(mqttProperties.getConsumerClientId(), factory, "test"); adapter.setCompletionTimeout(30000); adapter.setConverter(new DefaultPahoMessageConverter()); // 0 至多一次,数据可能丢失 // 1 至少一次,数据可能重复 // 2 只有一次,且仅有一次,最耗性能 adapter.setQos(1); // 设置订阅通道 adapter.setOutputChannel(channel); return adapter; } }
@ConfigurationProperties("mqtt") @Component public class MqttProperties implements Serializable { private static final long serialVersionUID = -1425980007744001158L; private String url; private String username; private String password; private int keepAlive; private int connectionTimeOut; private String producerClientId; private String producerQos; private String consumerClientId; private String consumerQos; private String consumerTopic; private int completionTimeout; private String defaultTopic; //get、set方法省略 }
3.网关配置
@MessagingGateway(defaultRequestChannel = "mqttOutboundChannel") public interface MqttGateway { void sendToMqtt(byte[] data,@Header(MqttHeaders.TOPIC) String topic); }
4.编写测试类
@Autowired private MqttGateway mqttGateway; @RequestMapping("/sendTest") public String sendMqttTest(String msg) { mqttGateway.send("test",msg); return "OK"; }
5.yml配置信息
mqtt: url: tcp://localhost:1883 username: test password: test1234 keep-alive: 30 connection-timeout: 3000 producerClientId: test-producer producerQos: 1 consumerClientId: test-consumer consumerQos: 1 deafultTopic : test
到此这篇关于Spring boot 集成 MQTT详情的文章就介绍到这了,更多相关Spring boot 集成 MQTT内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?