Swift中使用CocoaMQTT實現MQTT協議

MQTT介紹

MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸,是IBM開發的一個即時通訊協議,有可能成為物聯網的重要組成部分。該協議支持所有平臺,幾乎可以把所有聯網物品和外部連接起來,被用來當做傳感器和致動器(比如通過Twitter讓房屋聯網)的通信協議。

MQTT特點

  • 使用發布/訂閱消息模式,提供一對多的消息發布,解除應用程序耦合;
  • 對負載內容屏蔽的消息傳輸;
  • 使用 TCP/IP 提供網絡連接;
  • 有三種消息發布服務質量:
    “至多一次”,消息發布完全依賴底層 TCP/IP 網絡。會發生消息丟失或重復。這一級別可用于如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因為不久后還會有第二次發送。
    “至少一次”,確保消息到達,但消息重復可能會發生。
    “只有一次”,確保消息到達一次。這一級別可用于如下情況,在計費系統中,消息重復或丟失會導致不正確的結果。
  • 小型傳輸,開銷很?。ü潭ㄩL度的頭部是 2 字節),協議交換最小化,以降低網絡流量;
  • 使用 Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制

CocoaMQTT使用

  • Install using CocoaPods by adding this line to your Podfile:

pod 'CocoaMQTT'

```
  • Then, run the following command:

pod install

```
  • 導入CocoaMQTT

import CocoaMQTT

```
  • 初始化CocoaMQTT

      let clientIdPid = "" + String(NSProcessInfo().processIdentifier)
      mqtt = CocoaMQTT(clientId: clientIdPid, host: "192.168.9.135", port: 1881)
      if let mqtt = mqtt {
          mqtt.username = "57bec7e6cc96586442651585"
          mqtt.password = "rehL66qTLwmpruFQNacGqr4YedRDMptt"
          mqtt.willMessage = CocoaMQTTWill(topic:"v1.0/regist/57bec7e6cc96586442651585/12345", message:"did")
          mqtt.keepAlive = 90
          mqtt.delegate = self
      }
    
  • 實現其代理方法

      func mqtt(mqtt: CocoaMQTT, didConnect host: String, port: Int) {
      print("didConnect \(host):\(port)")
      }
    
           func mqtt(mqtt: CocoaMQTT, didConnectAck ack: CocoaMQTTConnAck) {
      //print("didConnectAck \(ack.rawValue)")
      if ack == .ACCEPT {
          mqtt.subscribe("v1.0/regist/57bec7e6cc96586442651585/12345", qos: CocoaMQTTQOS.QOS1)
          mqtt.ping()
    
      }
      
    }
    
    func mqtt(mqtt: CocoaMQTT, didPublishMessage message: CocoaMQTTMessage, id: UInt16) {
        print("didPublishMessage with message: \(message.string)")
    }
    
    func mqtt(mqtt: CocoaMQTT, didPublishAck id: UInt16) {
      print("didPublishAck with id: \(id)")
    }
    
    func mqtt(mqtt: CocoaMQTT, didReceiveMessage message: CocoaMQTTMessage, id: UInt16 ) {
      print("didReceivedMessage: \(message.string) with id \(id)")
      NSNotificationCenter.defaultCenter().postNotificationName("MQTTMessageNotification" + animal!, object: self, userInfo: ["message": message.string!, "topic": message.topic])
    }
    
    func mqtt(mqtt: CocoaMQTT, didSubscribeTopic topic: String) {
      print("didSubscribeTopic to \(topic)")
    }
    
    func mqtt(mqtt: CocoaMQTT, didUnsubscribeTopic topic: String) {
      print("didUnsubscribeTopic to \(topic)")
      }
    
    func mqttDidPing(mqtt: CocoaMQTT) {
      print("didPing")
    }
    
    func mqttDidReceivePong(mqtt: CocoaMQTT) {
      _console("didReceivePong")
    }
    
    func mqttDidDisconnect(mqtt: CocoaMQTT, withError err: NSError?) {
      _console("mqttDidDisconnect")
    }
    
    func _console(info: String) {
      print("Delegate: \(info)")
    

    }

  • 消息發送
    mqtt!.publish("chat/room/animals/client/" + client, withString: message, qos: .QOS1)

  • 消息接收
    代理方法中didReceiceMessage中返回接收到的消息

  • 斷開連接
    mqtt!.disconnect()

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

推薦閱讀更多精彩內容