|
WebCFace 3.2.0
Web-based Communication Framework & Dashboard-like UI
|
webcface/member.h)WebCFaceではサーバーに接続されたそれぞれのクライアントを Member と呼びます。 (たぶんROSでいうと Node に相当します)
データを受信する時など、Memberを指すために使用するのがMemberクラスです。 Client::member() で取得できます。 (C言語のAPIを除く)
C++ fooという名前のMember (=Clientのコンストラクタにfooを入力したクライアント) にアクセスするには、
member() の引数に自身の名前を入れると、Clientオブジェクトに直接アクセスする場合と同様そのクライアント自身を指します。JavaScript fooという名前のMember (=Clientのコンストラクタにfooを入力したクライアント) にアクセスするには、
member() の引数に自身の名前を入れると、Clientオブジェクトに直接アクセスする場合と同様そのクライアント自身を指します。fooという名前のMember (=Clientのコンストラクタにfooを入力したクライアント) にアクセスするには、 Memberクラスから実際にそれぞれのデータにアクセスする方法は次ページ以降で説明します。
このクライアント自身もMemberの1つですが、Client自体がMemberを継承したクラスになっているので、直接Clientのオブジェクト(wcli)に対して操作すればよいです。
Memberクラスおよびこれ以降説明する各種データ型のクラス (いずれも webcface::Field を継承している) について、
現在サーバーに接続されているメンバーのリストが得られます (無名のものと、自分自身を除く)
C++ Client::members() で取得できます。
wcfMemberList, wcfMemberListW にchar*の配列とサイズを渡すと、メンバーの一覧を取得できます。 JavaScript Client.members() で取得できます。
Python Client.members() で取得できます
C++
Member::exists() で、指定した名前のメンバーが存在するかどうかを調べることができます。
また、 Member::connected() で、指定した名前のメンバーが接続中かどうかを調べることができます。 WebCFaceではメンバーが切断したあともサーバーにデータが残っており受信できる場合がありますが、その場合はexists()はtrueですがconnected()はfalseを返します。
新しいメンバーが接続されたときに呼び出されるコールバックを設定できます
このクライアントが接続する前から存在したメンバーについては start(), waitConnection() 時に一度に送られるので、 コールバックの設定はstart()より前に行うと良いです。
C++ 2.0 引数にMemberを受け取る関数オブジェクトを Client::onMemberEntry() に設定することができます。 新しく接続したMemberの情報が引数に渡されます。
2.9 Member::onConnect() で、指定した名前のメンバーが接続されたときに実行するコールバックを設定できます。 onConnect はonMemberEntryの直後に呼び出されます。 また、メンバーが一度切断された後再接続された場合も呼び出されます。
2.9 Member::onDisconnect() で、指定した名前のメンバーが切断されたときに実行するコールバックを設定できます。 cpp wcli.member("foo").onDisconnect([](webcface::Member m){/* ... */});
C
wcfMemberEntryEvent, wcfMemberEntryEventW で引数に const char * と void * をとる関数ポインタをコールバックとして設定できます。
新しく接続したMemberの名前が引数に渡されます。 void*引数には登録時に任意のデータのポインタを渡すことができます。(使用しない場合はNULLでよいです。)
wcfWaitConnection() を使う場合、 クライアントはサーバーに接続し、発見したすべてのメンバーについてMemberEntryEventのコールバックを呼んでからreturnします。
JavaScript 引数にMemberを受け取る関数を Client.onMemberEntry() に設定することができます。 新しく接続したMemberの情報が引数に渡されます。
イベントの管理には eventemitter3 ライブラリを使用しており、 Client.onMemberEntry プロパティが返す EventTarget クラスのオブジェクトがEventEmitterのラッパーになっています。
on(関数) または addListener(関数) でコールバックを設定し、 off(関数) または removeListener(関数) で解除したりできます。 また once(関数) で1回だけ実行されるコールバックを設定できます。
Python 引数にMemberを受け取る関数を Client.on_member_entry() に設定することができます。 新しく接続したMemberの情報が引数に渡されます。
2.0
デコレータとして使うこともできます。
2.0 Client.wait_connection() を使う場合、 クライアントはサーバーに接続し、発見したすべてのメンバーについてon_member_entryコールバックを呼んでからreturnします。
C++では EventTarget クラスのオブジェクトを返します。 内部ではイベントの管理に eventpp ライブラリを使用しており、EventTargetは eventpp::CallbackList のラッパーとなっています。
appendListener(), prependListener() でコールバックを追加できます。 またinsertListener()でこれまでに追加されたコールバックのリストの途中にコールバックを挿入したり、 removeListener() でコールバックを削除したりできます。
1.7 appendListener, prependListener ではコールバックの引数が不要な場合は引数のない関数も渡すことができます。
1.11 wcli.onMemberEntry().callbackList() でeventpp::CallbackListのインスタンスが得られ、 CounterRemover, ConditionalRemover などeventppに用意されているさまざまなユーティリティ機能を使用できます。 より詳細な使い方はeventppのドキュメントを参照してください。 (この場合コールバックの引数は省略できません)
これ以降の章でもいくつかイベントが登場しますが、いずれもこれと同様の実装、使い方になっています。
Pythonでは client.on_member_entry プロパティが blinker ライブラリの signal を返します。
connect(関数) でコールバックを設定できます。
以下のようなクライアントの情報を取得できます。 (WebUI の Connection Info に表示されているのと同じ情報が取得できます)
"cpp", Pythonのライブラリ(webcface-python)は"python", JavaScriptのライブラリ(webcface-js)は"js"を返します。member.libVersion(), member.libName(), member.remoteAddr() で取得できます。wcfMemberLibVersion(wcli, name), wcfMemberLibName(wcli, name), wcfMemberRemoteAddr(wcli, name) で取得できます。member.libVersion, member.libName, member.remoteAddr で取得できます。member.lib_version, member.lib_name, member.remote_addr で取得できます。クライアントの通信速度を取得できます。(単位はms) ここでは通信速度とはサーバーとクライアントの間で1往復データを送受信するのにかかる遅延です。
通信速度の情報は5秒に1回更新され、更新されたときにonPingイベントが発生します
C++ Member::pingStatus() でmemberの通信速度(int型)を取得できます。 デフォルトの状態ではpingの情報は受信しておらずstd::nulloptを返しますが、 pingStatusに1回アクセスすることでpingの情報がリクエストされ、それ以降は値が送られてくるようになります。
また、 Member::onPing() でpingの情報が更新された時に実行するコールバックを設定できます。 onPing()を使うことでもリクエストが送られます。
2.0
onPing().appendListener(...)wcli.pingStatus(), wcli.onPing(...))C
wcfMemberPingStatus, wcfMemberPingStatusW でmemberの通信速度を取得できます。
また、 wcfMemberPingEvent, wcfMemberPingEventW で引数に const char * と void * をとる関数ポインタをコールバックとして設定できます。 void*引数には登録時に任意のデータのポインタを渡すことができます。(使用しない場合はNULLでよいです。)
JavaScript Member.pingStatus でmemberの通信速度を取得できます。 デフォルトの状態ではpingの情報は受信しておらずnullを返しますが、 pingStatusに1回アクセスすることでpingの情報がリクエストされ、それ以降は値が送られてくるようになります。
また、 Member.onPing でpingの情報が更新された時に実行するコールバックを設定できます。 onPingを使うことでもリクエストが送られます。
wcli.pingStatus, wcli.onPing)Python Member.ping_status でmemberの通信速度(int型)を取得できます。 デフォルトの状態ではpingの情報は受信しておらずNoneを返しますが、 ping_statusに1回アクセスすることでpingの情報がリクエストされ、それ以降は値が送られてくるようになります。
また、 Member.on_ping() でpingの情報が更新された時に実行するコールバックを設定できます。 on_ping()を使うことでもリクエストが送られます。
2.0
on_ping.connect(...)wcli.ping_status, wcli.on_ping(...))