iOS開発--MQTTリアルタイムデータ処理

4392 ワード

最近会社は実际にデータを伝送することを実现して、MQTTを使って実现して、次に内容を说明して、ノートにしました
一.MQTT
1つのユビキタスネットワークプロジェクトにはMQTTプロトコルが用いられ、デバイスとソフトウェアとの相互接続に用いることができる.
MQTT:インスタント通信プロトコル、トランスポート層プロトコル
二.よく使われるもの:
1.MQTTKit(もうメンテナンスしてない)
2.MQTTClient
a.アドレスポート、アカウントパスワードなどの基本情報を設定する
b.トピックの購読(複数のトピックを購読可能)
c.エージェントコールバックの実現方法(データの処理)
三.3つのメッセージ伝送方式:(状況に応じて使用)
a.最大1回(メッセージの消失または重複が発生する)
b.少なくとも1回(メッセージが到着することを確保し、メッセージの重複が発生する)
c.1回のみ(メッセージが1回到着することを確認する)
四、導入庫
pod 'MQTTClient'    
pod 'MQTTClient/Min'    
pod 'MQTTClient/Manager'    
pod 'MQTTClient/Websocket'     

ここではMQTTClientオープンソースライブラリ開発を採用しています.バックグラウンドのMQTTサービス用wsの場合、pod'MQTTClient/Websocket'をインポートする必要があります.ここでは、自身の必要に応じてpodをインポートすればいいです.
五、コード:
#import 
#import 

基本情報の構成

- (void)setParameterWithManager
{
    /**
     host:      
     port:      
     tls:      tls  ,mosca   tls ,         true
     keepalive:     ,   ,           ,         120s
     clean: session    ,      ,   false,      ,                      
     auth:         
     user:    
     pass:   
     willTopic:     
     willMsg:         
     willQos:          
     clientId:    id,          id      ,                    ,       id   ,           id  ,          ,       UUID
     */
    NSString *clientId = [UIDevice currentDevice].identifierForVendor.UUIDString;
    self.sessionManager = [[MQTTSessionManager alloc] init];
    [self.sessionManager connectTo:MQTTHOST
                              port:MQTTPORT
                               tls:false
                         keepalive:60  //        120s
                             clean:true
                              auth:true
                              user:MQTTUSERNAME
                              pass:MQTTPASSWORD
                              will:false
                         willTopic:nil
                           willMsg:nil
                           willQos:0
                    willRetainFlag:false
                      withClientId:clientId];
    self.sessionManager.delegate = self;

    //          
    [self.sessionManager addObserver:self
                          forKeyPath:@"state"
                             options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
                             context:nil];
    //         NSDictionary  ,Object   QoS,key   Topic
    self.sessionManager.subscriptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:MQTTQosLevelExactlyOnce] forKey:@"       (      )"];
}

接続ステータスのリスニング
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    switch (self.sessionManager.state) {
        case MQTTSessionManagerStateClosed:
            NSLog(@"      ");
            break;
        case MQTTSessionManagerStateClosing:
            NSLog(@"      ");
            break;
        case MQTTSessionManagerStateConnected:
            NSLog(@"    ");
            break;
        case MQTTSessionManagerStateConnecting:
            NSLog(@"     ");
            break;
        case MQTTSessionManagerStateError: {
            NSString *errorCode = self.sessionManager.lastErrorCode.localizedDescription;
            NSLog(@"     ----- %@",errorCode);
        }
            break;
        case MQTTSessionManagerStateStarting:
            NSLog(@"    ");
            break;
        default:
            break;
    }
}

データの処理
//   MQTTSessionManagerDelegate    ,    。
- (void)handleMessage:(NSData *)data onTopic:(NSString *)topic retained:(BOOL)retained
{
    NSLog(@"  :%@",topic);
    NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSData * newData = [dataString dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:newData options:NSJSONReadingMutableLeaves error:nil];
    NSLog(@"  :%@",jsonDict);
}

最後に観察者を削除することを忘れないでください.そうしないとプログラムがクラッシュします.
[self.sessionManager removeObserver:self forKeyPath:@"state"];