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
"で接続すると
LocalFileSystem(MBED本体のFlashメモリ)は/にマウントされているので、"http://192.168.1.68/MBED.HTM
"とするとmbedのホームページに行きます。
"http://192.168.1.68/sample.htm
"で接続するとサンプルのHTMLを表示します。
(EthernetInterfaceになったからか、画像の読み込みが速いような気がします。)
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しないように)