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

來源:互聯網
上載者:User

標籤: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協議實現遠程通訊

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.