1. 程式人生 > >iOS開發之使用MQTT協議實現遠程通訊

iOS開發之使用MQTT協議實現遠程通訊

lis height msg PE contex 特性 AC eva http

一、協議簡介:

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

二、協議特點:

1、MQTT是為大量計算能力有限,且工作在低帶寬、不可靠的網絡的遠程傳感器和嵌入式控制設備通訊而設計的協議,它具有以下主要的幾項特性:

1》、使用發布/訂閱消息模式,提供一對多的消息發布,解除應用程序耦合;

2》、對負載內容屏蔽的消息傳輸;

3》、使用 TCP/IP 提供網絡連接;

4》、有三種消息QoS發布服務質量;

A、“至多一次”,消息發布完全依賴底層 TCP/IP 網絡。會發生消息丟失或重復。這一級別可用於如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因為不久後還會有第二次發送。

B、“至少一次”,確保消息到達,但消息重復可能會發生。

C、“只有一次”,確保消息到達一次。這一級別可用於如下情況,在計費系統中,消息重復或丟失會導致不正確的結果。

5、小型傳輸,使用很小(固定長度的頭部是2字節),協議交換最小化,以降低網絡流量;

6、使用 Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制。

三、協議應用場景:

1、移動消息、物聯網、車聯網、智能硬件甚至能源勘探等

2、設計模式支持:1個字節報頭、2個字節心跳、消息QoS

四、使用MQTT協議集成iOS客戶端步驟:

1、github上搜索資料MQTT並下載,會出現兩個(建議使用第二個):

A、MQTTKit:停止更新 下載地址:https://github.com/mobile-web-messaging/MQTTKit

B、MQTTClient:經常更新 下載地址:https://github.com/novastone-media/MQTT-Client-Framework

2、導入MQTT和SocketRocket兩個框架到工程,如果遇到編譯報錯"_utf8_nextCharSafeBody", referenced from:,記得添加系統依賴庫libicucore.tbd

3、創建傳輸類型

MQTTCFSocketTransport* transport=[[MQTTCFSocketTransport alloc]init];

transport.host=@"192.168.1.1";

transport.port=[@"8080" intValue];

4、創建會話任務並設置代理

MQTTSession* session=[[MQTTSession alloc]init];

session.delegate=self;

session.transport=transport;

session.userName=@"peter";

session.password=@"123456";

5、訂閱主題

BOOL isSucess = [session connectAndWaitTimeout:30];//連接會話, 設置超時時間

if(isSucess){

[session subscribeToTopic:nil atLevel:MQTTQosLevelAtMostOnce subscribeHandler:^(NSError *error, NSArray<NSNumber *> *gQoss) {

if (error) {

NSLog(@"連接失敗:%@",error.localizedDescription);

}else{

NSLog(@"連接成功:%@",gQoss);

}

}];

}

5、KVO監聽狀態

[self.session addObserver:self forKeyPath:@"ststus" options:NSKeyValueObservingOptionOld context:nil];

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{

//正在斷開連接

if (self.session.status==MQTTSessionStatusDisconnecting) {

[self.session connect];//重新連接

}

}

6、發送數據

- (void)sending:(MQTTSession *)session type:(MQTTCommandType)type qos:(MQTTQosLevel)qos retained:(BOOL)retained duped:(BOOL)duped mid:(UInt16)mid data:(NSData *)data{

[session publishAndWaitData:data

onTopic:@"topic"

retain:NO

qos:MQTTQosLevelAtLeastOnce];

}

7、接收數據

-(void)newMessage:(MQTTSession *)session data:(NSData *)data onTopic:(NSString *)topic qos:(MQTTQosLevel)qos retained:(BOOL)retained mid:(unsigned int)mid{

NSDictionary* dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

self.dataDict=dict;//保存全局屬性

if ([topic rangeOfString:@"device_control"].location!=NSNotFound) {

//控制設備

}

}

8、斷開服務連接

- (void)connectionClosed:(MQTTSession *)session{

[session disconnect];//斷開

[session close];//關閉

}

9、取消訂閱服務

- (void)unsubAckReceived:(MQTTSession *)session msgID:(UInt16)msgID{

[session unsubscribeTopic:@"topic" unsubscribeHandler:^(NSError *error) {

}];

}

iOS開發之使用MQTT協議實現遠程通訊