iOS開発--MQTTリアルタイムデータ処理
4392 ワード
最近会社は実际にデータを伝送することを実现して、MQTTを使って実现して、次に内容を说明して、ノートにしました
一.MQTT
1つのユビキタスネットワークプロジェクトにはMQTTプロトコルが用いられ、デバイスとソフトウェアとの相互接続に用いることができる.
MQTT:インスタント通信プロトコル、トランスポート層プロトコル
二.よく使われるもの:
1.MQTTKit(もうメンテナンスしてない)
2.MQTTClient
a.アドレスポート、アカウントパスワードなどの基本情報を設定する
b.トピックの購読(複数のトピックを購読可能)
c.エージェントコールバックの実現方法(データの処理)
三.3つのメッセージ伝送方式:(状況に応じて使用)
a.最大1回(メッセージの消失または重複が発生する)
b.少なくとも1回(メッセージが到着することを確保し、メッセージの重複が発生する)
c.1回のみ(メッセージが1回到着することを確認する)
四、導入庫
ここではMQTTClientオープンソースライブラリ開発を採用しています.バックグラウンドのMQTTサービス用wsの場合、pod'MQTTClient/Websocket'をインポートする必要があります.ここでは、自身の必要に応じてpodをインポートすればいいです.
五、コード:
基本情報の構成
接続ステータスのリスニング
データの処理
最後に観察者を削除することを忘れないでください.そうしないとプログラムがクラッシュします.
一.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"];