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:
Mon Jun 24 07:36:48 2013 +0000
Revision:
36:a70b11e1560f
Parent:
35:515ec79792d3
Child:
37:e61ea8267415
fix _gs_puts

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