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);
}

GSwifiInterface library へ戻る


Please log in to post comments.