test1

Dependencies:   mbed HTTPServer EthernetNetIf FatFileSystemCpp

Committer:
solarca2
Date:
Wed Sep 02 05:58:09 2020 +0000
Revision:
0:0ca3ad47fc8e
test1
;

Who changed what in which revision?

UserRevisionLine numberNew 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 }