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:
Tue Sep 11 04:01:49 2012 +0000
Revision:
13:03b420e152b7
Parent:
12:63e714550791
Child:
14:9e89b922ace1
fix
;

Who changed what in which revision?

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