UPnPの実装

  • UDPでSSDPグループに参加する

  • UDPでSSDPグループからデバイスを検索する

  • TCPでルーターへリクエストを送る

UPnPを実装しよう

概要は説明した通りです。実際に実装してみましょう。サンプル実装を以下におきました。

実際に作ってもらうのが、もっとも効果的です。しかし、そんな時間がない方がほとんどでしょう。また、UPnP用のライブラリを利用するので、実装をする必要がないという方もいることでしょう。

なので、本章では実際に実装しながら、処理の流れを解説していきます

注意

Dart を利用するのてすが、Socket API は、hetimanetを使用します。2015/6/1において、Dart用に提供されている socketは、"chrome api ver1 " "chrome api ver2"、"dart:io"等いくつかあります。

利用するAPIに依存しないように、hetimanetでsocketを再定義して対応することにしました。

SSDPグループに参加する

通常、UDP Socketを生成して、IPが"239.255.255.250"、Portが"1900"のグループに参加します。 参加することで、SSDPグループに追加されたデバイス等が把握できるようになったり、グループに参加していないデバイスを無視したりできるようになります。

しかし、Chrome Socketから、上手く動作できなかったので、今回は、グループに参加していません。

(1) UDPソケットを生成する。

まずは、UDPソケットを生成しましょう。こんな感じです。

「bind ok」とコンソールに文字が表示されれば成功です。

(2) SSDPグループからデバイスを検索する

無事にUDPソケットを生成できる事を確認できたら、次はSSDPグループに、ポートマップに対応できるデバイスがないか依頼を出します。

先ほど生成したUDPSocketを利用して、"239.255.255.250"、Portが"1900"に 以下のメッセージを送っているだけです。

難しい事はないですね。これで、UPnPに対応したルーターが存在していれば、前の章で説明した。タグを含むxmlファイルを取得できます。

(3) グローバルIPを取得する

ルーターへ依頼をだせるようになりました。試しに、ルーターにGlobal IPについて問い合わせて見ましょう。

UPnPに対応しているルーターは、TCPサーバーが立ち上がっています。TCPサーバーへリクエストを送ります。

前章で説明した値を、pathとbodyに設定すれば無事リクエストを送信できます。

作成したライブラリは以下の通り

  • ルータを発見する

  • ポートマッピングする

  • グローバルアドレスを調べる

  • ポートマッピングする

  • グローバルアドレスを調べる

Kyorohiro work

http://kyorohiro.strikingly.com

Last updated