golangでUPnPのポートフォワーディングをしてみる3−不定形のXMLをどうにかしたい [プログラミング]
前回、とりあえずXMLをパースする方針ができました。できたのですが、ルーターのXMLには数々の問題があり一筋縄にはいきません。問題を挙げておきます。
1. XMLが定型ではなく、ルーターによって構造がまちまち。
2. XMLがUTF-8でない場合があって読み込み時にエラーが出る。
というかなりクソッタレな状況になっていて、まともにUPnPを使ってポートフォワーディングができる状況ではありません。各メーカーが決まりを守っていれば問題ないのですが、やりたい放題でまともに動く状況になってはいません。
自分の状況を述べますと、無線LANルーターを二つ見ました。NECのAtermとIOデータのWN-G300Rです。AtermはXMLの構造がどうにも深くて、Golangでは構造体を規定してのデータ取り込みが困難でした。このネスト構造が本当にXMLのフォーマットとして規定されているものなのか疑問に思い、他のルーターを見てみました。
WN-G300Rを見てみると、ネストもそんなに深くなくシンプルだったので、Atermの深さがちょっと異常というのが何となく分かりました。その後のパースを比較的シンプルなXMLだったWN-G300Rに変えて検証してみていると、UTF-8以外のコードが含まれており、やり方によってはGolangで以下のようなエラーが出てしまうのでした。
そもそもXMLのURLをブラウザでアクセスしても、パーシングでエラーが出ていたのでおかしいなとは思ってはいたのです。
IOデータの作った技術者が日本語エディタかなんかで編集してUTF-8の設定にしていなかったんですね、たぶん。そうじゃないとUTF-8外のデータが入り込むということは考えにくい。技術者だったら日本語の取り扱いぐらいは慎重にしておくべきですよね。ちょっと恥ずかしい。
XMLの形がちょっと独自すぎたり、そもそもXMLの体をなしていなかったりするので、正直言ってUPnPをポートフォワーディングで使うのは厳しい。問題を乗り越えるのにすべきことはいくつかあり、それを全部乗り越えるには正規の手続きではやりにくいと思われます。やれることとしては
・XMLにUTF-8以外のキャラクターが出てきても無視できるようにする。
・XMLの構造はあてにできないので、タグを一つ一つクロールして該当の部分だけ抜き出す。
ぐらいのものでしょうか。ポートフォワードが可能でなくても、決め打ちでメッセージを発行できるところはあるものの、ルーターごとに違う設定になっている部分はやっぱりXMLから抽出しないとできないので、パーシングは必要不可欠なのです。というか、完全に開発者のXMLの理解不足がアダとなっているなこりゃ。
そんなわけで、UPnPが可能としているルーターでも、UPnPをイネイブルにしたところでちっとも反応しないという状況が眼に浮かぶわけで。だから、あるソフトを使ってUPnPを有効にしたルーターで上手くいかないとしても何の疑いもなく動かないということはあり得るということをみなさんにも知っていただきたい。
とりあえずAtermのXMLはUTF-8ではあるので、それで動くかどうか確かめてみましょう。というか、こんな適当すぎる杜撰な仕様のソフトは一般的なんでしょうかね。まぁUPnPの成り立ちが微妙なのは否めませんけど。
1. XMLが定型ではなく、ルーターによって構造がまちまち。
2. XMLがUTF-8でない場合があって読み込み時にエラーが出る。
というかなりクソッタレな状況になっていて、まともにUPnPを使ってポートフォワーディングができる状況ではありません。各メーカーが決まりを守っていれば問題ないのですが、やりたい放題でまともに動く状況になってはいません。
自分の状況を述べますと、無線LANルーターを二つ見ました。NECのAtermとIOデータのWN-G300Rです。AtermはXMLの構造がどうにも深くて、Golangでは構造体を規定してのデータ取り込みが困難でした。このネスト構造が本当にXMLのフォーマットとして規定されているものなのか疑問に思い、他のルーターを見てみました。
WN-G300Rを見てみると、ネストもそんなに深くなくシンプルだったので、Atermの深さがちょっと異常というのが何となく分かりました。その後のパースを比較的シンプルなXMLだったWN-G300Rに変えて検証してみていると、UTF-8以外のコードが含まれており、やり方によってはGolangで以下のようなエラーが出てしまうのでした。
panic: XML syntax error on line 15: illegal character code U+0018
そもそもXMLのURLをブラウザでアクセスしても、パーシングでエラーが出ていたのでおかしいなとは思ってはいたのです。
XML パースエラー: 整形式になっていません。 URL: http://192.168.1.202:49152/wps_device.xml 行番号: 11, 列番号: 18:bLy -----------------^
IOデータの作った技術者が日本語エディタかなんかで編集してUTF-8の設定にしていなかったんですね、たぶん。そうじゃないとUTF-8外のデータが入り込むということは考えにくい。技術者だったら日本語の取り扱いぐらいは慎重にしておくべきですよね。ちょっと恥ずかしい。
XMLの形がちょっと独自すぎたり、そもそもXMLの体をなしていなかったりするので、正直言ってUPnPをポートフォワーディングで使うのは厳しい。問題を乗り越えるのにすべきことはいくつかあり、それを全部乗り越えるには正規の手続きではやりにくいと思われます。やれることとしては
・XMLにUTF-8以外のキャラクターが出てきても無視できるようにする。
・XMLの構造はあてにできないので、タグを一つ一つクロールして該当の部分だけ抜き出す。
ぐらいのものでしょうか。ポートフォワードが可能でなくても、決め打ちでメッセージを発行できるところはあるものの、ルーターごとに違う設定になっている部分はやっぱりXMLから抽出しないとできないので、パーシングは必要不可欠なのです。というか、完全に開発者のXMLの理解不足がアダとなっているなこりゃ。
そんなわけで、UPnPが可能としているルーターでも、UPnPをイネイブルにしたところでちっとも反応しないという状況が眼に浮かぶわけで。だから、あるソフトを使ってUPnPを有効にしたルーターで上手くいかないとしても何の疑いもなく動かないということはあり得るということをみなさんにも知っていただきたい。
とりあえずAtermのXMLはUTF-8ではあるので、それで動くかどうか確かめてみましょう。というか、こんな適当すぎる杜撰な仕様のソフトは一般的なんでしょうかね。まぁUPnPの成り立ちが微妙なのは否めませんけど。
タグ:Golang
コメント 0