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しないように)

Files at this revision

API Documentation at this revision

Comitter:
yueee_yt
Date:
Sat Feb 22 05:55:58 2014 +0000
Parent:
4:155c6ff99458
Commit message:
Remove USB MSD!(donot work)
; mbed-rtos is to double registration(in USBHost).

Changed in this revision

HttpServer.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 155c6ff99458 -r bfa9878aa274 HttpServer.lib
--- a/HttpServer.lib	Fri Feb 21 07:42:20 2014 +0000
+++ b/HttpServer.lib	Sat Feb 22 05:55:58 2014 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/yueee_yt/code/HttpServer/#1b6b021ee21d
+http://mbed.org/users/yueee_yt/code/HttpServer/#b8f6a11c70db
diff -r 155c6ff99458 -r bfa9878aa274 main.cpp
--- a/main.cpp	Fri Feb 21 07:42:20 2014 +0000
+++ b/main.cpp	Sat Feb 22 05:55:58 2014 +0000
@@ -5,16 +5,18 @@
 #include "HTTPServer.h"
 #include "mbed_rpc.h"
 #include "TextLCD.h"
+
 EthernetInterface eth;
 
 DigitalOut led4(LED4);
- 
-LocalFileSystem local("local"); 
-   void LcdWrite(Arguments* arg, Reply* r);    //ADD Here!!
- 
+
+LocalFileSystem local("local");
+void LcdWrite(Arguments* arg, Reply* r);    //ADD Here!!
+
 TextLCD lcd(p24, p26, p27, p28, p29, p30);
 
-void aliveState(void const *args) {
+void aliveState(void const *args)
+{
     while (true) {
         led4 = !led4;
         Thread::wait(1000);
@@ -26,16 +28,16 @@
     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");  
+    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"); //ADD Here!!
-  lcd.cls();
+    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
+        //if(eth.init(IPAddress,NetMasks,Gateway)!=0) { //for Static IP Address
         printf("EthernetInterface Initialize Error \r\n");
         return -1;
     }
diff -r 155c6ff99458 -r bfa9878aa274 mbed.bld
--- a/mbed.bld	Fri Feb 21 07:42:20 2014 +0000
+++ b/mbed.bld	Sat Feb 22 05:55:58 2014 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/869cf507173a
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/ed8466a608b4
\ No newline at end of file