MQTT總結

MQTT總結

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

參考文檔:

iOS MQTT----MQTTClient實戰-看這篇的就夠了 http://www.lxweimin.com/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服務器發布消息,MQTT檢查到客戶端A訂閱了該主題,于是實現了A和B客戶端之間的通訊。

通訊機制:

pver

應用場景

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

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

常見問題

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

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

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

如果不需要mqtt了,記得close,不然mqtt還會返回數據.

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

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

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

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

前提是你家的服務器一直在發送數據,而不是停掉了

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

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

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

這個時候,你需要監聽消息的狀態,就可以處理了,來看看,self.mySession.status的值

2.3 介紹兩種監聽方法:

KVO和定時器

over

MQTT.fx使用

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

具體的配置如下:

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

over

搭建MQTT服務器 mosquito

官網:http://mosquitto.org/download/

$ brew install mosquittto 
$ vi /usr/local/Cellar/mosquitto/版本/etc/mosquitto/mosquitto.conf #配置文件
# =================================================================    
# General configuration    
# =================================================================    
    
# 客戶端心跳的間隔時間    
#retry_interval 20    
    
# 系統狀態的刷新時間    
#sys_interval 10    
    
# 系統資源的回收時間,0表示盡快處理    
#store_clean_interval 10    
    
# 服務進程的PID    
#pid_file /var/run/mosquitto.pid    
    
# 服務進程的系統用戶    
#user mosquitto    
    
# 客戶端心跳消息的最大并發數    
#max_inflight_messages 10    
    
# 客戶端心跳消息緩存隊列    
#max_queued_messages 100    
    
# 用于設置客戶端長連接的過期時間,默認永不過期    
#persistent_client_expiration    
    
# =================================================================    
# Default listener    
# =================================================================    
    
# 服務綁定的IP地址    
#bind_address    
    
# 服務綁定的端口號    
#port 1883    
    
# 允許的最大連接數,-1表示沒有限制    
#max_connections -1    
    
# cafile:CA證書文件    
# capath:CA證書目錄    
# certfile:PEM證書文件    
# keyfile:PEM密鑰文件    
#cafile    
#capath    
#certfile    
#keyfile    
    
# 必須提供證書以保證數據安全性    
#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    
    
# 是否發布橋接的狀態信息    
#notifications true    
    
# 設置橋接模式下,消息將會發布到的話題地址    
# $SYS/broker/connection/<clientid>/state    
#notification_topic    
    
# 設置橋接的keepalive數值    
#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. 如果沒有將命令添加到環境變量,需要到sbin目錄下執行以上命令?;蛘咴诮K端執行sbin:

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

  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、端口等參數、設置用戶名密碼等參數、連接、查看日志。
  2. MQTT服務器端口被占用。
  3. 客戶端A、MQTT服務器、客戶端B。三端通訊機制。
  4. MQTT.fix 其實是當做客戶端用。物聯app作為另一個客戶端,必須刪除transport和tls加密等信息。才能聯通mqtt服務器。
MQTT客戶端安裝
  • M*****QTT.**FX 是目前主流的mqtt客戶端,可以快速驗證是否可以與IoT Hub 服務交流發布或訂閱消息。
    MQTT.FX官網
    MQTT.FX相關文檔

Looks kinda ugly though.

Block quotes can be nested.

Multiple Levels

Markdown preferences pane
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容