MQTT總結

MQTT總結

使用MQTT以訂閱消息的方式保持客戶端和服務端的通訊。MQTT 是IBM開發(fā)的一個即時通訊協(xié)議,有可能成為物聯(lián)網(wǎng)的重要組成部分。該協(xié)議支持所有平臺,幾乎可以把所有聯(lián)網(wǎng)物品和外部連接起來,被用來當做傳感器和致動器(比如通過Twitter讓房屋聯(lián)網(wǎng))的通信協(xié)議

參考文檔:

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

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

MQTT機制

MQTT的機制是:客戶端A、MQTT服務器、客戶端B ,之間的通訊。初始化時,首先客戶端A和客戶端B同時向MQTT服務器訂閱了主題,然后客戶端B向MQTT服務器發(fā)布消息,MQTT檢查到客戶端A訂閱了該主題,于是實現(xiàn)了A和B客戶端之間的通訊。

通訊機制:

pver

應用場景

MQTT是一個設計得非常出色的傳輸層協(xié)議,在移動消息、物聯(lián)網(wǎng)、車聯(lián)網(wǎng)、智能硬件甚至能源勘探等領域有著廣泛的應用。1個字節(jié)報頭、2個字節(jié)心跳、消息QoS支持等設計,非常適合在低帶寬、不可靠網(wǎng)絡、嵌入式設備上應用。

iOS MQTT實戰(zhàn)
  1. 導入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 {
          
        }
      }];
    }
    
    //實現(xiàn)session代理
    - (void)newMessage:(MQTTSession *)session data:(NSData *)data onTopic:(NSString *)topic qos:(MQTTQosLevel *)qos retained:(BOOL)retained mid:(usigned int)mid {
      //這個是代理回調方法,接收的數(shù)據(jù)可以在這里進行處理。
    }
    
  3. over

常見問題

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

在剛開始的時候,初始化了 MQTTSession 的對象,看截圖

[self.mySession disconnect] 斷開連接 對應的就是 [self.mySession connect] 重新連接

如果不需要mqtt了,記得close,不然mqtt還會返回數(shù)據(jù).

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

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

這種情況就很坑爹啦,你用mqtt的目的是啥,就是要實時監(jiān)控嘛。。。。

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

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

2.1 你的clientID,沒有設置,簡單說明,你有一個賬號是老王,那么你登錄了,你的同事也登錄了,這個時候,mqtt會自動掉線。

self.mySession.clientId 有這個屬性,我咨詢過后臺,說移動端要設置,設置成功就可以避免,但是如果你用的是,MQTTClient 這個,完全不用,因為別人已經處理好了,可以自己點擊進去看看,那么如果你用的是其他的第三方,clientId需要取隨機數(shù),不能相同.

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

這個時候,你需要監(jiān)聽消息的狀態(tài),就可以處理了,來看看,self.mySession.status的值

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

KVO和定時器

over

MQTT.fx使用

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

具體的配置如下:

MQTT服務器地址 1、Broker Address : testv2.wulian.cc 
MQTT服務器端口 2、Broker Port
客戶端唯一id,iOS通過UDID獲取,在訂閱消息時需要用到 3、Client ID:
General :
User Credentials: 必須設置用戶名和密碼

over

搭建MQTT服務器 mosquito

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

$ brew install mosquittto 
$ vi /usr/local/Cellar/mosquitto/版本/etc/mosquitto/mosquitto.conf #配置文件
# =================================================================    
# General configuration    
# =================================================================    
    
# 客戶端心跳的間隔時間    
#retry_interval 20    
    
# 系統(tǒng)狀態(tài)的刷新時間    
#sys_interval 10    
    
# 系統(tǒng)資源的回收時間,0表示盡快處理    
#store_clean_interval 10    
    
# 服務進程的PID    
#pid_file /var/run/mosquitto.pid    
    
# 服務進程的系統(tǒng)用戶    
#user mosquitto    
    
# 客戶端心跳消息的最大并發(fā)數(shù)    
#max_inflight_messages 10    
    
# 客戶端心跳消息緩存隊列    
#max_queued_messages 100    
    
# 用于設置客戶端長連接的過期時間,默認永不過期    
#persistent_client_expiration    
    
