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()