MQTT總結(jié)

MQTT總結(jié)

使用MQTT以訂閱消息的方式保持客戶端和服務(wù)端的通訊MQTT 是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é)議

參考文檔:

iOS MQTT----MQTTClient實(shí)戰(zhàn)-看這篇的就夠了 http://www.reibang.com/p/80ea4507ca74

百度云MQTT服務(wù):https://cloud.baidu.com/doc/IOT/Mqttclient.html#.E5.8F.91.E5.B8.83.E6.B6.88.E6.81.AF

MQTT機(jī)制

MQTT的機(jī)制是:客戶端A琉朽、MQTT服務(wù)器毒租、客戶端B ,之間的通訊箱叁。初始化時(shí)墅垮,首先客戶端A和客戶端B同時(shí)向MQTT服務(wù)器訂閱了主題,然后客戶端B向MQTT服務(wù)器發(fā)布消息耕漱,MQTT檢查到客戶端A訂閱了該主題算色,于是實(shí)現(xiàn)了A和B客戶端之間的通訊。

通訊機(jī)制:

pver

應(yīng)用場景

MQTT是一個(gè)設(shè)計(jì)得非常出色的傳輸層協(xié)議螟够,在移動(dòng)消息灾梦、物聯(lián)網(wǎng)、車聯(lián)網(wǎng)妓笙、智能硬件甚至能源勘探等領(lǐng)域有著廣泛的應(yīng)用若河。1個(gè)字節(jié)報(bào)頭、2個(gè)字節(jié)心跳寞宫、消息QoS支持等設(shè)計(jì)萧福,非常適合在低帶寬、不可靠網(wǎng)絡(luò)辈赋、嵌入式設(shè)備上應(yīng)用鲫忍。

iOS MQTT實(shí)戰(zhàn)
  1. 導(dǎo)入MQTTClient框架

  2. 代碼

    MQTTCFSocket transport = [[MQTTCFSocketTransport alloc] init];
    transport.host = MQTTHost;
    transport.port = MQTTPort;
    
    self.session = [[MQTTSession alloc] init];
    self.session.tranport = transport;
    [self.session setPassword:MQTTPassWord];
    [self.session setUserName:MQTTUserName];
    [self.session connectAndWaitTimeout:1];
    
    //訂閱主題
    + (void)subscribeTopic:(MQTTSession *)session ToTopic:(NSString *)topicUrl {
      [session subscribeToTopic:topicUrl atLevel:MQTTQosLevelAtMostOnce subscribeHandler:^(NSError *error, NSArray *gQoss) {
        if (error) {
          
        } else {
          
        }
      }];
    }
    
    //實(shí)現(xiàn)session代理
    - (void)newMessage:(MQTTSession *)session data:(NSData *)data onTopic:(NSString *)topic qos:(MQTTQosLevel *)qos retained:(BOOL)retained mid:(usigned int)mid {
      //這個(gè)是代理回調(diào)方法,接收的數(shù)據(jù)可以在這里進(jìn)行處理钥屈。
    }
    
  3. over

常見問題

1.先說常用的屬性悟民,如果你一直把mqtt開著,你不處理焕蹄,那么mqtt一直會(huì)有數(shù)據(jù)返回,我這邊就是1秒一次阀溶,然后一堆數(shù)據(jù)....

在剛開始的時(shí)候腻脏,初始化了 MQTTSession 的對象鸦泳,看截圖

[self.mySession disconnect] 斷開連接 對應(yīng)的就是 [self.mySession connect] 重新連接

如果不需要mqtt了,記得close永品,不然mqtt還會(huì)返回?cái)?shù)據(jù).

[self.session unsubscribeTopic:topic]; //取消訂閱主題
[self.session disconnect];//斷開連接
[self.session close]; // mqtt 關(guān)閉

2做鹰、在正常情況下,你的mqtt成功訂閱了主題鼎姐,那么它會(huì)一直在監(jiān)聽服務(wù)器是否有數(shù)據(jù)返回,但是有的時(shí)候嘛钾麸,你會(huì)遇到下面這中情況,mqtt停止了,當(dāng)然排除你自己 close的情況外.

這種情況就很坑爹啦炕桨,你用mqtt的目的是啥饭尝,就是要實(shí)時(shí)監(jiān)控嘛。献宫。钥平。。

在我查詢的資料中有幾種解釋:

前提是你家的服務(wù)器一直在發(fā)送數(shù)據(jù)姊途,而不是停掉了

2.1 你的clientID涉瘾,沒有設(shè)置,簡單說明,你有一個(gè)賬號(hào)是老王捷兰,那么你登錄了立叛,你的同事也登錄了,這個(gè)時(shí)候,mqtt會(huì)自動(dòng)掉線贡茅。

self.mySession.clientId 有這個(gè)屬性,我咨詢過后臺(tái)秘蛇,說移動(dòng)端要設(shè)置,設(shè)置成功就可以避免友扰,但是如果你用的是彤叉,MQTTClient 這個(gè),完全不用村怪,因?yàn)閯e人已經(jīng)處理好了秽浇,可以自己點(diǎn)擊進(jìn)去看看,那么如果你用的是其他的第三方,clientId需要取隨機(jī)數(shù)甚负,不能相同.

