MQTT 的遺愿消息

作者:Joe手幢,原文鏈接哩掺,原文日期:2016-07-04
譯者:粉紅星云云芦;校對:shanks关炼;定稿:CMB

這里是在 Linux 上使用 Swift 來編寫MQTT客戶端系列的一篇文章程腹。

在這篇文章里,我們將著眼在 MQTT遺愿消息儒拂。一般是連接著代理程序的客戶端預(yù)定義好 LWT(Last Will and Testament)的寸潦。如果客戶端異常地斷開連接色鸳,代理程序(the broker)將會廣播 LWT 消息到所有訂閱者的客戶端中。

比如說见转,你正在搭建一個聊天應(yīng)用命雀,每個客戶端與代理程序連接著并且訂閱了/chat/hottub,被發(fā)布到/chat/hottub的消息被所有的訂閱者接收斩箫。加入一個“聊天室”是一簡單有效的方法(比如:MQTT 主題)吏砂。

在正常情況下,一個客戶端主動退出的時候乘客,我們一般會期待看見這樣的消息:“Joe 離開了/chat/hottub”狐血。這個實現(xiàn)起來很簡單,在用戶用戶離開的時候易核,發(fā)布一個/exit的消息然后關(guān)閉客戶端匈织。但如果一個客戶端非正常地中斷連接(如網(wǎng)絡(luò)異常、客戶端閃退等等)牡直,誰來給代理程序發(fā)遺愿消息呢缀匕。

下面展示如何給 MQTT 客戶端設(shè)置遺言:

class Client:MQTT, MQTTDelegate {
  init(clientId:String) {
    super.init(clientId:clientId)
    super.willMessage =  MQTTWill(topic:"/chat/hottub",
                                  message:"{\"client\":\"\(clientId)\",\"message\":\"Abnormal Disconnect\"}")
    super.delegate = self
  }
  ...
}

willMessageMQTT 的一個 MQTTWill 類型的成員屬性。 MQTTWill 由標(biāo)題和消息構(gòu)成碰逸。在我們這個例子中標(biāo)題可以是我們的聊天頻道/chat/hottub乡小,消息則是由我們客戶端 ID 和一個簡單的異常連接中斷的字符串組成的 JSON 字符串。

獲取代碼

我們搭建程序用的 Swift 3.0 是來自蘋果最新的代碼倉庫的花竞,并且有持續(xù)更新我們程序的代碼劲件。需要先按照我們的apt-get倉庫安裝 Swift 3.0

我們 MQTT 聊天室的例子在GitHub上约急。

# git clone https://github.com/iachievedit/MQTTHotTub
# cd MQTTHotTub
# swift build

出于測試的目的零远,需要運(yùn)行 MQTTHotTub 兩回,所以需要打開兩個終端厌蔽。

用這個命令運(yùn)行客戶端 .build/debug/MQTTHotTub牵辣。

Prisencolinensinainciusol

我們的客戶端 MQTTHotTub 模擬了一個語無倫次聊天對話。發(fā)布的每條消息都是以 JSON 格式的傳遞的奴饮。

{"client":"octxktfo", "message":"Gyxswhz nsoxfnj gz."}
{"client":"ajyhyjic", "message":"Cmr w bzwubzv mwfhtklz."}

當(dāng)一個客戶端接收到一條不是自己發(fā)布的消息纬向,會有過濾消息的過程:

if cid != clientId {
  SLogInfo("Received \"\(msg)\" from \(cid)")
}

如果我們監(jiān)聽發(fā)送給一個特定主題的消息,并且我們也向那個主題發(fā)送消息戴卜。就像回聲一樣逾条,客戶端將也會接受到自己發(fā)布的消息。這就是用 cid != clientId 來過濾的目的了投剥。

可以觀察到每個客戶端控制臺打印記錄师脂,看看他們從別的客戶端接收到的消息:

Received "Wlfu zrqyj tady obxnjl lupihobi nph oapplt nyidmja." from octxktfo
Received "Cmr w bzwubzv mwfhtklz." from ajyhyjic

現(xiàn)在, CTRL-C 其中一個客戶端,注意到剩下的其他客戶端接收到的消息:

Received "Abnormal Disconnect" from octxktfo
連接異常中斷

以上就是 MQTT 的遺愿消息的實操啦吃警。中斷連接的客戶端沒有機(jī)會去廣播自己要退出糕篇,所以代理程序代替它發(fā)布了客戶端的死前遺言到對話/聊天室:

{"client":"\(clientId)","message":"Abnormal Disconnect"}

必須要有死前遺言嗎

必須這個詞太嚴(yán)肅了,這個問題的答案是 “不”酌心,你的 MQTT 客戶端不需要提供一個遺愿消息拌消。如果你想要提供的話,這里有很多的其他案例可以指導(dǎo)你安券。

接下來的計劃

我們繼續(xù)地很努力地研究在 Linux 上使用 Swift 來實現(xiàn)MQTT墩崩。在這篇文章后,我們的將專注于實現(xiàn) MQTT 的安全連接(MQTT SSL)上完疫。

本文由 SwiftGG 翻譯組翻譯泰鸡,已經(jīng)獲得作者翻譯授權(quán),最新文章請訪問 http://swift.gg壳鹤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盛龄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子芳誓,更是在濱河造成了極大的恐慌余舶,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锹淌,死亡現(xiàn)場離奇詭異匿值,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赂摆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門挟憔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人烟号,你說我怎么就攤上這事绊谭。” “怎么了汪拥?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵达传,是天一觀的道長。 經(jīng)常有香客問我迫筑,道長宪赶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任脯燃,我火速辦了婚禮搂妻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辕棚。我一直安慰自己欲主,他們只是感情好追他,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岛蚤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪懈糯。 梳的紋絲不亂的頭發(fā)上涤妒,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音赚哗,去河邊找鬼她紫。 笑死,一個胖子當(dāng)著我的面吹牛屿储,可吹牛的內(nèi)容都是我干的贿讹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼够掠,長吁一口氣:“原來是場噩夢啊……” “哼民褂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疯潭,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤赊堪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后竖哩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哭廉,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年相叁,在試婚紗的時候發(fā)現(xiàn)自己被綠了遵绰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡增淹,死狀恐怖椿访,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情埠通,我是刑警寧澤赎离,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站端辱,受9級特大地震影響梁剔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舞蔽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一荣病、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渗柿,春花似錦个盆、人聲如沸脖岛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柴梆。三九已至,卻和暖如春终惑,著一層夾襖步出監(jiān)牢的瞬間绍在,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工雹有, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留偿渡,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓霸奕,卻偏偏與公主長得像溜宽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子质帅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理适揉,服務(wù)發(fā)現(xiàn),斷路器煤惩,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 生于憂患涡扼,死于安樂。說的一點(diǎn)也沒有錯盟庞,人就是這樣吃沪,在安逸的環(huán)境中死去,在逆境中才能成長
    LuckyPi閱讀 188評論 0 0
  • 他是愛著她的什猖,從一開始票彪,他就是一直愛著她的。只是這份愛不狮,卻最終葬于人心降铸,相守未相厭,只因未相知摇零。 他是普通的如同大...
    砂蔚閱讀 218評論 3 7
  • 前情回顧 第五章:短暫的離別 實習(xí)就這樣分了下來驻仅,縱有不甘心谅畅,也有不開心,但每個人都踏上了新的征程噪服。 倩雪拿著兩大...
    遇琳閱讀 351評論 4 8