即時通訊-Android推送方案(MQTT)
這篇文章是居於前面的幾篇部落格,如果還不知道ActiveMQ伺服器的請看:即時通訊-ActiveMQ環境搭建
1.什麼是MQTT協議
MQTT(Message Queuing Telemetry Transport,訊息佇列遙測傳輸)是IBM開發的一個即時通訊協議。
有可能成為物聯網的重要組成部分。該協議支援所有平臺,幾乎可以把所有聯網物品和外部連線起來,被用來當做感測器和致動器(比如通過Twitter讓房屋聯網)的通訊協議
2.MQTT協議的特點
MQTT協議是為大量計算能力有限,且工作在低頻寬、不可靠的網路的遠端感測器和控制裝置通訊而設計的協議,它具有以下主要的幾項特性:
1、使用釋出/訂閱訊息模式,提供一對多的訊息釋出,解除應用程式耦合;
2、對負載內容遮蔽的訊息傳輸;
3、使用 TCP/IP 提供網路連線;
4、有三種訊息釋出服務質量:
? “至多一次”,訊息釋出完全依賴底層 TCP/IP 網路。會發生訊息丟失或重複。這一級別可用於如下情 況,環境感測器資料,丟失一次讀記錄無所謂,因為不久後還會有第二次傳送。
? “至少一次”,確保訊息到達,但訊息重複可能會發生。
? “只有一次”,確保訊息到達一次。這一級別可用於如下情況,在計費系統中,訊息重複或丟失會導致不正確的結果。
5、小型傳輸,開銷很小(固定長度的頭部是 2 位元組),協議交換最小化,以降低網路流量;
6、使用 Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制;
3.Android開啟MQTT連線
在開發前:
第一:Android專案要先引入下面jar:
org.eclipse.paho.client.mqttv3-1.0.2.jar
第二:要啟動AcitveMQ伺服器
Android端使用MQTT協議連線ActiveMQ伺服器
1.定義url
2.建立MqttClient物件
3.呼叫MqttClient物件中connect方法,並通過IMqttActionListener監聽連線的結果
4.Android關閉MQTT連線
Android端使用MQTT協議取消連線ActiveMQ伺服器
1.建立MqttClient物件
2.呼叫MqttClient物件中disconnect方法
5.自定義MQTT心跳(保持長連線)
Android端使用MQTT協議與ActiveMQ伺服器端保持長連線
1.定義一個定時器:
2.保持長連線
3.傳送心跳包
4.啟動訂閱,並開始定時器
7.測試
執行該Android專案檢視日誌輸出
點選連線:
保持心跳:
點選斷開連線:
6.Android開啟MQTT訂閱
使用第三方的心跳服務實現MQTT的訂閱:
1.引入第三方的jar:
org.eclipse.paho.android.service-1.0.2.jar
org.eclipse.paho.client.mqttv3-1.0.2.jar
2.建立MqttAndroidClient ,並設計一個訂閱的回撥
client = new MqttAndroidClient(this,uri, clientID);
//MqttCallbackHandler實現了MqttCallback介面,負責接收訂閱的訊息
client.setCallback(new MqttCallbackHandler(this, clientID));
3.連結伺服器(要啟動AcitveMQ伺服器)
client.connect(conOpt, null, new ConnectCallBackHandler(this));
4.開始訂閱
client.subscribe(topic,0,null,new SubcribeCallBackHandler(SubscriberActivity.this));
5.接收訂閱的訊息
//該方法是在MqttCallbackHandler中實現
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
Log.d("MqttCallbackHandler","MqttCallbackHandler/messageArrived="+s);
Log.d("MqttCallbackHandler","message="+new String(mqttMessage.getPayload()));
EventBus.getDefault().post(new MessageEvent(s,mqttMessage));
}
6.測試訂閱是否成功:
開啟ActiveMQ伺服器,釋出一個與訂閱的主題一樣的訊息,看看Android手機的客戶端是否可以接收到訊息
連線伺服器:
訂閱一個主題:
檢視ActiveMQ伺服器:
釋出一個主題:
檢視是否訂閱成功:
MQTT服務質量
在訂閱的時候可以修改訂閱的服務質量qos:
QoS 0:最多分發一次
QoS 1: 至少分發一次
QoS 2: 僅分發一次
/**訂閱一個主題,服務的質量qos預設為0,我們可以通過修改下面的第二個引數修改訂閱的服務質量*/
client.subscribe(topic,qos,null,new SubcribeCallBackHandler(SubscriberActivity.this));
MQTT過濾器
7.Android進行MQTT釋出
1-3.前三步與訂閱的一樣
4.開始釋出:
/**釋出一個主題:如果主題名一樣不會新建一個主題,會複用*/
client.publish(pubTopic,message,qos,retain,null,new PublishCallBackHandler(PublishActivity.this));
5.測試釋出
在Android手機的釋出介面,釋出一個主題,然後開啟ActiveMQ伺服器檢視是否釋出成功
釋出一個主題:
檢視主題釋出是否成功:
MQTT訊息保留
在釋出的時候可以修改訊息是否保留:
/**第四個引數retain是設計釋出的訊息是否保留,如果retain=true訊息會保留*/
client.publish(pubTopic,message,qos,retain,null,new PublishCallBackHandler(PublishActivity.this));
8.Android使用MQTT實現群聊
群聊實現的原理是:大家訂閱同一個主題,釋出同一個主題
1.訂閱同一個主題:(實現接收訊息)
2.釋出同一個主題:(實現釋出訊息)
開始兩個模擬器,連線伺服器:
開啟群聊介面:
兩個模擬器同事訂閱android06主題:
開始釋出訊息聊天: