MQTT.Client
説明
このクラスでは、MQTTブローカーへのクライアント接続を作成できます。
クライアントはブローカーにメッセージをパブリッシュすることができます。また、クライアントは、1つ以上のトピックに対してサブスクライブでき、そのトピックに関して他のクライアントからパブリッシュされたメッセージを受信できます。このクラスは、mosquittoクライアントライブラリを使用します。詳細については、mosquitto.orgとmosquitto.hを参照してください。
このクラスを使用するには、次の手順を実行します。
- 作成
- 設定
- 接続
- 通信
- 切断
- 破棄
作成
クライアントを作成するには、ID、バージョン、クリーンスタートフラグを指定します。MQTT.Client c = MQTT.Client("my-client-id", MQTT.Version.v31, 1);
デフォルトの引数の使用を選択することもできます。MQTT.Client c = MQTT.Client("");
IDがブランクの場合、クライアントはIDをランダムに生成します。 上記の場合、作成したクライアントは、FlexScript関数の実行が終了すると、自動的に破棄されます。より永続的な接続を作成するには、次のようにクライアントのツリーノードを指定します。
ノードをこのように供給すると、クライアントのデータはノードに格納されます。このクライアントに後でアクセスするには、次のように指定します。treenode holder = Model.find("path/to/target/node"); MQTT.Client c = MQTT.Client("my-client-id", MQTT.Version.v31, 1, holder);
クライアントデータを持たないノードからクライアントを作成すると、エラーになります。treenode holder = Model.find("path/to/target/node"); MQTT.Client c = holder; // OR MQTT.Client c = MQTT.Client(holder);
設定
作成したクライアントには、設定を行うことができます。- 必要な場合は、setWill()でWillメッセージを設定します。Willメッセージの使用は任意であり、クライアントが予期せずに切断された場合にのみパブリッシュされます。
- ブローカーで必要な場合は、setUsernamePassword()でユーザー名とパスワードを設定します。
- ブローカーで必要な場合は、setSSL()でSSLオプションを設定します。
- getMessage()でメッセージを待つ。または
- コールバックとして使用するノードをsetDefaultCallback()で指定する。このコールバックは、メッセージが受信されるたびに呼び出されます。
設定は不可逆的
大半の設定関数で行った変更は、クライアントで取り消すことはできません。たとえば、ユーザー名とパスワードを設定すると、そのユーザー名とパスワードを削除することはできません。クライアントの設定を変更する必要がある場合は、新しいクライアントを作成してください。
永続的なクライアントを作成する場合は、まず、正しく接続される永続的ではないクライアントを作成し、設定が正しいことを確認してください。
接続
ブローカーに接続するには、ホスト、ポート、キープアライブ間隔を指定します。int code = c.connect("localhost", 1883, 60);
接続すると、ブローカーとの間で通信が可能になります。通信を終了した時点で、必ず切断してください。 切断した後で、以前使用したものとまったく同じ設定でクライアントを再接続できます。
int code = c.connect();
接続の簡易バージョンを使用するには、次の条件を満たす必要があります。- クライアントが過去に正しく接続しており、どのような設定関数も呼び出していない。または
- クライアントがノードにバインドされており、すべてのメンバーノードの値が正しく設定されている(開発者向け)。
通信
MQTTでは、クライアントどうしは直接通信を行いません。代わりに、メッセージをパブリッシュします。メッセージにはトピックとペイロードが含まれます。どのクライアントもトピックに対してサブスクライブできます。サブスクライブしたクライアントは、そのトピックについてパブリッシュされたすべてのメッセージを受信します。ブローカーの主な役割は、パブリッシュされたメッセージを、現在のトピックに対してサブスクライブしているすべてのクライアントに配布することです。接続しているクライアントのみがメッセージを受信します。ブローカーが後で使用するためにメッセージを格納することはありません。唯一の例外は、保持メッセージです。メッセージが保持される場合、ブローカーはそのトピックの最新メッセージを保管します。クライアントがサブスクライブするとすぐに、ブローカーは保持メッセージ(ある場合)を送信します。
接続したクライアントは、1つ以上のトピックに対してサブスクライブできます。
int rc = c.subscribe("some-topic");
コールバックノードが設定されている場合、メッセージが到着するたびに、コールバックノードが評価されます。設定されていない場合、クライアントは着信メッセージをキューに格納し、取り出されるまで維持します。メッセージをパブリッシュするには、MQTT.Messageオブジェクトを作成し、パブリッシュします。MQTT.Message msg = c.getMessage(5.0); // Check if the message was received if (msg) { // use the message print(msg.topic, msg.payload); }
MQTT.Message msg = Message("some-topic", "some-message"); int rc = c.publish(msg);
切断
クライアントは次のように切断できます。int rc = c.disconect();
切断されたクライアントは、以後、ブローカーからメッセージを受信しません。破棄
クライアントをノードにバインドしていない場合、クライアントが作成されたFlexScript関数が終了すると、クライアントは自動的に破棄されます。クライアントがノードにバインドされている場合、ノードが破棄されるか、ノードのデータが変更されたときに、クライアントは破棄されます。プロパティ
プロパティは高度な機能であり、大半のユーザーは無視しても問題ありません。プロパティはMQTT 5.0で導入されました。プロパティはクライアントの大半のメソッドに渡すことができるほか、メッセージに含めることもできます。MQTT.Clientクラスは、プロパティをMapで表します。クライアントはマップ内のキーと値をすべて有効なMQTTプロパティに変換しようとします。キーがテキストであり、有効なプロパティ名でない場合、クライアントはキーと値をユーザープロパティとして使用します。
プロパティの一覧はMQTT 5.0仕様(https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901027)に記載されています。ここには、特定のAPI呼び出しにどのプロパティが有効かも記載されています。
プロパティ
isConnected | クライアントが現在ブローカーに接続しているかどうかを返します。 |
settings | 作成、設定、接続に関するすべての値のセットを返します。 |
メソッド
connect | クライアントをブローカーに接続します。 |
disconnect | ブローカーからクライアントを切断します。 |
getMessage | クライアントがメッセージを受信するのを待ちます。 |
publish | メッセージをパブリッシュします。 |
setDefaultCallback | メッセージを受信したときに評価するノードを指定します。 |
setSSL | TLS/SSLに使用するオプションを指定します。 |
setUsernamePassword | クライアントのユーザー名とパスワードを指定します。 |
setWill | クライアントのWillメッセージを設定します。 |
subscribe | クライアントをトピックに対してサブスクライブします。 |
unsubscribe | トピックからサブスクライブを解除します。 |
コンストラクター
MQTT.Client |
演算子
= | 特定のノードに格納されているクライアントにアクセスします。 |
詳細
削除を行わないでください。doc.flexsim.comのアンカーが修正されます。
MQTT.Client.isConnected
readonly int isConnected
説明
クライアントが現在ブローカーに接続しているかどうかを返します。
接続が予期せずに失われた場合、クライアントは自動的に再接続を試みます。そのような切断の間でも、この値はtrueを返します。削除を行わないでください。doc.flexsim.comのアンカーが修正されます。
MQTT.Client.settings
readonly settings
説明
作成、設定、接続に関するすべての値のセットを返します。
このプロパティでは、作成、設定、または接続の間に適用されたどの設定も読み取ることができます。たとえば、現在のホスト値を確認するには、次のように指定します。settingsオブジェクトでは、コンストラクター、設定メソッド、接続呼び出しのすべての引数を使用できます。MQTT.Client c = MQTT.Client(); //... configure/connect string host = c.settings.host;
削除を行わないでください。doc.flexsim.comのアンカーが修正されます。
MQTT.Client.connect()
int connect( string host , string bindAddr , Map properties , int port = 1883 , int keepAlive = 60 ) |
int connect( string host , int port = 1883 , int keepAlive = 60 ) |
int connect( ) |
パラメータ
host | ブローカーのホスト名またはIPアドレス。 |
bindAddr | MQTT 5.0でのみ使用します。ネットワークトラフィックを指定のインターフェイスに限定します。 |
properties | MQTT 5.0でのみ使用します。接続リクエストとともに送信するプロパティです。 |
port | ブローカーがリッスンしているポート。 |
keepAlive | この接続に使用するping間隔(秒単位)。 |
戻り値
int | 接続が成功した場合は0です。それ以外の場合、エラーコードを返します。 |
説明
クライアントをブローカーに接続します。
接続したクライアントは、サブスクライブとパブリッシュによってブローカーと通信できます。使用できるバージョンの値は次のとおりです。MQTT.Version.v31 /*MQTT Protocol 3.1*/ MQTT.Version.v311 /*MQTT Protocol 3.1.1*/ MQTT.Version.v5 /*MQTT Protocol 5.0*/
削除を行わないでください。doc.flexsim.comのアンカーが修正されます。
MQTT.Client.disconnect()
int disconnect( int reasonCode = 0 ) |
int disconnect( int reasonCode , Map disconnectProps ) |
パラメータ
reasonCode | 切断メッセージとともに送信する理由コード。 |
disconnectProps | MQTT 5.0で使用します。切断メッセージとともに送信するプロパティです。 |
戻り値
int | 0またはエラーコード。 |
説明
ブローカーからクライアントを切断します。
このメソッドは、まず、進行中のメッセージの送受信を終了します。次に、ブローカーから切断します。エラーコードが存在する場合でも、接続は切断されています。削除を行わないでください。doc.flexsim.comのアンカーが修正されます。
MQTT.Client.getMessage()
MQTT.Message getMessage( double maxSeconds ) |
パラメータ
maxSeconds | メッセージを待つ最長時間。 |
戻り値
MQTT.Message | メッセージを受信した場合、有効なメッセージです。タイムアウトの場合、無効なメッセージです。 |
説明
クライアントがメッセージを受信するのを待ちます。
クライアントがコールバックを設定している場合、コールバックがメッセージを処理するため、この関数は常に指定のタイムアウトまで待って無効なメッセージを返します。コールバックを設定していない場合、このメソッドは、クライアントの内部メッセージキューにメッセージが現れるのを待ちます。メッセージがすでに存在するか、タイムアウトの前に現れた場合、メッセージを内部キューから削除して返します。削除を行わないでください。doc.flexsim.comのアンカーが修正されます。
MQTT.Client.publish()
int publish( MQTT.Message msg ) |
パラメータ
msg | パブリッシュするメッセージ。 |
戻り値
int | パブリッシュが成功した場合は0、失敗した場合はエラーコードです。 |
説明
メッセージをパブリッシュします。
パブリッシュを行うために、トピック、ペイロード、QOS(サービス品質)、パラメータ、保持フラグを含むメッセージのすべての設定が使用されます。プロパティは、MQTT 5.0を使用する場合にのみ送信されます。削除を行わないでください。doc.flexsim.comのアンカーが修正されます。
MQTT.Client.setDefaultCallback()
setDefaultCallback( treenode callback ) |
パラメータ
callback | コールバックノード。 |
説明
メッセージを受信したときに評価するノードを指定します。
コールバックノードには、次のヘッダーが必要です。MQTT.Message msg = param(1);
このノードは、クライアントがメッセージを受信するたびに呼び出されます。メッセージの詳細については、「MQTT.Message」を参照してください。削除を行わないでください。doc.flexsim.comのアンカーが修正されます。
MQTT.Client.setSSL()
int setSSL( string cafile , string capath , string certfile , string keyfile , string keypassword , string ciphers = 0 ) |
int setSSL( string psk , string identity , string ciphers = 0 ) |
パラメータ
cafile | PEMフォーマットの認証局ファイル。 |
capath | PEMフォーマットの認証局ファイルが格納されているディレクトリ。 |
certfile | PEMフォーマットのクライアント証明書ファイル。 |
keyfile | PEMフォーマットのクライアントキーファイル。 |
keypassword | クライアントキーが暗号化されている場合、そのファイルのキー。 |
ciphers | 暗号化または復号に使用するOpenSSL暗号のリスト。 |
psk | 16進形式の事前共有キー(先頭の「0x」を除く)。 |
identity | このクライアントの識別。サーバーの設定によっては、ユーザー名として使用されることがあります。 |
戻り値
int | 成功した場合は0、失敗した場合はエラーコードです。 |
説明
TLS/SSLに使用するオプションを指定します。
クライアントによるTLS/SSLの使用をブローカーが必要としている場合、このメソッドはクライアントを適切に設定します。これらの値が正しくない場合、クライアントは接続できません。削除を行わないでください。doc.flexsim.comのアンカーが修正されます。
MQTT.Client.setUsernamePassword()
int setUsernamePassword( string username , string pwd ) |
パラメータ
username | クライアントのユーザー名。 |
pwd | クライアントのパスワード。 |
戻り値
int | 成功した場合は0、失敗した場合はエラーコードです。 |
説明
クライアントのユーザー名とパスワードを指定します。
ブローカーにユーザー名とパスワードが必要な場合、このメソッドはクライアントにこれらの値を設定します。値が正しくない場合、クライアントは接続できません。削除を行わないでください。doc.flexsim.comのアンカーが修正されます。
MQTT.Client.setWill()
int setWill( MQTT.Message msg ) |
パラメータ
msg | Willメッセージ。 |
戻り値
int | 成功した場合は0、失敗した場合はエラーコードです。 |
説明
クライアントのWillメッセージを設定します。
クライアントが予期せずに切断された場合、ブローカーによってWillメッセージがパブリッシュされます。Willメッセージは必須ではありません。削除を行わないでください。doc.flexsim.comのアンカーが修正されます。
MQTT.Client.subscribe()
int subscribe( string topic , int qos , int options = 0 ) |
int subscribe( string topic , int qos , int options , Map subscribeProps ) |
パラメータ
topic | サブスクライブするトピック。 |
qos | このサブスクリプションに要求されたサービス品質。 |
options | MQTT 5.0で使用します。サブスクリプションリクエストとともに送信するオプション値(ORで結合)です。 |
subscribeProps | MQTT 5.0で使用します。サブスクリプションリクエストとともに送信するプロパティです。 |
戻り値
int | 成功した場合は0、失敗した場合はエラーコードです。 |
説明
クライアントをトピックに対してサブスクライブします。
サブスクライブされたクライアントは、指定のトピックについてパブリッシュされたすべてのメッセージを受信します。コールバックノードが定義されている場合、それらのメッセージはコールバックノードに送信されます。定義されていない場合、メッセージは内部キューに蓄積され、getMessage()で読み取ることができます。ブローカーは、このサブスクリプションに使用可能な最大限のサービス品質を提供します。ワイルドカードを使用すると、同レベル以下の複数のトピックに対してサブスクライブできます。詳細については、MQTTの仕様を参照してください。
有効なオプション値を以下に示します。
0x04 | このオプションを設定すると、このクライアントが自身のサブスクライブ先のトピックに関してパブリッシュした場合、ブローカーはメッセージをそのクライアント自身にパブリッシュしません。 |
0x08 | このオプションを設定すると、このサブスクリプションのためにパブリッシュされたメッセージでは、保持フラグがパブリッシュ側のクライアントによる設定で維持されます。このオプションを設定しない場合のデフォルトの動作では、保持フラグはメッセージが新しいか古いかを示します。 |
0x10 | このオプションを設定すると、サブスクリプションが行われたとき、このサブスクリプションのために既存の保持メッセージが送信されます。ただし、そのサブスクリプションがまだ存在していない場合に限ります。 |
0x20 | このオプションを設定すると、このサブスクリプションでは、既存の保持メッセージは決して送信されません。 |
削除を行わないでください。doc.flexsim.comのアンカーが修正されます。
MQTT.Client.unsubscribe()
int unsubscribe( string topic ) |
int unsubscribe( string topic , Map unsubscribeProps ) |
パラメータ
topic | サブスクライブを解除するトピック。 |
unsubscribeProps | MQTT 5.0で使用します。サブスクライブ解除リクエストとともに送信するプロパティです。 |
戻り値
int | 成功した場合は0、失敗した場合はエラーコードです。 |
説明
トピックからサブスクライブを解除します。
サブスクライブを解除されたクライアントは、以後、ブローカーからそのトピックに関する新しいメッセージを受信しません。ただし、クライアントの内部キューにある既存のメッセージはそのまま残ります。削除を行わないでください。doc.flexsim.comのアンカーが修正されます。
MQTT.Client Constructor
MQTT.Client( string client , int version = 3 , int cleanStart = 1 , treenode holder = 0 ) |
MQTT.Client( treenode holder ) |
パラメータ
client | クライアントのID。 |
version | クライアントのMQTTプロトコルのバージョン。 |
cleanStart | クリーンスタートフラグ。 |
holder | クライアントデータを持っているか、クライアントデータを保持するために初期化されるノード。 |
説明
コンストラクターの最初のバージョンは、新しいクライアントを作成し、オプションでクライアントをノードにバインドします。2つ目のバージョンは、指定されたノードにすでに存在するクライアントデータにアクセスします。クライアントIDがブランクの場合、クライアントはランダムIDで接続します。
クライアントIDがブランクでなく、クリーンスタートフラグが0に設定されている場合、ブローカーはこのクライアントによって行われたサブスクリプションを記憶します。同じクライアントIDで再度接続したクライアントは、それらのサブスクリプションに対するメッセージの受信を自動的に開始します。
削除を行わないでください。doc.flexsim.comのアンカーが修正されます。
MQTT.Client.operator =
MQTT.Client operator =( treenode holder ) |
パラメータ
holder | クライアントデータが格納されているノード。 |
戻り値
MQTT.Client |
説明
特定のノードに格納されているクライアントにアクセスします。
クライアントを作成し、ノードにバインドする場合、そのクライアントにこの演算子でアクセスできます。クライアントデータを持たないノードを使用すると、エラーになります。