test1
Dependencies: mbed HTTPServer EthernetNetIf FatFileSystemCpp
HTTPSer_USB.cpp@0:0ca3ad47fc8e, 2020-09-02 (annotated)
- Committer:
- solarca2
- Date:
- Wed Sep 02 05:58:09 2020 +0000
- Revision:
- 0:0ca3ad47fc8e
test1
;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
solarca2 | 0:0ca3ad47fc8e | 1 | /* |
solarca2 | 0:0ca3ad47fc8e | 2 | RPC - リモートプロシージャコール |
solarca2 | 0:0ca3ad47fc8e | 3 | RPC (Remote Procedure Call)とは、プログラムから別のアドレス空間(別のCPUだったり、ネットワーク越しのPCだったり)にあるプログラムを実行する技術。 |
solarca2 | 0:0ca3ad47fc8e | 4 | |
solarca2 | 0:0ca3ad47fc8e | 5 | mbedのRPCコマンドの形式は次のとおりです。 |
solarca2 | 0:0ca3ad47fc8e | 6 | /<Object Name>/<Method Name> |
solarca2 | 0:0ca3ad47fc8e | 7 | |
solarca2 | 0:0ca3ad47fc8e | 8 | "/" だけ送ると、使用できるObject Nameを返します。 |
solarca2 | 0:0ca3ad47fc8e | 9 | |
solarca2 | 0:0ca3ad47fc8e | 10 | "/<Object Name>" だけ送ると、使用できるMethod Nameを返します。 |
solarca2 | 0:0ca3ad47fc8e | 11 | |
solarca2 | 0:0ca3ad47fc8e | 12 | RPC Over HTTP |
solarca2 | 0:0ca3ad47fc8e | 13 | |
solarca2 | 0:0ca3ad47fc8e | 14 | ウェブブラウザからも RPC を使用して、 mbed のハードウェアをコントロールすることができます。 |
solarca2 | 0:0ca3ad47fc8e | 15 | グローバルIPアドレス(WAN)で使う場合はセキュリティ機能(認証など)を載せたほうがいいでしょう。 |
solarca2 | 0:0ca3ad47fc8e | 16 | Information |
solarca2 | 0:0ca3ad47fc8e | 17 | |
solarca2 | 0:0ca3ad47fc8e | 18 | HTTP経由のRPCコマンドの形式は http://<url of mbed>/rpc/<Object name>/<Method name> <Arguments separated by spaces> |
solarca2 | 0:0ca3ad47fc8e | 19 | |
solarca2 | 0:0ca3ad47fc8e | 20 | svr.addHandler<RPCHandler>("/rpc"); |
solarca2 | 0:0ca3ad47fc8e | 21 | |
solarca2 | 0:0ca3ad47fc8e | 22 | Sample |
solarca2 | 0:0ca3ad47fc8e | 23 | |
solarca2 | 0:0ca3ad47fc8e | 24 | http://192.168.0.123/rpc/DigitalIn/new p5 myport |
solarca2 | 0:0ca3ad47fc8e | 25 | これはmbedのプログラムで |
solarca2 | 0:0ca3ad47fc8e | 26 | DigitalIn myport(p5); |
solarca2 | 0:0ca3ad47fc8e | 27 | を実行したのと同じです。 |
solarca2 | 0:0ca3ad47fc8e | 28 | 成功すると myport と返ってきます。 |
solarca2 | 0:0ca3ad47fc8e | 29 | |
solarca2 | 0:0ca3ad47fc8e | 30 | http://192.168.0.123/rpc/myport/read |
solarca2 | 0:0ca3ad47fc8e | 31 | これはmbedのプログラムで |
solarca2 | 0:0ca3ad47fc8e | 32 | myport.read(); |
solarca2 | 0:0ca3ad47fc8e | 33 | を実行したのと同じです。 |
solarca2 | 0:0ca3ad47fc8e | 34 | ポートの状態 0 または 1 が返ってきます。 |
solarca2 | 0:0ca3ad47fc8e | 35 | |
solarca2 | 0:0ca3ad47fc8e | 36 | ※ 192.168.0.123 はユーザーの環境に合わせてください。 |
solarca2 | 0:0ca3ad47fc8e | 37 | |
solarca2 | 0:0ca3ad47fc8e | 38 | また、上のプログラムは mbed のUSBストレージ(USBメモリ)にもアクセスできますので RPCを使ったhtmlファイルを入れておくといいでしょう。 |
solarca2 | 0:0ca3ad47fc8e | 39 | Sample |
solarca2 | 0:0ca3ad47fc8e | 40 | |
solarca2 | 0:0ca3ad47fc8e | 41 | http://192.168.0.123/files/mbed.htm |
solarca2 | 0:0ca3ad47fc8e | 42 | |
solarca2 | 0:0ca3ad47fc8e | 43 | webブラウザから |
solarca2 | 0:0ca3ad47fc8e | 44 | http://192.168.0.123/rpc/led3/write 1 |
solarca2 | 0:0ca3ad47fc8e | 45 | とするとLED3 が点灯することを確認する。 |
solarca2 | 0:0ca3ad47fc8e | 46 | |
solarca2 | 0:0ca3ad47fc8e | 47 | http://192.168.0.123/rpc/led3/write 0 |
solarca2 | 0:0ca3ad47fc8e | 48 | とするとLED3 が消灯する。 |
solarca2 | 0:0ca3ad47fc8e | 49 | |
solarca2 | 0:0ca3ad47fc8e | 50 | */ |
solarca2 | 0:0ca3ad47fc8e | 51 | |
solarca2 | 0:0ca3ad47fc8e | 52 | #include "mbed.h" |
solarca2 | 0:0ca3ad47fc8e | 53 | #include "EthernetNetIf.h" |
solarca2 | 0:0ca3ad47fc8e | 54 | #include "HTTPServer.h" |
solarca2 | 0:0ca3ad47fc8e | 55 | #include "MSCFileSystem.h" |
solarca2 | 0:0ca3ad47fc8e | 56 | |
solarca2 | 0:0ca3ad47fc8e | 57 | #define FSNAME "msc" |
solarca2 | 0:0ca3ad47fc8e | 58 | MSCFileSystem msc(FSNAME); |
solarca2 | 0:0ca3ad47fc8e | 59 | |
solarca2 | 0:0ca3ad47fc8e | 60 | //EthernetNetIf eth; |
solarca2 | 0:0ca3ad47fc8e | 61 | |
solarca2 | 0:0ca3ad47fc8e | 62 | EthernetNetIf eth( |
solarca2 | 0:0ca3ad47fc8e | 63 | IpAddr(172,16,3,150), //IP Address 172.16.3.130 to 172.16.3.150 |
solarca2 | 0:0ca3ad47fc8e | 64 | IpAddr(255,255,0,0), //Network Mask |
solarca2 | 0:0ca3ad47fc8e | 65 | // IpAddr(172,16,0,254), //Gateway |
solarca2 | 0:0ca3ad47fc8e | 66 | // IpAddr(172,168,3,10) //DNS |
solarca2 | 0:0ca3ad47fc8e | 67 | IpAddr(172,16,3,150), //Gateway |
solarca2 | 0:0ca3ad47fc8e | 68 | IpAddr(172,16,3,150) //DNS |
solarca2 | 0:0ca3ad47fc8e | 69 | ); |
solarca2 | 0:0ca3ad47fc8e | 70 | |
solarca2 | 0:0ca3ad47fc8e | 71 | HTTPServer svr; |
solarca2 | 0:0ca3ad47fc8e | 72 | |
solarca2 | 0:0ca3ad47fc8e | 73 | Serial pc(USBTX,USBRX); |
solarca2 | 0:0ca3ad47fc8e | 74 | |
solarca2 | 0:0ca3ad47fc8e | 75 | DigitalOut led1(LED1,"led1"); |
solarca2 | 0:0ca3ad47fc8e | 76 | DigitalOut led2(LED2,"led2"); |
solarca2 | 0:0ca3ad47fc8e | 77 | DigitalOut led3(LED3,"led3"); |
solarca2 | 0:0ca3ad47fc8e | 78 | DigitalOut led4(LED4,"led4"); |
solarca2 | 0:0ca3ad47fc8e | 79 | |
solarca2 | 0:0ca3ad47fc8e | 80 | int main() { |
solarca2 | 0:0ca3ad47fc8e | 81 | |
solarca2 | 0:0ca3ad47fc8e | 82 | DIR *d; |
solarca2 | 0:0ca3ad47fc8e | 83 | struct dirent *p; |
solarca2 | 0:0ca3ad47fc8e | 84 | |
solarca2 | 0:0ca3ad47fc8e | 85 | pc.printf("Setting up...\n"); |
solarca2 | 0:0ca3ad47fc8e | 86 | EthernetErr ethErr = eth.setup(); |
solarca2 | 0:0ca3ad47fc8e | 87 | if(ethErr) |
solarca2 | 0:0ca3ad47fc8e | 88 | { |
solarca2 | 0:0ca3ad47fc8e | 89 | pc.printf("Error %d in setup.\n", ethErr); |
solarca2 | 0:0ca3ad47fc8e | 90 | return -1; |
solarca2 | 0:0ca3ad47fc8e | 91 | } |
solarca2 | 0:0ca3ad47fc8e | 92 | pc.printf("Setup OK\n"); |
solarca2 | 0:0ca3ad47fc8e | 93 | |
solarca2 | 0:0ca3ad47fc8e | 94 | FSHandler::mount("/" FSNAME "/web", "/web"); //Mount /usb path on web root path |
solarca2 | 0:0ca3ad47fc8e | 95 | d = opendir("/" FSNAME "/web"); |
solarca2 | 0:0ca3ad47fc8e | 96 | |
solarca2 | 0:0ca3ad47fc8e | 97 | pc.printf("\nList of files on the flash drive:\n"); |
solarca2 | 0:0ca3ad47fc8e | 98 | if ( d != NULL ) |
solarca2 | 0:0ca3ad47fc8e | 99 | { |
solarca2 | 0:0ca3ad47fc8e | 100 | while ( (p = readdir(d)) != NULL ) |
solarca2 | 0:0ca3ad47fc8e | 101 | { |
solarca2 | 0:0ca3ad47fc8e | 102 | pc.printf(" - %s\n", p->d_name); |
solarca2 | 0:0ca3ad47fc8e | 103 | } |
solarca2 | 0:0ca3ad47fc8e | 104 | } |
solarca2 | 0:0ca3ad47fc8e | 105 | else |
solarca2 | 0:0ca3ad47fc8e | 106 | { |
solarca2 | 0:0ca3ad47fc8e | 107 | pc.printf("Could not open directory!"); |
solarca2 | 0:0ca3ad47fc8e | 108 | error("Could not open directory!"); |
solarca2 | 0:0ca3ad47fc8e | 109 | } |
solarca2 | 0:0ca3ad47fc8e | 110 | |
solarca2 | 0:0ca3ad47fc8e | 111 | |
solarca2 | 0:0ca3ad47fc8e | 112 | |
solarca2 | 0:0ca3ad47fc8e | 113 | Base::add_rpc_class<DigitalOut>(); |
solarca2 | 0:0ca3ad47fc8e | 114 | //svr.addHandler<SimpleHandler>("/"); //Default handler |
solarca2 | 0:0ca3ad47fc8e | 115 | svr.addHandler<FSHandler>("/web"); //Default handler |
solarca2 | 0:0ca3ad47fc8e | 116 | //svr.addHandler<FSHandler>("/"); //Default handler |
solarca2 | 0:0ca3ad47fc8e | 117 | svr.addHandler<RPCHandler>("/rpc"); |
solarca2 | 0:0ca3ad47fc8e | 118 | svr.bind(80); |
solarca2 | 0:0ca3ad47fc8e | 119 | printf("Listening... n"); |
solarca2 | 0:0ca3ad47fc8e | 120 | |
solarca2 | 0:0ca3ad47fc8e | 121 | Timer tm; |
solarca2 | 0:0ca3ad47fc8e | 122 | tm.start(); |
solarca2 | 0:0ca3ad47fc8e | 123 | //Listen indefinitely |
solarca2 | 0:0ca3ad47fc8e | 124 | while(true) |
solarca2 | 0:0ca3ad47fc8e | 125 | { |
solarca2 | 0:0ca3ad47fc8e | 126 | Net::poll(); |
solarca2 | 0:0ca3ad47fc8e | 127 | } |
solarca2 | 0:0ca3ad47fc8e | 128 | |
solarca2 | 0:0ca3ad47fc8e | 129 | return 0; |
solarca2 | 0:0ca3ad47fc8e | 130 | } |