ADVERTISEMENT AND DICOVERY


基本的には、[ここ](https://allseenalliance.org/developers/learn/core/system-description/advertisement-discovery)の要約。

# 概要

* AllJoynのシステムは、以下の仕組みを提供する。
    * Providerは、自身のサービスをAllJoynのネットワーク越しに宣伝(Advertise)する。
    * Consumerは、Providerが宣伝したサービスを発見(Discovery)し利用する。
* Wi-Fiのような、下位層のネットワークを複数サポートする。
* AllJoynは、AdvertiseとDiscoverの仕組みを実現するために、IPマルチキャストを利用している。
* AllJoynのアプリケーションからは、Discoveryの詳細動作が隠蔽されている。
* AllJoynルーターは、IP送信を利用したトランスポート固有のDiscoveryをサポートする。
* アプリケーションは、AllJoynのフレームワークを使って、以下に示すAdvertiseとDiscoveryの手段の一つを使うことができる。
    * Name-based Discovery
        * well-known nameまたは、固有名を使う。
    * Announcement-based Discovery
        * AllJoynのインタフェース名を使う。

## v14.06におけるDiscoveryの拡張

* より効率的にデバイスやアプリを発見するために、NGNSを使って機能が拡張された。
* NGNSは、`mDNS`ベースのDiscoveryプロトコルであり、Discoveryメッセージに含まれるAllJoynインタフェースを特定することができる。
* mDNSベースのプロトコルは、Discoveryの応答をユニキャストで行うように設計されているので、マルチキャストに比べて、トラフィックを低減させるなど、パフォーマンスの面で優れている。
* デバイスアプリの死活確認に、mDNSベースのpingメッセージが追加された。

(注) NGNSとは、Next Generatoin Name Serviceの略らしい。

# 従来(14.06以前)の名前ベースのDiscovery

* AllJoynルーターは、name-basedのサービスDiscoveryを可能にする、`Name Service`をサポートしている。
* `Name Service`は、IPネットワーク上で動作するUDPベースのDiscoveryプロトコル。
* `Name Service`は、`IS-AT`と`WHO-HAS`メッセージを提供する。これらのメッセージは、DiscoverとAdvertiseのために、`well-known name`を配送する。
* これらのメッセージは、IPマルチキャストで配送される。
* AllJoyn Frameworkのためのマルチキャストアドレスとポート番号は、IANAにより登録されている。
    * IPv4 Multicast group address : 224.0.0.113
    * IPv6 Multicast group address : FF0X::13A
    * Multicast port number : 9956
* `IS-AT`メッセージは、Providerが送信し、`WHO-HAS`メッセージはConsumerが送信するメッセージ。

# IS-AT

* `IS-AT`は、`well-known name`または固有名を使ってAllJoynのサービスをAdvertiseするために使う。
* 一つの`IS-AT`には、複数の`well-known name`または固有名のリストを含めることができる。
* `IS-AT`メッセージは、`Adv_Validity_Period `コンフィグパラメータによって指定された、`well-known name`の有効期間を指定する。
* AllJoynルーターは、IPマルチキャストで定期的に`IS-AT`メッセージを送信する。送信期間は、Providerの`Adv_Msg_Retransmit_Interval`コンフィグパラメータによって定められる。
* `IS-AT`メッセージは、受信した`WHO-HAS`メッセージに対する応答としても送信される。Consumerに、直ちにサービスの存在を通知することにより、Discoverの時間を最小化するためでもある。

# WHO-HAS

* `WHO-HAS`メッセージは、`well-knonw name`または固有名を使って、複数のAllJoynサービスを発見するためのメッセージ。
* `IS-AT`と似ていて、複数の`well-known name`または固有名のリストを含めることができる。
* 完全な`well-known name`の代わりに、`well-known name`のプレフィックスも含めることができる。
    * 例えば、`WHO-HAS`に含まれたプレフィックスが`org.alljyon.chat`の場合、`IS-AT`メッセージにてAdvertiseされた`org.alljoyn.chat._123456.Joe`にマッチする。
* `WHO-HAS`メッセージは、Wi-Fiネットワークの衝突を計算に入れ、時々繰り返し送信する。
* 以下のパラメータは、送信に関するパラメータ。
    * Disc_Msg_Number_Of_Retries
    * Disc_Msg_Retry_Interval
* `WHO-HAS`メッセージは、最初の送信後、`Disc_Msg_Retry_Interval`毎に、`Disc_Msg_Number_Of_Retries`回送信される。
* 利用者は、`WHO-HAS`メッセージのレスポンスで、`IS-AT`メッセージを受信することができる。

# 利用者側のAllJoynルーターの振舞い

name-basedのDiscoveryの、利用者側におけるAllJoynルータの振舞は以下のようになる。

1. FindAdvertisedName(WKN or WKN prefix)が、アプリから呼び出される。
2. `WHO-HAS`メッセージを送信する。
3. AllJoynネットワークの、IPマルチキャストグループに対して、`WHO-HAS`メッセージを送信する。
4. IPマルチキャストグループに対してListenする。
5. 受信した`IS-AT`メッセージを検査する。
6. `WHO-HAS`に含まれるWKN/WKN prefixが、受信した`IS-AT`に含まれるWKNにマッチするか確認する。
    7. マッチする場合は次へ。
    8. マッチしない場合は、5へ。
9. FoundAdvertisedName(WNK)をアプリにコールバックする。

# メッセージのシーケンス

以下は、name-based Discoveryのシナリオ。

* IP接続がすでに確立されているときのDiscovery
* 信頼性のないネットワーク上でのDiscovery
* IP接続の確立が遅延する場合のDiscovery
* IP接続の切断によるwell-known nameの喪失
* Provider（サービス提供者）が、well-known nameをキャンセルした場合
* Consumer（サービス利用者）が、well-known nameによるDiscoveryをキャンセルした場合

## IP接続が既に確立されているときのDiscovery

* 典型的な正常系シーケンス。
* ProviderとConsumerは、ともにIP接続が確立している。
* IPマルチキャストで、最初の`WHO-HAS`メッセージが送信されると、Providerは、すぐさま`IS-AT`メッセージを送信する。

## 信頼性のないネットワーク上でのDiscovery

* 信頼性のないネットワーク上で、`WHO-HAS`メッセージが喪失してしまうパターン。
* `WHO-HAS`メッセージは、`Disc_Msg_Number_Of_Retries`パラメータとと、`Disc_Msg_Retry_Interval`パラメータに基づき、リトライする。

## IP接続の確立が遅延する場合のDiscovery

* Consumerデバイスの、AllJoynネットワークのAPへの接続が遅延する。`WHO-HAS`メッセージの送信が完了した後、APへの接続が完了するパターン。
* このパターンは、Consumerデバイスが、新しいAllJoynのネットワークにちょうど参加したときに発生し得る。
* AllJoynルーターは、`FoundAdvertiseName`を呼び出す。

## IP接続の切断によるwell-known nameの喪失

WIP

## Provider（サービス提供者）が、well-known nameをキャンセルした場合

WIP

## Consumer（サービス利用者）が、well-known nameによるDiscoveryをキャンセルした場合

WIP