標籤:level lin bic utf8 位元組 品質 小型 text 建立
一、協議簡介:
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[email protected]"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協議實現遠程通訊