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:
Fri Jun 21 06:08:37 2013 +0000
Revision:
35:515ec79792d3
Parent:
33:b5a5a1e6325f
Child:
36:a70b11e1560f
fix getMac, reconnect

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gsfan 25:f6e5622d2930 1 /* Copyright (C) 2013 gsfan, MIT License
gsfan 25:f6e5622d2930 2 *
gsfan 25:f6e5622d2930 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
gsfan 25:f6e5622d2930 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
gsfan 25:f6e5622d2930 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
gsfan 25:f6e5622d2930 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
gsfan 25:f6e5622d2930 7 * furnished to do so, subject to the following conditions:
gsfan 25:f6e5622d2930 8 *
gsfan 25:f6e5622d2930 9 * The above copyright notice and this permission notice shall be included in all copies or
gsfan 25:f6e5622d2930 10 * substantial portions of the Software.
gsfan 25:f6e5622d2930 11 *
gsfan 25:f6e5622d2930 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
gsfan 25:f6e5622d2930 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
gsfan 25:f6e5622d2930 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
gsfan 25:f6e5622d2930 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
gsfan 25:f6e5622d2930 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
gsfan 0:2f6062c6d018 17 */
gsfan 0:2f6062c6d018 18 /** @file
gsfan 0:2f6062c6d018 19 * @brief Gainspan wi-fi module library for mbed
gsfan 0:2f6062c6d018 20 * GS1011MIC, GS1011MIP, GainSpan WiFi Breakout, etc.
gsfan 0:2f6062c6d018 21 */
gsfan 0:2f6062c6d018 22
gsfan 0:2f6062c6d018 23 #include "mbed.h"
gsfan 0:2f6062c6d018 24 #include "GSwifi.h"
gsfan 0:2f6062c6d018 25
gsfan 0:2f6062c6d018 26
gsfan 25:f6e5622d2930 27 GSwifi::GSwifi (PinName p_tx, PinName p_rx, PinName p_reset, PinName p_alarm, int baud) : _gs(p_tx, p_rx), _reset(p_reset), _buf_cmd(GS_CMD_SIZE) {
gsfan 25:f6e5622d2930 28
gsfan 25:f6e5622d2930 29 if (p_alarm != NC) {
gsfan 26:b347ee3a1087 30 _alarm = new DigitalInOut(p_alarm);
gsfan 26:b347ee3a1087 31 _alarm->output(); // low
gsfan 26:b347ee3a1087 32 _alarm->write(0);
gsfan 25:f6e5622d2930 33 } else {
gsfan 25:f6e5622d2930 34 _alarm = NULL;
gsfan 25:f6e5622d2930 35 }
gsfan 0:2f6062c6d018 36
gsfan 26:b347ee3a1087 37 _reset.output(); // low
gsfan 26:b347ee3a1087 38 _reset = 0;
gsfan 35:515ec79792d3 39 _baud = baud;
gsfan 35:515ec79792d3 40 if (_baud) _gs.baud(_baud);
gsfan 0:2f6062c6d018 41 _gs.attach(this, &GSwifi::isr_recv, Serial::RxIrq);
gsfan 0:2f6062c6d018 42 _rts = false;
gsfan 25:f6e5622d2930 43
gsfan 35:515ec79792d3 44 wait_ms(100);
gsfan 25:f6e5622d2930 45 reset();
gsfan 0:2f6062c6d018 46 }
gsfan 0:2f6062c6d018 47
gsfan 25:f6e5622d2930 48 GSwifi::GSwifi (PinName p_tx, PinName p_rx, PinName p_cts, PinName p_rts, PinName p_reset, PinName p_alarm, int baud) : _gs(p_tx, p_rx), _reset(p_reset), _buf_cmd(GS_CMD_SIZE) {
gsfan 25:f6e5622d2930 49
gsfan 25:f6e5622d2930 50 if (p_alarm != NC) {
gsfan 26:b347ee3a1087 51 _alarm = new DigitalInOut(p_alarm);
gsfan 26:b347ee3a1087 52 _alarm->output(); // low
gsfan 26:b347ee3a1087 53 _alarm->write(0);
gsfan 25:f6e5622d2930 54 } else {
gsfan 25:f6e5622d2930 55 _alarm = NULL;
gsfan 25:f6e5622d2930 56 }
gsfan 0:2f6062c6d018 57
gsfan 26:b347ee3a1087 58 _reset.output(); // low
gsfan 26:b347ee3a1087 59 _reset = 0;
gsfan 35:515ec79792d3 60 _baud = baud;
gsfan 35:515ec79792d3 61 if (_baud) _gs.baud(_baud);
gsfan 0:2f6062c6d018 62 _gs.attach(this, &GSwifi::isr_recv, Serial::RxIrq);
gsfan 33:b5a5a1e6325f 63 _rts = false;
gsfan 0:2f6062c6d018 64 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
gsfan 0:2f6062c6d018 65 if (p_cts == p12) { // CTS input (P0_17)
gsfan 0:2f6062c6d018 66 LPC_UART1->MCR |= (1<<7); // CTSEN
gsfan 0:2f6062c6d018 67 LPC_PINCON->PINSEL1 &= ~(3 << 2);
gsfan 0:2f6062c6d018 68 LPC_PINCON->PINSEL1 |= (1 << 2); // UART CTS
gsfan 0:2f6062c6d018 69 }
gsfan 0:2f6062c6d018 70 if (p_rts == P0_22) { // RTS output (P0_22)
gsfan 0:2f6062c6d018 71 LPC_UART1->MCR |= (1<<6); // RTSEN
gsfan 0:2f6062c6d018 72 LPC_PINCON->PINSEL1 &= ~(3 << 12);
gsfan 0:2f6062c6d018 73 LPC_PINCON->PINSEL1 |= (1 << 12); // UART RTS
gsfan 0:2f6062c6d018 74 _rts = true;
gsfan 0:2f6062c6d018 75 }
gsfan 0:2f6062c6d018 76 #elif defined(TARGET_LPC11U24)
gsfan 0:2f6062c6d018 77 if (p_cts == p21) { // CTS input (P0_7)
gsfan 16:aea56cce3bf5 78 LPC_USART->MCR |= (1<<7); // CTSEN
gsfan 0:2f6062c6d018 79 LPC_IOCON->PIO0_7 &= ~0x07;
gsfan 0:2f6062c6d018 80 LPC_IOCON->PIO0_7 |= 0x01; // UART CTS
gsfan 0:2f6062c6d018 81 }
gsfan 0:2f6062c6d018 82 if (p_rts == p22) { // RTS output (P0_17)
gsfan 16:aea56cce3bf5 83 LPC_USART->MCR |= (1<<6); // RTSEN
gsfan 0:2f6062c6d018 84 LPC_IOCON->PIO0_17 &= ~0x07;
gsfan 0:2f6062c6d018 85 LPC_IOCON->PIO0_17 |= 0x01; // UART RTS
gsfan 0:2f6062c6d018 86 _rts = true;
gsfan 0:2f6062c6d018 87 }
gsfan 0:2f6062c6d018 88 #endif
gsfan 25:f6e5622d2930 89
gsfan 35:515ec79792d3 90 wait_ms(100);
gsfan 25:f6e5622d2930 91 reset();
gsfan 25:f6e5622d2930 92 }
gsfan 25:f6e5622d2930 93
gsfan 25:f6e5622d2930 94 void GSwifi::reset () {
gsfan 26:b347ee3a1087 95
gsfan 26:b347ee3a1087 96 if (_alarm != NULL) {
gsfan 26:b347ee3a1087 97 _alarm->output(); // low
gsfan 26:b347ee3a1087 98 _alarm->write(0);
gsfan 26:b347ee3a1087 99 wait_ms(10);
gsfan 26:b347ee3a1087 100 _alarm->input(); // high
gsfan 28:fbba4c58d14c 101 _alarm->mode(PullUp);
gsfan 26:b347ee3a1087 102 wait_ms(10);
gsfan 26:b347ee3a1087 103 }
gsfan 26:b347ee3a1087 104 _reset.output(); // low
gsfan 26:b347ee3a1087 105 _reset = 0;
gsfan 26:b347ee3a1087 106
gsfan 35:515ec79792d3 107 memset(&_gs_sock, 0, sizeof(_gs_sock));
gsfan 35:515ec79792d3 108 memset(&_mac, 0, sizeof(_mac));
gsfan 25:f6e5622d2930 109 _connect = false;
gsfan 25:f6e5622d2930 110 _status = GSSTAT_READY;
gsfan 25:f6e5622d2930 111 _escape = 0;
gsfan 26:b347ee3a1087 112 resetResponse(GSRES_NONE);
gsfan 25:f6e5622d2930 113 _gs_mode = GSMODE_COMMAND;
gsfan 25:f6e5622d2930 114 _ssid = NULL;
gsfan 26:b347ee3a1087 115 _pass = NULL;
gsfan 25:f6e5622d2930 116 _reconnect = 0;
gsfan 26:b347ee3a1087 117 _buf_cmd.flush();
gsfan 25:f6e5622d2930 118
gsfan 33:b5a5a1e6325f 119 wait_ms(100);
gsfan 35:515ec79792d3 120 if (! _baud) autobaud(0);
gsfan 26:b347ee3a1087 121 _reset.input(); // high
gsfan 28:fbba4c58d14c 122 _reset.mode(PullUp);
gsfan 35:515ec79792d3 123 if (! _baud) autobaud(1);
gsfan 25:f6e5622d2930 124 wait_ms(500);
gsfan 0:2f6062c6d018 125 }
gsfan 0:2f6062c6d018 126
gsfan 35:515ec79792d3 127 int GSwifi::autobaud (int flg) {
gsfan 35:515ec79792d3 128 int i;
gsfan 35:515ec79792d3 129
gsfan 35:515ec79792d3 130 #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
gsfan 35:515ec79792d3 131 if (flg == 0) {
gsfan 35:515ec79792d3 132 LPC_UART1->ACR = (1<<2)|(1<<0); // auto-baud mode 0
gsfan 35:515ec79792d3 133 return 0;
gsfan 35:515ec79792d3 134 } else {
gsfan 35:515ec79792d3 135 for (i = 0; i < 50; i ++) {
gsfan 35:515ec79792d3 136 if (! (LPC_UART1->ACR & (1<<0))) {
gsfan 35:515ec79792d3 137 return 0;
gsfan 35:515ec79792d3 138 }
gsfan 35:515ec79792d3 139 wait_ms(10);
gsfan 35:515ec79792d3 140 }
gsfan 35:515ec79792d3 141 LPC_UART1->ACR = 0;
gsfan 35:515ec79792d3 142 }
gsfan 35:515ec79792d3 143 #elif defined(TARGET_LPC11U24)
gsfan 35:515ec79792d3 144 if (flg == 0) {
gsfan 35:515ec79792d3 145 LPC_USART->ACR = (1<<2)|(1<<0); // auto-baud mode 0
gsfan 35:515ec79792d3 146 return 0;
gsfan 35:515ec79792d3 147 } else {
gsfan 35:515ec79792d3 148 for (i = 0; i < 50; i ++) {
gsfan 35:515ec79792d3 149 if (! (LPC_USART->ACR & (1<<0))) {
gsfan 35:515ec79792d3 150 return 0;
gsfan 35:515ec79792d3 151 }
gsfan 35:515ec79792d3 152 wait_ms(10);
gsfan 35:515ec79792d3 153 }
gsfan 35:515ec79792d3 154 LPC_USART->ACR = 0;
gsfan 35:515ec79792d3 155 }
gsfan 35:515ec79792d3 156 #endif
gsfan 35:515ec79792d3 157 return -1;
gsfan 35:515ec79792d3 158 }
gsfan 35:515ec79792d3 159
gsfan 0:2f6062c6d018 160 // uart interrupt
gsfan 0:2f6062c6d018 161 void GSwifi::isr_recv () {
gsfan 0:2f6062c6d018 162 static int len, mode;
gsfan 0:2f6062c6d018 163 static char tmp[20];
gsfan 33:b5a5a1e6325f 164 char dat;
gsfan 33:b5a5a1e6325f 165
gsfan 1:b127c6c5241d 166 dat = _gs_getc();
gsfan 23:a783c62c36d0 167 #ifdef DEBUG_VIEW
gsfan 26:b347ee3a1087 168 if (dat >= 0x20 && dat < 0x7f) {
gsfan 26:b347ee3a1087 169 DBG("%c_", dat);
gsfan 26:b347ee3a1087 170 } else {
gsfan 26:b347ee3a1087 171 DBG("%02x_", dat);
gsfan 26:b347ee3a1087 172 }
gsfan 23:a783c62c36d0 173 #endif
gsfan 25:f6e5622d2930 174
gsfan 0:2f6062c6d018 175 switch (_gs_mode) {
gsfan 0:2f6062c6d018 176 case GSMODE_COMMAND: // command responce
gsfan 0:2f6062c6d018 177 if (_escape) {
gsfan 0:2f6062c6d018 178 // esc
gsfan 0:2f6062c6d018 179 switch (dat) {
gsfan 0:2f6062c6d018 180 case 'O':
gsfan 0:2f6062c6d018 181 DBG("ok\r\n");
gsfan 26:b347ee3a1087 182 _gs_ok = true;
gsfan 0:2f6062c6d018 183 break;
gsfan 0:2f6062c6d018 184 case 'F':
gsfan 0:2f6062c6d018 185 DBG("failure\r\n");
gsfan 26:b347ee3a1087 186 _gs_failure = true;
gsfan 0:2f6062c6d018 187 break;
gsfan 0:2f6062c6d018 188 case 'S':
gsfan 0:2f6062c6d018 189 DBG("GSMODE_DATA_RX\r\n");
gsfan 0:2f6062c6d018 190 _gs_mode = GSMODE_DATA_RX;
gsfan 0:2f6062c6d018 191 mode = 0;
gsfan 0:2f6062c6d018 192 break;
gsfan 0:2f6062c6d018 193 case 'u':
gsfan 0:2f6062c6d018 194 DBG("GSMODE_DATA_RXUDP\r\n");
gsfan 0:2f6062c6d018 195 _gs_mode = GSMODE_DATA_RXUDP;
gsfan 0:2f6062c6d018 196 mode = 0;
gsfan 0:2f6062c6d018 197 break;
gsfan 0:2f6062c6d018 198 case 'Z':
gsfan 0:2f6062c6d018 199 case 'H':
gsfan 0:2f6062c6d018 200 DBG("GSMODE_DATA_RX_BULK\r\n");
gsfan 0:2f6062c6d018 201 _gs_mode = GSMODE_DATA_RX_BULK;
gsfan 0:2f6062c6d018 202 mode = 0;
gsfan 0:2f6062c6d018 203 break;
gsfan 0:2f6062c6d018 204 case 'y':
gsfan 0:2f6062c6d018 205 DBG("GSMODE_DATA_RXUDP_BULK\r\n");
gsfan 0:2f6062c6d018 206 _gs_mode = GSMODE_DATA_RXUDP_BULK;
gsfan 0:2f6062c6d018 207 mode = 0;
gsfan 0:2f6062c6d018 208 break;
gsfan 0:2f6062c6d018 209 default:
gsfan 0:2f6062c6d018 210 DBG("unknown [ESC] %02x\r\n", dat);
gsfan 0:2f6062c6d018 211 break;
gsfan 0:2f6062c6d018 212 }
gsfan 0:2f6062c6d018 213 _escape = 0;
gsfan 0:2f6062c6d018 214 } else {
gsfan 0:2f6062c6d018 215 if (dat == 0x1b) {
gsfan 0:2f6062c6d018 216 _escape = 1;
gsfan 0:2f6062c6d018 217 } else
gsfan 26:b347ee3a1087 218 if (dat == '\n') {
gsfan 26:b347ee3a1087 219 // end of line
gsfan 26:b347ee3a1087 220 parseResponse();
gsfan 26:b347ee3a1087 221 } else
gsfan 0:2f6062c6d018 222 if (dat != '\r') {
gsfan 0:2f6062c6d018 223 // command
gsfan 25:f6e5622d2930 224 _buf_cmd.queue(dat);
gsfan 0:2f6062c6d018 225 }
gsfan 0:2f6062c6d018 226 }
gsfan 0:2f6062c6d018 227 break;
gsfan 0:2f6062c6d018 228
gsfan 0:2f6062c6d018 229 case GSMODE_DATA_RX:
gsfan 0:2f6062c6d018 230 case GSMODE_DATA_RXUDP:
gsfan 0:2f6062c6d018 231 if (mode == 0) {
gsfan 0:2f6062c6d018 232 // cid
gsfan 0:2f6062c6d018 233 _cid = x2i(dat);
gsfan 26:b347ee3a1087 234 _gs_sock[_cid].received = false;
gsfan 0:2f6062c6d018 235 mode ++;
gsfan 0:2f6062c6d018 236 if (_gs_mode == GSMODE_DATA_RX) {
gsfan 0:2f6062c6d018 237 mode = 3;
gsfan 0:2f6062c6d018 238 }
gsfan 0:2f6062c6d018 239 len = 0;
gsfan 0:2f6062c6d018 240 } else
gsfan 0:2f6062c6d018 241 if (mode == 1) {
gsfan 0:2f6062c6d018 242 // ip
gsfan 0:2f6062c6d018 243 if ((dat < '0' || dat > '9') && dat != '.') {
gsfan 0:2f6062c6d018 244 int ip1, ip2, ip3, ip4;
gsfan 0:2f6062c6d018 245 tmp[len] = 0;
gsfan 0:2f6062c6d018 246 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 0:2f6062c6d018 247 _from.setIp(IpAddr(ip1, ip2, ip3, ip4));
gsfan 0:2f6062c6d018 248 mode ++;
gsfan 0:2f6062c6d018 249 len = 0;
gsfan 0:2f6062c6d018 250 break;
gsfan 0:2f6062c6d018 251 }
gsfan 0:2f6062c6d018 252 tmp[len] = dat;
gsfan 0:2f6062c6d018 253 len ++;
gsfan 0:2f6062c6d018 254 } else
gsfan 0:2f6062c6d018 255 if (mode == 2) {
gsfan 0:2f6062c6d018 256 // port
gsfan 0:2f6062c6d018 257 if (dat < '0' || dat > '9') {
gsfan 0:2f6062c6d018 258 tmp[len] = 0;
gsfan 0:2f6062c6d018 259 _from.setPort(atoi(tmp));
gsfan 0:2f6062c6d018 260 mode ++;
gsfan 0:2f6062c6d018 261 len = 0;
gsfan 0:2f6062c6d018 262 break;
gsfan 0:2f6062c6d018 263 }
gsfan 0:2f6062c6d018 264 tmp[len] = dat;
gsfan 0:2f6062c6d018 265 len ++;
gsfan 0:2f6062c6d018 266 } else
gsfan 0:2f6062c6d018 267 if (_escape) {
gsfan 0:2f6062c6d018 268 // esc
gsfan 0:2f6062c6d018 269 switch (dat) {
gsfan 0:2f6062c6d018 270 case 'E':
gsfan 0:2f6062c6d018 271 DBG("recv ascii %d\r\n", _cid);
gsfan 26:b347ee3a1087 272 _gs_sock[_cid].received = true;
gsfan 0:2f6062c6d018 273 _gs_mode = GSMODE_COMMAND;
gsfan 26:b347ee3a1087 274
gsfan 26:b347ee3a1087 275 if (_gs_sock[_cid].protocol == GSPROT_HTTPGET) {
gsfan 26:b347ee3a1087 276 // recv interrupt
gsfan 29:1c4419512941 277 if (_gs_sock[_cid].onGsReceive.call(_cid, _gs_sock[_cid].data->available()) == 0)
gsfan 26:b347ee3a1087 278 _gs_sock[_cid].received = false;
gsfan 0:2f6062c6d018 279 }
gsfan 0:2f6062c6d018 280 break;
gsfan 0:2f6062c6d018 281 default:
gsfan 0:2f6062c6d018 282 DBG("unknown <ESC> %02x\r\n", dat);
gsfan 0:2f6062c6d018 283 break;
gsfan 0:2f6062c6d018 284 }
gsfan 0:2f6062c6d018 285 _escape = 0;
gsfan 0:2f6062c6d018 286 } else {
gsfan 0:2f6062c6d018 287 if (dat == 0x1b) {
gsfan 0:2f6062c6d018 288 _escape = 1;
gsfan 0:2f6062c6d018 289 } else {
gsfan 0:2f6062c6d018 290 // data
gsfan 25:f6e5622d2930 291 _gs_sock[_cid].data->queue(dat);
gsfan 0:2f6062c6d018 292 len ++;
gsfan 26:b347ee3a1087 293
gsfan 26:b347ee3a1087 294 if (len < GS_DATA_SIZE && _gs_sock[_cid].data->isFull()) {
gsfan 14:9e89b922ace1 295 // buffer full
gsfan 26:b347ee3a1087 296 // recv interrupt
gsfan 29:1c4419512941 297 _gs_sock[_cid].onGsReceive.call(_cid, _gs_sock[_cid].data->available());
gsfan 12:63e714550791 298 }
gsfan 0:2f6062c6d018 299 }
gsfan 0:2f6062c6d018 300 }
gsfan 0:2f6062c6d018 301 break;
gsfan 0:2f6062c6d018 302
gsfan 0:2f6062c6d018 303 case GSMODE_DATA_RX_BULK:
gsfan 0:2f6062c6d018 304 case GSMODE_DATA_RXUDP_BULK:
gsfan 0:2f6062c6d018 305 if (mode == 0) {
gsfan 0:2f6062c6d018 306 // cid
gsfan 0:2f6062c6d018 307 _cid = x2i(dat);
gsfan 26:b347ee3a1087 308 _gs_sock[_cid].received = false;
gsfan 0:2f6062c6d018 309 mode ++;
gsfan 0:2f6062c6d018 310 if (_gs_mode == GSMODE_DATA_RX_BULK) {
gsfan 0:2f6062c6d018 311 mode = 3;
gsfan 0:2f6062c6d018 312 }
gsfan 0:2f6062c6d018 313 len = 0;
gsfan 0:2f6062c6d018 314 } else
gsfan 0:2f6062c6d018 315 if (mode == 1) {
gsfan 0:2f6062c6d018 316 // ip
gsfan 0:2f6062c6d018 317 if ((dat < '0' || dat > '9') && dat != '.') {
gsfan 0:2f6062c6d018 318 int ip1, ip2, ip3, ip4;
gsfan 0:2f6062c6d018 319 tmp[len] = 0;
gsfan 0:2f6062c6d018 320 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 0:2f6062c6d018 321 _from.setIp(IpAddr(ip1, ip2, ip3, ip4));
gsfan 0:2f6062c6d018 322 mode ++;
gsfan 0:2f6062c6d018 323 len = 0;
gsfan 0:2f6062c6d018 324 break;
gsfan 0:2f6062c6d018 325 }
gsfan 0:2f6062c6d018 326 tmp[len] = dat;
gsfan 0:2f6062c6d018 327 len ++;
gsfan 0:2f6062c6d018 328 } else
gsfan 0:2f6062c6d018 329 if (mode == 2) {
gsfan 0:2f6062c6d018 330 // port
gsfan 0:2f6062c6d018 331 if (dat < '0' || dat > '9') {
gsfan 0:2f6062c6d018 332 tmp[len] = 0;
gsfan 0:2f6062c6d018 333 _from.setPort(atoi(tmp));
gsfan 0:2f6062c6d018 334 mode ++;
gsfan 0:2f6062c6d018 335 len = 0;
gsfan 0:2f6062c6d018 336 break;
gsfan 0:2f6062c6d018 337 }
gsfan 0:2f6062c6d018 338 tmp[len] = dat;
gsfan 0:2f6062c6d018 339 len ++;
gsfan 0:2f6062c6d018 340 } else
gsfan 0:2f6062c6d018 341 if (mode == 3) {
gsfan 0:2f6062c6d018 342 // length
gsfan 0:2f6062c6d018 343 tmp[len] = dat;
gsfan 0:2f6062c6d018 344 len ++;
gsfan 0:2f6062c6d018 345 if (len >= 4) {
gsfan 0:2f6062c6d018 346 tmp[len] = 0;
gsfan 0:2f6062c6d018 347 len = atoi(tmp);
gsfan 0:2f6062c6d018 348 mode ++;
gsfan 0:2f6062c6d018 349 break;
gsfan 0:2f6062c6d018 350 }
gsfan 0:2f6062c6d018 351 } else
gsfan 0:2f6062c6d018 352 if (mode == 4) {
gsfan 0:2f6062c6d018 353 // data
gsfan 5:6def1d0df519 354 if (_gs_sock[_cid].data != NULL) {
gsfan 25:f6e5622d2930 355 _gs_sock[_cid].data->queue(dat);
gsfan 5:6def1d0df519 356 }
gsfan 0:2f6062c6d018 357 len --;
gsfan 26:b347ee3a1087 358
gsfan 26:b347ee3a1087 359 if (len && _gs_sock[_cid].data->isFull()) {
gsfan 14:9e89b922ace1 360 // buffer full
gsfan 26:b347ee3a1087 361 // recv interrupt
gsfan 29:1c4419512941 362 _gs_sock[_cid].onGsReceive.call(_cid, _gs_sock[_cid].data->available());
gsfan 12:63e714550791 363 }
gsfan 0:2f6062c6d018 364 if (len == 0) {
gsfan 0:2f6062c6d018 365 DBG("recv binary %d\r\n", _cid);
gsfan 26:b347ee3a1087 366 _gs_sock[_cid].received = true;
gsfan 0:2f6062c6d018 367 _escape = 0;
gsfan 0:2f6062c6d018 368 _gs_mode = GSMODE_COMMAND;
gsfan 26:b347ee3a1087 369
gsfan 26:b347ee3a1087 370 if (_gs_sock[_cid].protocol == GSPROT_HTTPGET) {
gsfan 26:b347ee3a1087 371 // recv interrupt
gsfan 29:1c4419512941 372 if (_gs_sock[_cid].onGsReceive.call(_cid, _gs_sock[_cid].data->available()) == 0)
gsfan 26:b347ee3a1087 373 _gs_sock[_cid].received = false;
gsfan 0:2f6062c6d018 374 }
gsfan 0:2f6062c6d018 375 }
gsfan 0:2f6062c6d018 376 }
gsfan 0:2f6062c6d018 377 break;
gsfan 0:2f6062c6d018 378
gsfan 0:2f6062c6d018 379 }
gsfan 0:2f6062c6d018 380 }
gsfan 0:2f6062c6d018 381
gsfan 12:63e714550791 382 int GSwifi::command (const char *cmd, GSRESPONCE res, int timeout) {
gsfan 26:b347ee3a1087 383 int i;
gsfan 0:2f6062c6d018 384
gsfan 26:b347ee3a1087 385 if (cmd == NULL) {
gsfan 0:2f6062c6d018 386 // dummy CR+LF
gsfan 0:2f6062c6d018 387 _gs.printf("\r\n");
gsfan 26:b347ee3a1087 388 wait_ms(100);
gsfan 26:b347ee3a1087 389 _buf_cmd.flush();
gsfan 0:2f6062c6d018 390 return 0;
gsfan 0:2f6062c6d018 391 }
gsfan 0:2f6062c6d018 392
gsfan 26:b347ee3a1087 393 resetResponse(res);
gsfan 0:2f6062c6d018 394 for (i = 0; i < strlen(cmd); i ++) {
gsfan 1:b127c6c5241d 395 _gs_putc(cmd[i]);
gsfan 0:2f6062c6d018 396 }
gsfan 1:b127c6c5241d 397 _gs_putc('\r');
gsfan 1:b127c6c5241d 398 _gs_putc('\n');
gsfan 0:2f6062c6d018 399 DBG("command: %s\r\n", cmd);
gsfan 0:2f6062c6d018 400 if (strlen(cmd) == 0) return 0;
gsfan 26:b347ee3a1087 401
gsfan 26:b347ee3a1087 402 return waitResponse(timeout);
gsfan 0:2f6062c6d018 403 }
gsfan 0:2f6062c6d018 404
gsfan 26:b347ee3a1087 405 void GSwifi::resetResponse (GSRESPONCE res) {
gsfan 26:b347ee3a1087 406 _gs_ok = false;
gsfan 26:b347ee3a1087 407 _gs_failure = false;
gsfan 26:b347ee3a1087 408 _gs_flg = 0;
gsfan 26:b347ee3a1087 409 _gs_res = res;
gsfan 26:b347ee3a1087 410 }
gsfan 26:b347ee3a1087 411
gsfan 26:b347ee3a1087 412 int GSwifi::waitResponse (int ms) {
gsfan 0:2f6062c6d018 413 Timer timeout;
gsfan 0:2f6062c6d018 414
gsfan 26:b347ee3a1087 415 if (! ms) return 0;
gsfan 26:b347ee3a1087 416
gsfan 0:2f6062c6d018 417 timeout.start();
gsfan 0:2f6062c6d018 418 for (;;) {
gsfan 26:b347ee3a1087 419 if (timeout.read_ms() > ms) {
gsfan 26:b347ee3a1087 420 DBG("timeout\r\n");
gsfan 5:6def1d0df519 421 break;
gsfan 0:2f6062c6d018 422 }
gsfan 26:b347ee3a1087 423 if (_gs_ok && (_gs_flg == -1 || _gs_res == GSRES_NONE)) {
gsfan 26:b347ee3a1087 424 timeout.stop();
gsfan 26:b347ee3a1087 425 _gs_res = GSRES_NONE;
gsfan 26:b347ee3a1087 426 return 0;
gsfan 26:b347ee3a1087 427 }
gsfan 26:b347ee3a1087 428 if (_gs_failure) break;
gsfan 0:2f6062c6d018 429 }
gsfan 26:b347ee3a1087 430 timeout.stop();
gsfan 26:b347ee3a1087 431 _gs_res = GSRES_NONE;
gsfan 26:b347ee3a1087 432 return -1;
gsfan 0:2f6062c6d018 433 }
gsfan 0:2f6062c6d018 434
gsfan 35:515ec79792d3 435 int GSwifi::connect (GSSECURITY sec, const char *ssid, const char *pass, int dhcp, int reconnect, char *name) {
gsfan 0:2f6062c6d018 436 int r;
gsfan 0:2f6062c6d018 437 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 438
gsfan 0:2f6062c6d018 439 if (_connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 440
gsfan 0:2f6062c6d018 441 command(NULL, GSRES_NORMAL);
gsfan 0:2f6062c6d018 442 if (command("ATE0", GSRES_NORMAL)) return -1;
gsfan 0:2f6062c6d018 443 if (_rts) {
gsfan 0:2f6062c6d018 444 command("AT&R1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 445 }
gsfan 35:515ec79792d3 446 if (getMacAddress(_mac)) return -1;
gsfan 0:2f6062c6d018 447 #ifdef GS_BULK
gsfan 0:2f6062c6d018 448 command("AT+BDATA=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 449 #endif
gsfan 0:2f6062c6d018 450
gsfan 0:2f6062c6d018 451 disconnect();
gsfan 0:2f6062c6d018 452 command("AT+WM=0", GSRES_NORMAL); // infrastructure
gsfan 0:2f6062c6d018 453 wait_ms(100);
gsfan 20:151b5a4fdd29 454 if (dhcp && sec != GSSEC_WPS_BUTTON) {
gsfan 35:515ec79792d3 455 if (name) {
gsfan 35:515ec79792d3 456 sprintf(cmd, "AT+NDHCP=1,%s", name);
gsfan 35:515ec79792d3 457 } else {
gsfan 35:515ec79792d3 458 strcpy(cmd, "AT+NDHCP=1," GS_DHCPNAME);
gsfan 35:515ec79792d3 459 }
gsfan 35:515ec79792d3 460 command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 461 } else {
gsfan 0:2f6062c6d018 462 command("AT+NDHCP=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 463 }
gsfan 0:2f6062c6d018 464
gsfan 0:2f6062c6d018 465 switch (sec) {
gsfan 0:2f6062c6d018 466 case GSSEC_NONE:
gsfan 0:2f6062c6d018 467 case GSSEC_OPEN:
gsfan 0:2f6062c6d018 468 case GSSEC_WEP:
gsfan 0:2f6062c6d018 469 sprintf(cmd, "AT+WAUTH=%d", sec);
gsfan 0:2f6062c6d018 470 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 471 if (sec != GSSEC_NONE) {
gsfan 22:9b077e2823ce 472 sprintf(cmd, "AT+WWEP1=%s", pass);
gsfan 22:9b077e2823ce 473 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 474 wait_ms(100);
gsfan 22:9b077e2823ce 475 }
gsfan 0:2f6062c6d018 476 sprintf(cmd, "AT+WA=%s", ssid);
gsfan 1:b127c6c5241d 477 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
gsfan 20:151b5a4fdd29 478 if (r) {
gsfan 20:151b5a4fdd29 479 DBG("retry\r\n");
gsfan 26:b347ee3a1087 480 wait_ms(1000);
gsfan 20:151b5a4fdd29 481 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
gsfan 20:151b5a4fdd29 482 }
gsfan 0:2f6062c6d018 483 break;
gsfan 0:2f6062c6d018 484 case GSSEC_WPA_PSK:
gsfan 28:fbba4c58d14c 485 case GSSEC_WPA_ENT:
gsfan 0:2f6062c6d018 486 case GSSEC_WPA2_PSK:
gsfan 28:fbba4c58d14c 487 case GSSEC_WPA2_ENT:
gsfan 0:2f6062c6d018 488 command("AT+WAUTH=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 489 // sprintf(cmd, "AT+WWPA=%s", pass);
gsfan 0:2f6062c6d018 490 sprintf(cmd, "AT+WPAPSK=%s,%s", ssid, pass);
gsfan 0:2f6062c6d018 491 command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
gsfan 0:2f6062c6d018 492 wait_ms(100);
gsfan 0:2f6062c6d018 493 sprintf(cmd, "AT+WA=%s", ssid);
gsfan 1:b127c6c5241d 494 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
gsfan 20:151b5a4fdd29 495 if (r) {
gsfan 20:151b5a4fdd29 496 DBG("retry\r\n");
gsfan 26:b347ee3a1087 497 wait_ms(1000);
gsfan 20:151b5a4fdd29 498 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
gsfan 20:151b5a4fdd29 499 }
gsfan 0:2f6062c6d018 500 break;
gsfan 0:2f6062c6d018 501 case GSSEC_WPS_BUTTON:
gsfan 0:2f6062c6d018 502 command("AT+WAUTH=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 503 r = command("AT+WWPS=1", GSRES_WPS, GS_TIMEOUT2);
gsfan 0:2f6062c6d018 504 if (r) break;
gsfan 0:2f6062c6d018 505 if (dhcp) {
gsfan 35:515ec79792d3 506 r = setAddress(name);
gsfan 0:2f6062c6d018 507 }
gsfan 0:2f6062c6d018 508 break;
gsfan 28:fbba4c58d14c 509 case GSSEC_WPS_PIN:
gsfan 28:fbba4c58d14c 510 command("AT+WAUTH=0", GSRES_NORMAL);
gsfan 28:fbba4c58d14c 511 sprintf(cmd, "AT+WWPS=2,%s", pass);
gsfan 28:fbba4c58d14c 512 r = command(cmd, GSRES_WPS, GS_TIMEOUT2);
gsfan 28:fbba4c58d14c 513 if (r) break;
gsfan 28:fbba4c58d14c 514 if (dhcp) {
gsfan 35:515ec79792d3 515 r = setAddress(name);
gsfan 28:fbba4c58d14c 516 }
gsfan 28:fbba4c58d14c 517 break;
gsfan 6:a423f0d197de 518 default:
gsfan 6:a423f0d197de 519 DBG("Can't use security\r\n");
gsfan 6:a423f0d197de 520 r = -1;
gsfan 6:a423f0d197de 521 break;
gsfan 0:2f6062c6d018 522 }
gsfan 0:2f6062c6d018 523
gsfan 18:4b97804c37d1 524 if (r == 0 && !dhcp) {
gsfan 18:4b97804c37d1 525 sprintf(cmd, "AT+DNSSET=%d.%d.%d.%d",
gsfan 18:4b97804c37d1 526 _gateway[0], _gateway[1], _gateway[2], _gateway[3]);
gsfan 18:4b97804c37d1 527 command(cmd, GSRES_NORMAL);
gsfan 18:4b97804c37d1 528 }
gsfan 18:4b97804c37d1 529
gsfan 24:5c350ae2e703 530 if (r == 0) {
gsfan 24:5c350ae2e703 531 _connect = true;
gsfan 24:5c350ae2e703 532 _reconnect = reconnect;
gsfan 24:5c350ae2e703 533 _reconnect_count = 0;
gsfan 28:fbba4c58d14c 534 _sec = sec;
gsfan 35:515ec79792d3 535 if (_reconnect && ssid) {
gsfan 35:515ec79792d3 536 if (!_ssid) _ssid = (char*)malloc(strlen(ssid) + 1);
gsfan 28:fbba4c58d14c 537 strcpy(_ssid, ssid);
gsfan 28:fbba4c58d14c 538 }
gsfan 35:515ec79792d3 539 if (_reconnect && pass) {
gsfan 35:515ec79792d3 540 if (!_pass) _pass = (char*)malloc(strlen(pass) + 1);
gsfan 28:fbba4c58d14c 541 strcpy(_pass, pass);
gsfan 28:fbba4c58d14c 542 }
gsfan 24:5c350ae2e703 543 }
gsfan 0:2f6062c6d018 544 return r;
gsfan 0:2f6062c6d018 545 }
gsfan 0:2f6062c6d018 546
gsfan 19:cad912f5a6ba 547 int GSwifi::adhock (GSSECURITY sec, const char *ssid, const char *pass, IpAddr ipaddr, IpAddr netmask) {
gsfan 0:2f6062c6d018 548 int r;
gsfan 0:2f6062c6d018 549 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 550
gsfan 0:2f6062c6d018 551 if (_connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 552
gsfan 0:2f6062c6d018 553 command(NULL, GSRES_NORMAL);
gsfan 0:2f6062c6d018 554 if (command("ATE0", GSRES_NORMAL)) return -1;
gsfan 0:2f6062c6d018 555 if (_rts) {
gsfan 0:2f6062c6d018 556 command("AT&R1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 557 }
gsfan 35:515ec79792d3 558 if (getMacAddress(_mac)) return -1;
gsfan 0:2f6062c6d018 559 #ifdef GS_BULK
gsfan 0:2f6062c6d018 560 command("AT+BDATA=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 561 #endif
gsfan 0:2f6062c6d018 562
gsfan 35:515ec79792d3 563 disconnect();
gsfan 0:2f6062c6d018 564 command("AT+WM=1", GSRES_NORMAL); // adhock
gsfan 0:2f6062c6d018 565 wait_ms(100);
gsfan 0:2f6062c6d018 566 command("AT+NDHCP=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 567 setAddress(ipaddr, netmask, ipaddr, ipaddr);
gsfan 0:2f6062c6d018 568
gsfan 0:2f6062c6d018 569 switch (sec) {
gsfan 0:2f6062c6d018 570 case GSSEC_NONE:
gsfan 0:2f6062c6d018 571 case GSSEC_OPEN:
gsfan 0:2f6062c6d018 572 case GSSEC_WEP:
gsfan 0:2f6062c6d018 573 sprintf(cmd, "AT+WAUTH=%d", sec);
gsfan 0:2f6062c6d018 574 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 575 if (sec != GSSEC_NONE) {
gsfan 22:9b077e2823ce 576 sprintf(cmd, "AT+WWEP1=%s", pass);
gsfan 22:9b077e2823ce 577 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 578 wait_ms(100);
gsfan 22:9b077e2823ce 579 }
gsfan 0:2f6062c6d018 580 sprintf(cmd, "AT+WA=%s", ssid);
gsfan 0:2f6062c6d018 581 r = command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
gsfan 0:2f6062c6d018 582 break;
gsfan 0:2f6062c6d018 583 default:
gsfan 0:2f6062c6d018 584 DBG("Can't use security\r\n");
gsfan 0:2f6062c6d018 585 r = -1;
gsfan 0:2f6062c6d018 586 break;
gsfan 0:2f6062c6d018 587 }
gsfan 0:2f6062c6d018 588
gsfan 0:2f6062c6d018 589 if (r == 0) _connect = true;
gsfan 0:2f6062c6d018 590 return r;
gsfan 0:2f6062c6d018 591 }
gsfan 0:2f6062c6d018 592
gsfan 22:9b077e2823ce 593 int GSwifi::limitedap (GSSECURITY sec, const char *ssid, const char *pass, IpAddr ipaddr, IpAddr netmask, char *dns) {
gsfan 0:2f6062c6d018 594 int r;
gsfan 0:2f6062c6d018 595 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 596
gsfan 0:2f6062c6d018 597 if (_connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 598
gsfan 0:2f6062c6d018 599 command(NULL, GSRES_NORMAL);
gsfan 0:2f6062c6d018 600 if (command("ATE0", GSRES_NORMAL)) return -1;
gsfan 0:2f6062c6d018 601 if (_rts) {
gsfan 0:2f6062c6d018 602 command("AT&R1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 603 }
gsfan 35:515ec79792d3 604 if (getMacAddress(_mac)) return -1;
gsfan 0:2f6062c6d018 605 #ifdef GS_BULK
gsfan 0:2f6062c6d018 606 command("AT+BDATA=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 607 #endif
gsfan 0:2f6062c6d018 608
gsfan 35:515ec79792d3 609 disconnect();
gsfan 0:2f6062c6d018 610 command("AT+WM=2", GSRES_NORMAL); // limited ap
gsfan 26:b347ee3a1087 611 wait_ms(100);
gsfan 0:2f6062c6d018 612 command("AT+NDHCP=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 613 setAddress(ipaddr, netmask, ipaddr, ipaddr);
gsfan 8:bce9e7e51a0d 614 if (command("AT+DHCPSRVR=1", GSRES_NORMAL)) return -1;
gsfan 22:9b077e2823ce 615 if (dns) {
gsfan 22:9b077e2823ce 616 sprintf(cmd, "AT+DNS=1,%s", dns);
gsfan 22:9b077e2823ce 617 } else {
gsfan 22:9b077e2823ce 618 strcpy(cmd, "AT+DNS=1," GS_DNSNAME);
gsfan 22:9b077e2823ce 619 }
gsfan 22:9b077e2823ce 620 if (command(cmd, GSRES_NORMAL)) return -1;
gsfan 0:2f6062c6d018 621
gsfan 0:2f6062c6d018 622 switch (sec) {
gsfan 0:2f6062c6d018 623 case GSSEC_NONE:
gsfan 0:2f6062c6d018 624 case GSSEC_OPEN:
gsfan 0:2f6062c6d018 625 case GSSEC_WEP:
gsfan 0:2f6062c6d018 626 sprintf(cmd, "AT+WAUTH=%d", sec);
gsfan 0:2f6062c6d018 627 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 628 if (sec != GSSEC_NONE) {
gsfan 22:9b077e2823ce 629 sprintf(cmd, "AT+WWEP1=%s", pass);
gsfan 22:9b077e2823ce 630 command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 631 wait_ms(100);
gsfan 22:9b077e2823ce 632 }
gsfan 0:2f6062c6d018 633 sprintf(cmd, "AT+WA=%s", ssid);
gsfan 0:2f6062c6d018 634 r = command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
gsfan 0:2f6062c6d018 635 break;
gsfan 0:2f6062c6d018 636 default:
gsfan 0:2f6062c6d018 637 DBG("Can't use security\r\n");
gsfan 0:2f6062c6d018 638 r = -1;
gsfan 0:2f6062c6d018 639 break;
gsfan 0:2f6062c6d018 640 }
gsfan 0:2f6062c6d018 641
gsfan 0:2f6062c6d018 642 if (r == 0) _connect = true;
gsfan 0:2f6062c6d018 643 return r;
gsfan 0:2f6062c6d018 644 }
gsfan 0:2f6062c6d018 645
gsfan 0:2f6062c6d018 646 int GSwifi::disconnect () {
gsfan 0:2f6062c6d018 647 int i;
gsfan 0:2f6062c6d018 648
gsfan 0:2f6062c6d018 649 _connect = false;
gsfan 0:2f6062c6d018 650 for (i = 0; i < 16; i ++) {
gsfan 0:2f6062c6d018 651 _gs_sock[i].connect = false;
gsfan 0:2f6062c6d018 652 }
gsfan 0:2f6062c6d018 653 command("AT+NCLOSEALL", GSRES_NORMAL);
gsfan 0:2f6062c6d018 654 command("AT+WD", GSRES_NORMAL);
gsfan 0:2f6062c6d018 655 command("AT+NDHCP=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 656 wait_ms(100);
gsfan 0:2f6062c6d018 657 return 0;
gsfan 0:2f6062c6d018 658 }
gsfan 0:2f6062c6d018 659
gsfan 28:fbba4c58d14c 660 int GSwifi::reconnect () {
gsfan 28:fbba4c58d14c 661 int r;
gsfan 28:fbba4c58d14c 662 char cmd[GS_CMD_SIZE];
gsfan 28:fbba4c58d14c 663
gsfan 28:fbba4c58d14c 664 if (_connect || _status != GSSTAT_READY) return -1;
gsfan 28:fbba4c58d14c 665 if (!_ssid) return -1;
gsfan 28:fbba4c58d14c 666
gsfan 28:fbba4c58d14c 667 switch (_sec) {
gsfan 28:fbba4c58d14c 668 case GSSEC_WPS_BUTTON:
gsfan 28:fbba4c58d14c 669 case GSSEC_WPS_PIN:
gsfan 28:fbba4c58d14c 670 sprintf(cmd, "AT+WPAPSK=%s,%s", _ssid, _pass);
gsfan 28:fbba4c58d14c 671 command(cmd, GSRES_NORMAL, GS_TIMEOUT2);
gsfan 28:fbba4c58d14c 672 wait_ms(100);
gsfan 28:fbba4c58d14c 673 case GSSEC_NONE:
gsfan 28:fbba4c58d14c 674 case GSSEC_OPEN:
gsfan 28:fbba4c58d14c 675 case GSSEC_WEP:
gsfan 28:fbba4c58d14c 676 case GSSEC_WPA_PSK:
gsfan 28:fbba4c58d14c 677 case GSSEC_WPA_ENT:
gsfan 28:fbba4c58d14c 678 case GSSEC_WPA2_PSK:
gsfan 28:fbba4c58d14c 679 case GSSEC_WPA2_ENT:
gsfan 28:fbba4c58d14c 680 sprintf(cmd, "AT+WA=%s", _ssid);
gsfan 28:fbba4c58d14c 681 r = command(cmd, GSRES_DHCP, GS_TIMEOUT2);
gsfan 28:fbba4c58d14c 682 break;
gsfan 28:fbba4c58d14c 683 default:
gsfan 28:fbba4c58d14c 684 DBG("Can't use security\r\n");
gsfan 28:fbba4c58d14c 685 r = -1;
gsfan 28:fbba4c58d14c 686 break;
gsfan 28:fbba4c58d14c 687 }
gsfan 35:515ec79792d3 688
gsfan 35:515ec79792d3 689 if (r == 0) _connect = true;
gsfan 28:fbba4c58d14c 690 return r;
gsfan 28:fbba4c58d14c 691 }
gsfan 28:fbba4c58d14c 692
gsfan 35:515ec79792d3 693 int GSwifi::setAddress (char *name) {
gsfan 35:515ec79792d3 694 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 695
gsfan 35:515ec79792d3 696 if (name) {
gsfan 35:515ec79792d3 697 sprintf(cmd, "AT+NDHCP=1,%s", name);
gsfan 35:515ec79792d3 698 } else {
gsfan 35:515ec79792d3 699 strcpy(cmd, "AT+NDHCP=1," GS_DHCPNAME);
gsfan 35:515ec79792d3 700 }
gsfan 35:515ec79792d3 701 if (command(cmd, GSRES_DHCP), GS_TIMEOUT2) return -1;
gsfan 0:2f6062c6d018 702 if (_ipaddr.isNull()) return -1;
gsfan 0:2f6062c6d018 703 return 0;
gsfan 0:2f6062c6d018 704 }
gsfan 0:2f6062c6d018 705
gsfan 0:2f6062c6d018 706 int GSwifi::setAddress (IpAddr ipaddr, IpAddr netmask, IpAddr gateway, IpAddr nameserver) {
gsfan 0:2f6062c6d018 707 int r;
gsfan 0:2f6062c6d018 708 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 709
gsfan 0:2f6062c6d018 710 command("AT+NDHCP=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 711 wait_ms(100);
gsfan 0:2f6062c6d018 712
gsfan 0:2f6062c6d018 713 sprintf(cmd, "AT+NSET=%d.%d.%d.%d,%d.%d.%d.%d,%d.%d.%d.%d",
gsfan 0:2f6062c6d018 714 ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3],
gsfan 0:2f6062c6d018 715 netmask[0], netmask[1], netmask[2], netmask[3],
gsfan 0:2f6062c6d018 716 gateway[0], gateway[1], gateway[2], gateway[3]);
gsfan 0:2f6062c6d018 717 r = command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 718 if (r) return -1;
gsfan 0:2f6062c6d018 719 _ipaddr = ipaddr;
gsfan 0:2f6062c6d018 720 _netmask = netmask;
gsfan 0:2f6062c6d018 721 _gateway = gateway;
gsfan 0:2f6062c6d018 722
gsfan 0:2f6062c6d018 723 if (ipaddr != nameserver) {
gsfan 0:2f6062c6d018 724 sprintf(cmd, "AT+DNSSET=%d.%d.%d.%d",
gsfan 0:2f6062c6d018 725 nameserver[0], nameserver[1], nameserver[2], nameserver[3]);
gsfan 0:2f6062c6d018 726 r = command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 727 }
gsfan 0:2f6062c6d018 728 return r;
gsfan 0:2f6062c6d018 729 }
gsfan 0:2f6062c6d018 730
gsfan 1:b127c6c5241d 731 int GSwifi::getAddress (IpAddr &ipaddr, IpAddr &netmask, IpAddr &gateway, IpAddr &nameserver) {
gsfan 1:b127c6c5241d 732 ipaddr = _ipaddr;
gsfan 1:b127c6c5241d 733 netmask = _netmask;
gsfan 1:b127c6c5241d 734 gateway = _gateway;
gsfan 1:b127c6c5241d 735 nameserver = _nameserver;
gsfan 2:c6e0e97901b3 736 return 0;
gsfan 1:b127c6c5241d 737 }
gsfan 1:b127c6c5241d 738
gsfan 29:1c4419512941 739 int GSwifi::getMacAddress (char *mac) {
gsfan 35:515ec79792d3 740
gsfan 35:515ec79792d3 741 command("AT+NMAC=?", GSRES_MACADDRESS);
gsfan 35:515ec79792d3 742 if (_mac[0] || _mac[1] || _mac[2] || _mac[3] || _mac[4] || _mac[5]) {
gsfan 35:515ec79792d3 743 memcpy(mac, _mac, 6);
gsfan 35:515ec79792d3 744 return 0;
gsfan 35:515ec79792d3 745 }
gsfan 35:515ec79792d3 746 return -1;
gsfan 26:b347ee3a1087 747 }
gsfan 26:b347ee3a1087 748
gsfan 0:2f6062c6d018 749 int GSwifi::getHostByName (const char* name, IpAddr &addr) {
gsfan 0:2f6062c6d018 750 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 751
gsfan 0:2f6062c6d018 752 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 753
gsfan 0:2f6062c6d018 754 sprintf(cmd, "AT+DNSLOOKUP=%s", name);
gsfan 0:2f6062c6d018 755 if (command(cmd, GSRES_DNSLOOKUP)) return -1;
gsfan 0:2f6062c6d018 756
gsfan 0:2f6062c6d018 757 addr = _resolv;
gsfan 0:2f6062c6d018 758 return 0;
gsfan 0:2f6062c6d018 759 }
gsfan 0:2f6062c6d018 760
gsfan 0:2f6062c6d018 761 int GSwifi::getHostByName (Host &host) {
gsfan 0:2f6062c6d018 762 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 763
gsfan 0:2f6062c6d018 764 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 765
gsfan 0:2f6062c6d018 766 sprintf(cmd, "AT+DNSLOOKUP=%s", host.getName());
gsfan 0:2f6062c6d018 767 if (command(cmd, GSRES_DNSLOOKUP)) return -1;
gsfan 0:2f6062c6d018 768
gsfan 0:2f6062c6d018 769 host.setIp(_resolv);
gsfan 0:2f6062c6d018 770 return 0;
gsfan 0:2f6062c6d018 771 }
gsfan 0:2f6062c6d018 772
gsfan 0:2f6062c6d018 773 int GSwifi::setRFPower (int power) {
gsfan 0:2f6062c6d018 774 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 775
gsfan 0:2f6062c6d018 776 if (power < 0 || power > 7) return -1;
gsfan 0:2f6062c6d018 777
gsfan 0:2f6062c6d018 778 sprintf(cmd, "AT+WP=%d", power);
gsfan 0:2f6062c6d018 779 return command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 780 }
gsfan 0:2f6062c6d018 781
gsfan 2:c6e0e97901b3 782 int GSwifi::powerSave (int active, int save) {
gsfan 0:2f6062c6d018 783 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 784
gsfan 0:2f6062c6d018 785 if (_status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 786
gsfan 2:c6e0e97901b3 787 sprintf(cmd, "AT+WRXACTIVE=%d", active);
gsfan 0:2f6062c6d018 788 command(cmd, GSRES_NORMAL);
gsfan 3:1345daf4ec1a 789 sprintf(cmd, "AT+WRXPS=%d", save);
gsfan 0:2f6062c6d018 790 return command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 791 }
gsfan 0:2f6062c6d018 792
gsfan 0:2f6062c6d018 793 int GSwifi::standby (int msec) {
gsfan 26:b347ee3a1087 794 int i;
gsfan 0:2f6062c6d018 795 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 796
gsfan 0:2f6062c6d018 797 if (_status != GSSTAT_READY && _status != GSSTAT_WAKEUP) return -1;
gsfan 0:2f6062c6d018 798
gsfan 26:b347ee3a1087 799 if (_status == GSSTAT_READY) {
gsfan 0:2f6062c6d018 800 command("AT+WRXACTIVE=0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 801 command("AT+STORENWCONN", GSRES_NORMAL);
gsfan 0:2f6062c6d018 802 } else {
gsfan 0:2f6062c6d018 803 command("ATE0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 804 if (_rts) {
gsfan 0:2f6062c6d018 805 command("AT&R1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 806 }
gsfan 0:2f6062c6d018 807 }
gsfan 26:b347ee3a1087 808 for (i = 0; i < 16; i ++) {
gsfan 26:b347ee3a1087 809 _gs_sock[i].connect = false;
gsfan 26:b347ee3a1087 810 }
gsfan 0:2f6062c6d018 811 _status = GSSTAT_STANDBY;
gsfan 0:2f6062c6d018 812 sprintf(cmd, "AT+PSSTBY=%d,0,0,0", msec); // go standby
gsfan 0:2f6062c6d018 813 return command(cmd, GSRES_NORMAL, 0);
gsfan 0:2f6062c6d018 814 }
gsfan 0:2f6062c6d018 815
gsfan 0:2f6062c6d018 816 int GSwifi::wakeup () {
gsfan 0:2f6062c6d018 817
gsfan 26:b347ee3a1087 818 if (_status == GSSTAT_STANDBY && _alarm != NULL) {
gsfan 25:f6e5622d2930 819 Timer timeout;
gsfan 26:b347ee3a1087 820 _alarm->output(); // low
gsfan 25:f6e5622d2930 821 _alarm->write(0);
gsfan 25:f6e5622d2930 822 timeout.start();
gsfan 25:f6e5622d2930 823 while (_status != GSSTAT_WAKEUP && timeout.read() < GS_TIMEOUT) {
gsfan 25:f6e5622d2930 824 poll();
gsfan 25:f6e5622d2930 825 }
gsfan 25:f6e5622d2930 826 timeout.stop();
gsfan 26:b347ee3a1087 827 _alarm->input(); // high
gsfan 28:fbba4c58d14c 828 _alarm->mode(PullUp);
gsfan 25:f6e5622d2930 829 }
gsfan 25:f6e5622d2930 830
gsfan 0:2f6062c6d018 831 if (_status == GSSTAT_WAKEUP) {
gsfan 0:2f6062c6d018 832 _status = GSSTAT_READY;
gsfan 0:2f6062c6d018 833 command("ATE0", GSRES_NORMAL);
gsfan 0:2f6062c6d018 834 if (_rts) {
gsfan 0:2f6062c6d018 835 command("AT&R1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 836 }
gsfan 0:2f6062c6d018 837 #ifdef GS_BULK
gsfan 0:2f6062c6d018 838 command("AT+BDATA=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 839 #endif
gsfan 0:2f6062c6d018 840 command("AT+RESTORENWCONN", GSRES_NORMAL);
gsfan 0:2f6062c6d018 841 wait_ms(100);
gsfan 0:2f6062c6d018 842 return command("AT+WRXACTIVE=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 843 } else
gsfan 0:2f6062c6d018 844 if (_status == GSSTAT_DEEPSLEEP) {
gsfan 0:2f6062c6d018 845 _status = GSSTAT_READY;
gsfan 0:2f6062c6d018 846 return command("AT", GSRES_NORMAL);
gsfan 0:2f6062c6d018 847 }
gsfan 0:2f6062c6d018 848 return -1;
gsfan 0:2f6062c6d018 849 }
gsfan 0:2f6062c6d018 850
gsfan 0:2f6062c6d018 851 int GSwifi::deepSleep () {
gsfan 0:2f6062c6d018 852
gsfan 0:2f6062c6d018 853 if (_status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 854
gsfan 0:2f6062c6d018 855 _status = GSSTAT_DEEPSLEEP;
gsfan 0:2f6062c6d018 856 return command("AT+PSDPSLEEP", GSRES_NORMAL, 0); // go deep sleep
gsfan 0:2f6062c6d018 857 }
gsfan 0:2f6062c6d018 858
gsfan 0:2f6062c6d018 859 bool GSwifi::isConnected () {
gsfan 0:2f6062c6d018 860 return _connect;
gsfan 0:2f6062c6d018 861 }
gsfan 0:2f6062c6d018 862
gsfan 25:f6e5622d2930 863 GSwifi::GSSTATUS GSwifi::getStatus () {
gsfan 0:2f6062c6d018 864 return _status;
gsfan 0:2f6062c6d018 865 }
gsfan 0:2f6062c6d018 866
gsfan 1:b127c6c5241d 867 int GSwifi::getRssi () {
gsfan 1:b127c6c5241d 868 if (command("AT+WRSSI=?", GSRES_RSSI)) {
gsfan 1:b127c6c5241d 869 return 0;
gsfan 1:b127c6c5241d 870 }
gsfan 1:b127c6c5241d 871 return _rssi;
gsfan 1:b127c6c5241d 872 }
gsfan 1:b127c6c5241d 873
gsfan 5:6def1d0df519 874 int GSwifi::ntpdate (Host host, int sec) {
gsfan 5:6def1d0df519 875 char cmd[GS_CMD_SIZE];
gsfan 5:6def1d0df519 876
gsfan 5:6def1d0df519 877 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 5:6def1d0df519 878
gsfan 5:6def1d0df519 879 if (host.getIp().isNull()) {
gsfan 5:6def1d0df519 880 if (getHostByName(host)) {
gsfan 5:6def1d0df519 881 if (getHostByName(host)) return -1;
gsfan 5:6def1d0df519 882 }
gsfan 5:6def1d0df519 883 }
gsfan 5:6def1d0df519 884
gsfan 5:6def1d0df519 885 if (sec) {
gsfan 5:6def1d0df519 886 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 887 GS_TIMEOUT / 1000, sec);
gsfan 5:6def1d0df519 888 } else {
gsfan 5:6def1d0df519 889 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 890 GS_TIMEOUT / 1000);
gsfan 5:6def1d0df519 891 }
gsfan 5:6def1d0df519 892 return command(cmd, GSRES_NORMAL);
gsfan 5:6def1d0df519 893 }
gsfan 5:6def1d0df519 894
gsfan 5:6def1d0df519 895 int GSwifi::setTime (time_t time) {
gsfan 5:6def1d0df519 896 char cmd[GS_CMD_SIZE];
gsfan 5:6def1d0df519 897 struct tm *t;
gsfan 5:6def1d0df519 898
gsfan 5:6def1d0df519 899 if (_status != GSSTAT_READY) return -1;
gsfan 5:6def1d0df519 900
gsfan 5:6def1d0df519 901 t = localtime(&time);
gsfan 5:6def1d0df519 902 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 903 return command(cmd, GSRES_NORMAL);
gsfan 5:6def1d0df519 904 }
gsfan 5:6def1d0df519 905
gsfan 5:6def1d0df519 906 time_t GSwifi::getTime () {
gsfan 5:6def1d0df519 907
gsfan 5:6def1d0df519 908 if (command("AT+GETTIME=?", GSRES_TIME)) {
gsfan 5:6def1d0df519 909 return 0;
gsfan 5:6def1d0df519 910 }
gsfan 5:6def1d0df519 911 return _time;
gsfan 5:6def1d0df519 912 }
gsfan 5:6def1d0df519 913
gsfan 6:a423f0d197de 914 int GSwifi::gpioOut (int port, int out) {
gsfan 6:a423f0d197de 915 char cmd[GS_CMD_SIZE];
gsfan 6:a423f0d197de 916
gsfan 6:a423f0d197de 917 if (_status != GSSTAT_READY) return -1;
gsfan 6:a423f0d197de 918
gsfan 6:a423f0d197de 919 sprintf(cmd, "AT+DGPIO=%d,%d", port, out);
gsfan 6:a423f0d197de 920 return command(cmd, GSRES_NORMAL);
gsfan 6:a423f0d197de 921 }
gsfan 6:a423f0d197de 922
gsfan 26:b347ee3a1087 923 void GSwifi::parseResponse () {
gsfan 18:4b97804c37d1 924 int i;
gsfan 26:b347ee3a1087 925 char buf[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 926
gsfan 26:b347ee3a1087 927 while (! _buf_cmd.isEmpty()) {
gsfan 0:2f6062c6d018 928 // received "\n"
gsfan 0:2f6062c6d018 929 i = 0;
gsfan 25:f6e5622d2930 930 while ((! _buf_cmd.isEmpty()) && i < sizeof(buf)) {
gsfan 25:f6e5622d2930 931 _buf_cmd.dequeue(&buf[i]);
gsfan 0:2f6062c6d018 932 if (buf[i] == '\n') {
gsfan 0:2f6062c6d018 933 break;
gsfan 0:2f6062c6d018 934 }
gsfan 0:2f6062c6d018 935 i ++;
gsfan 0:2f6062c6d018 936 }
gsfan 26:b347ee3a1087 937 if (i == 0) continue;
gsfan 0:2f6062c6d018 938 buf[i] = 0;
gsfan 26:b347ee3a1087 939 DBG("parseResponse: %s\r\n", buf);
gsfan 0:2f6062c6d018 940
gsfan 26:b347ee3a1087 941 parseCmdResponse(buf);
gsfan 26:b347ee3a1087 942
gsfan 26:b347ee3a1087 943 if (strncmp(buf, "CONNECT ", 8) == 0 && buf[8] >= '0' && buf[8] <= 'F' && buf[9] != 0) {
gsfan 18:4b97804c37d1 944 int cid = x2i(buf[8]);
gsfan 18:4b97804c37d1 945 if (_gs_sock[cid].type == GSTYPE_SERVER) {
gsfan 26:b347ee3a1087 946 // fork (server socket)
gsfan 1:b127c6c5241d 947 int acid, ip1, ip2, ip3, ip4;
gsfan 1:b127c6c5241d 948 char *tmp = buf + 12;
gsfan 1:b127c6c5241d 949
gsfan 1:b127c6c5241d 950 acid = x2i(buf[10]);
gsfan 18:4b97804c37d1 951 DBG("connect %d -> %d\r\n", cid, acid);
gsfan 26:b347ee3a1087 952 newSock(acid, _gs_sock[cid].type, _gs_sock[cid].protocol);
gsfan 26:b347ee3a1087 953 _gs_sock[acid].onGsReceive = _gs_sock[cid].onGsReceive;
gsfan 18:4b97804c37d1 954 _gs_sock[acid].lcid = cid;
gsfan 1:b127c6c5241d 955 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 1:b127c6c5241d 956 _gs_sock[acid].host.setIp(IpAddr(ip1, ip2, ip3, ip4));
gsfan 1:b127c6c5241d 957 tmp = strstr(tmp, " ") + 1;
gsfan 1:b127c6c5241d 958 _gs_sock[acid].host.setPort(atoi(tmp));
gsfan 26:b347ee3a1087 959 _gs_sock[acid].onGsReceive.call(acid, 0); // event connected
gsfan 1:b127c6c5241d 960 }
gsfan 0:2f6062c6d018 961 } else
gsfan 26:b347ee3a1087 962 if (strncmp(buf, "DISCONNECT ", 11) == 0) {
gsfan 18:4b97804c37d1 963 int cid = x2i(buf[11]);
gsfan 18:4b97804c37d1 964 DBG("disconnect %d\r\n", cid);
gsfan 18:4b97804c37d1 965 _gs_sock[cid].connect = false;
gsfan 26:b347ee3a1087 966 _gs_sock[cid].onGsReceive.call(cid, -1); // event disconnected
gsfan 0:2f6062c6d018 967 } else
gsfan 0:2f6062c6d018 968 if (strncmp(buf, "DISASSOCIATED", 13) == 0 ||
gsfan 0:2f6062c6d018 969 strncmp(buf, "Disassociated", 13) == 0 ||
gsfan 16:aea56cce3bf5 970 strncmp(buf, "Disassociation Event", 20) == 0 ||
gsfan 26:b347ee3a1087 971 strncmp(buf, "UnExpected Warm Boot", 20) == 0 ||
gsfan 31:0abdc584823d 972 strncmp(buf, "APP Reset-APP SW Reset", 22) == 0 ||
gsfan 26:b347ee3a1087 973 strncmp(buf, "APP Reset-Wlan Except", 21) == 0 ) {
gsfan 35:515ec79792d3 974 DBG("disassociate\r\n");
gsfan 0:2f6062c6d018 975 _connect = false;
gsfan 0:2f6062c6d018 976 for (i = 0; i < 16; i ++) {
gsfan 0:2f6062c6d018 977 _gs_sock[i].connect = false;
gsfan 0:2f6062c6d018 978 }
gsfan 0:2f6062c6d018 979 } else
gsfan 0:2f6062c6d018 980 if (strncmp(buf, "Out of StandBy-Timer", 20) == 0 ||
gsfan 0:2f6062c6d018 981 strncmp(buf, "Out of StandBy-Alarm", 20) == 0) {
gsfan 16:aea56cce3bf5 982 // if (_status == GSSTAT_STANDBY) {
gsfan 0:2f6062c6d018 983 _status = GSSTAT_WAKEUP;
gsfan 16:aea56cce3bf5 984 // }
gsfan 0:2f6062c6d018 985 } else
gsfan 0:2f6062c6d018 986 if (strncmp(buf, "Out of Deep Sleep", 17) == 0 ) {
gsfan 16:aea56cce3bf5 987 // if (_status == GSSTAT_DEEPSLEEP) {
gsfan 0:2f6062c6d018 988 _status = GSSTAT_READY;
gsfan 16:aea56cce3bf5 989 // }
gsfan 0:2f6062c6d018 990 }
gsfan 0:2f6062c6d018 991 DBG("status: %d\r\n", _status);
gsfan 0:2f6062c6d018 992 }
gsfan 18:4b97804c37d1 993 }
gsfan 18:4b97804c37d1 994
gsfan 26:b347ee3a1087 995 void GSwifi::parseCmdResponse (char *buf) {
gsfan 26:b347ee3a1087 996 if (_gs_res == GSRES_NONE) return;
gsfan 26:b347ee3a1087 997
gsfan 26:b347ee3a1087 998 if (strcmp(buf, "OK") == 0) {
gsfan 26:b347ee3a1087 999 _gs_ok = true;
gsfan 26:b347ee3a1087 1000 } else
gsfan 26:b347ee3a1087 1001 if (strncmp(buf, "ERROR", 5) == 0) {
gsfan 26:b347ee3a1087 1002 _gs_failure = true;
gsfan 26:b347ee3a1087 1003 }
gsfan 26:b347ee3a1087 1004
gsfan 26:b347ee3a1087 1005 switch(_gs_res) {
gsfan 26:b347ee3a1087 1006 case GSRES_NORMAL:
gsfan 26:b347ee3a1087 1007 _gs_flg = -1;
gsfan 26:b347ee3a1087 1008 break;
gsfan 26:b347ee3a1087 1009 case GSRES_WPS:
gsfan 26:b347ee3a1087 1010 if (_gs_flg == 0 && strncmp(buf, "SSID=", 5) == 0) {
gsfan 35:515ec79792d3 1011 if (!_ssid) _ssid = (char*)malloc(strlen(&buf[5]) + 1);
gsfan 26:b347ee3a1087 1012 strcpy(_ssid, &buf[5]);
gsfan 26:b347ee3a1087 1013 _gs_flg ++;
gsfan 26:b347ee3a1087 1014 } else
gsfan 26:b347ee3a1087 1015 if (_gs_flg == 1 && strncmp(buf, "CHANNEL=", 8) == 0) {
gsfan 26:b347ee3a1087 1016 _gs_flg ++;
gsfan 26:b347ee3a1087 1017 } else
gsfan 26:b347ee3a1087 1018 if (_gs_flg == 2 && strncmp(buf, "PASSPHRASE=", 11) == 0) {
gsfan 35:515ec79792d3 1019 if (!_pass) _pass = (char*)malloc(strlen(&buf[11]) + 1);
gsfan 26:b347ee3a1087 1020 strcpy(_pass, &buf[11]);
gsfan 26:b347ee3a1087 1021 _gs_flg = -1;
gsfan 26:b347ee3a1087 1022 }
gsfan 26:b347ee3a1087 1023 break;
gsfan 26:b347ee3a1087 1024 case GSRES_CONNECT:
gsfan 26:b347ee3a1087 1025 if (strncmp(buf, "CONNECT ", 8) == 0 && buf[9] == 0) {
gsfan 26:b347ee3a1087 1026 _cid = x2i(buf[8]);
gsfan 26:b347ee3a1087 1027 _gs_flg = -1;
gsfan 26:b347ee3a1087 1028 }
gsfan 26:b347ee3a1087 1029 break;
gsfan 26:b347ee3a1087 1030 case GSRES_DHCP:
gsfan 26:b347ee3a1087 1031 if (_gs_flg == 0 && strstr(buf, "SubNet") && strstr(buf, "Gateway")) {
gsfan 26:b347ee3a1087 1032 _gs_flg ++;
gsfan 26:b347ee3a1087 1033 } else
gsfan 26:b347ee3a1087 1034 if (_gs_flg == 1) {
gsfan 26:b347ee3a1087 1035 int ip1, ip2, ip3, ip4;
gsfan 26:b347ee3a1087 1036 char *tmp = buf + 1;
gsfan 26:b347ee3a1087 1037 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 26:b347ee3a1087 1038 _ipaddr = IpAddr(ip1, ip2, ip3, ip4);
gsfan 26:b347ee3a1087 1039 tmp = strstr(tmp, ":") + 2;
gsfan 26:b347ee3a1087 1040 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 26:b347ee3a1087 1041 _netmask = IpAddr(ip1, ip2, ip3, ip4);
gsfan 26:b347ee3a1087 1042 tmp = strstr(tmp, ":") + 2;
gsfan 26:b347ee3a1087 1043 sscanf(tmp, "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 26:b347ee3a1087 1044 _gateway = IpAddr(ip1, ip2, ip3, ip4);
gsfan 26:b347ee3a1087 1045 _gs_flg = -1;
gsfan 26:b347ee3a1087 1046 }
gsfan 26:b347ee3a1087 1047 break;
gsfan 26:b347ee3a1087 1048 case GSRES_MACADDRESS:
gsfan 26:b347ee3a1087 1049 if (buf[2] == ':' && buf[5] == ':') {
gsfan 26:b347ee3a1087 1050 int mac1, mac2, mac3, mac4, mac5, mac6;
gsfan 26:b347ee3a1087 1051 sscanf(buf, "%x:%x:%x:%x:%x:%x", &mac1, &mac2, &mac3, &mac4, &mac5, &mac6);
gsfan 26:b347ee3a1087 1052 _mac[0] = mac1;
gsfan 26:b347ee3a1087 1053 _mac[1] = mac2;
gsfan 26:b347ee3a1087 1054 _mac[2] = mac3;
gsfan 26:b347ee3a1087 1055 _mac[3] = mac4;
gsfan 26:b347ee3a1087 1056 _mac[4] = mac5;
gsfan 26:b347ee3a1087 1057 _mac[5] = mac6;
gsfan 26:b347ee3a1087 1058 _gs_flg = -1;
gsfan 26:b347ee3a1087 1059 }
gsfan 26:b347ee3a1087 1060 break;
gsfan 26:b347ee3a1087 1061 case GSRES_DNSLOOKUP:
gsfan 26:b347ee3a1087 1062 if (strncmp(buf, "IP:", 3) == 0) {
gsfan 26:b347ee3a1087 1063 int ip1, ip2, ip3, ip4;
gsfan 26:b347ee3a1087 1064 sscanf(&buf[3], "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4);
gsfan 26:b347ee3a1087 1065 _resolv = IpAddr(ip1, ip2, ip3, ip4);
gsfan 26:b347ee3a1087 1066 _gs_flg = -1;
gsfan 26:b347ee3a1087 1067 }
gsfan 26:b347ee3a1087 1068 break;
gsfan 26:b347ee3a1087 1069 case GSRES_HTTP:
gsfan 31:0abdc584823d 1070 if (buf[0] >= '0' && buf[0] <= 'F' && buf[1] == 0) {
gsfan 26:b347ee3a1087 1071 _cid = x2i(buf[0]);
gsfan 26:b347ee3a1087 1072 _gs_flg = -1;
gsfan 26:b347ee3a1087 1073 }
gsfan 26:b347ee3a1087 1074 break;
gsfan 26:b347ee3a1087 1075 case GSRES_RSSI:
gsfan 26:b347ee3a1087 1076 if (buf[0] == '-' || (buf[0] >= '0' && buf[0] <= '9')) {
gsfan 26:b347ee3a1087 1077 _rssi = atoi(buf);
gsfan 26:b347ee3a1087 1078 _gs_flg = -1;
gsfan 26:b347ee3a1087 1079 }
gsfan 26:b347ee3a1087 1080 break;
gsfan 26:b347ee3a1087 1081 case GSRES_TIME:
gsfan 26:b347ee3a1087 1082 if (buf[0] >= '0' && buf[0] <= '9') {
gsfan 26:b347ee3a1087 1083 int year, month, day, hour, min, sec;
gsfan 26:b347ee3a1087 1084 struct tm t;
gsfan 26:b347ee3a1087 1085 sscanf(buf, "%d/%d/%d,%d:%d:%d", &day, &month, &year, &hour, &min, &sec);
gsfan 26:b347ee3a1087 1086 t.tm_sec = sec;
gsfan 26:b347ee3a1087 1087 t.tm_min = min;
gsfan 26:b347ee3a1087 1088 t.tm_hour = hour;
gsfan 26:b347ee3a1087 1089 t.tm_mday = day;
gsfan 26:b347ee3a1087 1090 t.tm_mon = month - 1;
gsfan 26:b347ee3a1087 1091 t.tm_year = year - 1900;
gsfan 26:b347ee3a1087 1092 _time = mktime(&t);
gsfan 26:b347ee3a1087 1093 _gs_flg = -1;
gsfan 26:b347ee3a1087 1094 }
gsfan 26:b347ee3a1087 1095 break;
gsfan 26:b347ee3a1087 1096 }
gsfan 26:b347ee3a1087 1097
gsfan 26:b347ee3a1087 1098 return;
gsfan 26:b347ee3a1087 1099 }
gsfan 26:b347ee3a1087 1100
gsfan 18:4b97804c37d1 1101 void GSwifi::poll () {
gsfan 18:4b97804c37d1 1102 int i, j;
gsfan 18:4b97804c37d1 1103
gsfan 0:2f6062c6d018 1104 for (i = 0; i < 16; i ++) {
gsfan 35:515ec79792d3 1105 if (_gs_sock[i].connect && _gs_sock[i].received) {
gsfan 35:515ec79792d3 1106 if (_gs_sock[i].data && ! _gs_sock[i].data->isEmpty()) {
gsfan 0:2f6062c6d018 1107 // recv interrupt
gsfan 26:b347ee3a1087 1108 _gs_sock[i].received = false;
gsfan 26:b347ee3a1087 1109 for (j = 0; j < 1500 / GS_DATA_SIZE + 1; j ++) {
gsfan 26:b347ee3a1087 1110 if (! _gs_sock[i].connect || _gs_sock[i].data->isEmpty()) break;
gsfan 29:1c4419512941 1111 _gs_sock[i].onGsReceive.call(i, _gs_sock[i].data->available());
gsfan 12:63e714550791 1112 }
gsfan 35:515ec79792d3 1113 }
gsfan 0:2f6062c6d018 1114 }
gsfan 0:2f6062c6d018 1115 }
gsfan 35:515ec79792d3 1116
gsfan 35:515ec79792d3 1117 if (_reconnect && ! _connect) {
gsfan 35:515ec79792d3 1118 if (_reconnect_count == 0 || (_reconnect_count < _reconnect && _reconnect_time < time(NULL))) {
gsfan 35:515ec79792d3 1119 _reconnect_count ++;
gsfan 35:515ec79792d3 1120 DBG("reconnect %d/%d\r\n", _reconnect_count, _reconnect);
gsfan 35:515ec79792d3 1121 if (reconnect() == 0) {
gsfan 35:515ec79792d3 1122 _reconnect_count = 0;
gsfan 35:515ec79792d3 1123 }
gsfan 35:515ec79792d3 1124 _reconnect_time = time(NULL) + GS_RECONTIME;
gsfan 24:5c350ae2e703 1125 }
gsfan 24:5c350ae2e703 1126 }
gsfan 0:2f6062c6d018 1127 }
gsfan 0:2f6062c6d018 1128
gsfan 19:cad912f5a6ba 1129 int GSwifi::certAdd (const char *name, const char *cert, int len) {
gsfan 0:2f6062c6d018 1130 int i;
gsfan 0:2f6062c6d018 1131 char cmd[GS_CMD_SIZE];
gsfan 0:2f6062c6d018 1132
gsfan 0:2f6062c6d018 1133 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 0:2f6062c6d018 1134
gsfan 0:2f6062c6d018 1135 sprintf(cmd, "AT+TCERTADD=%s,1,%d,1", name, len); // Hex, ram
gsfan 0:2f6062c6d018 1136 command(cmd, GSRES_NORMAL);
gsfan 0:2f6062c6d018 1137
gsfan 26:b347ee3a1087 1138 resetResponse(GSRES_NORMAL);
gsfan 1:b127c6c5241d 1139 _gs_putc(0x1b);
gsfan 1:b127c6c5241d 1140 _gs_putc('W');
gsfan 0:2f6062c6d018 1141 for (i = 0; i < len; i ++) {
gsfan 1:b127c6c5241d 1142 _gs_putc(cert[i]);
gsfan 0:2f6062c6d018 1143 }
gsfan 26:b347ee3a1087 1144 return waitResponse(GS_TIMEOUT);
gsfan 0:2f6062c6d018 1145 }
gsfan 0:2f6062c6d018 1146
gsfan 22:9b077e2823ce 1147 int GSwifi::provisioning (char *user, char *pass) {
gsfan 22:9b077e2823ce 1148 char cmd[GS_CMD_SIZE];
gsfan 22:9b077e2823ce 1149
gsfan 22:9b077e2823ce 1150 if (_status != GSSTAT_READY) return -1;
gsfan 22:9b077e2823ce 1151
gsfan 22:9b077e2823ce 1152 sprintf(cmd, "AT+WEBPROV=%s,%s", user, pass);
gsfan 22:9b077e2823ce 1153 return command(cmd, GSRES_NORMAL);
gsfan 22:9b077e2823ce 1154 }
gsfan 22:9b077e2823ce 1155
gsfan 22:9b077e2823ce 1156 int GSwifi::setBaud (int baud) {
gsfan 22:9b077e2823ce 1157
gsfan 22:9b077e2823ce 1158 if (_status != GSSTAT_READY) return -1;
gsfan 22:9b077e2823ce 1159
gsfan 22:9b077e2823ce 1160 _gs.printf("ATB=%d\r\n", baud);
gsfan 22:9b077e2823ce 1161 _gs.baud(baud);
gsfan 26:b347ee3a1087 1162 wait_ms(100);
gsfan 26:b347ee3a1087 1163 _buf_cmd.flush();
gsfan 22:9b077e2823ce 1164 return 0;
gsfan 22:9b077e2823ce 1165 }
gsfan 22:9b077e2823ce 1166
gsfan 25:f6e5622d2930 1167 int GSwifi::setRegion (int reg) {
gsfan 25:f6e5622d2930 1168 char cmd[GS_CMD_SIZE];
gsfan 15:5febfc399099 1169
gsfan 25:f6e5622d2930 1170 if (_status != GSSTAT_READY) return -1;
gsfan 15:5febfc399099 1171
gsfan 25:f6e5622d2930 1172 sprintf(cmd, "AT+WREGDOMAIN=%d", reg);
gsfan 25:f6e5622d2930 1173 return command(cmd, GSRES_NORMAL);
gsfan 15:5febfc399099 1174 }
gsfan 15:5febfc399099 1175
gsfan 25:f6e5622d2930 1176
gsfan 20:151b5a4fdd29 1177 int GSwifi::from_hex (int ch) {
gsfan 20:151b5a4fdd29 1178 return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10;
gsfan 20:151b5a4fdd29 1179 }
gsfan 20:151b5a4fdd29 1180
gsfan 20:151b5a4fdd29 1181 int GSwifi::to_hex (int code) {
gsfan 20:151b5a4fdd29 1182 static char hex[] = "0123456789abcdef";
gsfan 20:151b5a4fdd29 1183 return hex[code & 15];
gsfan 20:151b5a4fdd29 1184 }
gsfan 20:151b5a4fdd29 1185
gsfan 0:2f6062c6d018 1186 int GSwifi::x2i (char c) {
gsfan 0:2f6062c6d018 1187 if (c >= '0' && c <= '9') {
gsfan 0:2f6062c6d018 1188 return c - '0';
gsfan 0:2f6062c6d018 1189 } else
gsfan 0:2f6062c6d018 1190 if (c >= 'A' && c <= 'F') {
gsfan 0:2f6062c6d018 1191 return c - 'A' + 10;
gsfan 0:2f6062c6d018 1192 } else
gsfan 0:2f6062c6d018 1193 if (c >= 'a' && c <= 'f') {
gsfan 0:2f6062c6d018 1194 return c - 'a' + 10;
gsfan 0:2f6062c6d018 1195 }
gsfan 0:2f6062c6d018 1196 return 0;
gsfan 0:2f6062c6d018 1197 }
gsfan 0:2f6062c6d018 1198
gsfan 0:2f6062c6d018 1199 char GSwifi::i2x (int i) {
gsfan 0:2f6062c6d018 1200 if (i >= 0 && i <= 9) {
gsfan 0:2f6062c6d018 1201 return i + '0';
gsfan 0:2f6062c6d018 1202 } else
gsfan 0:2f6062c6d018 1203 if (i >= 10 && i <= 15) {
gsfan 0:2f6062c6d018 1204 return i - 10 + 'A';
gsfan 0:2f6062c6d018 1205 }
gsfan 0:2f6062c6d018 1206 return 0;
gsfan 0:2f6062c6d018 1207 }
gsfan 0:2f6062c6d018 1208
gsfan 25:f6e5622d2930 1209
gsfan 22:9b077e2823ce 1210 #ifdef DEBUG
gsfan 0:2f6062c6d018 1211 // for test
gsfan 23:a783c62c36d0 1212 void GSwifi::dump () {
gsfan 23:a783c62c36d0 1213 int i;
gsfan 23:a783c62c36d0 1214
gsfan 23:a783c62c36d0 1215 DBG("GS mode=%d, escape=%d, cid=%d\r\n", _gs_mode, _escape, _cid);
gsfan 23:a783c62c36d0 1216 for (i = 0; i < 16; i ++) {
gsfan 35:515ec79792d3 1217 DBG("[%d] ", i);
gsfan 35:515ec79792d3 1218 DBG("connect=%d, type=%d, protocol=%d, len=%d\r\n", _gs_sock[i].connect, _gs_sock[i].type, _gs_sock[i].protocol, _gs_sock[i].data->available());
gsfan 35:515ec79792d3 1219 DBG(" %x, %x\r\n", &_gs_sock[i], _gs_sock[i].data);
gsfan 35:515ec79792d3 1220 #ifdef GS_ENABLE_HTTPD
gsfan 23:a783c62c36d0 1221 if (_gs_sock[i].protocol == GSPROT_HTTPD) {
gsfan 23:a783c62c36d0 1222 DBG(" mode=%d, type=%d, len=%d\r\n", i, _httpd[i].mode, _httpd[i].type, _httpd[i].len);
gsfan 35:515ec79792d3 1223 DBG(" %x, %x\r\n", &_httpd[i], _httpd[i].buf);
gsfan 23:a783c62c36d0 1224 }
gsfan 35:515ec79792d3 1225 #endif
gsfan 23:a783c62c36d0 1226 }
gsfan 23:a783c62c36d0 1227 }
gsfan 0:2f6062c6d018 1228
gsfan 0:2f6062c6d018 1229 void GSwifi::test () {
gsfan 2:c6e0e97901b3 1230 /*
gsfan 0:2f6062c6d018 1231 command(NULL, GSRES_NORMAL);
gsfan 0:2f6062c6d018 1232 wait_ms(100);
gsfan 0:2f6062c6d018 1233 command("AT+NCLOSEALL", GSRES_NORMAL);
gsfan 0:2f6062c6d018 1234 _connect = true;
gsfan 2:c6e0e97901b3 1235 */
gsfan 2:c6e0e97901b3 1236 command("AT+WRXACTIVE=1", GSRES_NORMAL);
gsfan 0:2f6062c6d018 1237 }
gsfan 0:2f6062c6d018 1238
gsfan 0:2f6062c6d018 1239 int GSwifi::getc() {
gsfan 0:2f6062c6d018 1240 char c;
gsfan 25:f6e5622d2930 1241 if (! _buf_cmd.isEmpty()) {
gsfan 25:f6e5622d2930 1242 _buf_cmd.dequeue(&c);
gsfan 0:2f6062c6d018 1243 }
gsfan 0:2f6062c6d018 1244 /*
gsfan 0:2f6062c6d018 1245 } else
gsfan 0:2f6062c6d018 1246 if (_gs_sock[0].data != NULL) {
gsfan 25:f6e5622d2930 1247 _gs_sock[0].data->dequeue(&c);
gsfan 0:2f6062c6d018 1248 }
gsfan 0:2f6062c6d018 1249 */
gsfan 0:2f6062c6d018 1250 return c;
gsfan 0:2f6062c6d018 1251 }
gsfan 0:2f6062c6d018 1252
gsfan 0:2f6062c6d018 1253 void GSwifi::putc(char c) {
gsfan 1:b127c6c5241d 1254 _gs_putc(c);
gsfan 0:2f6062c6d018 1255 }
gsfan 0:2f6062c6d018 1256
gsfan 0:2f6062c6d018 1257 int GSwifi::readable() {
gsfan 25:f6e5622d2930 1258 return ! _buf_cmd.isEmpty();
gsfan 0:2f6062c6d018 1259 // return _buf_cmd.use() || (_gs_sock[0].data != NULL && _gs_sock[0].data->use());
gsfan 0:2f6062c6d018 1260 }
gsfan 18:4b97804c37d1 1261 #endif