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