SSブログ

golangでUPnPのポートフォワーディングをしてみる1 [プログラミング]

P2Pのソフトを作る上でルーターに穴を開けないといけなくなった。その点でUPnPを使うのが楽かなと思い、そこらへんの調査をしてみた。

Golangで実際動くものをと思ってミニマムなコードをでっち上げた。参考にしたコードは以下。

https://qiita.com/KyojiOsada/items/bc381b3058715d4011d2
https://github.com/syncthing/syncthing/blob/master/lib/upnp/upnp.go



めんどうなのでコメントを入れなかったけど、短いので逐一調べてもそれほど時間はかからないと思う。とりあえずSSDPを発行して、ルータの情報が入っているXMLのパスが入っているので、それはこれで取れる。

メッセージを送って受けるだけのミニマムなコードなのでわかりにくいことはないとは思うのですが、やっぱりXMLをパースしてパスを抽出するところまで書けばよかったかな?

ただ受け側の問題があり、SSDPのメッセージが複数届くので、そこのところを勘案すると少し面倒なのかもしれない。それにルーターだけではなく別のクライアントからも来るのでそれを見分けないと。タイミング的に他のメッセージが来た時にそれをはじくべく内容で選別しないといけないのです。でも、単純にこれという文字列がよく分からないんだよなぁ。それもルーターから複数くるので面倒臭い。

結局、Location: のなんとか.xmlを取ってくればよくて、ルーターからのメッセージには必ず(?)入っているので、ルータとわかるメッセージであれば何でもいいんですがね。決定的なタグの文字列があればいいんだけど…。

その中に書いてあるXMLのパスのXMLに使えるアクションが書かれているので、あったらそれを使うという具合になっているようです。別にXMLをダウンロードしてきて調べなくても、あると思って決め打ちでも動きそうなので、XMLをパースする作業はここではしません。後で考えることにします。




グローバルアドレスを取ってくるとかならあったりするのだけれど、下のところほど情報がなくて実際にどうしたらいいのか分からなかった。

http://manabu.quu.cc/up/6/e62532.htm

ここまで詳しく書いてくれていたら誰でも分かって嬉しい。上のサイトでポートマッピングのやり方がわかったんだけど、とりあえずグローバルアドレスを得ないとピアのクライアントに教えることもできないので、とりあえずルーターのIPがわかっている体でGolangのソースを書いて実際に取得してみる。

ん?なんかXMLの階層がへんな感じがする。他の無線LANルーターのXMLを見てみる。全然構造が違うじゃねぇか。普通XMLを使う時には、構造が規定されているため、所定の手続きをすれば同じタイプのXMLであればアクセスできるのだが、構造が違ったら順にタグの名前を辿って行く方法が使えない。

しょうがないので
SCPDURL
controlURL
eventSubURL
のタグ名で検索して、中の文字列を取ってくるやり方しかなさそうだね。バッティングしなければいいのだけれど…。普通はそういう使い方をしないので、サンプルがそういうのがないみたい。リファレンスの内容からスクラッチしないといけないのはしんどいな。

パースした体でメッセージを送ろうとしたけど、結局XMLを解析しなくてはいけないので、やっぱパースを後にするのはやめた。そもそもルーターごとに全然違う状況になっているから、文字列を決め打ちでやっても動作確認しかできない。




思ったよりも面倒くさくて一回で終わらなかった。次でXMLをパースして、そこから送り場所を得て、グローバルIPを取りたいと思う。そこからのポート開けのスマホからの別回線の確認をしてみたいと思う。

タグ:Golang
コメント(0) 

Twitterまとめ投稿 2019/07/14 [Twitter]


コメント(0)