SimpleHandler

Dependencies:   EthernetInterface HttpServer mbed-rpc mbed-rtos mbed TextLCD

新しいEthenetInterfaceを使ったHTMLServerを作りました。なるべくいじらなくて過去(EthernetEthの時代)と同様のことをします。

Thank You

新しいライブラリを作成するのにDonatien Garnier(@donatien )さん、Suga koubou(@okini3939 )さん、Norimasa Okamoto(@va009039 )さんのコードおよび記事を大変参考にさせて頂いています。

注意事項

まだ、すべてをチェックしているわけではありません。

環境

mbed LPC 1768 + ☆Board Orangeを使用する前提で書いています。
他のベースボードを使用する場合はTextLCDのアドレスを代えたり、削除等すればご利用できると思います。
FSとしてLocalFileSystemでチェックしています。このページのtest.htm,mbedrpc.js,sample.htm,sample.jpgは、mbedのローカルストレージに保存してください。

DEMO実行に必要なファイル

各ファイルをmbedのLocalFileSystemに保管してください。
mbedrpc.js /media/uploads/yueee_yt/mbedrpc.js
test.htm  /media/uploads/yueee_yt/test.htm
sample.htm   /media/uploads/yueee_yt/sample.htm
sample.jpg /media/uploads/yueee_yt/sample.jpg

HTTP Server

以前と同様SimpleHandler,FSHandler,RPCHandlerが利用できます。
RPCのJavaScript経由の場合は、このページにあるファイルを使用してください。

//#define DNS_SERVER_ADDRESS(ipaddr)        (ip4_addr_set_u32(ipaddr, ipaddr_addr("208.67.222.222"))) /* resolver1.opendns.com */
#include "mbed.h"
#include "rtos.h"
#include "EthernetInterface.h"
#include "HTTPServer.h"
#include "mbed_rpc.h"
#include "TextLCD.h"
EthernetInterface eth;

DigitalOut led4(LED4);
 
LocalFileSystem local("local"); 
void LcdWrite(Arguments* arg, Reply* r); 
 
TextLCD lcd(p24, p26, p27, p28, p29, p30);

void aliveState(void const *args) {
    while (true) {
        led4 = !led4;
        Thread::wait(1000);
    }
}

int main()
{
    printf("********* PROGRAM START ***********\r\n");
    Thread thread(aliveState);
    RPC::add_rpc_class<RpcDigitalOut>();
    RPC::construct<RpcDigitalOut, PinName, const char*>(LED1, "led1");  
    RPC::construct<RpcDigitalOut, PinName, const char*>(LED2, "led2");  
    RPC::construct<RpcDigitalOut, PinName, const char*>(LED3, "led3");  
    RPCFunction rpcFunc(LcdWrite, "LcdWrite");
    lcd.cls();
    lcd.locate(0,0);

    printf("EthernetInterface Setting up...\r\n");
    if(eth.init()!=0) {                             //for DHCP Server
    //if(eth.init(IPAddress,NetMasks,Gateway)!=0) { //for Static IP Address
        printf("EthernetInterface Initialize Error \r\n");
        return -1;
    }
    if(eth.connect()!=0) {
        printf("EthernetInterface Connect Error \r\n");
        return -1;
    }
    printf("IP Address is %s\r\n", eth.getIPAddress());
    printf("NetMask is %s\r\n", eth.getNetworkMask());
    printf("Gateway Address is %s\r\n", eth.getGateway());
    printf("Ethernet Setup OK\r\n");

    HTTPServerAddHandler<SimpleHandler>("/hello");
    FSHandler::mount("/local", "/");
    HTTPServerAddHandler<FSHandler>("/");
    HTTPServerAddHandler<RPCHandler>("/rpc");
    lcd.locate(0,0);
    lcd.printf("%s",eth.getIPAddress());
    HTTPServerStart(80);
}

void LcdWrite(Arguments* arg, Reply* r) 
{
    lcd.locate(0,1);
    lcd.printf("%s",arg->argv[0]);
}

液晶の1段目にDHCPでGetしたIPアドレスを表示するので、web Browserで、接続します。この例では、192.168.1.68になります。

SimpleHandlerが/helloになっているので、"http://192.168.1.68/hello"で接続すると
/media/uploads/yueee_yt/simplehandler.jpg

LocalFileSystem(MBED本体のFlashメモリ)は/にマウントされているので、"http://192.168.1.68/MBED.HTM"とするとmbedのホームページに行きます。

"http://192.168.1.68/sample.htm"で接続するとサンプルのHTMLを表示します。
(EthernetInterfaceになったからか、画像の読み込みが速いような気がします。)
/media/uploads/yueee_yt/samplehtm.jpg

RPC経由で led2を光らすには "http://192.168.1.68/rpc/led2/write 1"とすればLED2が光ります
消すにはもちろん"http://192.168.1.68/rpc/led2/write 0"とします。(空白は半角1スペース)。
RPCの設定はNorimasa Okamoto(@va009039 )のhttp://d.hatena.ne.jp/va009039/20130214/p1を参考にしました。
mbedは、プログラム中にHTMLを書かかなくて対応できるのが楽ですね。
最後のWebのTextBoxに英数字をいれ送信を押すとTextLCDの下段に表示されます。(RPCFunction のサンプル)

"http://192.168.1.68/test.htm"では、RPCをJavaScriptを使ってweb上から実行します。使い方は今までと一緒です。
(RPCに対しての命令とかが少し異なっていたので修正しています。 たとえば (旧)/DigitalOut/new,LED1 → (新) /DigitalOut/new LED1 LED1 です。
https://mbed.org/users/okini3939/notebook/RPC_jp/を参考に。)

test.htm

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp"> 
<title>mbed test web</title>
<script  type="text/javascript" src="mbedRPC.js" language="javascript"></script>
<script type="text/javascript">
            mbed = new HTTPRPC();
            led1 = new DigitalOut(mbed, LED1);
            led2 = new DigitalOut(mbed, LED2);
            led3 = new DigitalOut(mbed, LED3);
lcd = new RPCFunction(mbed,"LcdWrite");
          
</script>
</head>
<body>
<button type="submit" ID="btn_LED1a" onclick="led1.write(1)">LED1点灯</button> <br >
<button type="submit" ID="btn_LED2a" onclick="led2.write(1)">LED2点灯</button> <br >
<button type="submit" ID="btn_LED3a" onclick="led3.write(1)">LED3点灯</button> <br >
<br>
<button type="submit" ID="btn_LED1b" onclick="led1.write(0)">LED1消灯</button> <br >
<button type="submit" ID="btn_LED2b" onclick="led2.write(0)">LED2消灯</button> <br >
<button type="submit" ID="btn_LED3b" onclick="led3.write(0)">LED3消灯</button> <br >
<br>

<input type="text" id="textbox" ></input><button onclick="lcd.run(textbox.value);">送信</button> <br>

</body>
</html>


参考

ファイル名は8.3形式しか使用できないので拡張子は"*.htm"になっています。
USBHost MSD(beta)はうまく動いていません。USBHostにもRTOSのライブラリがあってリンクでエラーが発生します。
SDカードも動作しませんでした。
LocalFileSystemは、mbedで読み出すたびにPCから切り離されるので、少し面倒です。

今後は

IEEE1888サーバを実装予定です。
ファイルシステムに負荷をかけると止まります。リロードを繰り返すとmbedが止まります。原因を探ります。

履歴

2014/02/22 RPCHandlerのバグ(test.htmを複数回呼ぶと無応答)修正FSの問題らしい
2014/02/25 test.htmを軽くしました。(Reloadしないように)