GSwifiInterface HTTP Server
.
GSwifiInterface HTTP Server
GainSpan Wi-Fiモジュール GS1011 向けライブラリ GSwifiInterface を使って、 mbed を HTTPサーバ(Webサーバ) と WebSocketサーバ にするサンプルです。
RTOS有効版:
Import programGSwifiInterface_HTTPServer_rtos
HTTP and WebSocket Server with RTOS for GSwifiInterface library Please see: https://mbed.org/users/gsfan/notebook/gswifiinterface_httpd/
RTOS無効版:
Import programGSwifiInterface_HTTPServer
HTTP Server with WebSocket Server for GSwifiInterface library Please see: https://mbed.org/users/gsfan/notebook/gswifiinterface_httpd/
Information
HTTPサーバは開発中のため予期せぬ動作をすることがあります。
また、クラッキングなどに対しては無防備です。
改良点などあれば Pull Request 等でお知らせください。
Configuration
まず、設定してください。
RTOS有効版
GSwifiInterface/GSwifi/GSwifi_conf.h
#define CFG_ENABLE_RTOS #define CFG_ENABLE_HTTPD #define CFG_ENABLE_WEBSOCKET //#define CFG_ENABLE_SMTP
Wi-FiモジュールやSDメモリーを接続したピン、Wi-Fiの環境等を設定します。
main.cpp
#define SEC GSwifi::SEC_WEP //#define SEC GSwifi::SEC_WPA_PSK #define SSID "SSPD" #define PASS "PASSPHRASE" : int main () { : // TXD, RXD, CTS, RTS, RESET, ALARM, BAUD gs = new GSwifiInterface(p13, p14, p12, P0_22, p21, NC, 9600); gs->init(); //Use DHCP // gs->init("192.168.1.2", "255.255.255.0", "192.168.1.1");
RTOS無効版
GSwifiInterface/GSwifi/GSwifi_conf.h
//#define CFG_ENABLE_RTOS #define CFG_ENABLE_HTTPD #define CFG_ENABLE_WEBSOCKET //#define CFG_ENABLE_SMTP
Wi-FiモジュールやSDメモリーを接続したピン、Wi-Fiの環境等を設定します。
main.cpp
#define SEC GSwifi::SEC_WEP //#define SEC GSwifi::SEC_WPA_PSK #define SSID "SSPD" #define PASS "PASSPHRASE" : LocalFileSystem local("local"); // LPC1768, LPC11U24 only SDFileSystem sd(p5, p6, p7, p8, "sd"); : // TXD, RXD, CTS, RTS, RESET, ALARM, BAUD GSwifi gs(p13, p14, p12, P0_22, p20, NC, 9600); // mbed LPC1768 //GSwifi gs(PTD3, PTD2, NC, PTD5, PTA13); // FRDM KL25Z : gs.setAddress(); //Use DHCP // gs.setAddress("192.168.1.50", "255.255.255.0", "192.168.1.1", "192.168.1.1");
HTTP access
httpdAttach() によりURIとファイル(ディレクトリ)を関連付けします。
上から順にマッチングされますので、短いURIは後のほうに書きます。
main.cpp
gs.httpdAttach("/cgi-bin/", &cgi); // call back function (CGI) gs.httpdAttach("/ws/", &ws_server, 1); // call back function (WebSocket) gs.httpdAttach("/test/", "/sd/www/"); // SDFileSystem gs.httpdAttach("/", "/local/"); // LocalFileSystem
ブラウザへURLを入力し、アクセスします。
http://IPアドレス/ http://IPアドレス/mbed.htm http://IPアドレス/test/ws.html http://IPアドレス/cgi-bin/hagehage
URLが"/"で終わる場合、自動的に"index.html"を探します。
HTML files
HTMLファイルや画像ファイルは、あらかじめmbedのストレージまたはSDメモリーカードへ入れておきます。
mbedストレージを使う場合、ファイル名は8.3形式にしておきます。(SDメモリーカードはロングファイル名対応)
WebSocket sample
WebSocketの動作をテストするサンプルです。
ws.html
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja-JP" lang="ja-JP"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <script> var ws_url = "ws://" + location.hostname + "/ws/echo"; var ws = null; function init() { ws = new WebSocket(ws_url); if (ws != null) { ws.addEventListener('open', openHandler); ws.addEventListener('close', closeHandler); ws.addEventListener('message', messageHandler); ws.addEventListener('error', errorHandler); } } function openHandler(){ log('WebSocket opened.'); } function closeHandler(){ log('WebSocket closed.'); } function messageHandler(responce){ log('Recieve: ' + responce.data); } function errorHandler(){ log('Error'); } function log(text){ document.getElementById('recieve-message').innerHTML += text + '\n'; } function sendButton(){ if (ws != null) { var message = document.getElementById('send-message').value; ws.send(message); log('Send: ' + message); document.getElementById('send-message').value = ''; } } function closeButton(){ if (ws != null) { ws.close(); ws = null; log('Close'); } } </script> <body onLoad="init()"> <h1>Websocket test</h1> <form> <input type="text" id="send-message" /> <input type="button" value="OK" onClick="sendButton()" /> <input type="button" value="Close" onClick="closeButton()" /> </form> <pre id="recieve-message"></pre> </body> </html>
CGI sample
CGIはコールバックにより実現します。
POSTされたデータは recv() で得ることができます。
リクエストされたURIやQUERY_STRINGを得ることもできます。
レスポンスは、HTMLヘッダも含めて send() で送信してください。
main.cpp
void cgi (int cid) { int i; char buf[100]; led2 = 1; i = gs.recv(cid, buf, sizeof(buf)); if (i < 0) return; buf[i] = 0; pc.printf("CGI %d: %s ? %s '%s' %d\r\n", cid, gs.httpdGetFilename(cid), gs.httpdGetQuerystring(cid), buf, i); gs.send(cid, "HTTP/1.1 200 OK\r\n", 17); gs.send(cid, "Content-type: text/plain\r\n", 26); gs.send(cid, "\r\n", 2); gs.send(cid, "BODY: ", 6); gs.send(cid, buf, strlen(buf)); gs.send(cid, "\r\n", 2); gs.close(cid); }
Please log in to post comments.