2.2 碰到上面這個(gè)問題咋辦呢柬焕,MQTTClient 沒有斷線重連的機(jī)制,也可能是我沒找到梭域,哪位小伙伴看到了也麻煩告訴我一聲.

這個(gè)時(shí)候斑举,你需要監(jiān)聽消息的狀態(tài),就可以處理了病涨,來看看富玷,self.mySession.status的值

2.3 介紹兩種監(jiān)聽方法:

KVO和定時(shí)器

over

MQTT.fx使用

MQTT.fx客戶端可以用來作為 MQTT客戶端使用,向MQTT代理服務(wù)器訂閱主題和發(fā)布主題。

具體的配置如下:

MQTT服務(wù)器地址 1赎懦、Broker Address : testv2.wulian.cc 
MQTT服務(wù)器端口 2雀鹃、Broker Port
客戶端唯一id,iOS通過UDID獲取励两,在訂閱消息時(shí)需要用到 3黎茎、Client ID:
General :
User Credentials: 必須設(shè)置用戶名和密碼

over

搭建MQTT服務(wù)器 mosquito

官網(wǎng):http://mosquitto.org/download/

$ brew install mosquittto 
$ vi /usr/local/Cellar/mosquitto/版本/etc/mosquitto/mosquitto.conf #配置文件
# =================================================================    
# General configuration    
# =================================================================    
    
# 客戶端心跳的間隔時(shí)間    
#retry_interval 20    
    
# 系統(tǒng)狀態(tài)的刷新時(shí)間    
#sys_interval 10    
    
# 系統(tǒng)資源的回收時(shí)間,0表示盡快處理    
#store_clean_interval 10    
    
# 服務(wù)進(jìn)程的PID    
#pid_file /var/run/mosquitto.pid    
    
# 服務(wù)進(jìn)程的系統(tǒng)用戶    
#user mosquitto    
    
# 客戶端心跳消息的最大并發(fā)數(shù)    
#max_inflight_messages 10    
    
# 客戶端心跳消息緩存隊(duì)列    
#max_queued_messages 100    
    
# 用于設(shè)置客戶端長連接的過期時(shí)間当悔,默認(rèn)永不過期    
#persistent_client_expiration    
    
# =================================================================    
# Default listener    
# =================================================================    
    
# 服務(wù)綁定的IP地址    
#bind_address    
    
# 服務(wù)綁定的端口號(hào)    
#port 1883    
    
# 允許的最大連接數(shù)傅瞻,-1表示沒有限制    
#max_connections -1    
    
# cafile:CA證書文件    
# capath:CA證書目錄    
# certfile:PEM證書文件    
# keyfile:PEM密鑰文件    
#cafile    
#capath    
#certfile    
#keyfile    
    
# 必須提供證書以保證數(shù)據(jù)安全性    
#require_certificate false    
    
# 若require_certificate值為true,use_identity_as_username也必須為true    
#use_identity_as_username false    
    
# 啟用PSK(Pre-shared-key)支持    
#psk_hint    
    
# SSL/TSL加密算法盲憎,可以使用“openssl ciphers”命令獲取    
# as the output of that command.    
#ciphers    
    
# =================================================================    
# Persistence    
# =================================================================    
    
# 消息自動(dòng)保存的間隔時(shí)間    
#autosave_interval 1800    
    
# 消息自動(dòng)保存功能的開關(guān)    
#autosave_on_changes false    
    
# 持久化功能的開關(guān)    
persistence true    
    
# 持久化DB文件    
#persistence_file mosquitto.db    
    
# 持久化DB文件目錄    
#persistence_location /var/lib/mosquitto/    
    
# =================================================================    
# Logging    
# =================================================================    
    
# 4種日志模式:stdout嗅骄、stderr、syslog焙畔、topic    
# none 則表示不記日志掸读,此配置可以提升些許性能    
log_dest none    
    
# 選擇日志的級(jí)別(可設(shè)置多項(xiàng))    
#log_type error    
#log_type warning    
#log_type notice    
#log_type information    
    
# 是否記錄客戶端連接信息    
#connection_messages true    
    
# 是否記錄日志時(shí)間    
#log_timestamp true    
    
# =================================================================    
# Security    
# =================================================================    
    
# 客戶端ID的前綴限制,可用于保證安全性    
#clientid_prefixes    
    
# 允許匿名用戶    
#allow_anonymous true    
    
# 用戶/密碼文件宏多,默認(rèn)格式:username:password    
#password_file    
    
# PSK格式密碼文件儿惫,默認(rèn)格式:identity:key    
#psk_file    
    
# pattern write sensor/%u/data    
# ACL權(quán)限配置,常用語法如下:    
# 用戶限制:user <username>    
# 話題限制:topic [read|write] <topic>    
# 正則限制:pattern write sensor/%u/data    
#acl_file    
    
# =================================================================    
# Bridges    
# =================================================================    
    
# 允許服務(wù)之間使用“橋接”模式(可用于分布式部署)    
#connection <name>    
#address <host>[:<port>]    
#topic <topic> [[[out | in | both] qos-level] local-prefix remote-prefix]    
    
