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

Dependents:   GSwifi_httpd GSwifi_websocket GSwifi_tcpclient GSwifi_tcpserver ... more

Fork of GSwifi by 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/

/media/uploads/gsfan/gs_im_002.jpg /media/uploads/gsfan/gs1011m_2.jpg

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

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

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

Committer:
gsfan
Date:
Wed Jan 23 07:41:23 2013 +0000
Revision:
24:5c350ae2e703
Parent:
23:a783c62c36d0
Child:
25:f6e5622d2930
auto re-connect

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gsfan 0:2f6062c6d018 1 /**
gsfan 0:2f6062c6d018 2 * Gainspan wi-fi module library for mbed
gsfan 0:2f6062c6d018 3 * Copyright (c) 2012 gsfan
gsfan 0:2f6062c6d018 4 * Released under the MIT License: http://mbed.org/license/mit
gsfan 0:2f6062c6d018 5 */
gsfan 0:2f6062c6d018 6
gsfan 0:2f6062c6d018 7 /** @file
gsfan 0:2f6062c6d018 8 * @brief Gainspan wi-fi module library for mbed
gsfan 0:2f6062c6d018 9 * GS1011MIC, GS1011MIP, GainSpan WiFi Breakout, etc.
gsfan 0:2f6062c6d018 10 * module configuration: ATB=115200
gsfan 0:2f6062c6d018 11 */
gsfan 0:2f6062c6d018 12
gsfan 0:2f6062c6d018 13 #include "dbg.h"
gsfan 0:2f6062c6d018 14 #include "mbed.h"
gsfan 0:2f6062c6d018 15 #include "GSwifi.h"
gsfan 15:5febfc399099 16 #include <ctype.h>
gsfan 0:2f6062c6d018 17
gsfan 0:2f6062c6d018 18
gsfan 10:698c5e96b5b1 19 GSwifi::GSwifi (PinName p_tx, PinName p_rx, int baud) : _gs(p_tx, p_rx), _buf_cmd(GS_CMD_SIZE) {
gsfan 0:2f6062c6d018 20 _connect = false;
gsfan 0:2f6062c6d018 21 _status = GSSTAT_READY;
gsfan 0:2f6062c6d018 22 _escape = 0;
gsfan 23:a783c62c36d0 23 _response = GSRES_NONE;
gsfan 0:2f6062c6d018 24 _gs_mode = GSMODE_COMMAND;
gsfan 24:5c350ae2e703 25 _ssid = NULL;
gsfan 24:5c350ae2e703 26 _reconnect = 0;
gsfan 24:5c350ae2e703 27 _reconnect_count = 0;
gsfan 0:2f6062c6d018 28
gsfan 10:698c5e96b5b1 29 _gs.baud(baud);
gsfan 0:2f6062c6d018 30 _gs.attach(this, &GSwifi::isr_recv, Serial::RxIrq);
gsfan 0:2f6062c6d018 31 _rts = false;
gsfan 0:2f6062c6d018 32 }
gsfan 0:2f6062c6d018 33
gsfan 10:698c5e96b5b1 34 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) {
gsfan 0:2f6062c6d018 35 _connect = false;
gsfan 0:2f6062c6d018 36 _status = GSSTAT_READY;
gsfan 0:2f6062c6d018 37 _escape = 0;
gsfan 23:a783c62c36d0 38 _response = GSRES_NONE;
gsfan 0:2f6062c6d018 39 _gs_mode = GSMODE_COMMAND;
gsfan 24:5c350ae2e703 40 _ssid = NULL;
gsfan 24:5c350ae2e703 41 _reconnect = 0;
gsfan 24:5c350ae2e703 42 _reconnect_count = 0;
gsfan 0:2f6062c6d018 43
gsfan 10:698c5e96b5b1 44 _gs.baud(baud);
gsfan 0:2f6062c6d018 45 _gs.attach(this, &GSwifi::isr_recv, Serial::RxIrq);
gsfan 0:2f6062c6d018 46
gsfan 0:2f6062c6d018 47 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
gsfan 0:2f6062c6d018 48 if (p_cts == p12) { // CTS input (P0_17)
gsfan 0:2f6062c6d018 49 LPC_UART1->MCR |= (1<<7); // CTSEN
gsfan 0:2f6062c6d018 50 LPC_PINCON->PINSEL1 &= ~(3 << 2);
gsfan 0:2f6062c6d018 51 LPC_PINCON->PINSEL1 |= (1 << 2); // UART CTS
gsfan 0:2f6062c6d018 52 }
gsfan 0:2f6062c6d018 53 if (p_rts == P0_22) { // RTS output (P0_22)
gsfan 0:2f6062c6d018 54 LPC_UART1->MCR |= (1<<6); // RTSEN
gsfan 0:2f6062c6d018 55 LPC_PINCON->PINSEL1 &= ~(3 << 12);
gsfan 0:2f6062c6d018 56 LPC_PINCON->PINSEL1 |= (1 << 12); // UART RTS
gsfan 0:2f6062c6d018 57 _rts = true;
gsfan 0:2f6062c6d018 58 } else {
gsfan 0:2f6062c6d018 59 _rts = false;
gsfan 0:2f6062c6d018 60 }
gsfan 0:2f6062c6d018 61 #elif defined(TARGET_LPC11U24)
gsfan 0:2f6062c6d018 62 if (p_cts == p21) { // CTS input (P0_7)
gsfan 16:aea56cce3bf5 63 LPC_USART->MCR |= (1<<7); // CTSEN
gsfan 0:2f6062c6d018 64 LPC_IOCON->PIO0_7 &= ~0x07;
gsfan 0:2f6062c6d018 65 LPC_IOCON->PIO0_7 |= 0x01; // UART CTS
gsfan 0:2f6062c6d018 66 }
gsfan 0:2f6062c6d018 67 if (p_rts == p22) { // RTS output (P0_17)
gsfan 16:aea56cce3bf5 68 LPC_USART->MCR |= (1<<6); // RTSEN
gsfan 0:2f6062c6d018 69 LPC_IOCON->PIO0_17 &= ~0x07;
gsfan 0:2f6062c6d018 70 LPC_IOCON->PIO0_17 |= 0x01; // UART RTS
gsfan 0:2f6062c6d018 71 _rts = true;
gsfan 0:2f6062c6d018 72 } else {
gsfan 0:2f6062c6d018 73 _rts = false;
gsfan 0:2f6062c6d018 74 }
gsfan 0:2f6062c6d018 75 #endif
gsfan 0:2f6062c6d018 76 }
gsfan 0:2f6062c6d018 77
gsfan 0:2f6062c6d018 78 // uart interrupt
gsfan 0:2f6062c6d018 79 void GSwifi::isr_recv () {
gsfan 0:2f6062c6d018 80 static int len, mode;
gsfan 0:2f6062c6d018 81 static char tmp[20];
gsfan 0:2f6062c6d018 82 char flg, dat;
gsfan 0:2f6062c6d018 83
gsfan 0:2f6062c6d018 84 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
gsfan 0:2f6062c6d018 85 flg = LPC_UART1->LSR;
gsfan 0:2f6062c6d018 86 #elif defined(TARGET_LPC11U24)
gsfan 0:2f6062c6d018 87 flg = LPC_USART->LSR;
gsfan 0:2f6062c6d018 88 #endif
gsfan 1:b127c6c5241d 89 dat = _gs_getc();
gsfan 0:2f6062c6d018 90
gsfan 0:2f6062c6d018 91 if (flg & ((1 << 7)|(1 << 3)|(1 << 4))) return;
gsfan 23:a783c62c36d0 92 #ifdef DEBUG_VIEW
gsfan 18:4b97804c37d1 93 // DBG("%02x_", dat);
gsfan 23:a783c62c36d0 94 #endif
gsfan 23:a783c62c36d0 95 /*
gsfan 23:a783c62c36d0 96 if (dat >= 0x20 && dat < 0x7f) {
gsfan 23:a783c62c36d0 97 DBG("_%c", dat);
gsfan 23:a783c62c36d0 98 } else {
gsfan 23:a783c62c36d0 99 DBG("_%02x", dat);
gsfan 23:a783c62c36d0 100 }
gsfan 23:a783c62c36d0 101 */
gsfan 0:2f6062c6d018 102 switch (_gs_mode) {
gsfan 0:2f6062c6d018 103 case GSMODE_COMMAND: // command responce
gsfan 0:2f6062c6d018 104 if (_escape) {
gsfan 0:2f6062c6d018 105 // esc
gsfan 0:2f6062c6d018 106 switch (dat) {
gsfan 0:2f6062c6d018 107 case 'O':
gsfan 0:2f6062c6d018 108 DBG("ok\r\n");
gsfan 0:2f6062c6d018 109 _gs_ok = 1;
gsfan 0:2f6062c6d018 110 break;
gsfan 0:2f6062c6d018 111 case 'F':
gsfan 0:2f6062c6d018 112 DBG("failure\r\n");
gsfan 0:2f6062c6d018 113 _gs_failure = 1;
gsfan 0:2f6062c6d018 114 break;
gsfan 0:2f6062c6d018 115 case 'S':
gsfan 0:2f6062c6d018 116 DBG("GSMODE_DATA_RX\r\n");
gsfan 0:2f6062c6d018 117 _gs_mode = GSMODE_DATA_RX;
gsfan 0:2f6062c6d018 118 mode = 0;
gsfan 0:2f6062c6d018 119 break;
gsfan 0:2f6062c6d018 120 case 'u':
gsfan 0:2f6062c6d018 121 DBG("GSMODE_DATA_RXUDP\r\n");
gsfan 0:2f6062c6d018 122 _gs_mode = GSMODE_DATA_RXUDP;
gsfan 0:2f6062c6d018 123 mode = 0;
gsfan 0:2f6062c6d018 124 break;
gsfan 0:2f6062c6d018 125 case 'Z':
gsfan 0:2f6062c6d018 126 case 'H':
gsfan 0:2f6062c6d018 127 DBG("GSMODE_DATA_RX_BULK\r\n");
gsfan 0:2f6062c6d018 128 _gs_mode = GSMODE_DATA_RX_BULK;
gsfan 0:2f6062c6d018 129 mode = 0;
gsfan 0:2f6062c6d018 130 break;
gsfan 0:2f6062c6d018 131 case 'y':
gsfan 0:2f6062c6d018 132 DBG("GSMODE_DATA_RXUDP_BULK\r\n");
gsfan 0:2f6062c6d018 133 _gs_mode = GSMODE_DATA_RXUDP_BULK;
gsfan 0:2f6062c6d018 134 mode = 0;
gsfan 0:2f6062c6d018 135 break;
gsfan 0:2f6062c6d018 136 default:
gsfan 0:2f6062c6d018 137 DBG("unknown [ESC] %02x\r\n", dat);
gsfan 0:2f6062c6d018 138 break;
gsfan 0:2f6062c6d018 139 }
gsfan 0:2f6062c6d018 140 _escape = 0;
gsfan 0:2f6062c6d018 141 } else {
gsfan 0:2f6062c6d018 142 if (dat == 0x1b) {
gsfan 0:2f6062c6d018 143 _escape = 1;
gsfan 0:2f6062c6d018 144 } else
gsfan 0:2f6062c6d018 145 if (dat != '\r') {
gsfan 0:2f6062c6d018 146 // command
gsfan 0:2f6062c6d018 147 _buf_cmd.put(dat);
gsfan 18:4b97804c37d1 148 if (dat == '\n') {
gsfan 18:4b97804c37d1 149 _gs_enter ++;
gsfan 23:a783c62c36d0 150 if (_response == GSRES_NONE && _connect) {
gsfan 23:a783c62c36d0 151 DBG("poll_cmd\r\n");
gsfan 23:a783c62c36d0 152 poll_cmd();
gsfan 23:a783c62c36d0 153 }
gsfan 18:4b97804c37d1 154 }
gsfan 0:2f6062c6d018 155 }
gsfan 0:2f6062c6d018 156 }
gsfan 0:2f6062c6d018 157 break;
gsfan 0:2f6062c6d018 158
gsfan 0:2f6062c6d018 159 case GSMODE_DATA_RX:
gsfan 0:2f6062c6d018 160 case GSMODE_DATA_RXUDP:
gsfan 0:2f6062c6d018 161 if (mode == 0) {
gsfan 0:2f6062c6d018 162 // cid
gsfan 0:2f6062c6d018 163 _cid = x2i(dat);
gsfan 0:2f6062c6d018 164 _gs_sock[_cid].received = 0;
gsfan 0:2f6062c6d018 165 mode ++;
gsfan 0:2f6062c6d018 166 if (_gs_mode == GSMODE_DATA_RX) {
gsfan 0:2f6062c6d018 167 mode = 3;
gsfan 0:2f6062c6d018 168 }
gsfan 0:2f6062c6d018 169 len = 0;
gsfan 0:2f6062c6d018 170 } else
gsfan 0:2f6062c6d018 171 if (mode == 1) {
gsfan 0:2f6062c6d018 172 // ip
gsfan 0:2f6062c6d018 173 if ((dat < '0' || dat > '9') && dat != '.') {
gsfan 0:2f6062c6d018 174 int ip1, ip2, ip3, ip4;
gsfan 0:2f6062c6d018 175 tmp[len] = 0;
gsfan 0:2f6062c6d018 176 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 0:2f6062c6d018 177 _from.setIp(IpAddr(ip1, ip2, ip3, ip4));
gsfan 0:2f6062c6d018 178 mode ++;
gsfan 0:2f6062c6d018 179 len = 0;
gsfan 0:2f6062c6d018 180 break;
gsfan 0:2f6062c6d018 181 }
gsfan 0:2f6062c6d018 182 tmp[len] = dat;
gsfan 0:2f6062c6d018 183 len ++;
gsfan 0:2f6062c6d018 184 } else
gsfan 0:2f6062c6d018 185 if (mode == 2) {
gsfan 0:2f6062c6d018 186 // port
gsfan 0:2f6062c6d018 187 if (dat < '0' || dat > '9') {
gsfan 0:2f6062c6d018 188 tmp[len] = 0;
gsfan 0:2f6062c6d018 189 _from.setPort(atoi(tmp));
gsfan 0:2f6062c6d018 190 mode ++;
gsfan 0:2f6062c6d018 191 len = 0;
gsfan 0:2f6062c6d018 192 break;
gsfan 0:2f6062c6d018 193 }
gsfan 0:2f6062c6d018 194 tmp[len] = dat;
gsfan 0:2f6062c6d018 195 len ++;
gsfan 0:2f6062c6d018 196 } else
gsfan 0:2f6062c6d018 197 if (_escape) {
gsfan 0:2f6062c6d018 198 // esc
gsfan 0:2f6062c6d018 199 switch (dat) {
gsfan 0:2f6062c6d018 200 case 'E':
gsfan 0:2f6062c6d018 201 DBG("recv ascii %d\r\n", _cid);
gsfan 0:2f6062c6d018 202 _gs_sock[_cid].received = 1;
gsfan 0:2f6062c6d018 203 _gs_mode = GSMODE_COMMAND;
gsfan 0:2f6062c6d018 204 // recv interrupt
gsfan 0:2f6062c6d018 205 if (_gs_sock[_cid].protocol == GSPROT_HTTPGET && _gs_sock[_cid].onGsReceive != NULL) {
gsfan 1:b127c6c5241d 206 _gs_sock[_cid].onGsReceive(_cid, _gs_sock[_cid].data->use());
gsfan 0:2f6062c6d018 207 _gs_sock[_cid].received = 0;
gsfan 0:2f6062c6d018 208 }
gsfan 0:2f6062c6d018 209 break;
gsfan 0:2f6062c6d018 210 default:
gsfan 0:2f6062c6d018 211 DBG("unknown <ESC> %02x\r\n", dat);
gsfan 0:2f6062c6d018 212 break;
gsfan 0:2f6062c6d018 213 }
gsfan 0:2f6062c6d018 214 _escape = 0;
gsfan 0:2f6062c6d018 215 } else {
gsfan 0:2f6062c6d018 216 if (dat == 0x1b) {
gsfan 0:2f6062c6d018 217 _escape = 1;
gsfan 0:2f6062c6d018 218 } else {
gsfan 0:2f6062c6d018 219 // data
gsfan 0:2f6062c6d018 220 _gs_sock[_cid].data->put(dat);
gsfan 0:2f6062c6d018 221 len ++;
gsfan 12:63e714550791 222 if (len < GS_DATA_SIZE && _gs_sock[_cid].data->available() == 0) {
gsfan 14:9e89b922ace1 223 // buffer full
gsfan 14:9e89b922ace1 224 if (_gs_sock[_cid].onGsReceive != NULL) {
gsfan 14:9e89b922ace1 225 _gs_sock[_cid].onGsReceive(_cid, _gs_sock[_cid].data->use());
gsfan 12:63e714550791 226 }
gsfan 12:63e714550791 227 }
gsfan 0:2f6062c6d018 228 }
gsfan 0:2f6062c6d018 229 }
gsfan 0:2f6062c6d018 230 break;
gsfan 0:2f6062c6d018 231
gsfan 0:2f6062c6d018 232 case GSMODE_DATA_RX_BULK:
gsfan 0:2f6062c6d018 233 case GSMODE_DATA_RXUDP_BULK:
gsfan 5:6def1d0df519 234 // DBG("%c", dat);
gsfan 0:2f6062c6d018 235 if (mode == 0) {
gsfan 0:2f6062c6d018 236 // cid
gsfan 0:2f6062c6d018 237 _cid = x2i(dat);
gsfan 0:2f6062c6d018 238 _gs_sock[_cid].received = 0;
gsfan 0:2f6062c6d018 239 mode ++;
gsfan 0:2f6062c6d018 240 if (_gs_mode == GSMODE_DATA_RX_BULK) {
gsfan 0:2f6062c6d018 241 mode = 3;
gsfan 0:2f6062c6d018 242 }
gsfan 0:2f6062c6d018 243 len = 0;
gsfan 0:2f6062c6d018 244 } else
gsfan 0:2f6062c6d018 245 if (mode == 1) {
gsfan 0:2f6062c6d018 246 // ip
gsfan 0:2f6062c6d018 247 if ((dat < '0' || dat > '9') && dat != '.') {
gsfan 0:2f6062c6d018 248 int ip1, ip2, ip3, ip4;
gsfan 0:2f6062c6d018 249 tmp[len] = 0;
gsfan 0:2f6062c6d018 250 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 0:2f6062c6d018 251 _from.setIp(IpAddr(ip1, ip2, ip3, ip4));
gsfan 0:2f6062c6d018 252 mode ++;
gsfan 0:2f6062c6d018 253 len = 0;
gsfan 0:2f6062c6d018 254 break;
gsfan 0:2f6062c6d018 255 }
gsfan 0:2f6062c6d018 256 tmp[len] = dat;
gsfan 0:2f6062c6d018 257 len ++;
gsfan 0:2f6062c6d018 258 } else
gsfan 0:2f6062c6d018 259 if (mode == 2) {
gsfan 0:2f6062c6d018 260 // port
gsfan 0:2f6062c6d018 261 if (dat < '0' || dat > '9') {
gsfan 0:2f6062c6d018 262 tmp[len] = 0;
gsfan 0:2f6062c6d018 263 _from.setPort(atoi(tmp));
gsfan 0:2f6062c6d018 264 mode ++;
gsfan 0:2f6062c6d018 265 len = 0;
gsfan 0:2f6062c6d018 266 break;
gsfan 0:2f6062c6d018 267 }
gsfan 0:2f6062c6d018 268 tmp[len] = dat;
gsfan 0:2f6062c6d018 269 len ++;
gsfan 0:2f6062c6d018 270 } else
gsfan 0:2f6062c6d018 271 if (mode == 3) {
gsfan 0:2f6062c6d018 272 // length
gsfan 0:2f6062c6d018 273 tmp[len] = dat;
gsfan 0:2f6062c6d018 274 len ++;
gsfan 0:2f6062c6d018 275 if (len >= 4) {
gsfan 0:2f6062c6d018 276 tmp[len] = 0;
gsfan 0:2f6062c6d018 277 len = atoi(tmp);
gsfan 0:2f6062c6d018 278 mode ++;
gsfan 0:2f6062c6d018 279 break;
gsfan 0:2f6062c6d018 280 }
gsfan 0:2f6062c6d018 281 } else
gsfan 0:2f6062c6d018 282 if (mode == 4) {
gsfan 0:2f6062c6d018 283 // data
gsfan 5:6def1d0df519 284 if (_gs_sock[_cid].data != NULL) {
gsfan 5:6def1d0df519 285 _gs_sock[_cid].data->put(dat);
gsfan 5:6def1d0df519 286 }
gsfan 0:2f6062c6d018 287 len --;
gsfan 12:63e714550791 288 if (len && _gs_sock[_cid].data->available() == 0) {
gsfan 14:9e89b922ace1 289 // buffer full
gsfan 14:9e89b922ace1 290 if (_gs_sock[_cid].onGsReceive != NULL) {
gsfan 12:63e714550791 291 _gs_sock[_cid].onGsReceive(_cid, _gs_sock[_cid].data->use());
gsfan 12:63e714550791 292 }
gsfan 12:63e714550791 293 }
gsfan 0:2f6062c6d018 294 if (len == 0) {
gsfan 0:2f6062c6d018 295 DBG("recv binary %d\r\n", _cid);
gsfan 0:2f6062c6d018 296 _gs_sock[_cid].received = 1;
gsfan 0:2f6062c6d018 297 _escape = 0;
gsfan 0:2f6062c6d018 298 _gs_mode = GSMODE_COMMAND;
gsfan 0:2f6062c6d018 299 // recv interrupt
gsfan 0:2f6062c6d018 300 if (_gs_sock[_cid].protocol == GSPROT_HTTPGET && _gs_sock[_cid].onGsReceive != NULL) {
gsfan 1:b127c6c5241d 301 _gs_sock[_cid].onGsReceive(_cid, _gs_sock[_cid].data->use());
gsfan 0:2f6062c6d018 302 _gs_sock[_cid].received = 0;
gsfan 0:2f6062c6d018 303 }
gsfan 0:2f6062c6d018 304 }
gsfan 0:2f6062c6d018 305 }
gsfan 0:2f6062c6d018 306 break;
gsfan 0:2f6062c6d018 307
gsfan 0:2f6062c6d018 308 }
gsfan 0:2f6062c6d018 309 }
gsfan 0:2f6062c6d018 310
gsfan 12:63e714550791 311 int GSwifi::command (const char *cmd, GSRESPONCE res, int timeout) {
gsfan 18:4b97804c37d1 312 int i, r = 0;
gsfan 0:2f6062c6d018 313
gsfan 0:2f6062c6d018 314 if (! cmd) {
gsfan 0:2f6062c6d018 315 // dummy CR+LF
gsfan 0:2f6062c6d018 316 _gs.printf("\r\n");
gsfan 12:63e714550791 317 for (i = 0; i < 10; i ++) {
gsfan 14:9e89b922ace1 318 wait_ms(10);
gsfan 18:4b97804c37d1 319 poll_cmd();
gsfan 14:9e89b922ace1 320 _buf_cmd.clear();
gsfan 2:c6e0e97901b3 321 }
gsfan 0:2f6062c6d018 322 return 0;
gsfan 0:2f6062c6d018 323 }
gsfan 0:2f6062c6d018 324
gsfan 23:a783c62c36d0 325 _response = res;
gsfan 0:2f6062c6d018 326 _buf_cmd.clear();
gsfan 0:2f6062c6d018 327 _gs_ok = 0;
gsfan 0:2f6062c6d018 328 _gs_failure = 0;
gsfan 0:2f6062c6d018 329 _gs_enter = 0;
gsfan 0:2f6062c6d018 330 for (i = 0; i < strlen(cmd); i ++) {
gsfan 1:b127c6c5241d 331 _gs_putc(cmd[i]);
gsfan 0:2f6062c6d018 332 }
gsfan 1:b127c6c5241d 333 _gs_putc('\r');
gsfan 1:b127c6c5241d 334 _gs_putc('\n');
gsfan 0:2f6062c6d018 335 DBG("command: %s\r\n", cmd);
gsfan 0:2f6062c6d018 336 if (strlen(cmd) == 0) return 0;
gsfan 23:a783c62c36d0 337 // wait_ms(10);
gsfan 0:2f6062c6d018 338 if (timeout) {
gsfan 18:4b97804c37d1 339 r = cmdResponse(res, timeout);
gsfan 0:2f6062c6d018 340 }
gsfan 23:a783c62c36d0 341 _response = GSRES_NONE;
gsfan 18:4b97804c37d1 342 return r;
gsfan 0:2f6062c6d018 343 }
gsfan 0:2f6062c6d018 344
gsfan 0:2f6062c6d018 345 int GSwifi::cmdResponse (GSRESPONCE res, int ms) {
gsfan 0:2f6062c6d018 346 int i, n = 0, flg = 0;
gsfan 0:2f6062c6d018 347 char buf[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 348 Timer timeout;
gsfan 0:2f6062c6d018 349
gsfan 0:2f6062c6d018 350 timeout.start();
gsfan 0:2f6062c6d018 351 for (;;) {
gsfan 0:2f6062c6d018 352 // recv response
gsfan 0:2f6062c6d018 353 i = 0;
gsfan 0:2f6062c6d018 354 while (i < sizeof(buf)) {
gsfan 0:2f6062c6d018 355 if (_buf_cmd.use()) {
gsfan 0:2f6062c6d018 356 _buf_cmd.get(&buf[i]);
gsfan 0:2f6062c6d018 357 if (buf[i] == '\n') {
gsfan 0:2f6062c6d018 358 break;
gsfan 0:2f6062c6d018 359 }
gsfan 0:2f6062c6d018 360 i ++;
gsfan 0:2f6062c6d018 361 }
gsfan 0:2f6062c6d018 362 if (timeout.read_ms() > ms) {
gsfan 0:2f6062c6d018 363 timeout.stop();
gsfan 0:2f6062c6d018 364 DBG("timeout\r\n");
gsfan 0:2f6062c6d018 365 return -1;
gsfan 0:2f6062c6d018 366 }
gsfan 0:2f6062c6d018 367 }
gsfan 0:2f6062c6d018 368 _gs_enter = 0;
gsfan 0:2f6062c6d018 369 if (i == 0) continue;
gsfan 0:2f6062c6d018 370 buf[i] = 0;
gsfan 0:2f6062c6d018 371 DBG("response: %s\r\n", buf);
gsfan 0:2f6062c6d018 372 timeout.stop();
gsfan 0:2f6062c6d018 373
gsfan 0:2f6062c6d018 374 if (strcmp(buf, "OK") == 0) {
gsfan 0:2f6062c6d018 375 _gs_ok = 1;
gsfan 0:2f6062c6d018 376 } else
gsfan 0:2f6062c6d018 377 if (strncmp(buf, "ERROR", 5) == 0) {
gsfan 0:2f6062c6d018 378 _gs_failure = 1;
gsfan 0:2f6062c6d018 379 }
gsfan 0:2f6062c6d018 380
gsfan 0:2f6062c6d018 381 switch(res) {
gsfan 0:2f6062c6d018 382 case GSRES_NORMAL:
gsfan 0:2f6062c6d018 383 flg = 1;
gsfan 0:2f6062c6d018 384 break;
gsfan 0:2f6062c6d018 385 case GSRES_WPS:
gsfan 0:2f6062c6d018 386 if (n == 0 && strncmp(buf, "SSID", 4) == 0) {
gsfan 0:2f6062c6d018 387 n ++;
gsfan 0:2f6062c6d018 388 } else
gsfan 0:2f6062c6d018 389 if (n == 1 && strncmp(buf, "CHANNEL", 7) == 0) {
gsfan 0:2f6062c6d018 390 n ++;
gsfan 0:2f6062c6d018 391 } else
gsfan 0:2f6062c6d018 392 if (n == 2 && strncmp(buf, "PASSPHRASE", 10) == 0) {
gsfan 0:2f6062c6d018 393 n ++;
gsfan 0:2f6062c6d018 394 flg = 1;
gsfan 0:2f6062c6d018 395 }
gsfan 0:2f6062c6d018 396 break;
gsfan 0:2f6062c6d018 397 case GSRES_CONNECT:
gsfan 24:5c350ae2e703 398 if (strncmp(buf, "CONNECT ", 8) == 0) {
gsfan 0:2f6062c6d018 399 _cid = x2i(buf[8]);
gsfan 0:2f6062c6d018 400 flg = 1;
gsfan 0:2f6062c6d018 401 }
gsfan 0:2f6062c6d018 402 break;
gsfan 0:2f6062c6d018 403 case GSRES_DHCP:
gsfan 0:2f6062c6d018 404 if (n == 0 && strstr(buf, "SubNet") && strstr(buf, "Gateway")) {
gsfan 0:2f6062c6d018 405 n ++;
gsfan 0:2f6062c6d018 406 } else
gsfan 0:2f6062c6d018 407 if (n == 1) {
gsfan 0:2f6062c6d018 408 int ip1, ip2, ip3, ip4;
gsfan 0:2f6062c6d018 409 char *tmp = buf + 1;
gsfan 0:2f6062c6d018 410 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 0:2f6062c6d018 411 _ipaddr = IpAddr(ip1, ip2, ip3, ip4);
gsfan 0:2f6062c6d018 412 tmp = strstr(tmp, ":") + 2;
gsfan 0:2f6062c6d018 413 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 0:2f6062c6d018 414 _netmask = IpAddr(ip1, ip2, ip3, ip4);
gsfan 0:2f6062c6d018 415 tmp = strstr(tmp, ":") + 2;
gsfan 0:2f6062c6d018 416 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 0:2f6062c6d018 417 _gateway = IpAddr(ip1, ip2, ip3, ip4);
gsfan 0:2f6062c6d018 418 n ++;
gsfan 0:2f6062c6d018 419 flg = 1;
gsfan 0:2f6062c6d018 420 }
gsfan 0:2f6062c6d018 421 break;
gsfan 0:2f6062c6d018 422 case GSRES_MACADDRESS:
gsfan 9:3b819ba34c6c 423 if (buf[2] == ':' && buf[5] == ':') {
gsfan 0:2f6062c6d018 424 int mac1, mac2, mac3, mac4, mac5, mac6;
gsfan 0:2f6062c6d018 425 sscanf(buf, "%x:%x:%x:%x:%x:%x", &mac1, &mac2, &mac3, &mac4, &mac5, &mac6);
gsfan 4:a8d38857f3fd 426 _mac[0] = mac1;
gsfan 4:a8d38857f3fd 427 _mac[1] = mac2;
gsfan 4:a8d38857f3fd 428 _mac[2] = mac3;
gsfan 4:a8d38857f3fd 429 _mac[3] = mac4;
gsfan 4:a8d38857f3fd 430 _mac[4] = mac5;
gsfan 4:a8d38857f3fd 431 _mac[5] = mac6;
gsfan 0:2f6062c6d018 432 flg = 1;
gsfan 0:2f6062c6d018 433 }
gsfan 0:2f6062c6d018 434 break;
gsfan 0:2f6062c6d018 435 case GSRES_DNSLOOKUP:
gsfan 0:2f6062c6d018 436 if (strncmp(buf, "IP:", 3) == 0) {
gsfan 0:2f6062c6d018 437 int ip1, ip2, ip3, ip4;
gsfan 0:2f6062c6d018 438 sscanf(&buf[3], "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 0:2f6062c6d018 439 _resolv = IpAddr(ip1, ip2, ip3, ip4);
gsfan 0:2f6062c6d018 440 flg = 1;
gsfan 0:2f6062c6d018 441 }
gsfan 0:2f6062c6d018 442 break;
gsfan 0:2f6062c6d018 443 case GSRES_HTTP:
gsfan 4:a8d38857f3fd 444 if (buf[0] >= '0' && buf[0] <= 'F') {
gsfan 4:a8d38857f3fd 445 _cid = x2i(buf[0]);
gsfan 0:2f6062c6d018 446 flg = 1;
gsfan 0:2f6062c6d018 447 }
gsfan 0:2f6062c6d018 448 break;
gsfan 1:b127c6c5241d 449 case GSRES_RSSI:
gsfan 1:b127c6c5241d 450 if (buf[0] == '-' || (buf[0] >= '0' && buf[0] <= '9')) {
gsfan 1:b127c6c5241d 451 _rssi = atoi(buf);
gsfan 1:b127c6c5241d 452 flg = 1;
gsfan 1:b127c6c5241d 453 }
gsfan 1:b127c6c5241d 454 break;
gsfan 5:6def1d0df519 455 case GSRES_TIME:
gsfan 5:6def1d0df519 456 if (buf[0] >= '0' && buf[0] <= '9') {
gsfan 5:6def1d0df519 457 int year, month, day, hour, min, sec;
gsfan 5:6def1d0df519 458 struct tm t;
gsfan 11:983f4e832a3e 459 sscanf(buf, "%d/%d/%d,%d:%d:%d", &day, &month, &year, &hour, &min, &sec);
gsfan 5:6def1d0df519 460 t.tm_sec = sec;
gsfan 5:6def1d0df519 461 t.tm_min = min;
gsfan 5:6def1d0df519 462 t.tm_hour = hour;
gsfan 5:6def1d0df519 463 t.tm_mday = day;
gsfan 5:6def1d0df519 464 t.tm_mon = month - 1;
gsfan 5:6def1d0df519 465 t.tm_year = year - 1900;
gsfan 5:6def1d0df519 466 _time = mktime(&t);
gsfan 5:6def1d0df519 467 flg = 1;
gsfan 5:6def1d0df519 468 }
gsfan 5:6def1d0df519 469 break;
gsfan 0:2f6062c6d018 470 }
gsfan 0:2f6062c6d018 471
gsfan 0:2f6062c6d018 472 if ((flg && _gs_ok) || _gs_failure) break;
gsfan 0:2f6062c6d018 473 timeout.reset();
gsfan 0:2f6062c6d018 474 timeout.start();
gsfan 0:2f6062c6d018 475 }
gsfan 0:2f6062c6d018 476
gsfan 0:2f6062c6d018 477 if (_gs_failure || flg == 0) {
gsfan 0:2f6062c6d018 478 return -1;
gsfan 0:2f6062c6d018 479 } else {
gsfan 0:2f6062c6d018 480 return 0;
gsfan 0:2f6062c6d018 481 }
gsfan 0:2f6062c6d018 482 }
gsfan 0:2f6062c6d018 483
gsfan 24:5c350ae2e703 484 int GSwifi::connect (GSSECURITY sec, const char *ssid, const char *pass, int dhcp, int reconnect) {
gsfan 0:2f6062c6d018 485 int r;
gsfan 0:2f6062c6d018 486 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 487
gsfan 0:2f6062c6d018 488 if (_connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 489
gsfan 0:2f6062c6d018 490 command(NULL, GSRES_NORMAL);
gsfan 0:2f6062c6d018 491 if (command("ATE0", GSRES_NORMAL)) return -1;
gsfan 0:2f6062c6d018 492 if (_rts) {
gsfan 0:2f6062c6d018 493 command("AT&K0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 494 command("AT&R1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 495 }
gsfan 0:2f6062c6d018 496 command("AT+NMAC=?", GSRES_MACADDRESS);
gsfan 0:2f6062c6d018 497 #ifdef GS_BULK
gsfan 0:2f6062c6d018 498 command("AT+BDATA=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 499 #endif
gsfan 0:2f6062c6d018 500
gsfan 0:2f6062c6d018 501 disconnect();
gsfan 22:9b077e2823ce 502 command("AT+WREGDOMAIN=" GS_WREGDOMAIN, GSRES_NORMAL);
gsfan 0:2f6062c6d018 503 command("AT+WM=0", GSRES_NORMAL); // infrastructure
gsfan 0:2f6062c6d018 504 wait_ms(100);
gsfan 20:151b5a4fdd29 505 if (dhcp && sec != GSSEC_WPS_BUTTON) {
gsfan 0:2f6062c6d018 506 command("AT+NDHCP=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 507 } else {
gsfan 0:2f6062c6d018 508 command("AT+NDHCP=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 509 }
gsfan 0:2f6062c6d018 510
gsfan 0:2f6062c6d018 511 switch (sec) {
gsfan 0:2f6062c6d018 512 case GSSEC_NONE:
gsfan 0:2f6062c6d018 513 case GSSEC_OPEN:
gsfan 0:2f6062c6d018 514 case GSSEC_WEP:
gsfan 0:2f6062c6d018 515 sprintf(cmd, "AT+WAUTH=%d", sec);
gsfan 0:2f6062c6d018 516 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 517 if (sec != GSSEC_NONE) {
gsfan 22:9b077e2823ce 518 sprintf(cmd, "AT+WWEP1=%s", pass);
gsfan 22:9b077e2823ce 519 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 520 wait_ms(100);
gsfan 22:9b077e2823ce 521 }
gsfan 0:2f6062c6d018 522 sprintf(cmd, "AT+WA=%s", ssid);
gsfan 1:b127c6c5241d 523 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
gsfan 20:151b5a4fdd29 524 if (r) {
gsfan 20:151b5a4fdd29 525 DBG("retry\r\n");
gsfan 20:151b5a4fdd29 526 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
gsfan 20:151b5a4fdd29 527 }
gsfan 0:2f6062c6d018 528 break;
gsfan 0:2f6062c6d018 529 case GSSEC_WPA_PSK:
gsfan 0:2f6062c6d018 530 case GSSEC_WPA2_PSK:
gsfan 0:2f6062c6d018 531 command("AT+WAUTH=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 532 // sprintf(cmd, "AT+WWPA=%s", pass);
gsfan 0:2f6062c6d018 533 // command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 534 sprintf(cmd, "AT+WPAPSK=%s,%s", ssid, pass);
gsfan 0:2f6062c6d018 535 command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
gsfan 0:2f6062c6d018 536 wait_ms(100);
gsfan 0:2f6062c6d018 537 sprintf(cmd, "AT+WA=%s", ssid);
gsfan 1:b127c6c5241d 538 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
gsfan 20:151b5a4fdd29 539 if (r) {
gsfan 20:151b5a4fdd29 540 DBG("retry\r\n");
gsfan 20:151b5a4fdd29 541 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
gsfan 20:151b5a4fdd29 542 }
gsfan 0:2f6062c6d018 543 break;
gsfan 0:2f6062c6d018 544 case GSSEC_WPS_BUTTON:
gsfan 0:2f6062c6d018 545 command("AT+WAUTH=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 546 r = command("AT+WWPS=1", GSRES_WPS, GS_TIMEOUT2);
gsfan 0:2f6062c6d018 547 if (r) break;
gsfan 0:2f6062c6d018 548 if (dhcp) {
gsfan 0:2f6062c6d018 549 r = command("AT+NDHCP=1", GSRES_DHCP, GS_TIMEOUT2);
gsfan 0:2f6062c6d018 550 }
gsfan 0:2f6062c6d018 551 break;
gsfan 6:a423f0d197de 552 default:
gsfan 6:a423f0d197de 553 DBG("Can't use security\r\n");
gsfan 6:a423f0d197de 554 r = -1;
gsfan 6:a423f0d197de 555 break;
gsfan 0:2f6062c6d018 556 }
gsfan 0:2f6062c6d018 557
gsfan 18:4b97804c37d1 558 if (r == 0 && !dhcp) {
gsfan 18:4b97804c37d1 559 sprintf(cmd, "AT+DNSSET=%d.%d.%d.%d",
gsfan 18:4b97804c37d1 560 _gateway[0], _gateway[1], _gateway[2], _gateway[3]);
gsfan 18:4b97804c37d1 561 command(cmd, GSRES_NORMAL);
gsfan 18:4b97804c37d1 562 }
gsfan 18:4b97804c37d1 563
gsfan 24:5c350ae2e703 564 if (r == 0) {
gsfan 24:5c350ae2e703 565 _connect = true;
gsfan 24:5c350ae2e703 566 _reconnect = reconnect;
gsfan 24:5c350ae2e703 567 _reconnect_count = 0;
gsfan 24:5c350ae2e703 568 if (!_ssid) _ssid = new char[sizeof(ssid) + 1];
gsfan 24:5c350ae2e703 569 strcpy(_ssid, ssid);
gsfan 24:5c350ae2e703 570 }
gsfan 0:2f6062c6d018 571 return r;
gsfan 0:2f6062c6d018 572 }
gsfan 0:2f6062c6d018 573
gsfan 19:cad912f5a6ba 574 int GSwifi::adhock (GSSECURITY sec, const char *ssid, const char *pass, IpAddr ipaddr, IpAddr netmask) {
gsfan 0:2f6062c6d018 575 int r;
gsfan 0:2f6062c6d018 576 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 577
gsfan 0:2f6062c6d018 578 if (_connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 579
gsfan 0:2f6062c6d018 580 command(NULL, GSRES_NORMAL);
gsfan 0:2f6062c6d018 581 if (command("ATE0", GSRES_NORMAL)) return -1;
gsfan 0:2f6062c6d018 582 if (_rts) {
gsfan 0:2f6062c6d018 583 command("AT&K0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 584 command("AT&R1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 585 }
gsfan 0:2f6062c6d018 586 disconnect();
gsfan 0:2f6062c6d018 587 command("AT+NMAC=?", GSRES_MACADDRESS);
gsfan 0:2f6062c6d018 588 #ifdef GS_BULK
gsfan 0:2f6062c6d018 589 command("AT+BDATA=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 590 #endif
gsfan 0:2f6062c6d018 591
gsfan 22:9b077e2823ce 592 command("AT+WREGDOMAIN=" GS_WREGDOMAIN, GSRES_NORMAL);
gsfan 0:2f6062c6d018 593 command("AT+WM=1", GSRES_NORMAL); // adhock
gsfan 0:2f6062c6d018 594 wait_ms(100);
gsfan 0:2f6062c6d018 595 command("AT+NDHCP=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 596 setAddress(ipaddr, netmask, ipaddr, ipaddr);
gsfan 0:2f6062c6d018 597
gsfan 0:2f6062c6d018 598 switch (sec) {
gsfan 0:2f6062c6d018 599 case GSSEC_NONE:
gsfan 0:2f6062c6d018 600 case GSSEC_OPEN:
gsfan 0:2f6062c6d018 601 case GSSEC_WEP:
gsfan 0:2f6062c6d018 602 sprintf(cmd, "AT+WAUTH=%d", sec);
gsfan 0:2f6062c6d018 603 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 604 if (sec != GSSEC_NONE) {
gsfan 22:9b077e2823ce 605 sprintf(cmd, "AT+WWEP1=%s", pass);
gsfan 22:9b077e2823ce 606 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 607 wait_ms(100);
gsfan 22:9b077e2823ce 608 }
gsfan 0:2f6062c6d018 609 sprintf(cmd, "AT+WA=%s", ssid);
gsfan 0:2f6062c6d018 610 r = command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
gsfan 0:2f6062c6d018 611 break;
gsfan 0:2f6062c6d018 612 default:
gsfan 0:2f6062c6d018 613 DBG("Can't use security\r\n");
gsfan 0:2f6062c6d018 614 r = -1;
gsfan 0:2f6062c6d018 615 break;
gsfan 0:2f6062c6d018 616 }
gsfan 0:2f6062c6d018 617
gsfan 0:2f6062c6d018 618 if (r == 0) _connect = true;
gsfan 0:2f6062c6d018 619 return r;
gsfan 0:2f6062c6d018 620 }
gsfan 0:2f6062c6d018 621
gsfan 22:9b077e2823ce 622 int GSwifi::limitedap (GSSECURITY sec, const char *ssid, const char *pass, IpAddr ipaddr, IpAddr netmask, char *dns) {
gsfan 0:2f6062c6d018 623 int r;
gsfan 0:2f6062c6d018 624 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 625
gsfan 0:2f6062c6d018 626 if (_connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 627
gsfan 0:2f6062c6d018 628 command(NULL, GSRES_NORMAL);
gsfan 0:2f6062c6d018 629 if (command("ATE0", GSRES_NORMAL)) return -1;
gsfan 0:2f6062c6d018 630 if (_rts) {
gsfan 0:2f6062c6d018 631 command("AT&K0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 632 command("AT&R1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 633 }
gsfan 0:2f6062c6d018 634 disconnect();
gsfan 0:2f6062c6d018 635 command("AT+NMAC=?", GSRES_MACADDRESS);
gsfan 0:2f6062c6d018 636 #ifdef GS_BULK
gsfan 0:2f6062c6d018 637 command("AT+BDATA=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 638 #endif
gsfan 0:2f6062c6d018 639
gsfan 22:9b077e2823ce 640 command("AT+WREGDOMAIN=" GS_WREGDOMAIN, GSRES_NORMAL);
gsfan 0:2f6062c6d018 641 command("AT+WM=2", GSRES_NORMAL); // limited ap
gsfan 0:2f6062c6d018 642 wait_ms(1000);
gsfan 0:2f6062c6d018 643 command("AT+NDHCP=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 644 setAddress(ipaddr, netmask, ipaddr, ipaddr);
gsfan 8:bce9e7e51a0d 645 if (command("AT+DHCPSRVR=1", GSRES_NORMAL)) return -1;
gsfan 22:9b077e2823ce 646 if (dns) {
gsfan 22:9b077e2823ce 647 sprintf(cmd, "AT+DNS=1,%s", dns);
gsfan 22:9b077e2823ce 648 } else {
gsfan 22:9b077e2823ce 649 strcpy(cmd, "AT+DNS=1," GS_DNSNAME);
gsfan 22:9b077e2823ce 650 }
gsfan 22:9b077e2823ce 651 if (command(cmd, GSRES_NORMAL)) return -1;
gsfan 0:2f6062c6d018 652
gsfan 0:2f6062c6d018 653 switch (sec) {
gsfan 0:2f6062c6d018 654 case GSSEC_NONE:
gsfan 0:2f6062c6d018 655 case GSSEC_OPEN:
gsfan 0:2f6062c6d018 656 case GSSEC_WEP:
gsfan 0:2f6062c6d018 657 sprintf(cmd, "AT+WAUTH=%d", sec);
gsfan 0:2f6062c6d018 658 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 659 if (sec != GSSEC_NONE) {
gsfan 22:9b077e2823ce 660 sprintf(cmd, "AT+WWEP1=%s", pass);
gsfan 22:9b077e2823ce 661 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 662 wait_ms(100);
gsfan 22:9b077e2823ce 663 }
gsfan 0:2f6062c6d018 664 sprintf(cmd, "AT+WA=%s", ssid);
gsfan 0:2f6062c6d018 665 r = command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
gsfan 0:2f6062c6d018 666 break;
gsfan 0:2f6062c6d018 667 default:
gsfan 0:2f6062c6d018 668 DBG("Can't use security\r\n");
gsfan 0:2f6062c6d018 669 r = -1;
gsfan 0:2f6062c6d018 670 break;
gsfan 0:2f6062c6d018 671 }
gsfan 0:2f6062c6d018 672
gsfan 0:2f6062c6d018 673 if (r == 0) _connect = true;
gsfan 0:2f6062c6d018 674 return r;
gsfan 0:2f6062c6d018 675 }
gsfan 0:2f6062c6d018 676
gsfan 0:2f6062c6d018 677 int GSwifi::disconnect () {
gsfan 0:2f6062c6d018 678 int i;
gsfan 0:2f6062c6d018 679
gsfan 0:2f6062c6d018 680 _connect = false;
gsfan 0:2f6062c6d018 681 for (i = 0; i < 16; i ++) {
gsfan 0:2f6062c6d018 682 _gs_sock[i].connect = false;
gsfan 0:2f6062c6d018 683 }
gsfan 0:2f6062c6d018 684 command("AT+NCLOSEALL", GSRES_NORMAL);
gsfan 0:2f6062c6d018 685 command("AT+WD", GSRES_NORMAL);
gsfan 0:2f6062c6d018 686 command("AT+NDHCP=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 687 wait_ms(100);
gsfan 0:2f6062c6d018 688 return 0;
gsfan 0:2f6062c6d018 689 }
gsfan 0:2f6062c6d018 690
gsfan 0:2f6062c6d018 691 int GSwifi::setAddress () {
gsfan 0:2f6062c6d018 692
gsfan 0:2f6062c6d018 693 if (command("AT+NDHCP=1", GSRES_DHCP), GS_TIMEOUT2) return -1;
gsfan 0:2f6062c6d018 694 if (_ipaddr.isNull()) return -1;
gsfan 0:2f6062c6d018 695 return 0;
gsfan 0:2f6062c6d018 696 }
gsfan 0:2f6062c6d018 697
gsfan 0:2f6062c6d018 698 int GSwifi::setAddress (IpAddr ipaddr, IpAddr netmask, IpAddr gateway, IpAddr nameserver) {
gsfan 0:2f6062c6d018 699 int r;
gsfan 0:2f6062c6d018 700 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 701
gsfan 0:2f6062c6d018 702 command("AT+NDHCP=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 703 wait_ms(100);
gsfan 0:2f6062c6d018 704
gsfan 0:2f6062c6d018 705 sprintf(cmd, "AT+NSET=%d.%d.%d.%d,%d.%d.%d.%d,%d.%d.%d.%d",
gsfan 0:2f6062c6d018 706 ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3],
gsfan 0:2f6062c6d018 707 netmask[0], netmask[1], netmask[2], netmask[3],
gsfan 0:2f6062c6d018 708 gateway[0], gateway[1], gateway[2], gateway[3]);
gsfan 0:2f6062c6d018 709 r = command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 710 if (r) return -1;
gsfan 0:2f6062c6d018 711 _ipaddr = ipaddr;
gsfan 0:2f6062c6d018 712 _netmask = netmask;
gsfan 0:2f6062c6d018 713 _gateway = gateway;
gsfan 0:2f6062c6d018 714
gsfan 0:2f6062c6d018 715 if (ipaddr != nameserver) {
gsfan 0:2f6062c6d018 716 sprintf(cmd, "AT+DNSSET=%d.%d.%d.%d",
gsfan 0:2f6062c6d018 717 nameserver[0], nameserver[1], nameserver[2], nameserver[3]);
gsfan 0:2f6062c6d018 718 r = command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 719 }
gsfan 0:2f6062c6d018 720 return r;
gsfan 0:2f6062c6d018 721 }
gsfan 0:2f6062c6d018 722
gsfan 1:b127c6c5241d 723 int GSwifi::getAddress (IpAddr &ipaddr, IpAddr &netmask, IpAddr &gateway, IpAddr &nameserver) {
gsfan 1:b127c6c5241d 724 ipaddr = _ipaddr;
gsfan 1:b127c6c5241d 725 netmask = _netmask;
gsfan 1:b127c6c5241d 726 gateway = _gateway;
gsfan 1:b127c6c5241d 727 nameserver = _nameserver;
gsfan 2:c6e0e97901b3 728 return 0;
gsfan 1:b127c6c5241d 729 }
gsfan 1:b127c6c5241d 730
gsfan 0:2f6062c6d018 731 int GSwifi::getHostByName (const char* name, IpAddr &addr) {
gsfan 0:2f6062c6d018 732 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 733
gsfan 0:2f6062c6d018 734 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 735
gsfan 0:2f6062c6d018 736 sprintf(cmd, "AT+DNSLOOKUP=%s", name);
gsfan 0:2f6062c6d018 737 if (command(cmd, GSRES_DNSLOOKUP)) return -1;
gsfan 0:2f6062c6d018 738
gsfan 0:2f6062c6d018 739 addr = _resolv;
gsfan 0:2f6062c6d018 740 return 0;
gsfan 0:2f6062c6d018 741 }
gsfan 0:2f6062c6d018 742
gsfan 0:2f6062c6d018 743 int GSwifi::getHostByName (Host &host) {
gsfan 0:2f6062c6d018 744 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 745
gsfan 0:2f6062c6d018 746 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 747
gsfan 0:2f6062c6d018 748 sprintf(cmd, "AT+DNSLOOKUP=%s", host.getName());
gsfan 0:2f6062c6d018 749 if (command(cmd, GSRES_DNSLOOKUP)) return -1;
gsfan 0:2f6062c6d018 750
gsfan 0:2f6062c6d018 751 host.setIp(_resolv);
gsfan 0:2f6062c6d018 752 return 0;
gsfan 0:2f6062c6d018 753 }
gsfan 0:2f6062c6d018 754
gsfan 0:2f6062c6d018 755 int GSwifi::setRFPower (int power) {
gsfan 0:2f6062c6d018 756 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 757
gsfan 0:2f6062c6d018 758 if (power < 0 || power > 7) return -1;
gsfan 0:2f6062c6d018 759
gsfan 0:2f6062c6d018 760 sprintf(cmd, "AT+WP=%d", power);
gsfan 0:2f6062c6d018 761 return command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 762 }
gsfan 0:2f6062c6d018 763
gsfan 2:c6e0e97901b3 764 int GSwifi::powerSave (int active, int save) {
gsfan 0:2f6062c6d018 765 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 766
gsfan 0:2f6062c6d018 767 if (_status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 768
gsfan 2:c6e0e97901b3 769 sprintf(cmd, "AT+WRXACTIVE=%d", active);
gsfan 0:2f6062c6d018 770 command(cmd, GSRES_NORMAL);
gsfan 3:1345daf4ec1a 771 sprintf(cmd, "AT+WRXPS=%d", save);
gsfan 0:2f6062c6d018 772 return command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 773 }
gsfan 0:2f6062c6d018 774
gsfan 0:2f6062c6d018 775 int GSwifi::standby (int msec) {
gsfan 0:2f6062c6d018 776 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 777
gsfan 0:2f6062c6d018 778 if (_status != GSSTAT_READY && _status != GSSTAT_WAKEUP) return -1;
gsfan 0:2f6062c6d018 779
gsfan 0:2f6062c6d018 780 if (_status != GSSTAT_WAKEUP) {
gsfan 0:2f6062c6d018 781 command("AT+WRXACTIVE=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 782 command("AT+STORENWCONN", GSRES_NORMAL);
gsfan 0:2f6062c6d018 783 } else {
gsfan 0:2f6062c6d018 784 command("ATE0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 785 if (_rts) {
gsfan 0:2f6062c6d018 786 command("AT&K0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 787 command("AT&R1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 788 }
gsfan 0:2f6062c6d018 789 }
gsfan 0:2f6062c6d018 790 _status = GSSTAT_STANDBY;
gsfan 0:2f6062c6d018 791 sprintf(cmd, "AT+PSSTBY=%d,0,0,0", msec); // go standby
gsfan 0:2f6062c6d018 792 return command(cmd, GSRES_NORMAL, 0);
gsfan 0:2f6062c6d018 793 }
gsfan 0:2f6062c6d018 794
gsfan 0:2f6062c6d018 795 int GSwifi::wakeup () {
gsfan 0:2f6062c6d018 796
gsfan 0:2f6062c6d018 797 if (_status == GSSTAT_WAKEUP) {
gsfan 0:2f6062c6d018 798 _status = GSSTAT_READY;
gsfan 0:2f6062c6d018 799 command("ATE0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 800 if (_rts) {
gsfan 0:2f6062c6d018 801 command("AT&K0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 802 command("AT&R1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 803 }
gsfan 0:2f6062c6d018 804 #ifdef GS_BULK
gsfan 0:2f6062c6d018 805 command("AT+BDATA=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 806 #endif
gsfan 0:2f6062c6d018 807 command("AT+RESTORENWCONN", GSRES_NORMAL);
gsfan 0:2f6062c6d018 808 wait_ms(100);
gsfan 0:2f6062c6d018 809 return command("AT+WRXACTIVE=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 810 } else
gsfan 0:2f6062c6d018 811 if (_status == GSSTAT_DEEPSLEEP) {
gsfan 0:2f6062c6d018 812 _status = GSSTAT_READY;
gsfan 0:2f6062c6d018 813 return command("AT", GSRES_NORMAL);
gsfan 0:2f6062c6d018 814 }
gsfan 0:2f6062c6d018 815 return -1;
gsfan 0:2f6062c6d018 816 }
gsfan 0:2f6062c6d018 817
gsfan 0:2f6062c6d018 818 int GSwifi::deepSleep () {
gsfan 0:2f6062c6d018 819
gsfan 0:2f6062c6d018 820 if (_status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 821
gsfan 0:2f6062c6d018 822 _status = GSSTAT_DEEPSLEEP;
gsfan 0:2f6062c6d018 823 return command("AT+PSDPSLEEP", GSRES_NORMAL, 0); // go deep sleep
gsfan 0:2f6062c6d018 824 }
gsfan 0:2f6062c6d018 825
gsfan 0:2f6062c6d018 826 bool GSwifi::isConnected () {
gsfan 0:2f6062c6d018 827 return _connect;
gsfan 0:2f6062c6d018 828 }
gsfan 0:2f6062c6d018 829
gsfan 0:2f6062c6d018 830 GSSTATUS GSwifi::getStatus () {
gsfan 0:2f6062c6d018 831 return _status;
gsfan 0:2f6062c6d018 832 }
gsfan 0:2f6062c6d018 833
gsfan 1:b127c6c5241d 834 int GSwifi::getRssi () {
gsfan 1:b127c6c5241d 835 if (command("AT+WRSSI=?", GSRES_RSSI)) {
gsfan 1:b127c6c5241d 836 return 0;
gsfan 1:b127c6c5241d 837 }
gsfan 1:b127c6c5241d 838 return _rssi;
gsfan 1:b127c6c5241d 839 }
gsfan 1:b127c6c5241d 840
gsfan 5:6def1d0df519 841 int GSwifi::ntpdate (Host host, int sec) {
gsfan 5:6def1d0df519 842 char cmd[GS_CMD_SIZE];
gsfan 5:6def1d0df519 843
gsfan 5:6def1d0df519 844 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 5:6def1d0df519 845
gsfan 5:6def1d0df519 846 if (host.getIp().isNull()) {
gsfan 5:6def1d0df519 847 if (getHostByName(host)) {
gsfan 5:6def1d0df519 848 if (getHostByName(host)) return -1;
gsfan 5:6def1d0df519 849 }
gsfan 5:6def1d0df519 850 }
gsfan 5:6def1d0df519 851
gsfan 5:6def1d0df519 852 if (sec) {
gsfan 5:6def1d0df519 853 sprintf(cmd, "AT+NTIMESYNC=1,%d.%d.%d.%d,%d,1,%d", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3],
gsfan 5:6def1d0df519 854 GS_TIMEOUT / 1000, sec);
gsfan 5:6def1d0df519 855 } else {
gsfan 5:6def1d0df519 856 sprintf(cmd, "AT+NTIMESYNC=1,%d.%d.%d.%d,%d,0", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3],
gsfan 5:6def1d0df519 857 GS_TIMEOUT / 1000);
gsfan 5:6def1d0df519 858 }
gsfan 5:6def1d0df519 859 return command(cmd, GSRES_NORMAL);
gsfan 5:6def1d0df519 860 }
gsfan 5:6def1d0df519 861
gsfan 5:6def1d0df519 862 int GSwifi::setTime (time_t time) {
gsfan 5:6def1d0df519 863 char cmd[GS_CMD_SIZE];
gsfan 5:6def1d0df519 864 struct tm *t;
gsfan 5:6def1d0df519 865
gsfan 5:6def1d0df519 866 if (_status != GSSTAT_READY) return -1;
gsfan 5:6def1d0df519 867
gsfan 5:6def1d0df519 868 t = localtime(&time);
gsfan 5:6def1d0df519 869 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);
gsfan 5:6def1d0df519 870 return command(cmd, GSRES_NORMAL);
gsfan 5:6def1d0df519 871 }
gsfan 5:6def1d0df519 872
gsfan 5:6def1d0df519 873 time_t GSwifi::getTime () {
gsfan 5:6def1d0df519 874
gsfan 5:6def1d0df519 875 if (command("AT+GETTIME=?", GSRES_TIME)) {
gsfan 5:6def1d0df519 876 return 0;
gsfan 5:6def1d0df519 877 }
gsfan 5:6def1d0df519 878 return _time;
gsfan 5:6def1d0df519 879 }
gsfan 5:6def1d0df519 880
gsfan 6:a423f0d197de 881 int GSwifi::gpioOut (int port, int out) {
gsfan 6:a423f0d197de 882 char cmd[GS_CMD_SIZE];
gsfan 6:a423f0d197de 883
gsfan 6:a423f0d197de 884 if (_status != GSSTAT_READY) return -1;
gsfan 6:a423f0d197de 885
gsfan 6:a423f0d197de 886 sprintf(cmd, "AT+DGPIO=%d,%d", port, out);
gsfan 6:a423f0d197de 887 return command(cmd, GSRES_NORMAL);
gsfan 6:a423f0d197de 888 }
gsfan 6:a423f0d197de 889
gsfan 18:4b97804c37d1 890 void GSwifi::poll_cmd () {
gsfan 18:4b97804c37d1 891 int i;
gsfan 0:2f6062c6d018 892
gsfan 16:aea56cce3bf5 893 while (_gs_enter) {
gsfan 0:2f6062c6d018 894 // received "\n"
gsfan 0:2f6062c6d018 895 char buf[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 896
gsfan 23:a783c62c36d0 897 // wait_ms(10);
gsfan 0:2f6062c6d018 898 _gs_enter --;
gsfan 0:2f6062c6d018 899 i = 0;
gsfan 0:2f6062c6d018 900 while (_buf_cmd.use() && i < sizeof(buf)) {
gsfan 0:2f6062c6d018 901 _buf_cmd.get(&buf[i]);
gsfan 0:2f6062c6d018 902 if (buf[i] == '\n') {
gsfan 0:2f6062c6d018 903 break;
gsfan 0:2f6062c6d018 904 }
gsfan 0:2f6062c6d018 905 i ++;
gsfan 0:2f6062c6d018 906 }
gsfan 0:2f6062c6d018 907 buf[i] = 0;
gsfan 23:a783c62c36d0 908 DBG("poll: %d %s\r\n", _gs_enter, buf);
gsfan 0:2f6062c6d018 909
gsfan 14:9e89b922ace1 910 if (i == 0) {
gsfan 14:9e89b922ace1 911 } else
gsfan 1:b127c6c5241d 912 if (strncmp(buf, "CONNECT", 7) == 0 && buf[8] >= '0' && buf[8] <= 'F') {
gsfan 18:4b97804c37d1 913 int cid = x2i(buf[8]);
gsfan 18:4b97804c37d1 914 if (_gs_sock[cid].type == GSTYPE_SERVER) {
gsfan 1:b127c6c5241d 915 int acid, ip1, ip2, ip3, ip4;
gsfan 1:b127c6c5241d 916 char *tmp = buf + 12;
gsfan 1:b127c6c5241d 917
gsfan 1:b127c6c5241d 918 acid = x2i(buf[10]);
gsfan 18:4b97804c37d1 919 DBG("connect %d -> %d\r\n", cid, acid);
gsfan 18:4b97804c37d1 920 newSock(acid, _gs_sock[cid].type, _gs_sock[cid].protocol, _gs_sock[cid].onGsReceive);
gsfan 18:4b97804c37d1 921 _gs_sock[acid].lcid = cid;
gsfan 1:b127c6c5241d 922 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 1:b127c6c5241d 923 _gs_sock[acid].host.setIp(IpAddr(ip1, ip2, ip3, ip4));
gsfan 1:b127c6c5241d 924 tmp = strstr(tmp, " ") + 1;
gsfan 1:b127c6c5241d 925 _gs_sock[acid].host.setPort(atoi(tmp));
gsfan 18:4b97804c37d1 926
gsfan 20:151b5a4fdd29 927 #ifdef GS_USE_HTTPD
gsfan 18:4b97804c37d1 928 if (_gs_sock[acid].protocol == GSPROT_HTTPD) {
gsfan 18:4b97804c37d1 929 poll_httpd(acid, 0);
gsfan 18:4b97804c37d1 930 } else
gsfan 20:151b5a4fdd29 931 #endif
gsfan 18:4b97804c37d1 932 if (_gs_sock[acid].onGsReceive != NULL) {
gsfan 18:4b97804c37d1 933 _gs_sock[acid].onGsReceive(acid, 0); // event connected
gsfan 18:4b97804c37d1 934 }
gsfan 1:b127c6c5241d 935 }
gsfan 0:2f6062c6d018 936 } else
gsfan 0:2f6062c6d018 937 if (strncmp(buf, "DISCONNECT", 10) == 0) {
gsfan 18:4b97804c37d1 938 int cid = x2i(buf[11]);
gsfan 18:4b97804c37d1 939 DBG("disconnect %d\r\n", cid);
gsfan 18:4b97804c37d1 940 _gs_sock[cid].connect = false;
gsfan 18:4b97804c37d1 941
gsfan 20:151b5a4fdd29 942 #ifdef GS_USE_HTTPD
gsfan 18:4b97804c37d1 943 if (_gs_sock[cid].protocol == GSPROT_HTTPD) {
gsfan 18:4b97804c37d1 944 poll_httpd(cid, 0);
gsfan 18:4b97804c37d1 945 } else
gsfan 20:151b5a4fdd29 946 #endif
gsfan 18:4b97804c37d1 947 if (_gs_sock[cid].onGsReceive != NULL) {
gsfan 18:4b97804c37d1 948 _gs_sock[cid].onGsReceive(cid, 0); // event disconnected
gsfan 18:4b97804c37d1 949 }
gsfan 0:2f6062c6d018 950 } else
gsfan 0:2f6062c6d018 951 if (strncmp(buf, "DISASSOCIATED", 13) == 0 ||
gsfan 0:2f6062c6d018 952 strncmp(buf, "Disassociated", 13) == 0 ||
gsfan 16:aea56cce3bf5 953 strncmp(buf, "Disassociation Event", 20) == 0 ||
gsfan 16:aea56cce3bf5 954 strncmp(buf, "UnExpected Warm Boot", 20) == 0) {
gsfan 0:2f6062c6d018 955 _connect = false;
gsfan 0:2f6062c6d018 956 for (i = 0; i < 16; i ++) {
gsfan 0:2f6062c6d018 957 _gs_sock[i].connect = false;
gsfan 0:2f6062c6d018 958 }
gsfan 0:2f6062c6d018 959 } else
gsfan 0:2f6062c6d018 960 if (strncmp(buf, "Out of StandBy-Timer", 20) == 0 ||
gsfan 0:2f6062c6d018 961 strncmp(buf, "Out of StandBy-Alarm", 20) == 0) {
gsfan 16:aea56cce3bf5 962 // if (_status == GSSTAT_STANDBY) {
gsfan 0:2f6062c6d018 963 _status = GSSTAT_WAKEUP;
gsfan 16:aea56cce3bf5 964 // }
gsfan 0:2f6062c6d018 965 } else
gsfan 0:2f6062c6d018 966 if (strncmp(buf, "Out of Deep Sleep", 17) == 0 ) {
gsfan 16:aea56cce3bf5 967 // if (_status == GSSTAT_DEEPSLEEP) {
gsfan 0:2f6062c6d018 968 _status = GSSTAT_READY;
gsfan 16:aea56cce3bf5 969 // }
gsfan 0:2f6062c6d018 970 } else
gsfan 0:2f6062c6d018 971 if (strncmp(buf, "Out of", 6) == 0) {
gsfan 0:2f6062c6d018 972 }
gsfan 0:2f6062c6d018 973 DBG("status: %d\r\n", _status);
gsfan 0:2f6062c6d018 974 }
gsfan 18:4b97804c37d1 975 }
gsfan 18:4b97804c37d1 976
gsfan 18:4b97804c37d1 977 void GSwifi::poll () {
gsfan 18:4b97804c37d1 978 int i, j;
gsfan 18:4b97804c37d1 979
gsfan 18:4b97804c37d1 980 poll_cmd();
gsfan 18:4b97804c37d1 981
gsfan 0:2f6062c6d018 982 for (i = 0; i < 16; i ++) {
gsfan 0:2f6062c6d018 983 // if (_gs_sock[i].connect && _gs_sock[i].received) {
gsfan 0:2f6062c6d018 984 if (_gs_sock[i].received && _gs_sock[i].data->use()) {
gsfan 0:2f6062c6d018 985 // recv interrupt
gsfan 0:2f6062c6d018 986 _gs_sock[i].received = 0;
gsfan 20:151b5a4fdd29 987 #ifdef GS_USE_HTTPD
gsfan 18:4b97804c37d1 988 if (_gs_sock[i].protocol == GSPROT_HTTPD) {
gsfan 18:4b97804c37d1 989 for (j = 0; j < 1500 / GS_DATA_SIZE + 1; j ++) {
gsfan 18:4b97804c37d1 990 if (! _gs_sock[i].connect || ! _gs_sock[i].data->use()) break;
gsfan 18:4b97804c37d1 991 poll_httpd(i, _gs_sock[i].data->use());
gsfan 18:4b97804c37d1 992 }
gsfan 18:4b97804c37d1 993 } else
gsfan 20:151b5a4fdd29 994 #endif
gsfan 12:63e714550791 995 if (_gs_sock[i].onGsReceive != NULL) {
gsfan 12:63e714550791 996 for (j = 0; j < 1500 / GS_DATA_SIZE + 1; j ++) {
gsfan 18:4b97804c37d1 997 if (! _gs_sock[i].connect || ! _gs_sock[i].data->use()) break;
gsfan 12:63e714550791 998 _gs_sock[i].onGsReceive(i, _gs_sock[i].data->use());
gsfan 12:63e714550791 999 }
gsfan 12:63e714550791 1000 }
gsfan 0:2f6062c6d018 1001 }
gsfan 0:2f6062c6d018 1002 }
gsfan 24:5c350ae2e703 1003
gsfan 24:5c350ae2e703 1004 if (!_connect && _reconnect_count < _reconnect && _ssid) {
gsfan 24:5c350ae2e703 1005 // re-connrct
gsfan 24:5c350ae2e703 1006 int r;
gsfan 24:5c350ae2e703 1007 char cmd[GS_CMD_SIZE];
gsfan 24:5c350ae2e703 1008 _reconnect_count ++;
gsfan 24:5c350ae2e703 1009 DBG("re-connect %d\r\n", _reconnect_count);
gsfan 24:5c350ae2e703 1010 sprintf(cmd, "AT+WA=%s", _ssid);
gsfan 24:5c350ae2e703 1011 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
gsfan 24:5c350ae2e703 1012 if (r == 0) {
gsfan 24:5c350ae2e703 1013 _connect = true;
gsfan 24:5c350ae2e703 1014 _reconnect_count = 0;
gsfan 24:5c350ae2e703 1015 }
gsfan 24:5c350ae2e703 1016 }
gsfan 0:2f6062c6d018 1017 }
gsfan 0:2f6062c6d018 1018
gsfan 2:c6e0e97901b3 1019 void GSwifi::newSock (int cid, GSTYPE type, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive) {
gsfan 1:b127c6c5241d 1020 _gs_sock[cid].type = type;
gsfan 1:b127c6c5241d 1021 _gs_sock[cid].protocol = pro;
gsfan 1:b127c6c5241d 1022 _gs_sock[cid].connect = true;
gsfan 1:b127c6c5241d 1023 if (_gs_sock[cid].data == NULL) {
gsfan 1:b127c6c5241d 1024 _gs_sock[cid].data = new RingBuffer(GS_DATA_SIZE);
gsfan 1:b127c6c5241d 1025 } else {
gsfan 1:b127c6c5241d 1026 _gs_sock[cid].data->clear();
gsfan 1:b127c6c5241d 1027 }
gsfan 1:b127c6c5241d 1028 _gs_sock[cid].lcid = 0;
gsfan 1:b127c6c5241d 1029 _gs_sock[cid].received = 0;
gsfan 1:b127c6c5241d 1030 _gs_sock[cid].onGsReceive = ponGsReceive;
gsfan 1:b127c6c5241d 1031 }
gsfan 1:b127c6c5241d 1032
gsfan 0:2f6062c6d018 1033 int GSwifi::open (Host &host, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive) {
gsfan 0:2f6062c6d018 1034 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 1035
gsfan 0:2f6062c6d018 1036 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 1037 if (host.getIp().isNull() || host.getPort() == 0) {
gsfan 0:2f6062c6d018 1038 return -1;
gsfan 0:2f6062c6d018 1039 }
gsfan 0:2f6062c6d018 1040
gsfan 0:2f6062c6d018 1041 if (pro == GSPROT_UDP) {
gsfan 0:2f6062c6d018 1042 sprintf(cmd, "AT+NCUDP=%d.%d.%d.%d,%d", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], host.getPort());
gsfan 0:2f6062c6d018 1043 } else {
gsfan 0:2f6062c6d018 1044 sprintf(cmd, "AT+NCTCP=%d.%d.%d.%d,%d", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], host.getPort());
gsfan 0:2f6062c6d018 1045 }
gsfan 0:2f6062c6d018 1046 if (command(cmd, GSRES_CONNECT)) return -1;
gsfan 0:2f6062c6d018 1047
gsfan 1:b127c6c5241d 1048 newSock(_cid, GSTYPE_CLIENT, pro, ponGsReceive);
gsfan 0:2f6062c6d018 1049 return _cid;
gsfan 0:2f6062c6d018 1050 }
gsfan 0:2f6062c6d018 1051
gsfan 0:2f6062c6d018 1052 int GSwifi::listen (int port, GSPROTOCOL pro, onGsReceiveFunc ponGsReceive) {
gsfan 0:2f6062c6d018 1053 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 1054
gsfan 0:2f6062c6d018 1055 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 1056 if (port == 0) {
gsfan 0:2f6062c6d018 1057 return -1;
gsfan 0:2f6062c6d018 1058 }
gsfan 0:2f6062c6d018 1059
gsfan 0:2f6062c6d018 1060 if (pro == GSPROT_UDP) {
gsfan 0:2f6062c6d018 1061 sprintf(cmd, "AT+NSUDP=%d", port);
gsfan 0:2f6062c6d018 1062 } else {
gsfan 0:2f6062c6d018 1063 sprintf(cmd, "AT+NSTCP=%d", port);
gsfan 0:2f6062c6d018 1064 }
gsfan 0:2f6062c6d018 1065 if (command(cmd, GSRES_CONNECT)) return -1;
gsfan 0:2f6062c6d018 1066
gsfan 1:b127c6c5241d 1067 newSock(_cid, GSTYPE_SERVER, pro, ponGsReceive);
gsfan 0:2f6062c6d018 1068 return _cid;
gsfan 0:2f6062c6d018 1069 }
gsfan 0:2f6062c6d018 1070
gsfan 0:2f6062c6d018 1071 int GSwifi::close (int cid) {
gsfan 0:2f6062c6d018 1072 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 1073
gsfan 0:2f6062c6d018 1074 if (! _gs_sock[cid].connect) return -1;
gsfan 0:2f6062c6d018 1075
gsfan 0:2f6062c6d018 1076 _gs_sock[cid].connect = false;
gsfan 23:a783c62c36d0 1077 // delete _gs_sock[cid].data;
gsfan 23:a783c62c36d0 1078 // _gs_sock[cid].data = NULL;
gsfan 0:2f6062c6d018 1079 sprintf(cmd, "AT+NCLOSE=%X", cid);
gsfan 0:2f6062c6d018 1080 return command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 1081 }
gsfan 0:2f6062c6d018 1082
gsfan 19:cad912f5a6ba 1083 int GSwifi::send (int cid, const char *buf, int len) {
gsfan 0:2f6062c6d018 1084 int i;
gsfan 6:a423f0d197de 1085 Timer timeout;
gsfan 0:2f6062c6d018 1086
gsfan 0:2f6062c6d018 1087 if (! _gs_sock[cid].connect) return -1;
gsfan 0:2f6062c6d018 1088
gsfan 0:2f6062c6d018 1089 if ((_gs_sock[cid].protocol == GSPROT_TCP) ||
gsfan 18:4b97804c37d1 1090 (_gs_sock[cid].protocol == GSPROT_UDP && _gs_sock[cid].type == GSTYPE_CLIENT) ||
gsfan 18:4b97804c37d1 1091 (_gs_sock[cid].protocol == GSPROT_HTTPD)) {
gsfan 0:2f6062c6d018 1092 // TCP Client, TCP Server, UDP Client
gsfan 0:2f6062c6d018 1093 _gs_ok = 0;
gsfan 0:2f6062c6d018 1094 _gs_failure = 0;
gsfan 0:2f6062c6d018 1095 #ifdef GS_BULK
gsfan 0:2f6062c6d018 1096 _gs.printf("\x1bZ%X%04d", cid, len);
gsfan 0:2f6062c6d018 1097 for (i = 0; i < len; i ++) {
gsfan 1:b127c6c5241d 1098 _gs_putc(buf[i]);
gsfan 23:a783c62c36d0 1099 #ifdef DEBUG_VIEW
gsfan 23:a783c62c36d0 1100 DBG("%c", buf[i]);
gsfan 23:a783c62c36d0 1101 #endif
gsfan 0:2f6062c6d018 1102 }
gsfan 0:2f6062c6d018 1103 #else
gsfan 0:2f6062c6d018 1104 _gs.printf("\x1bS%X", cid);
gsfan 0:2f6062c6d018 1105 for (i = 0; i < len; i ++) {
gsfan 0:2f6062c6d018 1106 if (buf[i] >= 0x20 && buf[i] < 0x7f) {
gsfan 1:b127c6c5241d 1107 _gs_putc(buf[i]);
gsfan 23:a783c62c36d0 1108 #ifdef DEBUG_VIEW
gsfan 23:a783c62c36d0 1109 DBG("%c", buf[i]);
gsfan 23:a783c62c36d0 1110 #endif
gsfan 0:2f6062c6d018 1111 }
gsfan 0:2f6062c6d018 1112 }
gsfan 1:b127c6c5241d 1113 _gs_putc(0x1b);
gsfan 1:b127c6c5241d 1114 _gs_putc('E');
gsfan 0:2f6062c6d018 1115 #endif
gsfan 0:2f6062c6d018 1116 } else {
gsfan 0:2f6062c6d018 1117 return -1;
gsfan 0:2f6062c6d018 1118 }
gsfan 6:a423f0d197de 1119 timeout.start();
gsfan 6:a423f0d197de 1120 while (!_gs_ok && !_gs_failure && timeout.read_ms() < GS_TIMEOUT);
gsfan 0:2f6062c6d018 1121 return _gs_ok == 1 ? 0 : -1;
gsfan 0:2f6062c6d018 1122 }
gsfan 0:2f6062c6d018 1123
gsfan 19:cad912f5a6ba 1124 int GSwifi::send (int cid, const char *buf, int len, Host &host) {
gsfan 0:2f6062c6d018 1125 int i;
gsfan 6:a423f0d197de 1126 Timer timeout;
gsfan 0:2f6062c6d018 1127
gsfan 0:2f6062c6d018 1128 if (! _gs_sock[cid].connect) return -1;
gsfan 0:2f6062c6d018 1129
gsfan 0:2f6062c6d018 1130 if ((_gs_sock[cid].protocol == GSPROT_UDP && _gs_sock[cid].type == GSTYPE_SERVER)) {
gsfan 0:2f6062c6d018 1131 // UDP Server
gsfan 0:2f6062c6d018 1132 _gs_ok = 0;
gsfan 0:2f6062c6d018 1133 _gs_failure = 0;
gsfan 0:2f6062c6d018 1134 #ifdef GS_BULK
gsfan 0:2f6062c6d018 1135 _gs.printf("\x1bY%X", cid);
gsfan 7:b75b7fc144ff 1136 _gs.printf("%d.%d.%d.%d:%d:", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], host.getPort());
gsfan 0:2f6062c6d018 1137 _gs.printf("%04d", len);
gsfan 0:2f6062c6d018 1138 for (i = 0; i < len; i ++) {
gsfan 1:b127c6c5241d 1139 _gs_putc(buf[i]);
gsfan 23:a783c62c36d0 1140 #ifdef DEBUG_VIEW
gsfan 23:a783c62c36d0 1141 DBG("%c", buf[i]);
gsfan 23:a783c62c36d0 1142 #endif
gsfan 0:2f6062c6d018 1143 }
gsfan 0:2f6062c6d018 1144 #else
gsfan 0:2f6062c6d018 1145 _gs.printf("\x1bU%X", cid);
gsfan 7:b75b7fc144ff 1146 _gs.printf("%d.%d.%d.%d:%d:", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], host.getPort());
gsfan 0:2f6062c6d018 1147 for (i = 0; i < len; i ++) {
gsfan 0:2f6062c6d018 1148 if (buf[i] >= 0x20 && buf[i] < 0x7f) {
gsfan 1:b127c6c5241d 1149 _gs_putc(buf[i]);
gsfan 23:a783c62c36d0 1150 #ifdef DEBUG_VIEW
gsfan 23:a783c62c36d0 1151 DBG("%c", buf[i]);
gsfan 23:a783c62c36d0 1152 #endif
gsfan 0:2f6062c6d018 1153 }
gsfan 0:2f6062c6d018 1154 }
gsfan 1:b127c6c5241d 1155 _gs_putc(0x1b);
gsfan 1:b127c6c5241d 1156 _gs_putc('E');
gsfan 0:2f6062c6d018 1157 #endif
gsfan 0:2f6062c6d018 1158 } else {
gsfan 0:2f6062c6d018 1159 return -1;
gsfan 0:2f6062c6d018 1160 }
gsfan 6:a423f0d197de 1161 timeout.start();
gsfan 6:a423f0d197de 1162 while (!_gs_ok && !_gs_failure && timeout.read_ms() < GS_TIMEOUT);
gsfan 0:2f6062c6d018 1163 return _gs_ok == 1 ? 0 : -1;
gsfan 0:2f6062c6d018 1164 }
gsfan 0:2f6062c6d018 1165
gsfan 0:2f6062c6d018 1166 int GSwifi::recv (int cid, char *buf, int len) {
gsfan 0:2f6062c6d018 1167 int r;
gsfan 0:2f6062c6d018 1168 Timer timeout;
gsfan 0:2f6062c6d018 1169
gsfan 0:2f6062c6d018 1170 if (_gs_sock[cid].data == NULL) return 0;
gsfan 0:2f6062c6d018 1171
gsfan 0:2f6062c6d018 1172 timeout.start();
gsfan 0:2f6062c6d018 1173 while (_gs_sock[cid].data->use() == 0) {
gsfan 0:2f6062c6d018 1174 if (timeout.read_ms() > GS_TIMEOUT) return 0;
gsfan 0:2f6062c6d018 1175 }
gsfan 0:2f6062c6d018 1176 timeout.stop();
gsfan 0:2f6062c6d018 1177
gsfan 0:2f6062c6d018 1178 r = _gs_sock[cid].data->get(buf, len);
gsfan 0:2f6062c6d018 1179 return r;
gsfan 0:2f6062c6d018 1180 }
gsfan 0:2f6062c6d018 1181
gsfan 0:2f6062c6d018 1182 int GSwifi::recv (int cid, char *buf, int len, Host &host) {
gsfan 0:2f6062c6d018 1183 int r;
gsfan 0:2f6062c6d018 1184 Timer timeout;
gsfan 0:2f6062c6d018 1185
gsfan 0:2f6062c6d018 1186 if (_gs_sock[cid].data == NULL) return 0;
gsfan 0:2f6062c6d018 1187
gsfan 0:2f6062c6d018 1188 timeout.start();
gsfan 0:2f6062c6d018 1189 while (_gs_sock[cid].data->use() == 0) {
gsfan 0:2f6062c6d018 1190 if (timeout.read_ms() > GS_TIMEOUT) return 0;
gsfan 0:2f6062c6d018 1191 }
gsfan 0:2f6062c6d018 1192 timeout.stop();
gsfan 0:2f6062c6d018 1193
gsfan 0:2f6062c6d018 1194 r = _gs_sock[cid].data->get(buf, len);
gsfan 0:2f6062c6d018 1195 host = _from;
gsfan 0:2f6062c6d018 1196 return r;
gsfan 0:2f6062c6d018 1197 }
gsfan 0:2f6062c6d018 1198
gsfan 0:2f6062c6d018 1199 bool GSwifi::isConnected (int cid) {
gsfan 0:2f6062c6d018 1200 return _gs_sock[cid].connect;
gsfan 0:2f6062c6d018 1201 }
gsfan 0:2f6062c6d018 1202
gsfan 19:cad912f5a6ba 1203 int GSwifi::httpGet (Host &host, const char *uri, const char *user, const char *pwd, int ssl, onGsReceiveFunc ponGsReceive) {
gsfan 0:2f6062c6d018 1204 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 1205
gsfan 0:2f6062c6d018 1206 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 1207
gsfan 0:2f6062c6d018 1208 if (host.getIp().isNull()) {
gsfan 0:2f6062c6d018 1209 if (getHostByName(host)) {
gsfan 0:2f6062c6d018 1210 if (getHostByName(host)) return -1;
gsfan 0:2f6062c6d018 1211 }
gsfan 0:2f6062c6d018 1212 }
gsfan 0:2f6062c6d018 1213 if (host.getPort() == 0) {
gsfan 0:2f6062c6d018 1214 if (ssl) {
gsfan 0:2f6062c6d018 1215 host.setPort(443);
gsfan 0:2f6062c6d018 1216 } else {
gsfan 0:2f6062c6d018 1217 host.setPort(80);
gsfan 0:2f6062c6d018 1218 }
gsfan 0:2f6062c6d018 1219 }
gsfan 0:2f6062c6d018 1220
gsfan 0:2f6062c6d018 1221 command("AT+HTTPCONF=3,close", GSRES_NORMAL); // Connection:
gsfan 0:2f6062c6d018 1222 sprintf(cmd, "AT+HTTPCONF=11,%s", host.getName()); // Host:
gsfan 0:2f6062c6d018 1223 command(cmd, GSRES_NORMAL);
gsfan 15:5febfc399099 1224 if (user && pwd) {
gsfan 15:5febfc399099 1225 char tmp[GS_CMD_SIZE], tmp2[GS_CMD_SIZE];
gsfan 15:5febfc399099 1226 snprintf(tmp, sizeof(tmp), "%s:%s", user, pwd);
gsfan 15:5febfc399099 1227 base64encode(tmp, strlen(tmp), tmp2, sizeof(tmp2));
gsfan 15:5febfc399099 1228 sprintf(cmd, "AT+HTTPCONF=2,Basic %s", tmp2); // Authorization:
gsfan 15:5febfc399099 1229 command(cmd, GSRES_NORMAL);
gsfan 15:5febfc399099 1230 } else {
gsfan 15:5febfc399099 1231 command("AT+HTTPCONFDEL=2", GSRES_NORMAL);
gsfan 15:5febfc399099 1232 }
gsfan 15:5febfc399099 1233 command("AT+HTTPCONFDEL=5", GSRES_NORMAL);
gsfan 15:5febfc399099 1234 command("AT+HTTPCONFDEL=7", GSRES_NORMAL);
gsfan 15:5febfc399099 1235
gsfan 0:2f6062c6d018 1236 sprintf(cmd, "AT+HTTPOPEN=%d.%d.%d.%d,%d", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], host.getPort());
gsfan 0:2f6062c6d018 1237 if (ssl) {
gsfan 0:2f6062c6d018 1238 strcat(cmd, ",1");
gsfan 0:2f6062c6d018 1239 }
gsfan 0:2f6062c6d018 1240 if (command(cmd, GSRES_HTTP)) return -1;
gsfan 1:b127c6c5241d 1241 newSock(_cid, GSTYPE_CLIENT, GSPROT_HTTPGET, ponGsReceive);
gsfan 0:2f6062c6d018 1242
gsfan 15:5febfc399099 1243 sprintf(cmd, "AT+HTTPSEND=%d,1,%d,%s", _cid, GS_TIMEOUT / 1000, uri); // GET
gsfan 0:2f6062c6d018 1244 command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 1245
gsfan 0:2f6062c6d018 1246 return _cid;
gsfan 0:2f6062c6d018 1247 }
gsfan 0:2f6062c6d018 1248
gsfan 19:cad912f5a6ba 1249 int GSwifi::httpGet (Host &host, const char *uri, int ssl, onGsReceiveFunc ponGsReceive) {
gsfan 17:6828b084e74b 1250 return httpGet (host, uri, NULL, NULL, ssl, ponGsReceive);
gsfan 15:5febfc399099 1251 }
gsfan 15:5febfc399099 1252
gsfan 19:cad912f5a6ba 1253 int GSwifi::httpPost (Host &host, const char *uri, const char *body, const char *user, const char *pwd, int ssl, onGsReceiveFunc ponGsReceive) {
gsfan 15:5febfc399099 1254 char cmd[GS_CMD_SIZE];
gsfan 15:5febfc399099 1255 int i, len;
gsfan 15:5febfc399099 1256
gsfan 15:5febfc399099 1257 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 15:5febfc399099 1258
gsfan 15:5febfc399099 1259 if (host.getIp().isNull()) {
gsfan 15:5febfc399099 1260 if (getHostByName(host)) {
gsfan 15:5febfc399099 1261 if (getHostByName(host)) return -1;
gsfan 15:5febfc399099 1262 }
gsfan 15:5febfc399099 1263 }
gsfan 15:5febfc399099 1264 if (host.getPort() == 0) {
gsfan 15:5febfc399099 1265 if (ssl) {
gsfan 15:5febfc399099 1266 host.setPort(443);
gsfan 15:5febfc399099 1267 } else {
gsfan 15:5febfc399099 1268 host.setPort(80);
gsfan 15:5febfc399099 1269 }
gsfan 15:5febfc399099 1270 }
gsfan 15:5febfc399099 1271 len = strlen(body);
gsfan 15:5febfc399099 1272
gsfan 15:5febfc399099 1273 command("AT+HTTPCONF=3,close", GSRES_NORMAL); // Connection:
gsfan 15:5febfc399099 1274 sprintf(cmd, "AT+HTTPCONF=11,%s", host.getName()); // Host:
gsfan 15:5febfc399099 1275 command(cmd, GSRES_NORMAL);
gsfan 15:5febfc399099 1276 sprintf(cmd, "AT+HTTPCONF=5,%d", len); // Content-Length:
gsfan 15:5febfc399099 1277 command(cmd, GSRES_NORMAL);
gsfan 15:5febfc399099 1278 command("AT+HTTPCONF=7,application/x-www-form-urlencoded", GSRES_NORMAL); // Content-type:
gsfan 15:5febfc399099 1279 if (user && pwd) {
gsfan 15:5febfc399099 1280 char tmp[GS_CMD_SIZE], tmp2[GS_CMD_SIZE];
gsfan 15:5febfc399099 1281 snprintf(tmp, sizeof(tmp), "%s:%s", user, pwd);
gsfan 15:5febfc399099 1282 base64encode(tmp, strlen(tmp), tmp2, sizeof(tmp2));
gsfan 15:5febfc399099 1283 sprintf(cmd, "AT+HTTPCONF=2,Basic %s", tmp2); // Authorization:
gsfan 15:5febfc399099 1284 command(cmd, GSRES_NORMAL);
gsfan 15:5febfc399099 1285 } else {
gsfan 15:5febfc399099 1286 command("AT+HTTPCONFDEL=2", GSRES_NORMAL);
gsfan 15:5febfc399099 1287 }
gsfan 15:5febfc399099 1288
gsfan 15:5febfc399099 1289 sprintf(cmd, "AT+HTTPOPEN=%d.%d.%d.%d,%d", host.getIp()[0], host.getIp()[1], host.getIp()[2], host.getIp()[3], host.getPort());
gsfan 15:5febfc399099 1290 if (ssl) {
gsfan 15:5febfc399099 1291 strcat(cmd, ",1");
gsfan 15:5febfc399099 1292 }
gsfan 15:5febfc399099 1293 if (command(cmd, GSRES_HTTP)) return -1;
gsfan 15:5febfc399099 1294 newSock(_cid, GSTYPE_CLIENT, GSPROT_HTTPPOST, ponGsReceive);
gsfan 15:5febfc399099 1295
gsfan 15:5febfc399099 1296 sprintf(cmd, "AT+HTTPSEND=%d,3,%d,%s,%d", _cid, GS_TIMEOUT / 1000, uri, len); // POST
gsfan 15:5febfc399099 1297 command(cmd, GSRES_NORMAL);
gsfan 15:5febfc399099 1298
gsfan 15:5febfc399099 1299 _gs.printf("\x1bH%X", _cid);
gsfan 15:5febfc399099 1300 for (i = 0; i < len; i ++) {
gsfan 15:5febfc399099 1301 _gs_putc(body[i]);
gsfan 15:5febfc399099 1302 DBG("%c", body[i]);
gsfan 15:5febfc399099 1303 }
gsfan 15:5febfc399099 1304
gsfan 15:5febfc399099 1305 return _cid;
gsfan 15:5febfc399099 1306 }
gsfan 15:5febfc399099 1307
gsfan 19:cad912f5a6ba 1308 int GSwifi::httpPost (Host &host, const char *uri, const char *body, int ssl, onGsReceiveFunc ponGsReceive) {
gsfan 17:6828b084e74b 1309 return httpPost (host, uri, body, NULL, NULL, ssl, ponGsReceive);
gsfan 15:5febfc399099 1310 }
gsfan 15:5febfc399099 1311
gsfan 19:cad912f5a6ba 1312 int GSwifi::certAdd (const char *name, const char *cert, int len) {
gsfan 0:2f6062c6d018 1313 int i;
gsfan 0:2f6062c6d018 1314 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 1315
gsfan 0:2f6062c6d018 1316 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 1317
gsfan 0:2f6062c6d018 1318 sprintf(cmd, "AT+TCERTADD=%s,1,%d,1", name, len); // Hex, ram
gsfan 0:2f6062c6d018 1319 command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 1320
gsfan 1:b127c6c5241d 1321 _gs_putc(0x1b);
gsfan 1:b127c6c5241d 1322 _gs_putc('W');
gsfan 0:2f6062c6d018 1323 for (i = 0; i < len; i ++) {
gsfan 1:b127c6c5241d 1324 _gs_putc(cert[i]);
gsfan 0:2f6062c6d018 1325 }
gsfan 0:2f6062c6d018 1326 return cmdResponse(GSRES_NORMAL, GS_TIMEOUT);
gsfan 0:2f6062c6d018 1327 }
gsfan 0:2f6062c6d018 1328
gsfan 22:9b077e2823ce 1329 int GSwifi::provisioning (char *user, char *pass) {
gsfan 22:9b077e2823ce 1330 char cmd[GS_CMD_SIZE];
gsfan 22:9b077e2823ce 1331
gsfan 22:9b077e2823ce 1332 if (_status != GSSTAT_READY) return -1;
gsfan 22:9b077e2823ce 1333
gsfan 22:9b077e2823ce 1334 sprintf(cmd, "AT+WEBPROV=%s,%s", user, pass);
gsfan 22:9b077e2823ce 1335 return command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 1336 }
gsfan 22:9b077e2823ce 1337
gsfan 22:9b077e2823ce 1338 int GSwifi::setBaud (int baud) {
gsfan 22:9b077e2823ce 1339
gsfan 22:9b077e2823ce 1340 if (_status != GSSTAT_READY) return -1;
gsfan 22:9b077e2823ce 1341
gsfan 22:9b077e2823ce 1342 _gs.printf("ATB=%d\r\n", baud);
gsfan 22:9b077e2823ce 1343 _gs.baud(baud);
gsfan 22:9b077e2823ce 1344 for (int i = 0; i < 10; i ++) {
gsfan 22:9b077e2823ce 1345 wait_ms(10);
gsfan 22:9b077e2823ce 1346 poll_cmd();
gsfan 22:9b077e2823ce 1347 _buf_cmd.clear();
gsfan 22:9b077e2823ce 1348 }
gsfan 22:9b077e2823ce 1349 return 0;
gsfan 22:9b077e2823ce 1350 }
gsfan 22:9b077e2823ce 1351
gsfan 19:cad912f5a6ba 1352 int GSwifi::base64encode (char *input, int length, char *output, int len) {
gsfan 15:5febfc399099 1353 // code from
gsfan 15:5febfc399099 1354 // Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
gsfan 15:5febfc399099 1355 static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
gsfan 15:5febfc399099 1356 unsigned int c, c1, c2, c3;
gsfan 15:5febfc399099 1357
gsfan 15:5febfc399099 1358 if (len < ((((length-1)/3)+1)<<2)) return -1;
gsfan 15:5febfc399099 1359 for(unsigned int i = 0, j = 0; i<length; i+=3,j+=4) {
gsfan 15:5febfc399099 1360 c1 = ((((unsigned char)*((unsigned char *)&input[i]))));
gsfan 15:5febfc399099 1361 c2 = (length>i+1)?((((unsigned char)*((unsigned char *)&input[i+1])))):0;
gsfan 15:5febfc399099 1362 c3 = (length>i+2)?((((unsigned char)*((unsigned char *)&input[i+2])))):0;
gsfan 15:5febfc399099 1363
gsfan 15:5febfc399099 1364 c = ((c1 & 0xFC) >> 2);
gsfan 15:5febfc399099 1365 output[j+0] = base64[c];
gsfan 15:5febfc399099 1366 c = ((c1 & 0x03) << 4) | ((c2 & 0xF0) >> 4);
gsfan 15:5febfc399099 1367 output[j+1] = base64[c];
gsfan 15:5febfc399099 1368 c = ((c2 & 0x0F) << 2) | ((c3 & 0xC0) >> 6);
gsfan 15:5febfc399099 1369 output[j+2] = (length>i+1)?base64[c]:'=';
gsfan 15:5febfc399099 1370 c = (c3 & 0x3F);
gsfan 15:5febfc399099 1371 output[j+3] = (length>i+2)?base64[c]:'=';
gsfan 15:5febfc399099 1372 }
gsfan 15:5febfc399099 1373 output[(((length-1)/3)+1)<<2] = '\0';
gsfan 15:5febfc399099 1374 return 0;
gsfan 15:5febfc399099 1375 }
gsfan 15:5febfc399099 1376
gsfan 20:151b5a4fdd29 1377 int GSwifi::from_hex (int ch) {
gsfan 20:151b5a4fdd29 1378 return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10;
gsfan 20:151b5a4fdd29 1379 }
gsfan 20:151b5a4fdd29 1380
gsfan 20:151b5a4fdd29 1381 int GSwifi::to_hex (int code) {
gsfan 20:151b5a4fdd29 1382 static char hex[] = "0123456789abcdef";
gsfan 20:151b5a4fdd29 1383 return hex[code & 15];
gsfan 20:151b5a4fdd29 1384 }
gsfan 20:151b5a4fdd29 1385
gsfan 15:5febfc399099 1386 int GSwifi::urlencode (char *str, char *buf, int len) {
gsfan 15:5febfc399099 1387 // code from
gsfan 15:5febfc399099 1388 // Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
gsfan 20:151b5a4fdd29 1389 // char *pstr = str, *buf = (char*)malloc(strlen(str) * 3 + 1), *pbuf = buf;
gsfan 15:5febfc399099 1390 char *pstr = str, *pbuf = buf;
gsfan 15:5febfc399099 1391
gsfan 15:5febfc399099 1392 if (len < (strlen(str) * 3 + 1)) return -1;
gsfan 15:5febfc399099 1393 while (*pstr) {
gsfan 20:151b5a4fdd29 1394 if (isalnum(*pstr) || *pstr == '-' || *pstr == '_' || *pstr == '.' || *pstr == '~')
gsfan 15:5febfc399099 1395 *pbuf++ = *pstr;
gsfan 20:151b5a4fdd29 1396 else if (*pstr == ' ')
gsfan 15:5febfc399099 1397 *pbuf++ = '+';
gsfan 20:151b5a4fdd29 1398 else
gsfan 20:151b5a4fdd29 1399 *pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
gsfan 20:151b5a4fdd29 1400 pstr++;
gsfan 20:151b5a4fdd29 1401 }
gsfan 20:151b5a4fdd29 1402 *pbuf = '\0';
gsfan 20:151b5a4fdd29 1403 return 0;
gsfan 20:151b5a4fdd29 1404 }
gsfan 20:151b5a4fdd29 1405
gsfan 20:151b5a4fdd29 1406 int GSwifi::urldecode (char *str, char *buf, int len) {
gsfan 20:151b5a4fdd29 1407 // code from
gsfan 20:151b5a4fdd29 1408 // Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
gsfan 20:151b5a4fdd29 1409 // char *pstr = str, *buf = (char*)malloc(strlen(str) + 1), *pbuf = buf;
gsfan 20:151b5a4fdd29 1410 char *pstr = str, *pbuf = buf;
gsfan 20:151b5a4fdd29 1411
gsfan 20:151b5a4fdd29 1412 if (len < (strlen(str) / 3 - 1)) return -1;
gsfan 20:151b5a4fdd29 1413 while (*pstr) {
gsfan 20:151b5a4fdd29 1414 if (*pstr == '%') {
gsfan 20:151b5a4fdd29 1415 if (pstr[1] && pstr[2]) {
gsfan 20:151b5a4fdd29 1416 *pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]);
gsfan 20:151b5a4fdd29 1417 pstr += 2;
gsfan 20:151b5a4fdd29 1418 }
gsfan 20:151b5a4fdd29 1419 } else if (*pstr == '+') {
gsfan 20:151b5a4fdd29 1420 *pbuf++ = ' ';
gsfan 20:151b5a4fdd29 1421 } else {
gsfan 20:151b5a4fdd29 1422 *pbuf++ = *pstr;
gsfan 15:5febfc399099 1423 }
gsfan 15:5febfc399099 1424 pstr++;
gsfan 15:5febfc399099 1425 }
gsfan 15:5febfc399099 1426 *pbuf = '\0';
gsfan 15:5febfc399099 1427 return 0;
gsfan 15:5febfc399099 1428 }
gsfan 15:5febfc399099 1429
gsfan 0:2f6062c6d018 1430 int GSwifi::x2i (char c) {
gsfan 0:2f6062c6d018 1431 if (c >= '0' && c <= '9') {
gsfan 0:2f6062c6d018 1432 return c - '0';
gsfan 0:2f6062c6d018 1433 } else
gsfan 0:2f6062c6d018 1434 if (c >= 'A' && c <= 'F') {
gsfan 0:2f6062c6d018 1435 return c - 'A' + 10;
gsfan 0:2f6062c6d018 1436 } else
gsfan 0:2f6062c6d018 1437 if (c >= 'a' && c <= 'f') {
gsfan 0:2f6062c6d018 1438 return c - 'a' + 10;
gsfan 0:2f6062c6d018 1439 }
gsfan 0:2f6062c6d018 1440 return 0;
gsfan 0:2f6062c6d018 1441 }
gsfan 0:2f6062c6d018 1442
gsfan 0:2f6062c6d018 1443 char GSwifi::i2x (int i) {
gsfan 0:2f6062c6d018 1444 if (i >= 0 && i <= 9) {
gsfan 0:2f6062c6d018 1445 return i + '0';
gsfan 0:2f6062c6d018 1446 } else
gsfan 0:2f6062c6d018 1447 if (i >= 10 && i <= 15) {
gsfan 0:2f6062c6d018 1448 return i - 10 + 'A';
gsfan 0:2f6062c6d018 1449 }
gsfan 0:2f6062c6d018 1450 return 0;
gsfan 0:2f6062c6d018 1451 }
gsfan 0:2f6062c6d018 1452
gsfan 22:9b077e2823ce 1453 #ifdef DEBUG
gsfan 0:2f6062c6d018 1454 // for test
gsfan 23:a783c62c36d0 1455 void GSwifi::dump () {
gsfan 23:a783c62c36d0 1456 int i;
gsfan 23:a783c62c36d0 1457
gsfan 23:a783c62c36d0 1458 DBG("GS mode=%d, escape=%d, cid=%d\r\n", _gs_mode, _escape, _cid);
gsfan 23:a783c62c36d0 1459 for (i = 0; i < 16; i ++) {
gsfan 23:a783c62c36d0 1460 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());
gsfan 23:a783c62c36d0 1461 if (_gs_sock[i].protocol == GSPROT_HTTPD) {
gsfan 23:a783c62c36d0 1462 DBG(" mode=%d, type=%d, len=%d\r\n", i, _httpd[i].mode, _httpd[i].type, _httpd[i].len);
gsfan 23:a783c62c36d0 1463 }
gsfan 23:a783c62c36d0 1464 }
gsfan 23:a783c62c36d0 1465 }
gsfan 0:2f6062c6d018 1466
gsfan 0:2f6062c6d018 1467 void GSwifi::test () {
gsfan 2:c6e0e97901b3 1468 /*
gsfan 0:2f6062c6d018 1469 command(NULL, GSRES_NORMAL);
gsfan 0:2f6062c6d018 1470 wait_ms(100);
gsfan 0:2f6062c6d018 1471 command("AT+NCLOSEALL", GSRES_NORMAL);
gsfan 0:2f6062c6d018 1472 _connect = true;
gsfan 2:c6e0e97901b3 1473 */
gsfan 2:c6e0e97901b3 1474 command("AT+WRXACTIVE=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 1475 }
gsfan 0:2f6062c6d018 1476
gsfan 0:2f6062c6d018 1477 int GSwifi::getc() {
gsfan 0:2f6062c6d018 1478 char c;
gsfan 0:2f6062c6d018 1479 if (_buf_cmd.use()) {
gsfan 0:2f6062c6d018 1480 _buf_cmd.get(&c);
gsfan 0:2f6062c6d018 1481 }
gsfan 0:2f6062c6d018 1482 /*
gsfan 0:2f6062c6d018 1483 } else
gsfan 0:2f6062c6d018 1484 if (_gs_sock[0].data != NULL) {
gsfan 0:2f6062c6d018 1485 _gs_sock[0].data->get(&c);
gsfan 0:2f6062c6d018 1486 }
gsfan 0:2f6062c6d018 1487 */
gsfan 0:2f6062c6d018 1488 return c;
gsfan 0:2f6062c6d018 1489 }
gsfan 0:2f6062c6d018 1490
gsfan 0:2f6062c6d018 1491 void GSwifi::putc(char c) {
gsfan 1:b127c6c5241d 1492 _gs_putc(c);
gsfan 0:2f6062c6d018 1493 }
gsfan 0:2f6062c6d018 1494
gsfan 0:2f6062c6d018 1495 int GSwifi::readable() {
gsfan 0:2f6062c6d018 1496 return _buf_cmd.use();
gsfan 0:2f6062c6d018 1497 // return _buf_cmd.use() || (_gs_sock[0].data != NULL && _gs_sock[0].data->use());
gsfan 0:2f6062c6d018 1498 }
gsfan 18:4b97804c37d1 1499 #endif