iOS開發之使用MQTT協議實現遠程通訊
一、協議簡介:
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協議實現遠程通訊