«前の日記(2013年07月21日) 最新 次の日記(2013年08月11日)» 編集

日々をアレコレ


2013年07月29日

.NET Gadgeteerでウェブサーバー

2013/07/27のハッカソンでネットワーク関係でいろいろと苦労したのでお勉強。調べてみたら意外と簡単だったのでメモ。

SpiderとEthernet J11Dモジュールをつないでやった状態で、Setting up Ethernet on the .NET Gadgeteer - Pete Brown's 10rem.netGetting 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でデータを添付してリクエストを送る。レスポンスに関しては見ていない。こんな感じでブラウザとのデータのやり取りが出来るので、覚えるとブラウザから組み込み機器を操作することが可能になる。


«前の日記(2013年07月21日) 最新 次の日記(2013年08月11日)» 編集