2012年7月1日日曜日

mbedでHTTPサーバの構築

こんにちは。まるさ@maruuusa83です。
 暑くてたまらんです。

 Ethernetに接続できるように頑張っていたら、mbedがHTTPサーバになるという噂を聞きました。(mbedの紹介: http://maruuusa.blogspot.jp/2012/06/mbed.html)
52mm*26mmしかない恐ろしく小さいサーバです。こわい。
さらに、クエリ(?)のようなものを組んでmbedをHTTP越しに遠隔制御することもできるようです。こわい。

というわけで早速サーバとして立ち上げてみました。 ルータでローカルネットワークを組み、PCとmbetをつなぎます。PCでmbed内に保存したHTMLファイルを閲覧できれば成功、とします。

 mbed開発はWeb上に大量の情報がありますが、 ライブラリを用いるときなぜかリンクがうまく行かなかったり、なぜかメソッド引数が違う形になっていたりすることが多いので
ImportのProgramsから必要ライブラリがインポートされていそうなプロジェクトをインポートしたほうがスムーズに進みます。

今回は「http://mbed.org/users/donatien/programs/HTTPServerHelloWorld/60fqd」を用いました。
Import画面のImportAsでProgramにチェックを入れるのを忘れないでください。 これをしないと大変なことになります。

このプロジェクトでサーバの立ち上げに必要なライブラリのインポートどころか、プログラムのベースになる部分まで全て書かれています。便利です。
あとはこれを必要な形に書き換えていくだけです。

ローカルネットワークへの接続やリスニングの開始などは既にやってくれているので、
今回プログラム中で必要な設定は以下の項目で済みます。
・HTMLファイルを保存するためのローカルファイルシステムの設定
・設定したローカルファイルシステムへハンドルの割り当て

 実際に設定したソースコードがこれです。
デバッグプリントをLCDに表示させてるあたりが少し異なりますが無視でOKです。

HTTPClientHelloWorld.cpp
#include "mbed.h"
#include "EthernetNetIf.h"
#include "HTTPServer.h"
#include "TextLCD.h" //LCD用

EthernetNetIf eth;  
HTTPServer svr;

DigitalOut led1(LED1);
TextLCD lcd(p24, p25, p26, p27, p28, p29, p30); //LCDの設定

LocalFileSystem fs("webfs"); //ファイルシステムの設定

int main() {
  lcd.cls();
  lcd.printf("Setting up...\n");
  EthernetErr ethErr = eth.setup();
  if(ethErr)
  {
    lcd.cls();
    lcd.printf("Error %d in setup.\n", ethErr);
    return -1;
  }
  lcd.cls();
  lcd.printf("Setup OK\n");
  
  FSHandler::mount("/webfs", "/"); //ここで /webfs をWebパスのルートに割り当てる
//  svr.addHandler("/hello"); //これはとりあえず不要
  svr.addHandler("/"); //デフォルトのハンドラ
  svr.bind(80); //80ポートでサーバスタート
  
  lcd.cls();
  lcd.printf("Listening...\n");
    
  Timer tm;
  tm.start();
  //Listen indefinitely
  while(true)
  {
    Net::poll();
    if(tm.read()>.5)
    {
      led1=!led1; //Show that we are alive
      tm.start();
    }
  }
  
  return 0;
}

これでサーバとして動くことができます。
たったこれだけです。楽勝です。

ところで、mbedにはどうやってLANケーブルをつなぐのでしょうか。
これもまた簡単なんですね。
33~36ピンにRDの±、TDの±があります。LANケーブル用ソケット(パルストランス付)を買ってきて、それぞれをそれぞれのピンにつなぐだけです(雑)。
仕様書を見れば絶対書いてあるのですぐわかると思います。
僕はソケットがブレッドボードに合わなかったので少し手を加えて使いました。

さて
次に、表示するためのHTMLファイルを作ります。面倒なので適当にちょちょーっと書いてしまいます。

index.html
<html>
    <head>
        <title>TEST!</title>
    </head>

    <body>
        <h5>Hello, World!</h5>
    </body>
</html>

ひどくショボいページなのは気にしない。

最後に、ルータの設定。内のデバイスがmbedにアクセスできるように80ポートを開放します。これはルータごとに設定方法が異なるので各自頑張ってください。

これでHTTPサーバが完成しました!!
mbedのIPにブラウザからHTTPでアクセスしてみましょー!
http://mbedのIPアドレス/

こんな感じで地味なページが出たら成功です!
なんの面白みもないです!

次回はHTTPでmbedを制御する方法を紹介します。
RPCと言うんでしょうか。名前はよく知らないです。

0 件のコメント:

コメントを投稿