GainSpan Wi-Fi library see: http://mbed.org/users/gsfan/notebook/gainspan_wifi/
Dependents: GSwifi_httpd GSwifi_websocket GSwifi_tcpclient GSwifi_tcpserver ... more
Fork of GSwifi by
GainSpan Wi-Fi library
The GS1011 is an ultra low power 802.11b wireless module from GainSpan.
see: http://mbed.org/users/gsfan/notebook/gainspan_wifi/
ゲインスパン Wi-Fi モジュール ライブラリ
ゲインスパン社の低電力 Wi-Fiモジュール(無線LAN) GS1011 シリーズ用のライブラリです。
解説: http://mbed.org/users/gsfan/notebook/gainspan_wifi/
Diff: GSwifi_httpd.cpp
- Revision:
- 26:b347ee3a1087
- Parent:
- 25:f6e5622d2930
- Child:
- 29:1c4419512941
--- a/GSwifi_httpd.cpp Mon Feb 11 06:01:46 2013 +0000 +++ b/GSwifi_httpd.cpp Fri Feb 22 01:05:10 2013 +0000 @@ -59,14 +59,7 @@ sprintf(cmd, "AT+NSTCP=%d", port); if (command(cmd, GSRES_CONNECT)) return -1; - newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, NULL); -/* -// newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, &GSwifi::poll_httpd); -// newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, reinterpret_cast<onGsReceiveFunc>(&GSwifi::poll_httpd)); - void (GSwifi::*f1)(int,int) = &GSwifi::poll_httpd; - onGsReceiveFunc f2 = reinterpret_cast<onGsReceiveFunc>(f1); - newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, f2); -*/ + newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, this, &GSwifi::poll_httpd); return _cid; } @@ -92,7 +85,7 @@ } #endif - while (_gs_sock[cid].connect && _gs_sock[cid].data->use()) { + while (_gs_sock[cid].connect && (! _gs_sock[cid].data->isEmpty())) { flg = 0; if (_httpd[cid].buf == NULL) { _httpd[cid].buf = new char[HTTPD_BUF_SIZE]; @@ -425,7 +418,7 @@ int i, j, flg; unsigned char c; - while (_gs_sock[cid].connect && _gs_sock[cid].data->use()) { + while (_gs_sock[cid].connect && (! _gs_sock[cid].data->isEmpty())) { flg = 0; // get 1 line for (j = 0; j < len; j ++) { @@ -435,11 +428,13 @@ switch (_httpd[cid].mode) { case GSHTTPDMODE_WEBSOCKET: if (_httpd[cid].len == 0) { + // flag _httpd[cid].type = c & 0x0f; _httpd[cid].websocket_flg = c << 8; _httpd[cid].len ++; } else if (_httpd[cid].len == 1) { + // length 7bit _httpd[cid].websocket_flg |= c; _httpd[cid].length = c & 0x7f; _httpd[cid].len ++; @@ -463,6 +458,7 @@ _httpd[cid].length = (_httpd[cid].length << 8) | c; _httpd[cid].len ++; } else { + // end _httpd[cid].length = (_httpd[cid].length << 8) | c; _httpd[cid].len = 0; if (_httpd[cid].websocket_flg & 0x0080) { @@ -476,6 +472,7 @@ break; case GSHTTPDMODE_WEBSOCKET_MASK: + // masking key _httpd[cid].websocket_mask[_httpd[cid].len] = c; _httpd[cid].len ++; if (_httpd[cid].len >= 4) { @@ -486,8 +483,10 @@ break; case GSHTTPDMODE_WEBSOCKET_BODY: + // payload if (_httpd[cid].len < HTTPD_BUF_SIZE - 1) { if (_httpd[cid].websocket_flg & 0x0080) { + // un-mask _httpd[cid].buf[_httpd[cid].len] = c ^ _httpd[cid].websocket_mask[_httpd[cid].len & 0x03]; } else { _httpd[cid].buf[_httpd[cid].len] = c; @@ -508,44 +507,46 @@ DBG("websocket %d: (%d)\r\n", cid, _httpd[cid].len); } - if (flg) { - // websocket request - DBG("ws type %d\r\n", _httpd[cid].type); - switch (_httpd[cid].type) { - case 0x00: // continuation - case 0x01: // text - case 0x02: // binary - i = get_handler(_httpd[cid].uri); - if (i >= 0) { - if (_handler[i].onHttpCgi) { - // cgi - _handler[i].onHttpCgi(cid, &_httpd[cid]); - LOG("%d.%d.%d.%d ", _httpd[cid].host.getIp()[0], _httpd[cid].host.getIp()[1], _httpd[cid].host.getIp()[2], _httpd[cid].host.getIp()[3]); - LOG("%s %s %d 200 -\r\n", "WEBSOCKET", _httpd[cid].uri, _httpd[cid].length); - flg = 1; + if (flg) { + // websocket request + DBG("ws type %d\r\n", _httpd[cid].type); + switch (_httpd[cid].type) { + case 0x00: // continuation + case 0x01: // text + case 0x02: // binary + i = get_handler(_httpd[cid].uri); + if (i >= 0) { + if (_handler[i].onHttpCgi) { + // cgi + _handler[i].onHttpCgi(cid, &_httpd[cid]); + LOG("%d.%d.%d.%d ", _httpd[cid].host.getIp()[0], _httpd[cid].host.getIp()[1], _httpd[cid].host.getIp()[2], _httpd[cid].host.getIp()[3]); + LOG("%s %s %d 200 -\r\n", "WEBSOCKET", _httpd[cid].uri, _httpd[cid].length); + flg = 1; + } } - } - break; + break; - case 0x08: // close - close(cid); - break; + case 0x08: // close + close(cid); + break; - case 0x09: // ping - _gs_putc(0x8a); // pong - _gs_putc(0x04); - for (i = 0; i < _httpd[cid].len; i ++) { - _gs_putc(_httpd[cid].buf[i]); + case 0x09: // ping + { + char pong[_httpd[cid].len + 2]; + pong[0] = 0x8a; + pong[1] = 0x04; + memcpy(&pong[2], _httpd[cid].buf, _httpd[cid].len); + send(cid, pong, _httpd[cid].len + 2); + } + break; + + case 0x0a: // pong + break; + } + _httpd[cid].mode = GSHTTPDMODE_WEBSOCKET; + _httpd[cid].len = 0; + _httpd[cid].length = 0; } - break; - - case 0x0a: // pong - break; - } - _httpd[cid].mode = GSHTTPDMODE_WEBSOCKET; - _httpd[cid].len = 0; - _httpd[cid].length = 0; - } } // while }