MQTTについて
下の場合は、加入者のモデルに基づいてMQTTアーキテクチャ、クライアントが互いに通信、あなたが同じトピックをサブスクライブしている同じテーマに加入しなければならない、直接クライアント間で通信する方法はありません。サブスクリプションモデルで明白な利点は、クライアントのトピックにサブスクライブしているすべてのニュースを受け取ることができ、バルクトピックにメッセージを投稿する必要があり、その後です。
受信されたにかかわらず、クライアントがトピックにサブスクライブしている場合、トピックにサブスクライブし、クライアントは同様に、トピックにメッセージを送ることができるかどうかのメッセージがそれ自体で送られることに注意することが重要なのは、メッセージがトピックに送信する必要があります送信します。
また、重要なメッセージの伝送モードを表しQoSは、QoSは、次のことに注意すること:
- 「高々一度」0スタンド、基盤となるTCP / IPネットワークに完全に依存ニュースリリース。不足して起こるか、メッセージを複製します。すぐ後の第二の時間が送信されますので、このレベルは、以下の場合に使用することができ、環境センサデータは、読み出したレコードの損失は、重要ではありません。
- 図1は、メッセージが到達することを確実にするために、「少なくとも一度」を意味するが、メッセージが発生する可能性が繰り返されます。
- 図2は、メッセージが一度到達することを確実にするために「一度だけ」を表します。このレベルは、以下の場合、充電システムで使用することができる、メッセージが誤った結果にリードを繰り返すか、欠落しています。 注意:モスカが達成使用してサーバに、モスカは現在だけのQoS 1をサポートしていますDUE
シンプルなノートは、そのようなトピックに失われたすべてのオンラインの機器を、メッセージの送信など、一時的なメッセージを、送信する場合、それは問題ではありません、0その上に(メッセージを送信しているときに、クライアントのログはQoSレベルのサポートを示すために、クライアントはまた、同時オンラインに参加する必要がない場合、クライアントがメッセージを受信できることを保証するために必要な、あなたは、QoSの1を指定する必要がある場合は、このメッセージはまた、)サポートのQoSのレベルを示すとき時にクライアントログに、メッセージを受け取ることができますオフラインメッセージを受信指定されたセッションの有効性は、あなたがセッション状態のクライアントを維持したいサーバーを指定する必要があります。
のIOSクライアントMQTTクライアント・フレームワークに基づいて、
既存のクライアントSDK分析は、基本的に2つのカテゴリに分類:Cは、mosquittoなどのライブラリーから移植され、一方はにObjC天然または迅速に実現されます。
SDK様々なコントラストが、私が使用して、次のは、MQTTクライアントは、CocoaMQTTを使用することができます迅速な学生を使用して、これはまたemqttのサービスのSDK側の実装の著者です。
名 | タイプ | プログラム言語 | コード |
---|---|---|---|
PAHO | 元の | C | オープンソース。 Eclipseプロジェクト |
IBM | 元の | C | クローズソース。 IBM SDK |
mosquitto | 元の | C | オープンソース。 Eclipseプロジェクト |
MQTTKit | ラッパー(Mosquitto) | Objective-Cの | オープンソース。 Githubの |
マーケット | ラッパー(Mosquitto) | Objective-Cの | オープンソース。 Githubの |
Moscapsule | ラッパー(Mosquitto) | 迅速 | オープンソース。 Githubの |
Musqueteer | ラッパー(Mosquitto) | Objective-Cの | |
MQTTクライアント | ネイティブ | Objective-Cの | オープンソース。 Githubの |
MQTTSDK | ネイティブ | Objective-Cの | |
CocoaMQTT | ネイティブ | 迅速 | オープンソース。 Githubの |
可能性のある問題は、以下で説明する、Appleはモバイルネットワークを使用して、サードパーティ製のネットワークライブラリを禁止しています。
あなたはiOSアプリケーション用のMQTTを使用しようとしている場合は、私は非常にあなたがネイティブ(のObjective-C /スウィフト)のiOSライブラリを使用することをお勧めします。Cまたはラッパーライブラリを使用すると、通常、あなたはいくつかの点でPOSIXネットワーキング・コールを使用していることを意味します。Appleはモバイルインターネットのアンテナを使用してから、サードパーティ製のネットワークライブラリを使用することを禁止します。あなたはPAHOまたは類似のものを使用する場合は、WiFiネットワークに接続されている場合このように、あなただけのMQTTを使用することができます。
源代引自作https://github.com/relayr/apple-mqtt-example
統合のステップ
MQTTクライアント・サポート・ポッドは、簡単かつ迅速にプロジェクトに統合します。単純なシナリオの下で、アプリは、端末設備のそれぞれに異なるビジネスデータを生成し、ビジネス・データは、それぞれの端末のアプリで見ることが必要であり、そのすべての端末の業務データを同期する必要があります。MQTTメッセージの送信が話題で行われ、話題を作成する必要があり、MQTT実装トピックに応じて別途作成されていない、とトピックをサブスクライブすることはバインドされています。それは限りトピックを購読している、サーバはまず、あなたがトピックを作成していない場合は、サブスクリプションのリストに自分自身を追加しながら、もしあれば、現在のクライアントは、サブスクリプション・リストに追加され、話題が存在するかどうかを決定します。
接続を確立します
アプリはグローバル接続、複数の接続を確立し、単一の実施形態のモードを使用して、複数のページにデータを送信するアドバイスが必要な場合。あなたは、サーバーに接続するたびに非常に資源集約的であるため。次の接続を確立するコード:
1 |
* = SessionManagerのMQTTSessionManager [[MQTTSessionManagerのalloc]のinit];
[SessionManagerのConnectTo: "192.168.1.4" //サーバアドレスの@
ポート:1883 //サービスのポート番号は
、TLS://偽TLSプロトコルを使用するかどうか、TLSのモスカのサポートあなたがtrueに設定使用する場合は
一定時間ごとにハートビートパケットを送信するために、数秒で60 //心拍時間、:キープアライブを
クリーン:クリアするかどうか偽//セッションを、必要が味falseの場合、代表者は、クライアントがあれば、ログインしたままに、注意を払いますオフラインメッセージを受信することができ、再びログオフし
、ログイン認証を使用するかどうか// trueの場合、ユーザと、次の組み合わせで使用してパラメータを渡す:AUTHを
ユーザー:_username //ユーザ名の
パスを:_passwd //パスワード
willTopic:@「」//以下4つのパラメータセットクライアントが現在の伝送のためのトピックがメッセージをオフラインでパラメータである他のクライアントに送信されたオフラインメッセージ、であれば、ここでのオフラインメッセージは後に離れてライン取り送られたクライアント・メッセージを参照するすべてを落とした
でしょう:@ " 「//オフラインメッセージのカスタムフォーマットがよく一致することができ
willQos:0 //受信オフラインメッセージがレベル
willRetainFlagは:偽
withClientId:]; //クライアントID、サーバはデフォルトのidログイン後にクライアントを区別するために、この基づいているため、このIDは、グローバルに一意の必要があることに注意する必要があり、別の接続があればこのIDでログインし、接続が組立ラインをキックオフされます |
購読とメッセージを送信
接続が確立されると、後のトピックをサブスクライブしてメッセージを送信し、メッセージを送信し、次のようにサブスクリプションコードがあることができます。
1 |
//トピックフィード
sessionManager.subscriptions = [[NSMutableDictionary ALLOC] INIT]を、
[sessionManager.subscriptionsのsetObject:[のNSNumber numberWithInt :. 1]
forKey:_topic];
//メッセージを送信し、戻り値が0より大きいMSGID送信成功を表す
UInt16型MSGID = [ SessionManagerののsendData:[MSG dataUsingEncoding:NSUTF8StringEncoding ] // 送信されるメッセージボディ
トピック//するトピックにメッセージを送信する:トピック
QOS:1つの//メッセージ・レベルが
保持:偽]を、 |
メッセージを受信します
委任メッセージを受信することは、次のメッセージ受信手数料MQTTSessionManagerDelegateを実現するために達成しています
1 |
- (無効)のhandleMessage:(NSDataの*)データonTopic:(NSStringの*)トピックは保持:(BOOL)を保持。 |
ここでは、異なるメッセージを区別することができます
接続状態を監視します
レジスタ観察者は異なる状態取得した接続状態を判断します
1 |
//登録するオブザーバ、ページを離れるときオブザーバを削除することを忘れないでください
- (空)viewWillAppear:(BOOL)アニメーション{
[スーパーviewWillAppear:アニメーション];
[SessionManagerのaddObserver:自己
forKeyPath: "国家" @
オプション:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNewの
コンテキスト:なし];
}
- (ボイド)observeValueForKeyPath:(NSStringの*)キーパスofObject:(ID)オブジェクト変更:(NSDictionaryの*)変更コンテキスト(ボイド*)コンテキスト{
スイッチ(sessionManager.state){
ケースMQTTSessionManagerStateClosed://接続これは、閉じた
休憩を、
ケースMQTTSessionManagerStateClosing://接続が閉じられている
休憩。
場合は、MQTTSessionManagerStateConnected://が接続されています
BREAK;
ケースMQTTSessionManagerStateConnecting://接続
BREAKを、
ケースMQTTSessionManagerStateError://例外
BREAK;
ケースMQTTSessionManagerStateStarting://接続開始
デフォルト:
BREAK;
}
} |
フロントデスクに戻ったときMQTTプロトコル自体が自動的にバックグラウンド後切断アプリを終了し、このSDKの別の説明に加えて、再接続をサポートして、自動的に再接続します
Androidのクライアントと統合されたJS
JSのAndroidクライアントとクライアントがポロのプログラムで使用することができ、アドレスhttp://www.eclipse.org/paho/
私はテストのために使用するSDK:
Androidの https://www.eclipse.org/paho/clients/android/
JS https://www.eclipse.org/paho/clients/js/
統合手順と詳細なIOSは、のみ、上記のIOSのパラメータが可能な注意を払う必要があります
最後に書かれました
北の最近の天候が厳しいヘイズがポイントに行くことができない、気分も非常に低く、無力とより強い、悪化し続け、私は、この場所を残して準備ができて書き込むように、というように、他の穏やかを書き留めて何の心を持っていません右のもの。コンテンツは、ラズベリーPiとドッカーは、関連する何かを書くことが予想されます。