MQTT和Websocket的區別是什么
MQTT 是輕量級基于代理的發布/訂閱的消息傳輸協議,設計思想是開放、簡單、輕量、易于實現。這些特點使它適用于受限環境。例如:
①網絡代價昂貴,帶寬低、不可靠②在嵌入設備中運行,處理器和內存資源有限。
該協議的特點有:
①使用發布/訂閱消息模式,提供一對多的消息發布,解除應用程序耦合。
②對負載內容屏蔽的消息傳輸。
③使用 TCP/IP 提供網絡連接。
④有三種消息發布服務質量:
⑤至多一次,消息發布完全依賴底層 TCP/IP 網絡。會發生消息丟失或重復。這一級別可用于如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因為不久后還會有第二次發送。
⑥至少一次,確保消息到達,但消息重復可能會發生。
⑦只有一次,確保消息到達一次。這一級別可用于如下情況,在計費系統中,消息重復或丟失會導致不正確的結果。
⑧小型傳輸,開銷很小(固定長度的頭部是 2 字節),協議交換最小化,以降低網絡流量。
⑨使用 Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制。
WebSocket則提供使用一個TCP連接進行雙向通訊的機制,包括網絡協議和API,以取代網頁和服務器采用HTTP輪詢進行雙向通訊的機制。
本質上來說,WebSocket是不限于HTTP協議的,但是由于現存大量的HTTP基礎設施,代理,過濾,身份認證等等,WebSocket借用HTTP和HTTPS的端口。由于使用HTTP的端口,因此TCP連接建立后的握手消息是基于HTTP的,由服務器判斷這是一個HTTP協議,還是WebSocket協議。 WebSocket連接除了建立和關閉時的握手,數據傳輸和HTTP沒丁點關系了。
由此可知兩者的應用場景不一樣:
MQTT是為了物聯網場景設計的基于TCP的Pub/Sub協議,有許多為物聯網優化的特性,比如適應不同網絡的QoS、層級主題、遺言等等。
WebSocket是為了HTML5應用方便與服務器雙向通訊而設計的協議,HTTP握手然后轉TCP協議,用于取代之前的Server Push、Comet、長輪詢等老舊實現。
兩者之所有有交集,是因為一個應用場景:如何通過HTML5應用來作為MQTT的客戶端,以便接受設備消息或者向設備發送信息,那么MQTT over WebSocket自然成了最合理的途徑了。
怎么將消息發送到mqtt代理服務器
通過Cocoa Pods添加MQTTKit
MQTTKit在github上鏈接,down下來。
cd到工程目錄,輸入pod install,用xcode打開工程的打開xcworkspace擴展名的文件。
如果不是MQTTKit存在更新的版本,則輸入pod update。
新建一個MQTT的服務請求
NSString *clientID = ...
MQTTClient *client = [[MQTTClient alloc] initWithClientId:clientID];
發送消息,每次發送消息包括目標host和本地MQTT消息.具體MQTT格式消息見代碼。這里Host可以是Server的IP,不需要host表解析。
// connect to the MQTT server
[self.client connectToHost:@iot.eclipse.org
completionHandler:^(NSUInteger code) {
if (code == ConnectionAccepted) {
// when the client is connected, send a MQTT message
[self.client publishString:@Hello, MQTT
toTopic:@/MQTTKit/example
withQos:AtMostOnce
retain:NO
completionHandler:^(int mid) {
NSLog(@message has been delivered);
}];
}
}];
訂閱主題并接受MQTT格式的消息,這部分在viewdidload中實現。
// define the handler that will be called when MQTT messages are received by the client
[self.client setMessageHandler:^(MQTTMessage *message) {
NSString *text = [message.payloadString];
NSLog(@received message %@, text);
}];
// connect the MQTT client
[self.client connectToHost:@iot.eclipse.org
completionHandler:^(MQTTConnectionReturnCode code) {
if (code == ConnectionAccepted) {
// when the client is connected, subscribe to the topic to receive message.
[self.client subscribe:@/MQTTKit/example
withCompletionHandler:nil];
}
}];
斷開連接
[self.client disconnectWithCompletionHandler:^(NSUInteger code) {
// The client is disconnected when this completion handler is called
NSLog(@MQTT client is disconnected);
}];
整個連接建立、發送消息、接受消息、斷開連接都是通過Block的消息機制來實現,因此需要對block有很好地理解。