Swift中使用CocoaMQTT实现MQTT协议

MQTT介绍

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输,是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。

MQTT特点

  • 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
  • 对负载内容屏蔽的消息传输;
  • 使用 TCP/IP 提供网络连接;
  • 有三种消息发布服务质量:
    “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
    “至少一次”,确保消息到达,但消息重复可能会发生。
    “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
  • 小型传输,开销很小(固定长度的头部是 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()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容