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

MQTT介紹

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

Transport荡碾,消息隊(duì)列遙測傳輸)是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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市颊乘,隨后出現(xiàn)的幾起案子参淹,更是在濱河造成了極大的恐慌,老刑警劉巖乏悄,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浙值,死亡現(xiàn)場離奇詭異,居然都是意外死亡檩小,警方通過查閱死者的電腦和手機(jī)开呐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來识啦,“玉大人负蚊,你說我怎么就攤上這事⊥窍” “怎么了家妆?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冕茅。 經(jīng)常有香客問我伤极,道長蛹找,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任哨坪,我火速辦了婚禮庸疾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘当编。我一直安慰自己届慈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布忿偷。 她就那樣靜靜地躺著金顿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲤桥。 梳的紋絲不亂的頭發(fā)上揍拆,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音茶凳,去河邊找鬼嫂拴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贮喧,可吹牛的內(nèi)容都是我干的腾啥。 我是一名探鬼主播名扛,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼唉窃,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼栖茉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饱普,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤运挫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后套耕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谁帕,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年冯袍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匈挖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡康愤,死狀恐怖儡循,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情征冷,我是刑警寧澤择膝,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站检激,受9級(jí)特大地震影響肴捉,放射性物質(zhì)發(fā)生泄漏腹侣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一齿穗、第九天 我趴在偏房一處隱蔽的房頂上張望傲隶。 院中可真熱鬧,春花似錦窃页、人聲如沸跺株。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帖鸦。三九已至,卻和暖如春胚嘲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洛二。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國打工馋劈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晾嘶。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓妓雾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親垒迂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子械姻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

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