test1
Dependencies: mbed HTTPServer EthernetNetIf FatFileSystemCpp
Diff: HTTPSer_USB.cpp
- Revision:
- 0:0ca3ad47fc8e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HTTPSer_USB.cpp Wed Sep 02 05:58:09 2020 +0000 @@ -0,0 +1,130 @@ +/* +RPC - リモートプロシージャコール +RPC (Remote Procedure Call)とは、プログラムから別のアドレス空間(別のCPUだったり、ネットワーク越しのPCだったり)にあるプログラムを実行する技術。 + +mbedのRPCコマンドの形式は次のとおりです。 +/<Object Name>/<Method Name> + +"/" だけ送ると、使用できるObject Nameを返します。 + +"/<Object Name>" だけ送ると、使用できるMethod Nameを返します。 + +RPC Over HTTP + +ウェブブラウザからも RPC を使用して、 mbed のハードウェアをコントロールすることができます。 +グローバルIPアドレス(WAN)で使う場合はセキュリティ機能(認証など)を載せたほうがいいでしょう。 +Information + +HTTP経由のRPCコマンドの形式は http://<url of mbed>/rpc/<Object name>/<Method name> <Arguments separated by spaces> + +svr.addHandler<RPCHandler>("/rpc"); + +Sample + +http://192.168.0.123/rpc/DigitalIn/new p5 myport + これはmbedのプログラムで + DigitalIn myport(p5); + を実行したのと同じです。 + 成功すると myport と返ってきます。 + +http://192.168.0.123/rpc/myport/read + これはmbedのプログラムで + myport.read(); + を実行したのと同じです。 + ポートの状態 0 または 1 が返ってきます。 + +※ 192.168.0.123 はユーザーの環境に合わせてください。 + +また、上のプログラムは mbed のUSBストレージ(USBメモリ)にもアクセスできますので RPCを使ったhtmlファイルを入れておくといいでしょう。 +Sample + +http://192.168.0.123/files/mbed.htm + +webブラウザから +http://192.168.0.123/rpc/led3/write 1 +とするとLED3 が点灯することを確認する。 + +http://192.168.0.123/rpc/led3/write 0 +とするとLED3 が消灯する。 + +*/ + +#include "mbed.h" +#include "EthernetNetIf.h" +#include "HTTPServer.h" +#include "MSCFileSystem.h" + +#define FSNAME "msc" +MSCFileSystem msc(FSNAME); + +//EthernetNetIf eth; + +EthernetNetIf eth( + IpAddr(172,16,3,150), //IP Address 172.16.3.130 to 172.16.3.150 + IpAddr(255,255,0,0), //Network Mask +// IpAddr(172,16,0,254), //Gateway +// IpAddr(172,168,3,10) //DNS + IpAddr(172,16,3,150), //Gateway + IpAddr(172,16,3,150) //DNS +); + +HTTPServer svr; + +Serial pc(USBTX,USBRX); + +DigitalOut led1(LED1,"led1"); +DigitalOut led2(LED2,"led2"); +DigitalOut led3(LED3,"led3"); +DigitalOut led4(LED4,"led4"); + +int main() { + + DIR *d; + struct dirent *p; + + pc.printf("Setting up...\n"); + EthernetErr ethErr = eth.setup(); + if(ethErr) + { + pc.printf("Error %d in setup.\n", ethErr); + return -1; + } + pc.printf("Setup OK\n"); + + FSHandler::mount("/" FSNAME "/web", "/web"); //Mount /usb path on web root path + d = opendir("/" FSNAME "/web"); + + pc.printf("\nList of files on the flash drive:\n"); + if ( d != NULL ) + { + while ( (p = readdir(d)) != NULL ) + { + pc.printf(" - %s\n", p->d_name); + } + } + else + { + pc.printf("Could not open directory!"); + error("Could not open directory!"); + } + + + + Base::add_rpc_class<DigitalOut>(); + //svr.addHandler<SimpleHandler>("/"); //Default handler + svr.addHandler<FSHandler>("/web"); //Default handler + //svr.addHandler<FSHandler>("/"); //Default handler + svr.addHandler<RPCHandler>("/rpc"); + svr.bind(80); + printf("Listening... n"); + + Timer tm; + tm.start(); + //Listen indefinitely + while(true) + { + Net::poll(); + } + + return 0; +}