1.
什么叫MQTT?
1.0
全称:Message Queuing Telemetry Transport
((消息队列遥测传输)。是IBM
开发的一个即时通讯协议
。
1.1
其具有协议简洁
、小巧
、可扩展性强
、省流量
、省电
等优点,而且已经有PHP
,JAVA
,Python
,C
,C#
,Go
等多个语言版本。
1.2
基本可以使用在任何平台上。几乎可以把所有联网物品和外部连接起来,所以特别适合用来当做物联网的通信协议
2.
MQTT特点(使用发布
/订阅
消息模式)
2.0
使用 TCP/IP 提供网络连接
2.1
对负载内容屏蔽的消息传输
2.2
有三种消息发布服务质量
“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
“至少一次”,确保消息到达,但消息重复可能会发生
“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
2.3
小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量
2.4
使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制
3.
MQTT协议特征
MQTT是一种基于代理的发布/订阅的消息协议。提供一对多
的消息分发,解除应用程序耦合
4.
错误汇总
-
MQTT连接断开,(
32109
) -java.io.EOFException错误
原因:客户端唯一标识重复
导致的
具体可参考:Connection lost (32109) - java.io.EOFException -
MQTT断线重连订阅无法接收
// 配置里将cleanSession设为true,当客户端掉线时,服务器端会清除客户端 session
// 重连后 客户端会有一个新的session
connOpts.setCleanSession(true);
解决: cleanSession设为false,客户端掉线后,服务器端不会清除session,当重连后可以接收之前订阅主题的消息。当客户端上线后会接受到它离线的这段时间的消息
- mqtt在连接成功后,各种机型退到后台心跳发送会不稳定(
手机差别很多
)
解决:connectionLost
回调一定记得重连
client = new MqttAndroidClient(this, uri.toString(), info.uid);
client.setCallback(mqttCallback); // 设置MQTT监听并且接受消息
/**
* MQTT监听并且接受消息
*/
private MqttCallback mqttCallback = new MqttCallback() {
@Override
public void messageArrived(String topic, MqttMessage message) {
String msg = new String(message.getPayload());
if (msgCallBack != null) {
msgCallBack.setMessage(msg);
}
Log.i(TAG, "messageArrived:" + msg);
}
@Override
public void deliveryComplete(IMqttDeliveryToken arg0) {
Log.i(TAG, "deliveryComplete");
}
@Override
public void connectionLost(Throwable arg0) {
Log.i(TAG, "connectionLost"); // 失去连接,重连
}
};
4.
参考
- MQTT协议笔记之连接和心跳
- Mqtt精髓系列之心跳机制
- MQTT协议(二)连接和心跳
- MQTT协议之连接和心跳介绍
- MQTT协议及应用场景
- MQTT断线重连订阅无法接收
- MQTT断线重连
- MQTT协议3.1.1中文翻译版
文档均为mqtt协议的说明,没有具体如何使用的指导,深入研究协议的可以看
- MQTT Android
- 使用MqttAndroidClient完成IM