[followme][開源]Android基于MQTT協(xié)議實(shí)現(xiàn)的免費(fèi)消息推送服務(wù)

MQTT介紹

首先,我們簡單的提一下mqtt是什么;MQTT(Message Queuing Telemetry

Transport,消息隊(duì)列遙測(cè)傳輸)是IBM開發(fā)的一個(gè)即時(shí)通訊協(xié)議,有可能成為物聯(lián)網(wǎng)的重要組成部分。該協(xié)議支持所有平臺(tái),幾乎可以把所有聯(lián)網(wǎng)物品和外部連接起來,被用來當(dāng)做傳感器和致動(dòng)器(比如通過Twitter讓房屋聯(lián)網(wǎng))的通信協(xié)議。

上面的這些語言都太官方了,我覺得總結(jié)一句話就是:連上mqtt之后,服務(wù)器那邊就可以在你不斷的情況下給你推送數(shù)據(jù),并且實(shí)時(shí)性比較好;

工作原理

現(xiàn)在就讓我們來總結(jié)一下我們所使用的mqtt到底是怎么工作的,方便以后查閱的時(shí)候少走彎路。

流程圖:

一、既然要使用官方提供的mqtt協(xié)議,那么就必須導(dǎo)入官方給出的jar包我們使用的是IBM公司提供的wmqtt.jar包。

二、既然要讓它一直在后臺(tái)運(yùn)行,則必須通過服務(wù)來運(yùn)行,后臺(tái)常駐才符合我們的要求。

既然是鏈接前后臺(tái)的服務(wù)器,那么鏈接的狀態(tài)可能要分很多種,例如:

就會(huì)有以上的六種狀態(tài)信息;鏈接的狀態(tài)是通過發(fā)送廣播的形式發(fā)送的:

(1)、斷開鏈接的廣播:

(2)、嘗試鏈接,但未鏈接上:

(3)、鏈接斷開,重新鏈接:

(4)、由于其他的原因?qū)е聼o法鏈接:

(5)、鏈接成功:

(6)、未能鏈接上:

每一種鏈接的狀態(tài)都會(huì)發(fā)送相應(yīng)的狀態(tài)信息,在log中打印出來,讓我們很直觀的看到此時(shí)的mqtt處于哪一種狀態(tài)。

三、我們?cè)阪溄觤qtt的時(shí)候需要先定義一個(gè)鏈接的接口:

mqttClient = MqttClient.createMqttClient(mqttConnSpec,usePersistence);

String mqttConnSpec = "tcp://" + brokerHostName + "@"+ brokerPortNumber;

詳細(xì)信息是:“tcp://ip@1883”;

private boolean connectToBroker()這個(gè)方法是判斷當(dāng)前的鏈接是否存在,存在返回true,不存在返回false,然后在執(zhí)行后面的操作;

// try to connect

mqttClient.connect(generateClientId(), cleanStart, keepAliveSeconds);

此時(shí)才是mqtt建立鏈接的操作,第一個(gè)參數(shù)generateClientID()是建立鏈接的一個(gè)關(guān)鍵字,是為了區(qū)分不同的主機(jī)鏈接到mqtt,方便服務(wù)器那邊進(jìn)行區(qū)分。(“fiber1/Android手機(jī)自帶的序列號(hào),這個(gè)碼是唯一的,每一部手機(jī)都是不一樣的,這樣才能更好的區(qū)分)。第二個(gè)參數(shù)是false。第三個(gè)參數(shù)是保持心跳,五秒一次。

上面就已經(jīng)說過了,當(dāng)它返回的是true的時(shí)候,就說明這個(gè)鏈接已經(jīng)建立成功了,后續(xù)的操作就是訂閱我們的主題了;

mqttClient.subscribe(topics, parms);

既然有訂閱,那么就必須有取消訂閱,因?yàn)槿∠嗛喪菫榱俗屛覀兊脑O(shè)備在注銷之后,不想再收到任何的消息,或者是刪除設(shè)備之后不想再收到任何的消息是一樣的道理。所以這個(gè)操作是必不可少的。

mqttClient.unsubscribe(topics);

取消訂閱和訂閱的區(qū)別就在于訂閱的時(shí)候需要發(fā)送QoS,而取消訂閱的時(shí)候是不需要發(fā)送QoS的;

四、下面的就是接受廣播:

1、private class BackgroundDataChangeIntentReceiver extends BroadcastReceiver// 接收廣播

我們?cè)谧鲞@件事的時(shí)候,通過請(qǐng)求一個(gè)喚醒鎖,我們要求盡可能的喚醒鎖-只是足夠維持處理器的運(yùn)行,直到我們完成

2、private class NetworkConnectionIntentReceiver extends BroadcastReceiver

所謂的響應(yīng)于網(wǎng)絡(luò)連接的變化-在連接到服務(wù)器之后,這讓我們等待,直到我們有一個(gè)可用的數(shù)據(jù)連接

3、public class PingSender extends BroadcastReceiver

這個(gè)廣播用于喚醒手機(jī),使手機(jī)可以時(shí)刻接收mqtt的推送消息;

4、public class StatusUpdateReceiver extends BroadcastReceiver

當(dāng)mqtt的客戶端連接的狀態(tài)發(fā)生改變的時(shí)候,通過StatusUpdateReceiver接收廣播;

5、public class MQTTMessageReceiver extends BroadcastReceiver

當(dāng)收到mqtt的推送的消息時(shí),通過MQTTMessageReceiver接收廣播;

五、最后就是,當(dāng)我們收到推送的消息,怎么處理?比如下面的處理上報(bào)的告警消息

通過異步任務(wù),將獲取的json數(shù)據(jù)進(jìn)行解析,

public static class AlarmTask extends AsyncTask// 收到告警消息,插入數(shù)據(jù)庫,并且彈出提示界面.

alarmData = jsonobj.geMYSYString("alarm");

......告警處理代碼

注意:在網(wǎng)絡(luò)斷開之后,我們沒有重連的機(jī)制,只有在網(wǎng)絡(luò)重新鏈接上之后,我們才會(huì)去再鏈接mqtt(重連的機(jī)制還是和第一次鏈接的機(jī)制一致),斷網(wǎng)時(shí),我們也沒有必要去鏈接,因?yàn)檫@本身就是不通的,一直鏈接,反而會(huì)造成阻塞;

代碼開源

MQTTService.java

wmqtt.jar

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,923評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,284評(píng)論 25 708
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 11,145評(píng)論 6 13
  • 第一章:相識(shí) 喜歡一個(gè)人是什么感覺,會(huì)很激動(dòng)嗎,還是會(huì)故作淡定。 平常的一個(gè)人應(yīng)該是會(huì)很激動(dòng)吧,有的人會(huì)語無倫次,...
    s時(shí)過境遷s閱讀 189評(píng)論 0 1
  • 一 莊重的教堂里,威爾頓的象征 ——諾倫,正在宣讀上帝的啟示: “醫(yī)生,律師,教師,工程師,科學(xué)家…… 將來的精英...
    蓬年閱讀 663評(píng)論 0 3