java中的mqtt无法链接_MQTT协议的初浅认识之连接建立

MQTT百科

MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。

从危机百科可以看出,MQTT是一种协议,不是一种消息队列。尽管,它有消息队列的设计,但更侧重是一种网络协议。 一般推荐使用2014年10月30日发布的MQTT 3.1.1版本,关于MQTT3.1.1版本优势的文章。

几个概念

客户端(Client)

MQTT客户端是运行MQTT客户端库并通过网络连接到MQTT中间件的任何设备(从嵌入式设备到服务器)。MQTT客户端库可由各种编程语言实现。 例如,Android,Arduino,C,C ++,C#,Go,iOS,Java,JavaScript和.NET。

中间件(Broker)

MQTT中间件是MQTT协议的核心。负责接收所有消息,过滤消息,确定订阅每条消息的客户端,以及将消息发送给这些订阅的客户端。还包括对持久会话的管理,以及客户端的认证和授权等功能。例如:Mosquitto就是由Eclipse基金会维护开发的MQTT中间件。由Apache基金会维护开发的ActiveMQ消息中间件支持MQTT协议。

MQTT 连接

这里借用hivemq的几张图.

MQTT连接过程

d5196ae9d20aad58e71e13e4db7c6b09.png

MQTT协议是基于TCP/IP的。客户端和中间件建立连接的时候:

客户端先发送CONNECT消息给中间件

中间件收到客户端的连接请求后返回CONNACK消息

13766ddf46aa58c5b47d3faa4b0fea44.png

CONNECT消息

4c53c0258947e7595108a4bdabc275b4.png

参数说明:

clientId:表示客户端id,可以是设备唯一id,或者是业务系统用户id

cleanSession:false表示使用持久会话;true表示不使用持久会话

username:mqtt中间件的验证用户名

password:mqtt中间件的验证密码

lassWill开头:表示客户端从中间件中意外断开时中间件应该怎么做

keepAlive:表示客户端与中间件之间在没有任何消息的推送的时候,多久启用一次客户端发一次PINGREQ消息,中间件收到PINGREQ消息后,必须给客户端回复PINGRESP消息。这个参数很重要。

CONNACK消息

CONNACK消息包含两个部分:

会话是否持久标识

mqtt连接状态标识

a05f52089064623b58a3832fe4e4bac7.png

参数说明:

sessionPresent::true表示是持久会话;否则,反之。

returnCode:见下表。

Return Code

Return Code Response

0

Connection accepted

1

Connection refused, unacceptable protocol version

2

Connection refused, identifier rejected

3

Connection refused, server unavailable

4

Connection refused, bad user name or password

5

Connection refused, not authorized

后面,我们再谈谈MQTT的订阅发布过程

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Mqtt Paho(Java)时,如果连接断或者网络不稳定,我们需要实现Mqtt客户端的重连机制,以保证消息的可靠传递。下面是一个实现Mqtt Paho(Java)重连的例子: ```java import org.eclipse.paho.client.mqttv3.*; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; public class MqttClientDemo { private static final String BROKER_URL = "tcp://localhost:1883"; private static final String TOPIC = "test"; private static final String CLIENT_ID = "mqtt-java-client"; public static void main(String[] args) throws MqttException, InterruptedException { MemoryPersistence persistence = new MemoryPersistence(); MqttClient client = new MqttClient(BROKER_URL, CLIENT_ID, persistence); MqttConnectOptions options = new MqttConnectOptions(); options.setCleanSession(true); options.setAutomaticReconnect(true); // 启用自动重连 client.setCallback(new MqttCallback() { @Override public void connectionLost(Throwable throwable) { System.out.println("Connection lost!"); } @Override public void messageArrived(String s, MqttMessage mqttMessage) throws Exception { System.out.println("Message arrived: " + new String(mqttMessage.getPayload())); } @Override public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { System.out.println("Delivery complete!"); } }); client.connect(options); client.subscribe(TOPIC, 1); while (true) { if (!client.isConnected()) { System.out.println("Client disconnected! Trying to reconnect..."); client.connect(options); client.subscribe(TOPIC, 1); } Thread.sleep(1000); } } } ``` 在这个例子,我们设置了自动重连机制: ```java options.setAutomaticReconnect(true); ``` 然后在while循环不断检查客户端是否连接,如果客户端断开了连接,就会尝试重新连接: ```java if (!client.isConnected()) { System.out.println("Client disconnected! Trying to reconnect..."); client.connect(options); client.subscribe(TOPIC, 1); } ``` 这样就可以实现Mqtt Paho(Java)的重连了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值