UPnP
初めに
UDPでマルチキャストしてデバイス発見、みたいなあたりに興味があったので、 大御所?っぽいUPnPについてざっくり調べてみた。
参考元は以下。
Device Architecture Documents » UPnP Forum -> UPnP Device Architecture version 2.0(PDF)
「ざっくり」というのは、自分の興味ある以下の部分に絞って流し読みをしたからだ。
これら以上のこと、たとえばXMLの要素とか使用ポート番号とか、そういうものは調べていない。
なぜこの部分だけ興味があるのかと言えば、類似のシステムを自分で作りたいからだ。 (もちろん、まんまUPnPだと車輪の再発明なのでする気はないが)
そのために既存の技術を調べ、どのような流れで成り立っているのか知りたいし、 名付けづらい部分は既存の用語をお借りしたい。(今回だとcontrol pointとか)
そういう背景なので、ご了承ください。
UPnPの用語
とりあえず気になった用語は以下だ。
仕様書の翻訳ではないので正確な定義は原本に譲るとして、 以下ではざっくりと自分なりの言葉で定義する。
- control point : deviceを使う人。
- device : serviceを提供する人。root deviceとembedded deviceがある。(embedded deviceは用語集に書かれていないが)
- service : いわゆるサービス。
- device description : deviceの詳細。中にどんなembedded deviceがあるかとか、どんなserviceをどんなURLで提供しているかとか。
- service description : serviceの詳細。どんなactionがあるかとか、どんなstate variableがあるかとか。
- action : control pointからserviceへのメソッド呼び出し。
- state variable : serviceのフィールド(メンバ変数)。変更時にeventを発行するものがある。
- event : serviceからの通知。購読(subscribe)すると飛んでくるものと、強制的にマルチキャストされてくるものがある。
- publisher : eventの発行者。今のところserviceのみ。
- subscriber : eventの購読者。普通はcontrol pointだが、deviceがなる場合もある。
つまり、登場人物としてはcontrol pointとdevice、あとはserviceがいる。
deviceはコンポジット構造+serviceを持っていて、 その定義がdevice descriptionに書かれている。
serviceはメソッドとしてaction、フィールドとしてstate variableを持っており、 その定義がservice descriptionに書かれている。
state variableにはobservableなものと非observableなものがある。
……オブジェクト指向的にはこんな感じだろうか。
UPnPのステップ
UPnPには、以下のステップがある。
- Addressing : control pointやdeviceにIPアドレスを割り当てる。
- Discovery : control pointがdeviceを発見する、探す。
- Description : control pointがdeviceやserviceのdescriptionを取得する。
- Control : control pointがserviceのactionを実行する。
- Eventing : control pointがserviceのstate variableを購読する。
- Presentation : control pointがdeviceの持つHTML画面を描画する? あまり興味がないので調べていない。
仕様書にはそれぞれに0~5の番号が振られているが、 実際にシーケンシャルに行う必要があるのはaddressing, discovery, descriptionくらいで、 control, eventing, presentationはdescriptionまで終われば順番に関係なく自由に実行してよさそうだ。
addressing, presentationはちょっと詳細すぎて興味がわかず、 description, controlはシンプルすぎて書くことがないので、 以下はdiscovery, eventingについてまとめる。
Discovery
discovery、と銘打たれているが、発見だけでなくその逆(紛失?*1)もこの範疇だ。
ざっくり以下の処理が登場する。
- Advertisement : deviceからcontrol pointへの存在通知。
- Search : control pointからdeviceへ放つソナー。
使われている単語をおおまかにピックアップしながら詳述すると、 advertisementには「ネットワーク上にいるよ!」と通知(advertise)するaliveと、 ネットワークからいなくなる際にadvertiseを取り消す(revokeする)byebyeがある。
deviceがネットワーク上にいる状態をavailable、いない状態をunavailableと言っているようだ。
searchにはrequestとresponseがあり、まあそのままだ。 ただしrequestはユニキャストもマルチキャストもできる。
TTLとかupdateとかもあるらしいがとりあえず端折る。
Eventing
eventingにはunicast eventingとmulticast eventingがある。 multicast eventingは何も考えずeventをズドーンとマルチキャストするだけで面白くないので、 ここではunicast eventingについて詳述する。
unicast eventingで登場する処理は以下4つだ。
- Subscribe : 制限時間付きでeventを購読する。(無制限も可能らしい)
- Renew : Subscribeの制限時間を延長する。
- Cancel : Subscribeしたeventの購読を中止する。
- Event : 発行されたeventの通知。(名詞と動詞があって紛らわしい)
図を見る限りでは、subscribeとrenewはresponseあり、他は一方通行。
subscribeのresponseでsubscription IDが割り当てられ、 以降のrenew, cancel, eventではそのIDを使ってやりとりするようだ。
まとめ
ものすごくさっくりとした、駆け足なUPnP旅行ではあったが、 参考にできる程度には用語を拾えたのではなかろうか。
類似システム構築の際に抽象化の助けとなればいいが。
もう一つ参考として、次はBLEあたりの仕様を読んでみたい。
*1:正直、この「発見の対義語」が欲しかったのだが、それっぽい言葉は見付からなかった