test1

Dependencies:   mbed HTTPServer EthernetNetIf FatFileSystemCpp

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers HTTPSer_USB.cpp Source File

HTTPSer_USB.cpp

00001 /* 
00002 RPC - リモートプロシージャコール
00003 RPC (Remote Procedure Call)とは、プログラムから別のアドレス空間(別のCPUだったり、ネットワーク越しのPCだったり)にあるプログラムを実行する技術。 
00004 
00005 mbedのRPCコマンドの形式は次のとおりです。
00006 /<Object Name>/<Method Name>
00007 
00008 "/" だけ送ると、使用できるObject Nameを返します。
00009 
00010 "/<Object Name>" だけ送ると、使用できるMethod Nameを返します。
00011 
00012 RPC Over HTTP
00013 
00014 ウェブブラウザからも RPC を使用して、 mbed のハードウェアをコントロールすることができます。
00015 グローバルIPアドレス(WAN)で使う場合はセキュリティ機能(認証など)を載せたほうがいいでしょう。
00016 Information
00017 
00018 HTTP経由のRPCコマンドの形式は http://<url of mbed>/rpc/<Object name>/<Method name> <Arguments separated by spaces>
00019 
00020 svr.addHandler<RPCHandler>("/rpc"); 
00021 
00022 Sample
00023 
00024 http://192.168.0.123/rpc/DigitalIn/new p5 myport
00025     これはmbedのプログラムで
00026     DigitalIn myport(p5);
00027     を実行したのと同じです。
00028     成功すると myport と返ってきます。
00029  
00030 http://192.168.0.123/rpc/myport/read
00031     これはmbedのプログラムで
00032     myport.read();
00033     を実行したのと同じです。
00034     ポートの状態 0 または 1 が返ってきます。
00035 
00036 ※ 192.168.0.123 はユーザーの環境に合わせてください。
00037 
00038 また、上のプログラムは mbed のUSBストレージ(USBメモリ)にもアクセスできますので RPCを使ったhtmlファイルを入れておくといいでしょう。
00039 Sample
00040 
00041 http://192.168.0.123/files/mbed.htm
00042 
00043 webブラウザから
00044 http://192.168.0.123/rpc/led3/write 1
00045 とするとLED3 が点灯することを確認する。
00046 
00047 http://192.168.0.123/rpc/led3/write 0
00048 とするとLED3 が消灯する。
00049 
00050 */
00051 
00052 #include "mbed.h"
00053 #include "EthernetNetIf.h"
00054 #include "HTTPServer.h"
00055 #include "MSCFileSystem.h"
00056 
00057 #define FSNAME "msc"
00058 MSCFileSystem msc(FSNAME);
00059 
00060 //EthernetNetIf eth;
00061 
00062 EthernetNetIf eth(
00063   IpAddr(172,16,3,150), //IP Address 172.16.3.130 to 172.16.3.150
00064   IpAddr(255,255,0,0), //Network Mask
00065 //  IpAddr(172,16,0,254), //Gateway
00066 //  IpAddr(172,168,3,10)  //DNS
00067   IpAddr(172,16,3,150), //Gateway
00068   IpAddr(172,16,3,150)  //DNS
00069 );
00070 
00071 HTTPServer svr;
00072 
00073 Serial pc(USBTX,USBRX);
00074 
00075 DigitalOut led1(LED1,"led1");
00076 DigitalOut led2(LED2,"led2");
00077 DigitalOut led3(LED3,"led3");
00078 DigitalOut led4(LED4,"led4");
00079 
00080 int main() {
00081 
00082     DIR *d;
00083     struct dirent *p;
00084 
00085     pc.printf("Setting up...\n");
00086     EthernetErr ethErr = eth.setup();
00087     if(ethErr)
00088     {
00089         pc.printf("Error %d in setup.\n", ethErr);
00090         return -1;
00091     }
00092     pc.printf("Setup OK\n");
00093 
00094     FSHandler::mount("/" FSNAME "/web", "/web"); //Mount /usb path on web root path
00095     d = opendir("/" FSNAME "/web");
00096     
00097     pc.printf("\nList of files on the flash drive:\n");
00098     if ( d != NULL )
00099     {
00100         while ( (p = readdir(d)) != NULL )
00101         {
00102             pc.printf(" - %s\n", p->d_name);
00103         }
00104     }
00105     else
00106     {
00107         pc.printf("Could not open directory!");
00108         error("Could not open directory!");
00109     }
00110 
00111 
00112   
00113     Base::add_rpc_class<DigitalOut>();
00114     //svr.addHandler<SimpleHandler>("/"); //Default handler
00115     svr.addHandler<FSHandler>("/web"); //Default handler
00116     //svr.addHandler<FSHandler>("/"); //Default handler
00117     svr.addHandler<RPCHandler>("/rpc");
00118     svr.bind(80);
00119     printf("Listening... n");
00120 
00121     Timer tm;
00122     tm.start();
00123     //Listen indefinitely
00124     while(true)
00125     {
00126         Net::poll();
00127     }
00128   
00129   return 0;
00130 }