# 設(shè)置橋接的客戶端ID    
#clientid    
    
# 橋接斷開時(shí)伸但,是否清除遠(yuǎn)程服務(wù)器中的消息    
#cleansession false    
    
# 是否發(fā)布橋接的狀態(tài)信息    
#notifications true    
    
# 設(shè)置橋接模式下肾请,消息將會(huì)發(fā)布到的話題地址    
# $SYS/broker/connection/<clientid>/state    
#notification_topic    
    
# 設(shè)置橋接的keepalive數(shù)值    
#keepalive_interval 60    
    
# 橋接模式,目前有三種:automatic更胖、lazy铛铁、once    
#start_type automatic    
    
# 橋接模式automatic的超時(shí)時(shí)間    
#restart_timeout 30    
    
# 橋接模式lazy的超時(shí)時(shí)間    
#idle_timeout 60    
    
# 橋接客戶端的用戶名    
#username    
    
# 橋接客戶端的密碼    
#password    
    
# bridge_cafile:橋接客戶端的CA證書文件    
# bridge_capath:橋接客戶端的CA證書目錄    
# bridge_certfile:橋接客戶端的PEM證書文件    
# bridge_keyfile:橋接客戶端的PEM密鑰文件    
#bridge_cafile    
#bridge_capath    
#bridge_certfile    
#bridge_keyfile    

啟動(dòng)mqtt服務(wù)器
  1. 直接運(yùn)行命令行“mosquitto -c /usr/local/Cellar/mosquitto/1.3.5/etc/mosquitto/mosquitto.conf -d”即可開啟服務(wù)

  2. 如果沒有將命令添加到環(huán)境變量,需要到sbin目錄下執(zhí)行以上命令却妨《穑或者在終端執(zhí)行sbin:

    $ /usr/local/Cellar/mosquitto/1.4.11_2/sbin/mosquitto
    
  3. 如果不想用命令啟動(dòng)的話。也可以直接進(jìn)入/usr/local/Cellar/mosquitto/1.4.11_2/sbin目錄下彪标,點(diǎn)擊相應(yīng)的腳本執(zhí)行文件倍权,就會(huì)自動(dòng)啟動(dòng)。

  4. 配置MQTT.fx客戶端:

    1捞烟、Host薄声; 127.0.0.1
    2、port: 1883
    3题画、username 默辨、password 可以不設(shè)置(mqtt服務(wù)器默認(rèn)沒有設(shè)置)
    
  5. MQTT服務(wù)器端口被占用

    $ lsof -i:1883
    $ 1883端口被占用
    $ sudo kill -9 PID #刪除占用該端口的進(jìn)程
    
  6. over

常見問題
  1. MQTT.fix軟件的使用。設(shè)置host苍息、端口等參數(shù)缩幸、設(shè)置用戶名密碼等參數(shù)壹置、連接、查看日志表谊。
  2. MQTT服務(wù)器端口被占用蒸绩。
  3. 客戶端A、MQTT服務(wù)器铃肯、客戶端B。三端通訊機(jī)制传蹈。
  4. MQTT.fix 其實(shí)是當(dāng)做客戶端用押逼。物聯(lián)app作為另一個(gè)客戶端,必須刪除transport和tls加密等信息惦界。才能聯(lián)通mqtt服務(wù)器挑格。
MQTT客戶端安裝

Looks kinda ugly though.

Block quotes can be nested.

Multiple Levels

Markdown preferences pane
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漂彤,一起剝皮案震驚了整個(gè)濱河市冠场,隨后出現(xiàn)的幾起案子洞渔,更是在濱河造成了極大的恐慌,老刑警劉巖匿级,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狂窑,死亡現(xiàn)場離奇詭異媳板,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)泉哈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蛉幸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丛晦,你說我怎么就攤上這事奕纫。” “怎么了烫沙?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵匹层,是天一觀的道長。 經(jīng)常有香客問我斧吐,道長又固,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任煤率,我火速辦了婚禮仰冠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蝶糯。我一直安慰自己洋只,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著识虚,像睡著了一般肢扯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上担锤,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天蔚晨,我揣著相機(jī)與錄音,去河邊找鬼肛循。 笑死铭腕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的多糠。 我是一名探鬼主播累舷,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼夹孔!你這毒婦竟也來了被盈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤搭伤,失蹤者是張志新(化名)和其女友劉穎只怎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怜俐,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尝盼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佑菩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盾沫。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖殿漠,靈堂內(nèi)的尸體忽然破棺而出赴精,到底是詐尸還是另有隱情,我是刑警寧澤绞幌,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布蕾哟,位于F島的核電站,受9級(jí)特大地震影響莲蜘,放射性物質(zhì)發(fā)生泄漏谭确。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一票渠、第九天 我趴在偏房一處隱蔽的房頂上張望逐哈。 院中可真熱鬧,春花似錦问顷、人聲如沸昂秃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肠骆。三九已至算途,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚀腿,已是汗流浹背嘴瓤。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莉钙,地道東北人纱注。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像胆胰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子刻获,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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