Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of GSwifi_old by
GSwifi.cpp
00001 /** 00002 * Gainspan wi-fi module library for mbed 00003 * Copyright (c) 2012 gsfan 00004 * Released under the MIT License: http://mbed.org/license/mit 00005 */ 00006 00007 /** @file 00008 * @brief Gainspan wi-fi module library for mbed 00009 * GS1011MIC, GS1011MIP, GainSpan WiFi Breakout, etc. 00010 * module configuration: ATB=115200 00011 */ 00012 00013 #include "dbg.h" 00014 #include "mbed.h" 00015 #include "GSwifi.h" 00016 #include <ctype.h> 00017 00018 00019 GSwifi::GSwifi (PinName p_tx, PinName p_rx, int baud) : _gs(p_tx, p_rx), _buf_cmd(GS_CMD_SIZE) { 00020 _connect = false; 00021 _status = GSSTAT_READY; 00022 _escape = 0; 00023 _response = GSRES_NONE; 00024 _gs_mode = GSMODE_COMMAND; 00025 _ssid = NULL; 00026 _reconnect = 0; 00027 _reconnect_count = 0; 00028 00029 _gs.baud(baud); 00030 _gs.attach(this, &GSwifi::isr_recv, Serial::RxIrq); 00031 _rts = false; 00032 } 00033 00034 GSwifi::GSwifi (PinName p_tx, PinName p_rx, PinName p_cts, PinName p_rts, int baud) : _gs(p_tx, p_rx), _buf_cmd(GS_CMD_SIZE) { 00035 _connect = false; 00036 _status = GSSTAT_READY; 00037 _escape = 0; 00038 _response = GSRES_NONE; 00039 _gs_mode = GSMODE_COMMAND; 00040 _ssid = NULL; 00041 _reconnect = 0; 00042 _reconnect_count = 0; 00043 00044 _gs.baud(baud); 00045 _gs.attach(this, &GSwifi::isr_recv, Serial::RxIrq); 00046 00047 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) 00048 if (p_cts == p12) { // CTS input (P0_17) 00049 LPC_UART1->MCR |= (1<<7); // CTSEN 00050 LPC_PINCON->PINSEL1 &= ~(3 << 2); 00051 LPC_PINCON->PINSEL1 |= (1 << 2); // UART CTS 00052 } 00053 if (p_rts == P0_22) { // RTS output (P0_22) 00054 LPC_UART1->MCR |= (1<<6); // RTSEN 00055 LPC_PINCON->PINSEL1 &= ~(3 << 12); 00056 LPC_PINCON->PINSEL1 |= (1 << 12); // UART RTS 00057 _rts = true; 00058 } else { 00059 _rts = false; 00060 } 00061 #elif defined(TARGET_LPC11U24) 00062 if (p_cts == p21) { // CTS input (P0_7) 00063 LPC_USART->MCR |= (1<<7); // CTSEN 00064 LPC_IOCON->PIO0_7 &= ~0x07; 00065 LPC_IOCON->PIO0_7 |= 0x01; // UART CTS 00066 } 00067 if (p_rts == p22) { // RTS output (P0_17) 00068 LPC_USART->MCR |= (1<<6); // RTSEN 00069 LPC_IOCON->PIO0_17 &= ~0x07; 00070 LPC_IOCON->PIO0_17 |= 0x01; // UART RTS 00071 _rts = true; 00072 } else { 00073 _rts = false; 00074 } 00075 #endif 00076 } 00077 00078 // uart interrupt 00079 void GSwifi::isr_recv () { 00080 static int len, mode; 00081 static char tmp[20]; 00082 char flg, dat; 00083 00084 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) 00085 flg = LPC_UART1->LSR; 00086 #elif defined(TARGET_LPC11U24) 00087 flg = LPC_USART->LSR; 00088 #endif 00089 dat = _gs_getc(); 00090 00091 if (flg & ((1 << 7)|(1 << 3)|(1 << 4))) return; 00092 #ifdef DEBUG_VIEW 00093 // DBG("%02x_", dat); 00094 #endif 00095 /* 00096 if (dat >= 0x20 && dat < 0x7f) { 00097 DBG("_%c", dat); 00098 } else { 00099 DBG("_%02x", dat); 00100 } 00101 */ 00102 switch (_gs_mode) { 00103 case GSMODE_COMMAND: // command responce 00104 if (_escape) { 00105 // esc 00106 switch (dat) { 00107 case 'O': 00108 DBG("ok\r\n"); 00109 _gs_ok = 1; 00110 break; 00111 case 'F': 00112 DBG("failure\r\n"); 00113 _gs_failure = 1; 00114 break; 00115 case 'S': 00116 DBG("GSMODE_DATA_RX\r\n"); 00117 _gs_mode = GSMODE_DATA_RX; 00118 mode = 0; 00119 break; 00120 case 'u': 00121 DBG("GSMODE_DATA_RXUDP\r\n"); 00122 _gs_mode = GSMODE_DATA_RXUDP; 00123 mode = 0; 00124 break; 00125 case 'Z': 00126 case 'H': 00127 DBG("GSMODE_DATA_RX_BULK\r\n"); 00128 _gs_mode = GSMODE_DATA_RX_BULK; 00129 mode = 0; 00130 break; 00131 case 'y': 00132 DBG("GSMODE_DATA_RXUDP_BULK\r\n"); 00133 _gs_mode = GSMODE_DATA_RXUDP_BULK; 00134 mode = 0; 00135 break; 00136 default: 00137 DBG("unknown [ESC] %02x\r\n", dat); 00138 break; 00139 } 00140 _escape = 0; 00141 } else { 00142 if (dat == 0x1b) { 00143 _escape = 1; 00144 } else 00145 if (dat != '\r') { 00146 // command 00147 _buf_cmd.put(dat); 00148 if (dat == '\n') { 00149 _gs_enter ++; 00150 if (_response == GSRES_NONE && _connect) { 00151 DBG("poll_cmd\r\n"); 00152 poll_cmd(); 00153 } 00154 } 00155 } 00156 } 00157 break; 00158 00159 case GSMODE_DATA_RX: 00160 case GSMODE_DATA_RXUDP: 00161 if (mode == 0) { 00162 // cid 00163 _cid = x2i(dat); 00164 _gs_sock[_cid].received = 0; 00165 mode ++; 00166 if (_gs_mode == GSMODE_DATA_RX) { 00167 mode = 3; 00168 } 00169 len = 0; 00170 } else 00171 if (mode == 1) { 00172 // ip 00173 if ((dat < '0' || dat > '9') && dat != '.') { 00174 int ip1, ip2, ip3, ip4; 00175 tmp[len] = 0; 00176 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4); 00177 _from.setIp(IpAddr(ip1, ip2, ip3, ip4)); 00178 mode ++; 00179 len = 0; 00180 break; 00181 } 00182 tmp[len] = dat; 00183 len ++; 00184 } else 00185 if (mode == 2) { 00186 // port 00187 if (dat < '0' || dat > '9') { 00188 tmp[len] = 0; 00189 _from.setPort(atoi(tmp)); 00190 mode ++; 00191 len = 0; 00192 break; 00193 } 00194 tmp[len] = dat; 00195 len ++; 00196 } else 00197 if (_escape) { 00198 // esc 00199 switch (dat) { 00200 case 'E': 00201 DBG("recv ascii %d\r\n", _cid); 00202 _gs_sock[_cid].received = 1; 00203 _gs_mode = GSMODE_COMMAND; 00204 // recv interrupt 00205 if (_gs_sock[_cid].protocol == GSPROT_HTTPGET && _gs_sock[_cid].onGsReceive != NULL) { 00206 _gs_sock[_cid].onGsReceive(_cid, _gs_sock[_cid].data->use()); 00207 _gs_sock[_cid].received = 0; 00208 } 00209 break; 00210 default: 00211 DBG("unknown <ESC> %02x\r\n", dat); 00212 break; 00213 } 00214 _escape = 0; 00215 } else { 00216 if (dat == 0x1b) { 00217 _escape = 1; 00218 } else { 00219 // data 00220 _gs_sock[_cid].data->put(dat); 00221 len ++; 00222 if (len < GS_DATA_SIZE && _gs_sock[_cid].data->available() == 0) { 00223 // buffer full 00224 if (_gs_sock[_cid].onGsReceive != NULL) { 00225 _gs_sock[_cid].onGsReceive(_cid, _gs_sock[_cid].data->use()); 00226 } 00227 } 00228 } 00229 } 00230 break; 00231 00232 case GSMODE_DATA_RX_BULK: 00233 case GSMODE_DATA_RXUDP_BULK: 00234 // DBG("%c", dat); 00235 if (mode == 0) { 00236 // cid 00237 _cid = x2i(dat); 00238 _gs_sock[_cid].received = 0; 00239 mode ++; 00240 if (_gs_mode == GSMODE_DATA_RX_BULK) { 00241 mode = 3; 00242 } 00243 len = 0; 00244 } else 00245 if (mode == 1) { 00246 // ip 00247 if ((dat < '0' || dat > '9') && dat != '.') { 00248 int ip1, ip2, ip3, ip4; 00249 tmp[len] = 0; 00250 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4); 00251 _from.setIp(IpAddr(ip1, ip2, ip3, ip4)); 00252 mode ++; 00253 len = 0; 00254 break; 00255 } 00256 tmp[len] = dat; 00257 len ++; 00258 } else 00259 if (mode == 2) { 00260 // port 00261 if (dat < '0' || dat > '9') { 00262 tmp[len] = 0; 00263 _from.setPort(atoi(tmp)); 00264 mode ++; 00265 len = 0; 00266 break; 00267 } 00268 tmp[len] = dat; 00269 len ++; 00270 } else 00271 if (mode == 3) { 00272 // length 00273 tmp[len] = dat; 00274 len ++; 00275 if (len >= 4) { 00276 tmp[len] = 0; 00277 len = atoi(tmp); 00278 mode ++; 00279 break; 00280 } 00281 } else 00282 if (mode == 4) { 00283 // data 00284 if (_gs_sock[_cid].data != NULL) { 00285 _gs_sock[_cid].data->put(dat); 00286 } 00287 len --; 00288 if (len && _gs_sock[_cid].data->available() == 0) { 00289 // buffer full 00290 if (_gs_sock[_cid].onGsReceive != NULL) { 00291 _gs_sock[_cid].onGsReceive(_cid, _gs_sock[_cid].data->use()); 00292 } 00293 } 00294 if (len == 0) { 00295 DBG("recv binary %d\r\n", _cid); 00296 _gs_sock[_cid].received = 1; 00297 _escape = 0; 00298 _gs_mode = GSMODE_COMMAND; 00299 // recv interrupt 00300 if (_gs_sock[_cid].protocol == GSPROT_HTTPGET && _gs_sock[_cid].onGsReceive != NULL) { 00301 _gs_sock[_cid].onGsReceive(_cid, _gs_sock[_cid].data->use()); 00302 _gs_sock[_cid].received = 0; 00303 } 00304 } 00305 } 00306 break; 00307 00308 } 00309 } 00310 00311 int GSwifi::command (const char *cmd, GSRESPONCE res, int timeout) { 00312 int i, r = 0; 00313 00314 if (! cmd) { 00315 // dummy CR+LF 00316 _gs.printf("\r\n"); 00317 for (i = 0; i < 10; i ++) { 00318 wait_ms(10); 00319 poll_cmd(); 00320 _buf_cmd.clear(); 00321 } 00322 return 0; 00323 } 00324 00325 _response = res; 00326 _buf_cmd.clear(); 00327 _gs_ok = 0; 00328 _gs_failure = 0; 00329 _gs_enter = 0; 00330 for (i = 0; i < strlen(cmd); i ++) { 00331 _gs_putc(cmd[i]); 00332 } 00333 _gs_putc('\r'); 00334 _gs_putc('\n'); 00335 DBG("command: %s\r\n", cmd); 00336 if (strlen(cmd) == 0) return 0; 00337 // wait_ms(10); 00338 if (timeout) { 00339 r = cmdResponse(res, timeout); 00340 } 00341 _response = GSRES_NONE; 00342 return r; 00343 } 00344 00345 int GSwifi::cmdResponse (GSRESPONCE res, int ms) { 00346 int i, n = 0, flg = 0; 00347 char buf[GS_CMD_SIZE]; 00348 Timer timeout; 00349 00350 timeout.start(); 00351 for (;;) { 00352 // recv response 00353 i = 0; 00354 while (i < sizeof(buf)) { 00355 if (_buf_cmd.use()) { 00356 _buf_cmd.get(&buf[i]); 00357 if (buf[i] == '\n') { 00358 break; 00359 } 00360 i ++; 00361 } 00362 if (timeout.read_ms() > ms) { 00363 timeout.stop(); 00364 DBG("timeout\r\n"); 00365 return -1; 00366 } 00367 } 00368 _gs_enter = 0; 00369 if (i == 0) continue; 00370 buf[i] = 0; 00371 DBG("response: %s\r\n", buf); 00372 timeout.stop(); 00373 00374 if (strcmp(buf, "OK") == 0) { 00375 _gs_ok = 1; 00376 } else 00377 if (strncmp(buf, "ERROR", 5) == 0) { 00378 _gs_failure = 1; 00379 } 00380 00381 switch(res) { 00382 case GSRES_NORMAL: 00383 flg = 1; 00384 break; 00385 case GSRES_WPS: 00386 if (n == 0 && strncmp(buf, "SSID", 4) == 0) { 00387 n ++; 00388 } else 00389 if (n == 1 && strncmp(buf, "CHANNEL", 7) == 0) { 00390 n ++; 00391 } else 00392 if (n == 2 && strncmp(buf, "PASSPHRASE", 10) == 0) { 00393 n ++; 00394 flg = 1; 00395 } 00396 break; 00397 case GSRES_CONNECT: 00398 if (strncmp(buf, "CONNECT ", 8) == 0) { 00399 _cid = x2i(buf[8]); 00400 flg = 1; 00401 } 00402 break; 00403 case GSRES_DHCP: 00404 if (n == 0 && strstr(buf, "SubNet") && strstr(buf, "Gateway")) { 00405 n ++; 00406 } else 00407 if (n == 1) { 00408 int ip1, ip2, ip3, ip4; 00409 char *tmp = buf + 1; 00410 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4); 00411 _ipaddr = IpAddr(ip1, ip2, ip3, ip4); 00412 tmp = strstr(tmp, ":") + 2; 00413 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4); 00414 _netmask = IpAddr(ip1, ip2, ip3, ip4); 00415 tmp = strstr(tmp, ":") + 2; 00416 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4); 00417 _gateway = IpAddr(ip1, ip2, ip3, ip4); 00418 n ++; 00419 flg = 1; 00420 } 00421 break; 00422 case GSRES_MACADDRESS: 00423 if (buf[2] == ':' && buf[5] == ':') { 00424 int mac1, mac2, mac3, mac4, mac5, mac6; 00425 sscanf(buf, "%x:%x:%x:%x:%x:%x", &mac1, &mac2, &mac3, &mac4, &mac5, &mac6); 00426 _mac[0] = mac1; 00427 _mac[1] = mac2; 00428 _mac[2] = mac3; 00429 _mac[3] = mac4; 00430 _mac[4] = mac5; 00431 _mac[5] = mac6; 00432 flg = 1; 00433 } 00434 break; 00435 case GSRES_DNSLOOKUP: 00436 if (strncmp(buf, "IP:", 3) == 0) { 00437 int ip1, ip2, ip3, ip4; 00438 sscanf(&buf[3], "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4); 00439 _resolv = IpAddr(ip1, ip2, ip3, ip4); 00440 flg = 1; 00441 } 00442 break; 00443 case GSRES_HTTP: 00444 if (buf[0] >= '0' && buf[0] <= 'F') { 00445 _cid = x2i(buf[0]); 00446 flg = 1; 00447 } 00448 break; 00449 case GSRES_RSSI: 00450 if (buf[0] == '-' || (buf[0] >= '0' && buf[0] <= '9')) { 00451 _rssi = atoi(buf); 00452 flg = 1; 00453 } 00454 break; 00455 case GSRES_TIME: 00456 if (buf[0] >= '0' && buf[0] <= '9') { 00457 int year, month, day, hour, min, sec; 00458 struct tm t; 00459 sscanf(buf, "%d/%d/%d,%d:%d:%d", &day, &month, &year, &hour, &min, &sec); 00460 t.tm_sec = sec; 00461 t.tm_min = min; 00462 t.tm_hour = hour; 00463 t.tm_mday = day; 00464 t.tm_mon = month - 1; 00465 t.tm_year = year - 1900; 00466 _time = mktime(&t); 00467 flg = 1; 00468 } 00469 break; 00470 } 00471 00472 if ((flg && _gs_ok) || _gs_failure) break; 00473 timeout.reset(); 00474 timeout.start(); 00475 } 00476 00477 if (_gs_failure || flg == 0) { 00478 return -1; 00479 } else { 00480 return 0; 00481 } 00482 } 00483 00484 int GSwifi::connect (GSSECURITY sec, const char *ssid, const char *pass, int dhcp, int reconnect) { 00485 int r; 00486 char cmd[GS_CMD_SIZE]; 00487 00488 if (_connect || _status != GSSTAT_READY) return -1; 00489 00490 command(NULL, GSRES_NORMAL); 00491 if (command("ATE0", GSRES_NORMAL)) return -1; 00492 if (_rts) { 00493 command("AT&K0", GSRES_NORMAL); 00494 command("AT&R1", GSRES_NORMAL); 00495 } 00496 command("AT+NMAC=?", GSRES_MACADDRESS); 00497 #ifdef GS_BULK 00498 command("AT+BDATA=1", GSRES_NORMAL); 00499 #endif 00500 00501 disconnect(); 00502 command("AT+WREGDOMAIN=" GS_WREGDOMAIN, GSRES_NORMAL); 00503 command("AT+WM=0", GSRES_NORMAL); // infrastructure 00504 wait_ms(100); 00505 if (dhcp && sec != GSSEC_WPS_BUTTON) { 00506 command("AT+NDHCP=1", GSRES_NORMAL); 00507 } else { 00508 command("AT+NDHCP=0", GSRES_NORMAL); 00509 } 00510 00511 switch (sec) { 00512 case GSSEC_NONE: 00513 case GSSEC_OPEN: 00514 case GSSEC_WEP: 00515 sprintf(cmd, "AT+WAUTH=%d", sec); 00516 command(cmd, GSRES_NORMAL); 00517 if (sec != GSSEC_NONE) { 00518 sprintf(cmd, "AT+WWEP1=%s", pass); 00519 command(cmd, GSRES_NORMAL); 00520 wait_ms(100); 00521 } 00522 sprintf(cmd, "AT+WA=%s", ssid); 00523 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2); 00524 if (r) { 00525 DBG("retry\r\n"); 00526 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2); 00527 } 00528 break; 00529 case GSSEC_WPA_PSK: 00530 case GSSEC_WPA2_PSK: 00531 command("AT+WAUTH=0", GSRES_NORMAL); 00532 // sprintf(cmd, "AT+WWPA=%s", pass); 00533 // command(cmd, GSRES_NORMAL); 00534 sprintf(cmd, "AT+WPAPSK=%s,%s", ssid, pass); 00535 command(cmd, GSRES_NORMAL, GS_TIMEOUT2); 00536 wait_ms(100); 00537 sprintf(cmd, "AT+WA=%s", ssid); 00538 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2); 00539 if (r) { 00540 DBG("retry\r\n"); 00541 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2); 00542 } 00543 break; 00544 case GSSEC_WPS_BUTTON: 00545 command("AT+WAUTH=0", GSRES_NORMAL); 00546 r = command("AT+WWPS=1", GSRES_WPS, GS_TIMEOUT2); 00547 if (r) break; 00548 if (dhcp) { 00549 r = command("AT+NDHCP=1", GSRES_DHCP, GS_TIMEOUT2); 00550 } 00551 break; 00552 default: 00553 DBG("Can't use security\r\n"); 00554 r = -1; 00555 break; 00556 } 00557 00558 if (r == 0 && !dhcp) { 00559 sprintf(cmd, "AT+DNSSET=%d.%d.%d.%d", 00560 _gateway[0], _gateway[1], _gateway[2], _gateway[3]); 00561 command(cmd, GSRES_NORMAL); 00562 } 00563 00564 if (r == 0) { 00565 _connect = true; 00566 _reconnect = reconnect; 00567 _reconnect_count = 0; 00568 if (!_ssid) _ssid = new char[sizeof(ssid) + 1]; 00569 strcpy(_ssid, ssid); 00570 } 00571 return r; 00572 } 00573 00574 int GSwifi::adhock (GSSECURITY sec, const char *ssid, const char *pass, IpAddr ipaddr, IpAddr netmask) { 00575 int r; 00576 char cmd[GS_CMD_SIZE]; 00577 00578 if (_connect || _status != GSSTAT_READY) return -1; 00579 00580 command(NULL, GSRES_NORMAL); 00581 if (command("ATE0", GSRES_NORMAL)) return -1; 00582 if (_rts) { 00583 command("AT&K0", GSRES_NORMAL); 00584 command("AT&R1", GSRES_NORMAL); 00585 } 00586 disconnect(); 00587 command("AT+NMAC=?", GSRES_MACADDRESS); 00588 #ifdef GS_BULK 00589 command("AT+BDATA=1", GSRES_NORMAL); 00590 #endif 00591 00592 command("AT+WREGDOMAIN=" GS_WREGDOMAIN, GSRES_NORMAL); 00593 command("AT+WM=1", GSRES_NORMAL); // adhock 00594 wait_ms(100); 00595 command("AT+NDHCP=0", GSRES_NORMAL); 00596 setAddress(ipaddr, netmask, ipaddr, ipaddr); 00597 00598 switch (sec) { 00599 case GSSEC_NONE: 00600 case GSSEC_OPEN: 00601 case GSSEC_WEP: 00602 sprintf(cmd, "AT+WAUTH=%d", sec); 00603 command(cmd, GSRES_NORMAL); 00604 if (sec != GSSEC_NONE) { 00605 sprintf(cmd, "AT+WWEP1=%s", pass); 00606 command(cmd, GSRES_NORMAL); 00607 wait_ms(100); 00608 } 00609 sprintf(cmd, "AT+WA=%s", ssid); 00610 r = command(cmd, GSRES_NORMAL, GS_TIMEOUT2); 00611 break; 00612 default: 00613 DBG("Can't use security\r\n"); 00614 r = -1; 00615 break; 00616 } 00617 00618 if (r == 0) _connect = true; 00619 return r; 00620 } 00621 00622 int GSwifi::limitedap (GSSECURITY sec, const char *ssid, const char *pass, IpAddr ipaddr, IpAddr netmask, char *dns) { 00623 int r; 00624 char cmd[GS_CMD_SIZE]; 00625 00626 if (_connect || _status != GSSTAT_READY) return -1; 00627 00628 command(NULL, GSRES_NORMAL); 00629 if (command("ATE0", GSRES_NORMAL)) return -1; 00630 if (_rts) { 00631 command("AT&K0", GSRES_NORMAL); 00632 command("AT&R1", GSRES_NORMAL); 00633 } 00634 disconnect(); 00635 command("AT+NMAC=?", GSRES_MACADDRESS); 00636 #ifdef GS_BULK 00637 command("AT+BDATA=1", GSRES_NORMAL); 00638 #endif 00639 00640 command("AT+WREGDOMAIN=" GS_WREGDOMAIN, GSRES_NORMAL); 00641 command("AT+WM=2", GSRES_NORMAL); // limited ap 00642 wait_ms(1000); 00643 command("AT+NDHCP=0", GSRES_NORMAL); 00644 setAddress(ipaddr, netmask, ipaddr, ipaddr); 00645 if (command("AT+DHCPSRVR=1", GSRES_NORMAL)) return -1; 00646 if (dns) { 00647 sprintf(cmd, "AT+DNS=1,%s", dns); 00648 } else { 00649 strcpy(cmd, "AT+DNS=1," GS_DNSNAME); 00650 } 00651 if (command(cmd, GSRES_NORMAL)) return -1; 00652 00653 switch (sec) { 00654 case GSSEC_NONE: 00655 case GSSEC_OPEN: 00656 case GSSEC_WEP: 00657 sprintf(cmd, "AT+WAUTH=%d", sec); 00658 command(cmd, GSRES_NORMAL); 00659 if (sec != GSSEC_NONE) { 00660 sprintf(cmd, "AT+WWEP1=%s", pass); 00661 command(cmd, GSRES_NORMAL); 00662 wait_ms(100); 00663 } 00664 sprintf(cmd, "AT+WA=%s", ssid); 00665 r = command(cmd, GSRES_NORMAL, GS_TIMEOUT2); 00666 break; 00667 default: 00668 DBG("Can't use security\r\n"); 00669 r = -1; 00670 break; 00671 } 00672 00673 if (r == 0) _connect = true; 00674 return r; 00675 } 00676 00677 int GSwifi::disconnect () { 00678 int i; 00679 00680 _connect = false; 00681 for (i = 0; i < 16; i ++) { 00682 _gs_sock[i].connect = false; 00683 } 00684 command("AT+NCLOSEALL", GSRES_NORMAL); 00685 command("AT+WD", GSRES_NORMAL); 00686 command("AT+NDHCP=0", GSRES_NORMAL); 00687 wait_ms(100); 00688 return 0; 00689 } 00690 00691 int GSwifi::setAddress () { 00692 00693 if (command("AT+NDHCP=1", GSRES_DHCP), GS_TIMEOUT2) return -1; 00694 if (_ipaddr.isNull()) return -1; 00695 return 0; 00696 } 00697 00698 int GSwifi::setAddress (IpAddr ipaddr, IpAddr netmask, IpAddr gateway, IpAddr nameserver) { 00699 int r; 00700 char cmd[GS_CMD_SIZE]; 00701 00702 command("AT+NDHCP=0", GSRES_NORMAL); 00703 wait_ms(100); 00704 00705 sprintf(cmd, "AT+NSET=%d.%d.%d.%d,%d.%d.%d.%d,%d.%d.%d.%d", 00706 ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3], 00707 netmask[0], netmask[1], netmask[2], netmask[3], 00708 gateway[0], gateway[1], gateway[2], gateway[3]); 00709 r = command(cmd, GSRES_NORMAL); 00710 if (r) return -1; 00711 _ipaddr = ipaddr; 00712 _netmask = netmask; 00713 _gateway = gateway; 00714 00715 if (ipaddr != nameserver) { 00716 sprintf(cmd, "AT+DNSSET=%d.%d.%d.%d", 00717 nameserver[0], nameserver[1], nameserver[2], nameserver[3]); 00718 r = command(cmd, GSRES_NORMAL); 00719 } 00720 return r; 00721 } 00722 00723 int GSwifi::getAddress (IpAddr &ipaddr, IpAddr &netmask, IpAddr &gateway, IpAddr &nameserver) { 00724 ipaddr = _ipaddr; 00725 netmask = _netmask; 00726 gateway = _gateway; 00727 nameserver = _nameserver; 00728 return 0; 00729 } 00730 00731 int GSwifi::getHostByName (const char* name, IpAddr &addr) { 00732 char cmd[GS_CMD_SIZE]; 00733 00734 if (! _connect || _status != GSSTAT_READY) return -1; 00735 00736 sprintf(cmd, "AT+DNSLOOKUP=%s", name); 00737 if (command(cmd, GSRES_DNSLOOKUP)) return -1; 00738 00739 addr = _resolv; 00740 return 0; 00741 } 00742 00743 int GSwifi::getHostByName (Host &host) { 00744 char cmd[GS_CMD_SIZE]; 00745 00746 if (! _connect || _status != GSSTAT_READY) return -1; 00747 00748 sprintf(cmd, "AT+DNSLOOKUP=%s", host.getName()); 00749 if (command(cmd, GSRES_DNSLOOKUP)) return -1; 00750 00751 host.setIp(_resolv); 00752 return 0; 00753 } 00754 00755 int GSwifi::setRFPower (int power) { 00756 char cmd[GS_CMD_SIZE]; 00757 00758 if (power < 0 || power > 7) return -1; 00759 00760 sprintf(cmd, "AT+WP=%d", power); 00761 return command(cmd, GSRES_NORMAL); 00762 } 00763 00764 int GSwifi::powerSave (int active, int save) { 00765 char cmd[GS_CMD_SIZE]; 00766 00767 if (_status != GSSTAT_READY) return -1; 00768 00769 sprintf(cmd, "AT+WRXACTIVE=%d", active); 00770 command(cmd, GSRES_NORMAL); 00771 sprintf(cmd, "AT+WRXPS=%d", save); 00772 return command(cmd, GSRES_NORMAL); 00773 } 00774 00775 int GSwifi::standby (int msec) { 00776 char cmd[GS_CMD_SIZE]; 00777 00778 if (_status != GSSTAT_READY && _status != GSSTAT_WAKEUP) return -1; 00779 00780 if (_status != GSSTAT_WAKEUP) { 00781 command("AT+WRXACTIVE=0", GSRES_NORMAL); 00782 command("AT+STORENWCONN", GSRES_NORMAL); 00783 } else { 00784 command("ATE0", GSRES_NORMAL); 00785 if (_rts) { 00786 command("AT&K0", GSRES_NORMAL); 00787 command("AT&R1", GSRES_NORMAL); 00788 } 00789 } 00790 _status = GSSTAT_STANDBY; 00791 sprintf(cmd, "AT+PSSTBY=%d,0,0,0", msec); // go standby 00792 return command(cmd, GSRES_NORMAL, 0); 00793 } 00794 00795 int GSwifi::wakeup () { 00796 00797 if (_status == GSSTAT_WAKEUP) { 00798 _status = GSSTAT_READY; 00799 command("ATE0", GSRES_NORMAL); 00800 if (_rts) { 00801 command("AT&K0", GSRES_NORMAL); 00802 command("AT&R1", GSRES_NORMAL); 00803 } 00804 #ifdef GS_BULK 00805 command("AT+BDATA=1", GSRES_NORMAL); 00806 #endif 00807 command("AT+RESTORENWCONN", GSRES_NORMAL); 00808 wait_ms(100); 00809 return command("AT+WRXACTIVE=1", GSRES_NORMAL); 00810 } else 00811 if (_status == GSSTAT_DEEPSLEEP) { 00812 _status = GSSTAT_READY; 00813 return command("AT", GSRES_NORMAL); 00814 } 00815 return -1; 00816 } 00817 00818 int GSwifi::deepSleep () { 00819 00820 if (_status != GSSTAT_READY) return -1; 00821 00822 _status = GSSTAT_DEEPSLEEP; 00823 return command("AT+PSDPSLEEP", GSRES_NORMAL, 0); // go deep sleep 00824 } 00825 00826 bool GSwifi::isConnected () { 00827 return _connect; 00828 } 00829 00830 GSSTATUS GSwifi::getStatus () { 00831 return _status; 00832 } 00833 00834 int GSwifi::getRssi () { 00835 if (command("AT+WRSSI=?", GSRES_RSSI)) { 00836 return 0; 00837 } 00838 return _rssi; 00839 } 00840 00841 int GSwifi::ntpdate (Host host, int sec) { 00842 char cmd[GS_CMD_SIZE]; 00843 00844 if (! _connect || _status != GSSTAT_READY) return -1; 00845 00846 if (host.getIp().isNull()) { 00847 if (getHostByName(host)) { 00848 if (getHostByName(host)) return -1; 00849 } 00850 } 00851 00852 if (sec) { 00853 sprintf(cmd, "AT+NTIMESYNC=1,%d.%d.%d.%d,%d,1,%d", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], 00854 GS_TIMEOUT / 1000, sec); 00855 } else { 00856 sprintf(cmd, "AT+NTIMESYNC=1,%d.%d.%d.%d,%d,0", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], 00857 GS_TIMEOUT / 1000); 00858 } 00859 return command(cmd, GSRES_NORMAL); 00860 } 00861 00862 int GSwifi::setTime (time_t time) { 00863 char cmd[GS_CMD_SIZE]; 00864 struct tm *t; 00865 00866 if (_status != GSSTAT_READY) return -1; 00867 00868 t = localtime(&time); 00869 sprintf(cmd, "AT+SETTIME=%d/%d/%d,%d:%d:%d", t->tm_mday, t->tm_mon + 1, t->tm_year + 1900, t->tm_hour, t->tm_min, t->tm_sec); 00870 return command(cmd, GSRES_NORMAL); 00871 } 00872 00873 time_t GSwifi::getTime () { 00874 00875 if (command("AT+GETTIME=?", GSRES_TIME)) { 00876 return 0; 00877 } 00878 return _time; 00879 } 00880 00881 int GSwifi::gpioOut (int port, int out) { 00882 char cmd[GS_CMD_SIZE]; 00883 00884 if (_status != GSSTAT_READY) return -1; 00885 00886 sprintf(cmd, "AT+DGPIO=%d,%d", port, out); 00887 return command(cmd, GSRES_NORMAL); 00888 } 00889 00890 void GSwifi::poll_cmd () { 00891 int i; 00892 00893 while (_gs_enter) { 00894 // received "\n" 00895 char buf[GS_CMD_SIZE]; 00896 00897 // wait_ms(10); 00898 _gs_enter --; 00899 i = 0; 00900 while (_buf_cmd.use() && i < sizeof(buf)) { 00901 _buf_cmd.get(&buf[i]); 00902 if (buf[i] == '\n') { 00903 break; 00904 } 00905 i ++; 00906 } 00907 buf[i] = 0; 00908 DBG("poll: %d %s\r\n", _gs_enter, buf); 00909 00910 if (i == 0) { 00911 } else 00912 if (strncmp(buf, "CONNECT", 7) == 0 && buf[8] >= '0' && buf[8] <= 'F') { 00913 int cid = x2i(buf[8]); 00914 if (_gs_sock[cid].type == GSTYPE_SERVER) { 00915 int acid, ip1, ip2, ip3, ip4; 00916 char *tmp = buf + 12; 00917 00918 acid = x2i(buf[10]); 00919 DBG("connect %d -> %d\r\n", cid, acid); 00920 newSock(acid, _gs_sock[cid].type, _gs_sock[cid].protocol, _gs_sock[cid].onGsReceive); 00921 _gs_sock[acid].lcid = cid; 00922 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4); 00923 _gs_sock[acid].host.setIp(IpAddr(ip1, ip2, ip3, ip4)); 00924 tmp = strstr(tmp, " ") + 1; 00925 _gs_sock[acid].host.setPort(atoi(tmp)); 00926 00927 #ifdef GS_USE_HTTPD 00928 if (_gs_sock[acid].protocol == GSPROT_HTTPD) { 00929 poll_httpd(acid, 0); 00930 } else 00931 #endif 00932 if (_gs_sock[acid].onGsReceive != NULL) { 00933 _gs_sock[acid].onGsReceive(acid, 0); // event connected 00934 } 00935 } 00936 } else 00937 if (strncmp(buf, "DISCONNECT", 10) == 0) { 00938 int cid = x2i(buf[11]); 00939 DBG("disconnect %d\r\n", cid); 00940 _gs_sock[cid].connect = false; 00941 00942 #ifdef GS_USE_HTTPD 00943 if (_gs_sock[cid].protocol == GSPROT_HTTPD) { 00944 poll_httpd(cid, 0); 00945 } else 00946 #endif 00947 if (_gs_sock[cid].onGsReceive != NULL) { 00948 _gs_sock[cid].onGsReceive(cid, 0); // event disconnected 00949 } 00950 } else 00951 if (strncmp(buf, "DISASSOCIATED", 13) == 0 || 00952 strncmp(buf, "Disassociated", 13) == 0 || 00953 strncmp(buf, "Disassociation Event", 20) == 0 || 00954 strncmp(buf, "UnExpected Warm Boot", 20) == 0) { 00955 _connect = false; 00956 for (i = 0; i < 16; i ++) { 00957 _gs_sock[i].connect = false; 00958 } 00959 } else 00960 if (strncmp(buf, "Out of StandBy-Timer", 20) == 0 || 00961 strncmp(buf, "Out of StandBy-Alarm", 20) == 0) { 00962 // if (_status == GSSTAT_STANDBY) { 00963 _status = GSSTAT_WAKEUP; 00964 // } 00965 } else 00966 if (strncmp(buf, "Out of Deep Sleep", 17) == 0 ) { 00967 // if (_status == GSSTAT_DEEPSLEEP) { 00968 _status = GSSTAT_READY; 00969 // } 00970 } else 00971 if (strncmp(buf, "Out of", 6) == 0) { 00972 } 00973 DBG("status: %d\r\n", _status); 00974 } 00975 } 00976 00977 void GSwifi::poll () { 00978 int i, j; 00979 00980 poll_cmd(); 00981 00982 for (i = 0; i < 16; i ++) { 00983 // if (_gs_sock[i].connect && _gs_sock[i].received) { 00984 if (_gs_sock[i].received && _gs_sock[i].data->use()) { 00985 // recv interrupt 00986 _gs_sock[i].received = 0; 00987 #ifdef GS_USE_HTTPD 00988 if (_gs_sock[i].protocol == GSPROT_HTTPD) { 00989 for (j = 0; j < 1500 / GS_DATA_SIZE + 1; j ++) { 00990 if (! _gs_sock[i].connect || ! _gs_sock[i].data->use()) break; 00991 poll_httpd(i, _gs_sock[i].data->use()); 00992 } 00993 } else 00994 #endif 00995 if (_gs_sock[i].onGsReceive != NULL) { 00996 for (j = 0; j < 1500 / GS_DATA_SIZE + 1; j ++) { 00997 if (! _gs_sock[i].connect || ! _gs_sock[i].data->use()) break; 00998 _gs_sock[i].onGsReceive(i, _gs_sock[i].data->use()); 00999 } 01000 } 01001 } 01002 } 01003 01004 if (!_connect && _reconnect_count < _reconnect && _ssid) { 01005 // re-connrct 01006 int r; 01007 char cmd[GS_CMD_SIZE]; 01008 _reconnect_count ++; 01009 DBG("re-connect %d\r\n", _reconnect_count); 01010 sprintf(cmd, "AT+WA=%s", _ssid); 01011 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2); 01012 if (r == 0) { 01013 _connect = true; 01014 _reconnect_count = 0; 01015 } 01016 } 01017 } 01018 01019 void GSwifi::newSock (int cid, GSTYPE type, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive) { 01020 _gs_sock[cid].type = type; 01021 _gs_sock[cid].protocol = pro; 01022 _gs_sock[cid].connect = true; 01023 if (_gs_sock[cid].data == NULL) { 01024 _gs_sock[cid].data = new RingBuffer(GS_DATA_SIZE); 01025 } else { 01026 _gs_sock[cid].data->clear(); 01027 } 01028 _gs_sock[cid].lcid = 0; 01029 _gs_sock[cid].received = 0; 01030 _gs_sock[cid].onGsReceive = ponGsReceive; 01031 } 01032 01033 int GSwifi::open (Host &host, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive) { 01034 char cmd[GS_CMD_SIZE]; 01035 01036 if (! _connect || _status != GSSTAT_READY) return -1; 01037 if (host.getIp().isNull() || host.getPort() == 0) { 01038 return -1; 01039 } 01040 01041 if (pro == GSPROT_UDP) { 01042 sprintf(cmd, "AT+NCUDP=%d.%d.%d.%d,%d", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], host.getPort()); 01043 } else { 01044 sprintf(cmd, "AT+NCTCP=%d.%d.%d.%d,%d", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], host.getPort()); 01045 } 01046 if (command(cmd, GSRES_CONNECT)) return -1; 01047 01048 newSock(_cid, GSTYPE_CLIENT, pro, ponGsReceive); 01049 return _cid; 01050 } 01051 01052 int GSwifi::listen (int port, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive) { 01053 char cmd[GS_CMD_SIZE]; 01054 01055 if (! _connect || _status != GSSTAT_READY) return -1; 01056 if (port == 0) { 01057 return -1; 01058 } 01059 01060 if (pro == GSPROT_UDP) { 01061 sprintf(cmd, "AT+NSUDP=%d", port); 01062 } else { 01063 sprintf(cmd, "AT+NSTCP=%d", port); 01064 } 01065 if (command(cmd, GSRES_CONNECT)) return -1; 01066 01067 newSock(_cid, GSTYPE_SERVER, pro, ponGsReceive); 01068 return _cid; 01069 } 01070 01071 int GSwifi::close (int cid) { 01072 char cmd[GS_CMD_SIZE]; 01073 01074 if (! _gs_sock[cid].connect) return -1; 01075 01076 _gs_sock[cid].connect = false; 01077 // delete _gs_sock[cid].data; 01078 // _gs_sock[cid].data = NULL; 01079 sprintf(cmd, "AT+NCLOSE=%X", cid); 01080 return command(cmd, GSRES_NORMAL); 01081 } 01082 01083 int GSwifi::send (int cid, const char *buf, int len) { 01084 int i; 01085 Timer timeout; 01086 01087 if (! _gs_sock[cid].connect) return -1; 01088 01089 if ((_gs_sock[cid].protocol == GSPROT_TCP) || 01090 (_gs_sock[cid].protocol == GSPROT_UDP && _gs_sock[cid].type == GSTYPE_CLIENT) || 01091 (_gs_sock[cid].protocol == GSPROT_HTTPD)) { 01092 // TCP Client, TCP Server, UDP Client 01093 _gs_ok = 0; 01094 _gs_failure = 0; 01095 #ifdef GS_BULK 01096 _gs.printf("\x1bZ%X%04d", cid, len); 01097 for (i = 0; i < len; i ++) { 01098 _gs_putc(buf[i]); 01099 #ifdef DEBUG_VIEW 01100 DBG("%c", buf[i]); 01101 #endif 01102 } 01103 #else 01104 _gs.printf("\x1bS%X", cid); 01105 for (i = 0; i < len; i ++) { 01106 if (buf[i] >= 0x20 && buf[i] < 0x7f) { 01107 _gs_putc(buf[i]); 01108 #ifdef DEBUG_VIEW 01109 DBG("%c", buf[i]); 01110 #endif 01111 } 01112 } 01113 _gs_putc(0x1b); 01114 _gs_putc('E'); 01115 #endif 01116 } else { 01117 return -1; 01118 } 01119 timeout.start(); 01120 while (!_gs_ok && !_gs_failure && timeout.read_ms() < GS_TIMEOUT); 01121 return _gs_ok == 1 ? 0 : -1; 01122 } 01123 01124 int GSwifi::send (int cid, const char *buf, int len, Host &host) { 01125 int i; 01126 Timer timeout; 01127 01128 if (! _gs_sock[cid].connect) return -1; 01129 01130 if ((_gs_sock[cid].protocol == GSPROT_UDP && _gs_sock[cid].type == GSTYPE_SERVER)) { 01131 // UDP Server 01132 _gs_ok = 0; 01133 _gs_failure = 0; 01134 #ifdef GS_BULK 01135 _gs.printf("\x1bY%X", cid); 01136 _gs.printf("%d.%d.%d.%d:%d:", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], host.getPort()); 01137 _gs.printf("%04d", len); 01138 for (i = 0; i < len; i ++) { 01139 _gs_putc(buf[i]); 01140 #ifdef DEBUG_VIEW 01141 DBG("%c", buf[i]); 01142 #endif 01143 } 01144 #else 01145 _gs.printf("\x1bU%X", cid); 01146 _gs.printf("%d.%d.%d.%d:%d:", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], host.getPort()); 01147 for (i = 0; i < len; i ++) { 01148 if (buf[i] >= 0x20 && buf[i] < 0x7f) { 01149 _gs_putc(buf[i]); 01150 #ifdef DEBUG_VIEW 01151 DBG("%c", buf[i]); 01152 #endif 01153 } 01154 } 01155 _gs_putc(0x1b); 01156 _gs_putc('E'); 01157 #endif 01158 } else { 01159 return -1; 01160 } 01161 timeout.start(); 01162 while (!_gs_ok && !_gs_failure && timeout.read_ms() < GS_TIMEOUT); 01163 return _gs_ok == 1 ? 0 : -1; 01164 } 01165 01166 int GSwifi::recv (int cid, char *buf, int len) { 01167 int r; 01168 Timer timeout; 01169 01170 if (_gs_sock[cid].data == NULL) return 0; 01171 01172 timeout.start(); 01173 while (_gs_sock[cid].data->use() == 0) { 01174 if (timeout.read_ms() > GS_TIMEOUT) return 0; 01175 } 01176 timeout.stop(); 01177 01178 r = _gs_sock[cid].data->get(buf, len); 01179 return r; 01180 } 01181 01182 int GSwifi::recv (int cid, char *buf, int len, Host &host) { 01183 int r; 01184 Timer timeout; 01185 01186 if (_gs_sock[cid].data == NULL) return 0; 01187 01188 timeout.start(); 01189 while (_gs_sock[cid].data->use() == 0) { 01190 if (timeout.read_ms() > GS_TIMEOUT) return 0; 01191 } 01192 timeout.stop(); 01193 01194 r = _gs_sock[cid].data->get(buf, len); 01195 host = _from; 01196 return r; 01197 } 01198 01199 bool GSwifi::isConnected (int cid) { 01200 return _gs_sock[cid].connect; 01201 } 01202 01203 int GSwifi::httpGet (Host &host, const char *uri, const char *user, const char *pwd, int ssl, onGsReceiveFunc ponGsReceive) { 01204 char cmd[GS_CMD_SIZE]; 01205 01206 if (! _connect || _status != GSSTAT_READY) return -1; 01207 01208 if (host.getIp().isNull()) { 01209 if (getHostByName(host)) { 01210 if (getHostByName(host)) return -1; 01211 } 01212 } 01213 if (host.getPort() == 0) { 01214 if (ssl) { 01215 host.setPort(443); 01216 } else { 01217 host.setPort(80); 01218 } 01219 } 01220 01221 command("AT+HTTPCONF=3,close", GSRES_NORMAL); // Connection: 01222 sprintf(cmd, "AT+HTTPCONF=11,%s", host.getName()); // Host: 01223 command(cmd, GSRES_NORMAL); 01224 if (user && pwd) { 01225 char tmp[GS_CMD_SIZE], tmp2[GS_CMD_SIZE]; 01226 snprintf(tmp, sizeof(tmp), "%s:%s", user, pwd); 01227 base64encode(tmp, strlen(tmp), tmp2, sizeof(tmp2)); 01228 sprintf(cmd, "AT+HTTPCONF=2,Basic %s", tmp2); // Authorization: 01229 command(cmd, GSRES_NORMAL); 01230 } else { 01231 command("AT+HTTPCONFDEL=2", GSRES_NORMAL); 01232 } 01233 command("AT+HTTPCONFDEL=5", GSRES_NORMAL); 01234 command("AT+HTTPCONFDEL=7", GSRES_NORMAL); 01235 01236 sprintf(cmd, "AT+HTTPOPEN=%d.%d.%d.%d,%d", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], host.getPort()); 01237 if (ssl) { 01238 strcat(cmd, ",1"); 01239 } 01240 if (command(cmd, GSRES_HTTP)) return -1; 01241 newSock(_cid, GSTYPE_CLIENT, GSPROT_HTTPGET, ponGsReceive); 01242 01243 sprintf(cmd, "AT+HTTPSEND=%d,1,%d,%s", _cid, GS_TIMEOUT / 1000, uri); // GET 01244 command(cmd, GSRES_NORMAL); 01245 01246 return _cid; 01247 } 01248 01249 int GSwifi::httpGet (Host &host, const char *uri, int ssl, onGsReceiveFunc ponGsReceive) { 01250 return httpGet (host, uri, NULL, NULL, ssl, ponGsReceive); 01251 } 01252 01253 int GSwifi::httpPost (Host &host, const char *uri, const char *body, const char *user, const char *pwd, int ssl, onGsReceiveFunc ponGsReceive) { 01254 char cmd[GS_CMD_SIZE]; 01255 int i, len; 01256 01257 if (! _connect || _status != GSSTAT_READY) return -1; 01258 01259 if (host.getIp().isNull()) { 01260 if (getHostByName(host)) { 01261 if (getHostByName(host)) return -1; 01262 } 01263 } 01264 if (host.getPort() == 0) { 01265 if (ssl) { 01266 host.setPort(443); 01267 } else { 01268 host.setPort(80); 01269 } 01270 } 01271 len = strlen(body); 01272 01273 command("AT+HTTPCONF=3,close", GSRES_NORMAL); // Connection: 01274 sprintf(cmd, "AT+HTTPCONF=11,%s", host.getName()); // Host: 01275 command(cmd, GSRES_NORMAL); 01276 sprintf(cmd, "AT+HTTPCONF=5,%d", len); // Content-Length: 01277 command(cmd, GSRES_NORMAL); 01278 command("AT+HTTPCONF=7,application/x-www-form-urlencoded", GSRES_NORMAL); // Content-type: 01279 if (user && pwd) { 01280 char tmp[GS_CMD_SIZE], tmp2[GS_CMD_SIZE]; 01281 snprintf(tmp, sizeof(tmp), "%s:%s", user, pwd); 01282 base64encode(tmp, strlen(tmp), tmp2, sizeof(tmp2)); 01283 sprintf(cmd, "AT+HTTPCONF=2,Basic %s", tmp2); // Authorization: 01284 command(cmd, GSRES_NORMAL); 01285 } else { 01286 command("AT+HTTPCONFDEL=2", GSRES_NORMAL); 01287 } 01288 01289 sprintf(cmd, "AT+HTTPOPEN=%d.%d.%d.%d,%d", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], host.getPort()); 01290 if (ssl) { 01291 strcat(cmd, ",1"); 01292 } 01293 if (command(cmd, GSRES_HTTP)) return -1; 01294 newSock(_cid, GSTYPE_CLIENT, GSPROT_HTTPPOST, ponGsReceive); 01295 01296 sprintf(cmd, "AT+HTTPSEND=%d,3,%d,%s,%d", _cid, GS_TIMEOUT / 1000, uri, len); // POST 01297 command(cmd, GSRES_NORMAL); 01298 01299 _gs.printf("\x1bH%X", _cid); 01300 for (i = 0; i < len; i ++) { 01301 _gs_putc(body[i]); 01302 DBG("%c", body[i]); 01303 } 01304 01305 return _cid; 01306 } 01307 01308 int GSwifi::httpPost (Host &host, const char *uri, const char *body, int ssl, onGsReceiveFunc ponGsReceive) { 01309 return httpPost (host, uri, body, NULL, NULL, ssl, ponGsReceive); 01310 } 01311 01312 int GSwifi::certAdd (const char *name, const char *cert, int len) { 01313 int i; 01314 char cmd[GS_CMD_SIZE]; 01315 01316 if (! _connect || _status != GSSTAT_READY) return -1; 01317 01318 sprintf(cmd, "AT+TCERTADD=%s,1,%d,1", name, len); // Hex, ram 01319 command(cmd, GSRES_NORMAL); 01320 01321 _gs_putc(0x1b); 01322 _gs_putc('W'); 01323 for (i = 0; i < len; i ++) { 01324 _gs_putc(cert[i]); 01325 } 01326 return cmdResponse(GSRES_NORMAL, GS_TIMEOUT); 01327 } 01328 01329 int GSwifi::provisioning (char *user, char *pass) { 01330 char cmd[GS_CMD_SIZE]; 01331 01332 if (_status != GSSTAT_READY) return -1; 01333 01334 sprintf(cmd, "AT+WEBPROV=%s,%s", user, pass); 01335 return command(cmd, GSRES_NORMAL); 01336 } 01337 01338 int GSwifi::setBaud (int baud) { 01339 01340 if (_status != GSSTAT_READY) return -1; 01341 01342 _gs.printf("ATB=%d\r\n", baud); 01343 _gs.baud(baud); 01344 for (int i = 0; i < 10; i ++) { 01345 wait_ms(10); 01346 poll_cmd(); 01347 _buf_cmd.clear(); 01348 } 01349 return 0; 01350 } 01351 01352 int GSwifi::base64encode (char *input, int length, char *output, int len) { 01353 // code from 01354 // Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) 01355 static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 01356 unsigned int c, c1, c2, c3; 01357 01358 if (len < ((((length-1)/3)+1)<<2)) return -1; 01359 for(unsigned int i = 0, j = 0; i<length; i+=3,j+=4) { 01360 c1 = ((((unsigned char)*((unsigned char *)&input[i])))); 01361 c2 = (length>i+1)?((((unsigned char)*((unsigned char *)&input[i+1])))):0; 01362 c3 = (length>i+2)?((((unsigned char)*((unsigned char *)&input[i+2])))):0; 01363 01364 c = ((c1 & 0xFC) >> 2); 01365 output[j+0] = base64[c]; 01366 c = ((c1 & 0x03) << 4) | ((c2 & 0xF0) >> 4); 01367 output[j+1] = base64[c]; 01368 c = ((c2 & 0x0F) << 2) | ((c3 & 0xC0) >> 6); 01369 output[j+2] = (length>i+1)?base64[c]:'='; 01370 c = (c3 & 0x3F); 01371 output[j+3] = (length>i+2)?base64[c]:'='; 01372 } 01373 output[(((length-1)/3)+1)<<2] = '\0'; 01374 return 0; 01375 } 01376 01377 int GSwifi::from_hex (int ch) { 01378 return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10; 01379 } 01380 01381 int GSwifi::to_hex (int code) { 01382 static char hex[] = "0123456789abcdef"; 01383 return hex[code & 15]; 01384 } 01385 01386 int GSwifi::urlencode (char *str, char *buf, int len) { 01387 // code from 01388 // Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) 01389 // char *pstr = str, *buf = (char*)malloc(strlen(str) * 3 + 1), *pbuf = buf; 01390 char *pstr = str, *pbuf = buf; 01391 01392 if (len < (strlen(str) * 3 + 1)) return -1; 01393 while (*pstr) { 01394 if (isalnum(*pstr) || *pstr == '-' || *pstr == '_' || *pstr == '.' || *pstr == '~') 01395 *pbuf++ = *pstr; 01396 else if (*pstr == ' ') 01397 *pbuf++ = '+'; 01398 else 01399 *pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15); 01400 pstr++; 01401 } 01402 *pbuf = '\0'; 01403 return 0; 01404 } 01405 01406 int GSwifi::urldecode (char *str, char *buf, int len) { 01407 // code from 01408 // Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) 01409 // char *pstr = str, *buf = (char*)malloc(strlen(str) + 1), *pbuf = buf; 01410 char *pstr = str, *pbuf = buf; 01411 01412 if (len < (strlen(str) / 3 - 1)) return -1; 01413 while (*pstr) { 01414 if (*pstr == '%') { 01415 if (pstr[1] && pstr[2]) { 01416 *pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]); 01417 pstr += 2; 01418 } 01419 } else if (*pstr == '+') { 01420 *pbuf++ = ' '; 01421 } else { 01422 *pbuf++ = *pstr; 01423 } 01424 pstr++; 01425 } 01426 *pbuf = '\0'; 01427 return 0; 01428 } 01429 01430 int GSwifi::x2i (char c) { 01431 if (c >= '0' && c <= '9') { 01432 return c - '0'; 01433 } else 01434 if (c >= 'A' && c <= 'F') { 01435 return c - 'A' + 10; 01436 } else 01437 if (c >= 'a' && c <= 'f') { 01438 return c - 'a' + 10; 01439 } 01440 return 0; 01441 } 01442 01443 char GSwifi::i2x (int i) { 01444 if (i >= 0 && i <= 9) { 01445 return i + '0'; 01446 } else 01447 if (i >= 10 && i <= 15) { 01448 return i - 10 + 'A'; 01449 } 01450 return 0; 01451 } 01452 01453 #ifdef DEBUG 01454 // for test 01455 void GSwifi::dump () { 01456 int i; 01457 01458 DBG("GS mode=%d, escape=%d, cid=%d\r\n", _gs_mode, _escape, _cid); 01459 for (i = 0; i < 16; i ++) { 01460 DBG("%d: connect=%d, type=%d, protocol=%d, len=%d\r\n", i, _gs_sock[i].connect, _gs_sock[i].type, _gs_sock[i].protocol, _gs_sock[i].data->use()); 01461 if (_gs_sock[i].protocol == GSPROT_HTTPD) { 01462 DBG(" mode=%d, type=%d, len=%d\r\n", i, _httpd[i].mode, _httpd[i].type, _httpd[i].len); 01463 } 01464 } 01465 } 01466 01467 void GSwifi::test () { 01468 /* 01469 command(NULL, GSRES_NORMAL); 01470 wait_ms(100); 01471 command("AT+NCLOSEALL", GSRES_NORMAL); 01472 _connect = true; 01473 */ 01474 command("AT+WRXACTIVE=1", GSRES_NORMAL); 01475 } 01476 01477 int GSwifi::getc() { 01478 char c; 01479 if (_buf_cmd.use()) { 01480 _buf_cmd.get(&c); 01481 } 01482 /* 01483 } else 01484 if (_gs_sock[0].data != NULL) { 01485 _gs_sock[0].data->get(&c); 01486 } 01487 */ 01488 return c; 01489 } 01490 01491 void GSwifi::putc(char c) { 01492 _gs_putc(c); 01493 } 01494 01495 int GSwifi::readable() { 01496 return _buf_cmd.use(); 01497 // return _buf_cmd.use() || (_gs_sock[0].data != NULL && _gs_sock[0].data->use()); 01498 } 01499 #endif
Generated on Wed Jul 13 2022 01:52:46 by
1.7.2
