AllJoynに付属しているサンプルbasicを試してみる。


試したサンプルはこちら。
https://allseenalliance.org/developers/develop/run-sample-apps/basic

# 実行環境

* VirtualBox上のUbuntu 14.04で試してみた。
* AllJoynのバージョンは、v14.12。

# basicは何をやるサンプルか？

ローカルのネットワーク越しに以下のようなことをしてくれる。

- `basic_client`が、`basic_service`に対して２つの単語`Hello`と`World`を渡す。
- `basic_service`は、それらの単語を連結した文字列`Hello World`を、`basic_client`に返してくれる。

# ビルド

[ここ](https://wiki.allseenalliance.org/gateway/getting_started)に従ってビルドした。
ビルドすると、以下の場所にバイナリが生成される。今回使うのは (*) のプログラム。

```bash
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`を起動する。

```bash
$  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に失敗している模様。)

```bash
$  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](https://allseenalliance.org/developers/learn/core/system-description/advertisement-discovery)の仕組みをパケットを観測することにより、理解を深めるためにやってみた。

ちなみに、`tcpdump`のコマンドは以下。(邪魔なsshのパケットは無視している。)

```bash
 $ sudo tcpdump -i eth0 -nX not port 22
```

パケットの詳細解析は別途やるとして、ざっくり列挙してみる。[
Advertisement and Discovery](https://allseenalliance.org/developers/learn/core/system-description/advertisement-discovery#ngns-message-sequences) に、プロトコルの詳細の説明があるので、合わせて読む。

* 起動直後は、`basic_service`・`basic_client`ともに以下の挙動。（若干パケットの内容は異なる。）
    * マルチキャストアドレス`224.0.0.113`に、何か送信する。
    * ブロードキャストアドレス`10.0.2.225`に、何か送信する。
    * マルチキャストアドレス`ff02::13a`に、何か送信する。
* 送信間隔を徐々に広げながら、上記を繰り返す。
* 使用しているプロトコルは以下のようだ。(Wireshark上の表記)
    * ALLJOYN-NS
        * IPv4マルチキャスト
        * IPv6マルチキャスト
        * ブロードキャスト
    * MDNS
    * ICMPv3
    * ICMPv6
* `Hello`とか、`World`という文字列は暗号化されていて、パケットからは観測することはできなかった。

キャプチャしたパケットは、以下にある。
https://github.com/toshiyukihina/alljoyn-sample-packets