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