blog

探索するFlutterのIMプログラム - MQTT

主人公その2:MQTTは、"軽量 "通信プロトコルに基づいてパブリッシュ/サブスクライブモデルであり、プロトコルは、TCP/IPプロトコル上に構築され、1999年にIBMによってリリースされました.....

Nov 16, 2020 · 5 min. read
シェア

Demo

プログラムの選択 - MQTT

この記事を始める前に、まず今日の2人の主人公を紹介しましょうᤪ:

主人公その1:インスタント・メッセージング

MQTTの最大の利点は、非常に少ないコード量と限られた帯域幅で、リモートデバイスに接続してリアルタイムかつ信頼性の高いメッセージングサービスを提供できることです。

実際、プロジェクト内にIM機能を実装する場合、複数の選択肢がありますが、なぜMQTTを選ぶのでしょうか?まず第一に、プロジェクトの複数のエンドポイントの整合性を考慮し、プロジェクトの複数のエンドポイントを持って、エンドの1つに正常にアクセスして機能を実装するためにMQTTソリューションを採用しており、その後、複数のエンドポイント間の対話を開くことができるかもしれないので、私も自分のプロジェクト内でMQTTメッセージプッシュソリューションを使用するつもりです。もう一つの重要な理由は、MQTTにはライブラリがあるからです!ライブラリがあります!

見てください。これはピカピカのライブラリで、その高い人気+高い関心+高い「いいね!」は、それがいかに優れているかをよく表しています。中にはこう言う人もいるかもしれません:3ウェイ・ライブラリは技術的じゃない、3ウェイ・ライブラリのカスタマイズ性は高くない、あーだこーだ、あーだこーだ、あーだこーだ、あーだこーだ、あーだこーだ、あーだこーだ、あーだこーだ、あーだこーだ、あーだこーだ、あーだこーだ。しかし、これはカスタマイズのためのソースコードを見ていない、巨人はあなたが踏まない肩を持っている、足に行かなければならない、多分いつかあなたは巨人になりますが、私は巨人の肩の上に巨人になった、オリーは与えます!巨人の肩に乗って飛び立つ準備はできましたか?

MQTT Client

Step1:MQTTAppConnectionState

最初に明確にする必要があるのは、MQTTの接続状態です。この部分を理解するのは簡単で、MQTTで可能な状態は、接続されている、接続されていない、接続されています。このように列挙されています。

 enum MQTTAppConnectionState { connected, disconnected, connecting }

非常に良いです!すでに最初のステップを完了し、アイデアが明確になってきています。

Step2:MQTTAppState

MQTTの接続状態を取得した後、他に何が必要でしょうか?接続状態を知る目的は何でしょうか?もちろん、接続が成功したときにメッセージを送受信し、接続が切断されたときにメッセージの送受信を停止し、メッセージを受信したときに受信したメッセージを知るためです。これが、MQTTAppStateと呼ばれるクラスの必要性です。

 class MQTTAppState with ChangeNotifier{
 MQTTAppConnectionState _appConnectionState = MQTTAppConnectionState.disconnected;
 String _receivedText = '';
 String _historyText = '';
 void setReceivedText(String text) {
 _receivedText = text;
 _historyText = _historyText + '
' + _receivedText;
 notifyListeners();
 }
 void setAppConnectionState(MQTTAppConnectionState state) {
 _appConnectionState = state;
 notifyListeners();
 }
 String get getReceivedText => _receivedText;
 String get getHistoryText => _historyText;
 MQTTAppConnectionState get getAppConnectionState => _appConnectionState;
}

このクラスでは、現在の受信メッセージreceivedTextの定義を見ることができますし、メッセージ_ historyTextの履歴を受信し、2つのメッセージを定義し、メッセージの履歴が実際に重畳され、改行のプロセスは、各メッセージの新しい履歴を形成するために新しいメッセージに参加する元のに基づいて、新しいメッセージを受信しました。また、MQTTAppConnectionStateを管理するためのメソッドを定義します!このクラスのはChangeNotifierを継承している、Flutterの学生に精通していることも推測することができます、これは、はい、ここでもProviderの技術ソリューションの後にグローバルな状態管理を容易にすることです。

Step3:MQTTManager

関数やクラスライブラリにアクセスする必要がある場合、まず最初にグローバル管理のアイデアが必要です。そうでないと、FlutterのようなフレームワークではUIとビジネスロジックの区別が難しくなります。ここでのMQTTManagerの目的は、IMメッセージの送受信とメッセージの購読を一元管理することで、グローバルマネージャクラスとして、まず必要なのはコンストラクタを定義することです、コンストラクタは一般的にMQTTに必要な内容のクラスに配置されます、必要なクラスとは?ここでは、MQTTの基本的な理解を持っている必要があり、ここで私は最初にあなたに答えを書きます。

 MQTTManager({
 @required String host,
 @required String topic,
 @required String identifier,
 @required MQTTAppState state
 }
 ): _identifier = identifier, _host = host, _topic = topic, _currentState = state ;

MQTTのための最も基本的な構成は、ホスト(ホストアドレス)、トピック(サブスクリプションの件名)、識別子(ユーザーID)、状態(接続状態)が含まれています実際には、これらの人々はそれが理解するのは難しいことではありませんについて慎重に考えて、これは、受信者を区別し、メッセージを送受信するために行うことです基本的な構成のいくつかの送信者。

また、MQTTサーバが必要です!、同じサーバの基本的な設定を追加する必要があります

 void initializeMQTTClient(){
 _client = MqttServerClient(_host,_identifier);
 _client.port = 1883;
 _client.keepAlivePeriod = 20;
 _client.onDisconnected = onDisconnected;
 _client.secure = false;
 _client.logging(on: true);
 _client.onConnected = onConnected;
 _client.onSubscribed = onSubscribed;
 final MqttConnectMessage connMess = MqttConnectMessage()
 .withClientIdentifier(_identifier)
 .withWillTopic('willtopic') set a will message
 .withWillMessage('My Will message')
 .startClean()
 .withWillQos(MqttQos.atLeastOnce);
 _client.connectionMessage = connMess;
 }

このような単純なサーバーは、ポート番号、接続保留時間など、彼に良い基本的な設定を与えるために設定されている、すべての情報が設定され、マネージャにいくつかの基本的な管理方法を追加することができます。

MQTT

上記の絶え間ない努力では、次のすべてが論理的であると思われる、文字の手、上のページの知識と組み合わせ。マネージャを介して実装できるMQTT接続

 _connectMQTT()
 {
 manager = MQTTManager(
 host: "test.mosquitto.org",
 topic: "flutter/amp/cool",
 identifier: _userName,
 state: currentAppState);
 manager.initializeMQTTClient();
 manager.connect();
 }

同時に、ChangeNaotifierが統合されているので、動的にサブスクライブメッセージを聞くことができます、簡単に、2行のコード。

//現在受信したメッセージ
appState.getReceivedText
//すべての履歴メッセージ
appState.getHistoryText

メッセージの送信も非常に簡単で、1行のコードで完了します!

mqttManager.publish(message);
Read next