2013年07月29日
● .NET Gadgeteerでウェブサーバー
2013/07/27のハッカソンでネットワーク関係でいろいろと苦労したのでお勉強。調べてみたら意外と簡単だったのでメモ。
SpiderとEthernet J11Dモジュールをつないでやった状態で、Setting up Ethernet on the .NET Gadgeteer - Pete Brown's 10rem.netとGetting Started with .NET Gadgeteer > 4. Web Messenger > A Gadgeteer Web Server : Safari Books Onlineを参考に、以下の様なソースにしたらとりあえずOK。
public partial class Program { Gadgeteer.Networking.WebEvent event; void ProgramStarted() { #if false // DCHPによるアドレス取得 ethernet_J11D.UseDHCP(); #else // 静的にIPアドレスなどを設定 ethernet_J11D.UsetStaticIP("IPアドレス","サブネットマスク","ゲートウェイ"); #endif // イベントハンドラ登録 ethernet_J11D.NetworkDown += ethernet_J11D_NetworkDown; ethernet_J11D.NetworkUp += ethernet_J11D_NetworkUp; } void ethernet_J11D_NetworkDown(GTM.Module.NetworkModule sender, GTM.Module.NetworkModule.NetworkState state) { Gadgeteer.Networking.WebServer.StopLocalServer(); Debug.Print("Network Down"); } void ethernet_J11D_NetworUp(GTM.Module.NetworkModule sender, GTM.Module.NetworkModule.NetworkState state) { Debug.Print("Network Up"); Gadgeteer.Networking.WebServer.StartLocalServer(ehternet_J11D.NetworkSettings.IPAdress, 80); event = Gadgeteer.Networking.WebServer.SetupWebEvent("hello"); event.WebEventReceived += event_WebEventReceived; } void event_WebEventReceived(string path, WebServer.HttpMethod method, Responder responder) { responder.Respond("hello!"); } }
これで実行して、IPアドレス/helloに対してブラウザからアクセスるとテキストで「Hello!」と表示される。WebServer.SetupWebEvent()メソッドで渡しているのがURLのパスに相当していて、上のソースだと「hello」となる。試してないけど、長いパスだったり、スレッシュで区切られたものでも多分問題ないのかも。で、ブラウザから、IPアドレス/パスでアクセスするとパスに対応したWebReceiveEventが発生するので、その処理を行う。Responder.Respond()メソッドがクライアントに対する応答に。引数がstringならtext/plainで、Streamならaudio/mp3で、Gadgeteer.Pictureならimage/bitmapで応答を返し、byte配列と、文字列によるMIMEの指定も可能。もし、固定のHTMLの文字列をtext/htmlで返答する場合、テンプレートとなるHTML文書をテキスト形式でプロジェクトに追加して、リソースとして登録しておくと便利かも。たとえば、HtmlTemp.txtという名前で返答の基本となるHTML文書を保存したとき、プロジェクトのプロパティ内の「リソース」から「リソースの追加」を選択して、作成したHtmlTemp.txtを選択して追加。その後、次のようにするとHtmlTemp.txtの内容をそのまま返答として返すことができる。
void event_WebEventReceived(string path, WebServer.HttpMethod method, Responder responder) { byte[] contents = new System.Text.UTF8Encoding().GetBytes(Resources.GetString(Resources.StringResources.HtmlTemp); responder.Respond(contents, "text/html"); }
● JavaScriptで非同期通信
Gadgeteerにつながったデバイスをネットワーク経由で操作するのに、Gadgeteerがウェブサーバーになってしまえばブラウザから操作できるっていうことで、そのためにはJavaScriptを使えばいろいろできるかと思って勉強したのでメモ。
<html> <head> <script type="text/javascript"> function sendData(var1, var2) { var req = new XMLHttpRequest(); req.open("POST", "送信先"); req.send("var1=" + var1 + "&var2=" + var2); } </script> </head> <body> <form> <input type="button" value="0,1" onclick="sendData(0,1)"> <input type="button" value="2,3" onclick="sendData(2,3)"> </form> </body> </html>
このソースだと、ボタンが2つ表示されて、最初のボタンは送信先に対してPOSTでvar1=0、var2=1でデータを添付してリクエストを送る。レスポンスに関しては見ていない。こんな感じでブラウザとのデータのやり取りが出来るので、覚えるとブラウザから組み込み機器を操作することが可能になる。