即时通讯 MQTT

1. 什么叫MQTT?

1.0 全称:Message Queuing Telemetry Transport((消息队列遥测传输)。是IBM开发的一个即时通讯协议

1.1 其具有协议简洁小巧可扩展性强省流量省电等优点,而且已经有PHPJAVAPythonCC#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. 错误汇总

  1. MQTT连接断开,(32109) - java.io.EOFException错误
    原因:客户端唯一标识重复导致的
    具体可参考:Connection lost (32109) - java.io.EOFException

  2. MQTT断线重连订阅无法接收

 // 配置里将cleanSession设为true,当客户端掉线时,服务器端会清除客户端 session
 // 重连后 客户端会有一个新的session
  	connOpts.setCleanSession(true);

解决: cleanSession设为false,客户端掉线后,服务器端不会清除session,当重连后可以接收之前订阅主题的消息。当客户端上线后会接受到它离线的这段时间的消息

  1. 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. 参考

  1. MQTT协议笔记之连接和心跳
  2. Mqtt精髓系列之心跳机制
  3. MQTT协议(二)连接和心跳
  4. MQTT协议之连接和心跳介绍
  5. MQTT协议及应用场景
  6. MQTT断线重连订阅无法接收
  7. MQTT断线重连
  8. MQTT协议3.1.1中文翻译版 文档均为mqtt协议的说明,没有具体如何使用的指导,深入研究协议的可以看
  9. MQTT Android
  10. 使用MqttAndroidClient完成IM
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章