GainSpan Wi-Fi library see: http://mbed.org/users/gsfan/notebook/gainspan_wifi/

Fork of GSwifi_old by gs fan

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/

Information

Please change the baud rate in advance.

  • ATB=115200
  • AT&W0

It may be better and sometimes faster.
GSwifi gs(p13, p14, baud);

Heavily modified new library: http://mbed.org/users/gsfan/code/GSwifi

ゲインスパン Wi-Fi モジュール ライブラリ

ゲインスパン社の低電力 Wi-Fiモジュール(無線LAN) GS1011 シリーズ用のライブラリです。

解説: http://mbed.org/users/gsfan/notebook/gainspan_wifi/

Information

モジュールはあらかじめ次のコマンドでボーレートを変更しておく。

  • ATB=115200
  • AT&W0

場合によってはもっと高速の方がいいかもしれない。クラス宣言時にレート設定をする。
GSwifi gs(p13, p14, baud);

大幅に更新された新しいライブラリ: http://mbed.org/users/gsfan/code/GSwifi

Committer:
gsfan
Date:
Thu Nov 01 02:55:57 2012 +0000
Revision:
18:4b97804c37d1
Child:
19:cad912f5a6ba
support smtp (send mail) and http server (httpd)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gsfan 18:4b97804c37d1 1 #include "dbg.h"
gsfan 18:4b97804c37d1 2 #include "mbed.h"
gsfan 18:4b97804c37d1 3 #include "GSwifi.h"
gsfan 18:4b97804c37d1 4
gsfan 18:4b97804c37d1 5 #define HTTPD_REQUEST 0
gsfan 18:4b97804c37d1 6 #define HTTPD_HEAD 1
gsfan 18:4b97804c37d1 7 #define HTTPD_SPACE 2
gsfan 18:4b97804c37d1 8 #define HTTPD_BODY 3
gsfan 18:4b97804c37d1 9 #define HTTPD_ERROR 4
gsfan 18:4b97804c37d1 10
gsfan 18:4b97804c37d1 11 int GSwifi::httpd (int port) {
gsfan 18:4b97804c37d1 12 int i;
gsfan 18:4b97804c37d1 13 char cmd[GS_CMD_SIZE];
gsfan 18:4b97804c37d1 14
gsfan 18:4b97804c37d1 15 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 18:4b97804c37d1 16
gsfan 18:4b97804c37d1 17 for (i = 0; i < 16; i ++) {
gsfan 18:4b97804c37d1 18 _httpd[i].mode = HTTPD_REQUEST;
gsfan 18:4b97804c37d1 19 _httpd[i].buf = NULL;
gsfan 18:4b97804c37d1 20 _httpd[i].uri = NULL;
gsfan 18:4b97804c37d1 21 }
gsfan 18:4b97804c37d1 22 _handler_count = 0;
gsfan 18:4b97804c37d1 23
gsfan 18:4b97804c37d1 24 sprintf(cmd, "AT+NSTCP=%d", port);
gsfan 18:4b97804c37d1 25 if (command(cmd, GSRES_CONNECT)) return -1;
gsfan 18:4b97804c37d1 26
gsfan 18:4b97804c37d1 27 newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, NULL);
gsfan 18:4b97804c37d1 28 return _cid;
gsfan 18:4b97804c37d1 29 }
gsfan 18:4b97804c37d1 30
gsfan 18:4b97804c37d1 31 void GSwifi::poll_httpd (int cid, int len) {
gsfan 18:4b97804c37d1 32 int i, j, flg = 0;
gsfan 18:4b97804c37d1 33 char c;
gsfan 18:4b97804c37d1 34
gsfan 18:4b97804c37d1 35 if (len == 0) {
gsfan 18:4b97804c37d1 36 _httpd[cid].mode = HTTPD_REQUEST;
gsfan 18:4b97804c37d1 37 _httpd[cid].len = 0;
gsfan 18:4b97804c37d1 38 _httpd[cid].keepalive = 0;
gsfan 18:4b97804c37d1 39 return;
gsfan 18:4b97804c37d1 40 }
gsfan 18:4b97804c37d1 41
gsfan 18:4b97804c37d1 42 while (_gs_sock[cid].connect && _gs_sock[cid].data->use()) {
gsfan 18:4b97804c37d1 43 flg = 0;
gsfan 18:4b97804c37d1 44 if (_httpd[cid].buf == NULL) {
gsfan 18:4b97804c37d1 45 _httpd[cid].buf = new char[HTTPD_BUF_SIZE];
gsfan 18:4b97804c37d1 46 }
gsfan 18:4b97804c37d1 47 for (j = 0; j < len; j ++) {
gsfan 18:4b97804c37d1 48 _gs_sock[cid].data->get(&c);
gsfan 18:4b97804c37d1 49 if (c == '\r') continue;
gsfan 18:4b97804c37d1 50 if (c == '\n' && _httpd[cid].mode != HTTPD_BODY) break;
gsfan 18:4b97804c37d1 51
gsfan 18:4b97804c37d1 52 if (_httpd[cid].len < HTTPD_BUF_SIZE - 1) {
gsfan 18:4b97804c37d1 53 _httpd[cid].buf[_httpd[cid].len] = c;
gsfan 18:4b97804c37d1 54 }
gsfan 18:4b97804c37d1 55 _httpd[cid].len ++;
gsfan 18:4b97804c37d1 56 if (_httpd[cid].len >= _httpd[cid].length && _httpd[cid].mode == HTTPD_BODY) break;
gsfan 18:4b97804c37d1 57 }
gsfan 18:4b97804c37d1 58 if (j >= len) return;
gsfan 18:4b97804c37d1 59 if (_httpd[cid].len < HTTPD_BUF_SIZE) {
gsfan 18:4b97804c37d1 60 _httpd[cid].buf[_httpd[cid].len] = 0;
gsfan 18:4b97804c37d1 61 DBG("httpd: %d %s (%d)\r\n", _httpd[cid].mode, _httpd[cid].buf, _httpd[cid].len);
gsfan 18:4b97804c37d1 62 }
gsfan 18:4b97804c37d1 63
gsfan 18:4b97804c37d1 64 switch (_httpd[cid].mode) {
gsfan 18:4b97804c37d1 65 case HTTPD_REQUEST:
gsfan 18:4b97804c37d1 66 if (strncmp(_httpd[cid].buf, "GET ", 4) == 0) {
gsfan 18:4b97804c37d1 67 _httpd[cid].type = 0;
gsfan 18:4b97804c37d1 68 j = 4;
gsfan 18:4b97804c37d1 69 } else
gsfan 18:4b97804c37d1 70 if (strncmp(_httpd[cid].buf, "POST ", 5) == 0) {
gsfan 18:4b97804c37d1 71 _httpd[cid].type = 1;
gsfan 18:4b97804c37d1 72 j = 5;
gsfan 18:4b97804c37d1 73 } else {
gsfan 18:4b97804c37d1 74 _httpd[cid].mode = HTTPD_ERROR;
gsfan 18:4b97804c37d1 75 break;
gsfan 18:4b97804c37d1 76 }
gsfan 18:4b97804c37d1 77
gsfan 18:4b97804c37d1 78 for (i = j; i < _httpd[cid].len; i ++) {
gsfan 18:4b97804c37d1 79 if (_httpd[cid].buf[i] == ' ') break;
gsfan 18:4b97804c37d1 80 }
gsfan 18:4b97804c37d1 81 i = i - j;
gsfan 18:4b97804c37d1 82 if (i) {
gsfan 18:4b97804c37d1 83 if (_httpd[cid].uri == NULL) {
gsfan 18:4b97804c37d1 84 _httpd[cid].uri = new char[HTTPD_URI_SIZE];
gsfan 18:4b97804c37d1 85 }
gsfan 18:4b97804c37d1 86 strncpy(_httpd[cid].uri, &_httpd[cid].buf[j], i);
gsfan 18:4b97804c37d1 87 _httpd[cid].uri[i] = 0;
gsfan 18:4b97804c37d1 88 }
gsfan 18:4b97804c37d1 89 _httpd[cid].mode = HTTPD_HEAD;
gsfan 18:4b97804c37d1 90 _httpd[cid].length = 0;
gsfan 18:4b97804c37d1 91 DBG("uri: %s\r\n", _httpd[cid].uri);
gsfan 18:4b97804c37d1 92 break;
gsfan 18:4b97804c37d1 93
gsfan 18:4b97804c37d1 94 case HTTPD_HEAD:
gsfan 18:4b97804c37d1 95 if (_httpd[cid].len == 0) {
gsfan 18:4b97804c37d1 96 _httpd[cid].mode = HTTPD_BODY;
gsfan 18:4b97804c37d1 97 if (_httpd[cid].length == 0) flg = 1;
gsfan 18:4b97804c37d1 98 } else
gsfan 18:4b97804c37d1 99 if (strncmp(_httpd[cid].buf, "Content-length: ", 16) == 0) {
gsfan 18:4b97804c37d1 100 _httpd[cid].length = atoi(&_httpd[cid].buf[16]);
gsfan 18:4b97804c37d1 101 } else
gsfan 18:4b97804c37d1 102 if (strncmp(_httpd[cid].buf, "Connection: Keep-Alive", 22) == 0) {
gsfan 18:4b97804c37d1 103 if (! _httpd[cid].keepalive) {
gsfan 18:4b97804c37d1 104 _httpd[cid].keepalive = HTTPD_KEEPALIVE;
gsfan 18:4b97804c37d1 105 }
gsfan 18:4b97804c37d1 106 }
gsfan 18:4b97804c37d1 107 break;
gsfan 18:4b97804c37d1 108
gsfan 18:4b97804c37d1 109 case HTTPD_BODY:
gsfan 18:4b97804c37d1 110 if (_httpd[cid].len >= _httpd[cid].length) {
gsfan 18:4b97804c37d1 111 DBG("body: %s\r\n", _httpd[cid].buf);
gsfan 18:4b97804c37d1 112 flg = 1;
gsfan 18:4b97804c37d1 113 }
gsfan 18:4b97804c37d1 114 break;
gsfan 18:4b97804c37d1 115 }
gsfan 18:4b97804c37d1 116
gsfan 18:4b97804c37d1 117 if (flg) {
gsfan 18:4b97804c37d1 118 // http request
gsfan 18:4b97804c37d1 119 _httpd[cid].buf[_httpd[cid].len] = 0;
gsfan 18:4b97804c37d1 120 // scan handler
gsfan 18:4b97804c37d1 121 flg = 0;
gsfan 18:4b97804c37d1 122 for (i = 0; i < _handler_count; i ++) {
gsfan 18:4b97804c37d1 123 j = strlen(_handler[i].uri);
gsfan 18:4b97804c37d1 124 if (strncmp(_httpd[cid].uri, _handler[i].uri, j) == NULL) {
gsfan 18:4b97804c37d1 125 if (_handler[i].dir) {
gsfan 18:4b97804c37d1 126 // file
gsfan 18:4b97804c37d1 127 httpd_request(cid, _handler[i].dir, &_httpd[cid].uri[j], _httpd[cid].keepalive);
gsfan 18:4b97804c37d1 128 flg = 1;
gsfan 18:4b97804c37d1 129 } else
gsfan 18:4b97804c37d1 130 if (_handler[i].onHttpCgi) {
gsfan 18:4b97804c37d1 131 // cgi
gsfan 18:4b97804c37d1 132 _handler[i].onHttpCgi(cid, &_httpd[cid].uri[j], _httpd[cid].buf, _httpd[cid].len);
gsfan 18:4b97804c37d1 133 flg = 1;
gsfan 18:4b97804c37d1 134 }
gsfan 18:4b97804c37d1 135 break;
gsfan 18:4b97804c37d1 136 }
gsfan 18:4b97804c37d1 137 }
gsfan 18:4b97804c37d1 138 if (! flg) {
gsfan 18:4b97804c37d1 139 send_httpd_error(cid, 403);
gsfan 18:4b97804c37d1 140 }
gsfan 18:4b97804c37d1 141
gsfan 18:4b97804c37d1 142 if (_httpd[cid].keepalive) {
gsfan 18:4b97804c37d1 143 _httpd[cid].mode = HTTPD_REQUEST;
gsfan 18:4b97804c37d1 144 _httpd[cid].len = 0;
gsfan 18:4b97804c37d1 145 _httpd[cid].type = 0;
gsfan 18:4b97804c37d1 146 _httpd[cid].length = 0;
gsfan 18:4b97804c37d1 147 _httpd[cid].keepalive --;
gsfan 18:4b97804c37d1 148 } else {
gsfan 18:4b97804c37d1 149 close(cid);
gsfan 18:4b97804c37d1 150 }
gsfan 18:4b97804c37d1 151 }
gsfan 18:4b97804c37d1 152
gsfan 18:4b97804c37d1 153 if (_httpd[cid].mode == HTTPD_ERROR) {
gsfan 18:4b97804c37d1 154 send_httpd_error(cid, 400);
gsfan 18:4b97804c37d1 155 }
gsfan 18:4b97804c37d1 156
gsfan 18:4b97804c37d1 157 _httpd[cid].len = 0;
gsfan 18:4b97804c37d1 158 }
gsfan 18:4b97804c37d1 159 }
gsfan 18:4b97804c37d1 160
gsfan 18:4b97804c37d1 161 int GSwifi::httpd_request (int cid, char *dir, char *file, int keep) {
gsfan 18:4b97804c37d1 162 FILE *fp;
gsfan 18:4b97804c37d1 163 int i, j;
gsfan 18:4b97804c37d1 164 char buf[100], tmp[20];
gsfan 18:4b97804c37d1 165
gsfan 18:4b97804c37d1 166 strcpy(buf, dir);
gsfan 18:4b97804c37d1 167 strcat(buf, file);
gsfan 18:4b97804c37d1 168 if (buf[strlen(buf) - 1] == '/') {
gsfan 18:4b97804c37d1 169 strcat(buf, "index.htm");
gsfan 18:4b97804c37d1 170 }
gsfan 18:4b97804c37d1 171 DBG("file: %s\r\n", buf);
gsfan 18:4b97804c37d1 172
gsfan 18:4b97804c37d1 173 fp = fopen(buf, "r");
gsfan 18:4b97804c37d1 174 if (fp) {
gsfan 18:4b97804c37d1 175 strcpy(buf, "HTTP/1.1 200 OK\r\n");
gsfan 18:4b97804c37d1 176 send(cid, buf, strlen(buf));
gsfan 18:4b97804c37d1 177 {
gsfan 18:4b97804c37d1 178 j = ftell(fp);
gsfan 18:4b97804c37d1 179 fseek(fp, 0, SEEK_END);
gsfan 18:4b97804c37d1 180 i = ftell(fp);
gsfan 18:4b97804c37d1 181 fseek(fp, j, SEEK_SET);
gsfan 18:4b97804c37d1 182 }
gsfan 18:4b97804c37d1 183 sprintf(buf, "Content-Length: %d\r\n", i);
gsfan 18:4b97804c37d1 184 send(cid, buf, strlen(buf));
gsfan 18:4b97804c37d1 185 j = strlen(file);
gsfan 18:4b97804c37d1 186 if (j == 0 || strncmp(&file[j - 4], ".htm", 4)) {
gsfan 18:4b97804c37d1 187 strcpy(tmp, "text/html");
gsfan 18:4b97804c37d1 188 } else
gsfan 18:4b97804c37d1 189 if (strncmp(&file[j - 4], ".jpg", 4)) {
gsfan 18:4b97804c37d1 190 strcpy(tmp, "image/jpeg");
gsfan 18:4b97804c37d1 191 } else
gsfan 18:4b97804c37d1 192 if (strncmp(&file[j - 4], ".png", 4)) {
gsfan 18:4b97804c37d1 193 strcpy(tmp, "image/png");
gsfan 18:4b97804c37d1 194 } else
gsfan 18:4b97804c37d1 195 if (strncmp(&file[j - 4], ".gif", 4)) {
gsfan 18:4b97804c37d1 196 strcpy(tmp, "image/gif");
gsfan 18:4b97804c37d1 197 } else {
gsfan 18:4b97804c37d1 198 strcpy(tmp, "text/plain");
gsfan 18:4b97804c37d1 199 }
gsfan 18:4b97804c37d1 200 sprintf(buf, "Content-Type: %s\r\n", tmp);
gsfan 18:4b97804c37d1 201 send(cid, buf, strlen(buf));
gsfan 18:4b97804c37d1 202 if (keep) {
gsfan 18:4b97804c37d1 203 strcpy(buf, "Connection: Keep-Alive\r\n");
gsfan 18:4b97804c37d1 204 } else {
gsfan 18:4b97804c37d1 205 strcpy(buf, "Connection: close\r\n");
gsfan 18:4b97804c37d1 206 }
gsfan 18:4b97804c37d1 207 send(cid, buf, strlen(buf));
gsfan 18:4b97804c37d1 208 strcpy(buf, "Server: GSwifi httpd\r\n");
gsfan 18:4b97804c37d1 209 send(cid, buf, strlen(buf));
gsfan 18:4b97804c37d1 210 send(cid, "\r\n", 2);
gsfan 18:4b97804c37d1 211
gsfan 18:4b97804c37d1 212 for (;;) {
gsfan 18:4b97804c37d1 213 i = fread(buf, sizeof(char), sizeof(buf), fp);
gsfan 18:4b97804c37d1 214 if (i == 0) break;
gsfan 18:4b97804c37d1 215 send(cid, buf, i);
gsfan 18:4b97804c37d1 216 if (feof(fp)) break;
gsfan 18:4b97804c37d1 217 }
gsfan 18:4b97804c37d1 218 fclose(fp);
gsfan 18:4b97804c37d1 219 return 0;
gsfan 18:4b97804c37d1 220 }
gsfan 18:4b97804c37d1 221
gsfan 18:4b97804c37d1 222 send_httpd_error(cid, 404);
gsfan 18:4b97804c37d1 223 return -1;
gsfan 18:4b97804c37d1 224 }
gsfan 18:4b97804c37d1 225
gsfan 18:4b97804c37d1 226 void GSwifi::send_httpd_error (int cid, int err) {
gsfan 18:4b97804c37d1 227 char buf[100], msg[30];
gsfan 18:4b97804c37d1 228
gsfan 18:4b97804c37d1 229 switch (err) {
gsfan 18:4b97804c37d1 230 case 400:
gsfan 18:4b97804c37d1 231 strcpy(msg, "Bad Request");
gsfan 18:4b97804c37d1 232 break;
gsfan 18:4b97804c37d1 233 case 403:
gsfan 18:4b97804c37d1 234 strcpy(msg, "Forbidden");
gsfan 18:4b97804c37d1 235 break;
gsfan 18:4b97804c37d1 236 case 404:
gsfan 18:4b97804c37d1 237 strcpy(msg, "Not Found");
gsfan 18:4b97804c37d1 238 break;
gsfan 18:4b97804c37d1 239 case 500:
gsfan 18:4b97804c37d1 240 default:
gsfan 18:4b97804c37d1 241 strcpy(msg, "Internal Server Error");
gsfan 18:4b97804c37d1 242 break;
gsfan 18:4b97804c37d1 243 }
gsfan 18:4b97804c37d1 244 DBG("httpd error: %d %d %s\r\n", cid, err, msg);
gsfan 18:4b97804c37d1 245
gsfan 18:4b97804c37d1 246 sprintf(buf, "HTTP/1.1 %d %s\r\n", err, msg);
gsfan 18:4b97804c37d1 247 send(cid, buf, strlen(buf));
gsfan 18:4b97804c37d1 248 strcpy(buf, "Content-Type: text/html\r\n");
gsfan 18:4b97804c37d1 249 send(cid, buf, strlen(buf));
gsfan 18:4b97804c37d1 250 send(cid, "\r\n", 2);
gsfan 18:4b97804c37d1 251
gsfan 18:4b97804c37d1 252 sprintf(buf, "<html><head><title>%d %s</title></head>\r\n", err, msg);
gsfan 18:4b97804c37d1 253 send(cid, buf, strlen(buf));
gsfan 18:4b97804c37d1 254 sprintf(buf, "<body><h1>%s</h1></body></html>\r\n", msg);
gsfan 18:4b97804c37d1 255 send(cid, buf, strlen(buf));
gsfan 18:4b97804c37d1 256 close(cid);
gsfan 18:4b97804c37d1 257 }
gsfan 18:4b97804c37d1 258
gsfan 18:4b97804c37d1 259 int GSwifi::attach_httpd (char *uri, char *dir) {
gsfan 18:4b97804c37d1 260 if (_handler_count < HTTPD_HANDLE) {
gsfan 18:4b97804c37d1 261 _handler[_handler_count].uri = new char[strlen(uri) + 1];
gsfan 18:4b97804c37d1 262 strcpy(_handler[_handler_count].uri, uri);
gsfan 18:4b97804c37d1 263 _handler[_handler_count].dir = new char[strlen(dir) + 1];
gsfan 18:4b97804c37d1 264 strcpy(_handler[_handler_count].dir, dir);
gsfan 18:4b97804c37d1 265 _handler[_handler_count].onHttpCgi = NULL;
gsfan 18:4b97804c37d1 266 _handler_count ++;
gsfan 18:4b97804c37d1 267 return 0;
gsfan 18:4b97804c37d1 268 } else {
gsfan 18:4b97804c37d1 269 return -1;
gsfan 18:4b97804c37d1 270 }
gsfan 18:4b97804c37d1 271 }
gsfan 18:4b97804c37d1 272
gsfan 18:4b97804c37d1 273 int GSwifi::attach_httpd (char *uri, onHttpdCgiFunc ponHttpCgi) {
gsfan 18:4b97804c37d1 274 if (_handler_count < HTTPD_HANDLE) {
gsfan 18:4b97804c37d1 275 _handler[_handler_count].uri = new char[strlen(uri) + 1];
gsfan 18:4b97804c37d1 276 strcpy(_handler[_handler_count].uri, uri);
gsfan 18:4b97804c37d1 277 _handler[_handler_count].dir = NULL;
gsfan 18:4b97804c37d1 278 _handler[_handler_count].onHttpCgi = ponHttpCgi;
gsfan 18:4b97804c37d1 279 _handler_count ++;
gsfan 18:4b97804c37d1 280 return 0;
gsfan 18:4b97804c37d1 281 } else {
gsfan 18:4b97804c37d1 282 return -1;
gsfan 18:4b97804c37d1 283 }
gsfan 18:4b97804c37d1 284 }