試したサンプルはこちら。
https://allseenalliance.org/developers/develop/run-sample-apps/basic
実行環境
- VirtualBox上のUbuntu 14.04で試してみた。
- AllJoynのバージョンは、v14.12。
basicは何をやるサンプルか?
ローカルのネットワーク越しに以下のようなことをしてくれる。
-
basic_client
が、basic_service
に対して2つの単語Hello
とWorld
を渡す。 -
basic_service
は、それらの単語を連結した文字列Hello World
を、basic_client
に返してくれる。
ビルド
ここに従ってビルドした。
ビルドすると、以下の場所にバイナリが生成される。今回使うのは (*) のプログラム。
build/linux/x86/debug/dist/cpp/bin/samples/
├── AboutClient
├── AboutClient_legacy
├── AboutService
├── AboutService_legacy
├── basic_client <= (*)
├── basic_service <= (*)
├── chat
├── FileTransferClient
├── FileTransferService
├── nameChange_client
├── SampleDaemon
├── sample_rule_app
├── signalConsumer_client
└── signal_service
動かしてみる
basic_service
を起動する。
$ LD_LIBRARY_PATH=$AJ_ROOT/build/linux/x86/debug/dist/cpp/lib ./basic_service
AllJoyn Library version: v14.12.000.
AllJoyn Library build info: AllJoyn Library v14.12.000 (Built Thu Oct 15 03:27:58 UTC 2015 by thina - Git: alljoyn.git branch: '(detached from v14.12)' tag: 'v14.12' (+0 changes) commit ref: 0d71b216bb3a3cadc615c3eda6f8200093c5e117).
Interface created.
BusAttachment started.
RegisterBusObject succeeded.
ObjectRegistered has been called.
Connect to 'null:' succeeded.
NameOwnerChanged: name=org.alljoyn.Bus.sample, oldOwner=<none>, newOwner=:fKWGJuRH.2.
RequestName('org.alljoyn.Bus.sample') succeeded.
BindSessionPort succeeded.
Advertisement of the service name 'org.alljoyn.Bus.sample' succeeded.
basic_client
を動かす。何やらERROR NETWORK
というエラーが発生しているようだが、とりあえず気にしない。(bindに失敗している模様。)
$ LD_LIBRARY_PATH=$AJ_ROOT/build/linux/x86/debug/dist/cpp/lib ./basic_client
AllJoyn Library version: v14.12.000.
AllJoyn Library build info: AllJoyn Library v14.12.000 (Built Thu Oct 15 03:27:58 UTC 2015 by thina - Git: alljoyn.git branch: '(detached from v14.12)' tag: 'v14.12' (+0 changes) commit ref: 0d71b216bb3a3cadc615c3eda6f8200093c5e117).
Interface 'org.alljoyn.Bus.sample' created.
BusAttachment started.
0.728 ****** ERROR NETWORK common/os/posix/Socket.cc:346 | Binding (sockfd = 41) to 0.0.0.0 9955: 98 - Address already in use: ER_OS_ERROR
BusAttachment connected to 'null:'.
BusListener Registered.
org.alljoyn.Bus.FindAdvertisedName ('org.alljoyn.Bus.sample') succeeded.
Waited 0 seconds for JoinSession completion.
0.737 ****** ERROR NETWORK common/os/posix/Socket.cc:346 | Binding (sockfd = 53) to 0.0.0.0 9955: 98 - Address already in use: ER_OS_ERROR
FoundAdvertisedName(name='org.alljoyn.Bus.sample', prefix='org.alljoyn.Bus.sample')
FoundAdvertisedName(name='org.alljoyn.Bus.sample', prefix='org.alljoyn.Bus.sample')
NameOwnerChanged: name='org.alljoyn.Bus.sample', oldOwner='<none>', newOwner=':fKWGJuRH.2'.
JoinSession SUCCESS (Session id=549605507).
JoinSession SUCCESS (Session id=-681846617).
'org.alljoyn.Bus.sample.cat' (path='/sample') returned 'Hello World!'.
Basic client exiting with status 0x0000 (ER_OK).
basic_client
は、AllJoynのネットワークへの参加(Join)成功後、Hello
とWorld
という文字列を投げる。
basic_service
は、basic_client
が送信してきたHello
とWorld
を連結して、basic_client
にレスポンスを返している。
パケットをキャプチャしてみる
ネットワーク上の動きを見てみるために、パケットをキャプチャしてみる。
これは、ADVERTISEMENT AND DISCOVERYの仕組みをパケットを観測することにより、理解を深めるためにやってみた。
ちなみに、tcpdump
のコマンドは以下。(邪魔なsshのパケットは無視している。)
$ sudo tcpdump -i eth0 -nX not port 22
パケットの詳細解析は別途やるとして、ざっくり列挙してみる。
Advertisement and Discovery に、プロトコルの詳細の説明があるので、合わせて読む。
- 起動直後は、
basic_service
・basic_client
ともに以下の挙動。(若干パケットの内容は異なる。)- マルチキャストアドレス
224.0.0.113
に、何か送信する。 - ブロードキャストアドレス
10.0.2.225
に、何か送信する。 - マルチキャストアドレス
ff02::13a
に、何か送信する。
- マルチキャストアドレス
- 送信間隔を徐々に広げながら、上記を繰り返す。
- 使用しているプロトコルは以下のようだ。(Wireshark上の表記)
- ALLJOYN-NS
- IPv4マルチキャスト
- IPv6マルチキャスト
- ブロードキャスト
- MDNS
- ICMPv3
- ICMPv6
- ALLJOYN-NS
-
Hello
とか、World
という文字列は暗号化されていて、パケットからは観測することはできなかった。
キャプチャしたパケットは、以下にある。
https://github.com/toshiyukihina/alljoyn-sample-packets