# =================================================================    
# Default listener    
# =================================================================    
    
# 服務綁定的IP地址    
#bind_address    
    
# 服務綁定的端口號    
#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    
# =================================================================    
    
# 消息自動保存的間隔時間    
#autosave_interval 1800    
    
# 消息自動保存功能的開關    
#autosave_on_changes false    
    
# 持久化功能的開關    
persistence true    
    
# 持久化DB文件    
#persistence_file mosquitto.db    
    
# 持久化DB文件目錄    
#persistence_location /var/lib/mosquitto/    
    
# =================================================================    
# Logging    
# =================================================================    
    
# 4種日志模式:stdout、stderr、syslog、topic    
# none 則表示不記日志,此配置可以提升些許性能    
log_dest none    
    
# 選擇日志的級別(可設置多項)    
#log_type error    
#log_type warning    
#log_type notice    
#log_type information    
    
# 是否記錄客戶端連接信息    
#connection_messages true    
    
# 是否記錄日志時間    
#log_timestamp true    
    
# =================================================================    
# Security    
# =================================================================    
    
# 客戶端ID的前綴限制,可用于保證安全性    
#clientid_prefixes    
    
# 允許匿名用戶    
#allow_anonymous true    
    
# 用戶/密碼文件,默認格式:username:password    
#password_file    
    
# PSK格式密碼文件,默認格式:identity:key    
#psk_file    
    
# pattern write sensor/%u/data    
# ACL權限配置,常用語法如下:    
# 用戶限制:user <username>    
# 話題限制:topic [read|write] <topic>    
# 正則限制:pattern write sensor/%u/data    
#acl_file    
    
# =================================================================    
# Bridges    
# =================================================================    
    
# 允許服務之間使用“橋接”模式(可用于分布式部署)    
#connection <name>    
#address <host>[:<port>]    
#topic <topic> [[[out | in | both] qos-level] local-prefix remote-prefix]    
    
# 設置橋接的客戶端ID    
#clientid    
    
# 橋接斷開時,是否清除遠程服務器中的消息    
#cleansession false    
    
# 是否發(fā)布橋接的狀態(tài)信息    
#notifications true    
    
# 設置橋接模式下,消息將會發(fā)布到的話題地址    
# $SYS/broker/connection/<clientid>/state    
#notification_topic    
    
# 設置橋接的keepalive數(shù)值    
#keepalive_interval 60    
    
# 橋接模式,目前有三種:automatic、lazy、once    
#start_type automatic    
    
# 橋接模式automatic的超時時間    
#restart_timeout 30    
    
# 橋接模式lazy的超時時間    
#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    

啟動mqtt服務器
  1. 直接運行命令行“mosquitto -c /usr/local/Cellar/mosquitto/1.3.5/etc/mosquitto/mosquitto.conf -d”即可開啟服務

  2. 如果沒有將命令添加到環(huán)境變量,需要到sbin目錄下執(zhí)行以上命令?;蛘咴诮K端執(zhí)行sbin:

    $ /usr/local/Cellar/mosquitto/1.4.11_2/sbin/mosquitto
    
  3. 如果不想用命令啟動的話。也可以直接進入/usr/local/Cellar/mosquitto/1.4.11_2/sbin目錄下,點擊相應的腳本執(zhí)行文件,就會自動啟動。

  4. 配置MQTT.fx客戶端:

    1、Host; 127.0.0.1
    2、port: 1883
    3、username 、password 可以不設置(mqtt服務器默認沒有設置)
    
  5. MQTT服務器端口被占用

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

常見問題
  1. MQTT.fix軟件的使用。設置host、端口等參數(shù)、設置用戶名密碼等參數(shù)、連接、查看日志。
  2. MQTT服務器端口被占用。
  3. 客戶端A、MQTT服務器、客戶端B。三端通訊機制。
  4. MQTT.fix 其實是當做客戶端用。物聯(lián)app作為另一個客戶端,必須刪除transport和tls加密等信息。才能聯(lián)通mqtt服務器。
MQTT客戶端安裝

Looks kinda ugly though.

Block quotes can be nested.

Multiple Levels

Markdown preferences pane
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容