GSwifiInterface library (interface for GainSpan Wi-Fi GS1011 modules) Please see https://mbed.org/users/gsfan/notebook/GSwifiInterface/
Dependents: GSwifiInterface_HelloWorld GSwifiInterface_HelloServo GSwifiInterface_UDPEchoServer GSwifiInterface_UDPEchoClient ... more
Fork of WiflyInterface by
GainSpan Wi-Fi library
The GS1011/GS2100 is an ultra low power 802.11b wireless module from GainSpan.
mbed RTOS supported.
- about this library: http://mbed.org/users/gsfan/notebook/GSwifiInterface/
- about Wi-Fi module: http://mbed.org/users/gsfan/notebook/gainspan_wifi/
ゲインスパン Wi-Fi モジュール ライブラリ
ゲインスパン社の低電力 Wi-Fiモジュール(無線LAN) GS1011/GS2100 シリーズ用のライブラリです。
mbed RTOS に対応しています。(mbed2.0)
- このライブラリについて: http://mbed.org/users/gsfan/notebook/gainspan_wifi/
- Wi-FIモジュールについて: http://mbed.org/users/gsfan/notebook/gainspan_wifi/
- UARTコマンド、SPIデータインターフェースに対応しました。(2019/09)
GSwifi/GSwifi.cpp@22:d25a5a0d2497, 2019-09-24 (annotated)
- Committer:
- gsfan
- Date:
- Tue Sep 24 06:24:37 2019 +0000
- Revision:
- 22:d25a5a0d2497
- Parent:
- 21:6431364fc667
UART Command and SPI Data supported.; bug fix.;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gsfan | 22:d25a5a0d2497 | 1 | /* Copyright (C) 2019 gsfan, MIT License |
gsfan | 5:78943b3945b5 | 2 | * |
gsfan | 5:78943b3945b5 | 3 | * Permission is hereby granted, free of charge, to any person obtaining a copy of this software |
gsfan | 5:78943b3945b5 | 4 | * and associated documentation files (the "Software"), to deal in the Software without restriction, |
gsfan | 5:78943b3945b5 | 5 | * including without limitation the rights to use, copy, modify, merge, publish, distribute, |
gsfan | 5:78943b3945b5 | 6 | * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is |
gsfan | 5:78943b3945b5 | 7 | * furnished to do so, subject to the following conditions: |
gsfan | 5:78943b3945b5 | 8 | * |
gsfan | 5:78943b3945b5 | 9 | * The above copyright notice and this permission notice shall be included in all copies or |
gsfan | 5:78943b3945b5 | 10 | * substantial portions of the Software. |
gsfan | 5:78943b3945b5 | 11 | * |
gsfan | 5:78943b3945b5 | 12 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING |
gsfan | 5:78943b3945b5 | 13 | * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
gsfan | 5:78943b3945b5 | 14 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
gsfan | 5:78943b3945b5 | 15 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
gsfan | 5:78943b3945b5 | 16 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
gsfan | 5:78943b3945b5 | 17 | */ |
gsfan | 5:78943b3945b5 | 18 | |
gsfan | 5:78943b3945b5 | 19 | #include "mbed.h" |
gsfan | 5:78943b3945b5 | 20 | #include "GSwifi.h" |
gsfan | 5:78943b3945b5 | 21 | #include <string> |
gsfan | 5:78943b3945b5 | 22 | #include <algorithm> |
gsfan | 5:78943b3945b5 | 23 | |
gsfan | 5:78943b3945b5 | 24 | GSwifi * GSwifi::_inst; |
gsfan | 5:78943b3945b5 | 25 | |
gsfan | 22:d25a5a0d2497 | 26 | #ifdef CFG_SPI_DATAINTERFACE |
gsfan | 22:d25a5a0d2497 | 27 | GSwifi::GSwifi(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, |
gsfan | 22:d25a5a0d2497 | 28 | PinName mosi, PinName miso, PinName sclk, PinName cs, PinName wake, |
gsfan | 22:d25a5a0d2497 | 29 | PinName alarm, int baud, int freq): |
gsfan | 22:d25a5a0d2497 | 30 | _gs(tx, rx), _spi(mosi, miso, sclk), _wake(wake), _reset(reset) |
gsfan | 22:d25a5a0d2497 | 31 | #else |
gsfan | 8:64184a968e3b | 32 | GSwifi::GSwifi(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm, int baud): |
gsfan | 8:64184a968e3b | 33 | _gs(tx, rx), _reset(reset) |
gsfan | 22:d25a5a0d2497 | 34 | #endif |
gsfan | 5:78943b3945b5 | 35 | { |
gsfan | 8:64184a968e3b | 36 | _inst = this; |
gsfan | 5:78943b3945b5 | 37 | memset(&_state, 0, sizeof(_state)); |
gsfan | 5:78943b3945b5 | 38 | memset(&_con, 0, sizeof(_con)); |
gsfan | 11:71d67fea5ace | 39 | _state.initialized = false; |
gsfan | 22:d25a5a0d2497 | 40 | _state.datainterface = false; |
gsfan | 11:71d67fea5ace | 41 | _state.status = STAT_READY; |
gsfan | 8:64184a968e3b | 42 | _state.cid = -1; |
gsfan | 19:d035412a7803 | 43 | #ifdef CFG_EXTENDED_MEMORY1 |
gsfan | 19:d035412a7803 | 44 | int n = CFG_EXTENDED_SIZE1 / (CFG_MAX_SOCKETS + 1); |
gsfan | 20:9bfb8a13010c | 45 | _state.buf = new CircBuffer<char>(n - 1, (void*)CFG_EXTENDED_MEMORY1); |
gsfan | 19:d035412a7803 | 46 | #ifdef CFG_ENABLE_RTOS |
gsfan | 19:d035412a7803 | 47 | for (int i = 0; i < CFG_MAX_SOCKETS; i ++) { |
gsfan | 20:9bfb8a13010c | 48 | _con[i].buf = new CircBuffer<char>(n - 1, (void*)(CFG_EXTENDED_MEMORY1 + (n * (i + 1)))); |
gsfan | 19:d035412a7803 | 49 | if (_con[i].buf == NULL) |
gsfan | 19:d035412a7803 | 50 | error("CircBuffer failed"); |
gsfan | 19:d035412a7803 | 51 | } |
gsfan | 19:d035412a7803 | 52 | _threadPoll = NULL; |
gsfan | 19:d035412a7803 | 53 | #endif |
gsfan | 19:d035412a7803 | 54 | #else // CFG_EXTENDED_MEMORY |
gsfan | 8:64184a968e3b | 55 | _state.buf = new CircBuffer<char>(CFG_DATA_SIZE); |
gsfan | 11:71d67fea5ace | 56 | #ifdef CFG_ENABLE_RTOS |
gsfan | 16:105b56570533 | 57 | for (int i = 0; i < CFG_MAX_SOCKETS; i ++) { |
gsfan | 8:64184a968e3b | 58 | _con[i].buf = new CircBuffer<char>(CFG_DATA_SIZE); |
gsfan | 11:71d67fea5ace | 59 | if (_con[i].buf == NULL) |
gsfan | 11:71d67fea5ace | 60 | error("CircBuffer failed"); |
gsfan | 5:78943b3945b5 | 61 | } |
gsfan | 8:64184a968e3b | 62 | _threadPoll = NULL; |
gsfan | 5:78943b3945b5 | 63 | #endif |
gsfan | 19:d035412a7803 | 64 | #endif // CFG_EXTENDED_MEMORY |
gsfan | 8:64184a968e3b | 65 | |
gsfan | 8:64184a968e3b | 66 | setReset(true); |
gsfan | 8:64184a968e3b | 67 | initUart(cts, rts, alarm, baud); |
gsfan | 22:d25a5a0d2497 | 68 | #ifdef CFG_SPI_DATAINTERFACE |
gsfan | 22:d25a5a0d2497 | 69 | initSpi (cs, freq); |
gsfan | 22:d25a5a0d2497 | 70 | #endif |
gsfan | 8:64184a968e3b | 71 | setAlarm(true); |
gsfan | 8:64184a968e3b | 72 | wait_ms(10); |
gsfan | 8:64184a968e3b | 73 | setAlarm(false); |
gsfan | 8:64184a968e3b | 74 | wait_ms(100); |
gsfan | 8:64184a968e3b | 75 | setReset(false); |
gsfan | 8:64184a968e3b | 76 | wait_ms(100); |
gsfan | 5:78943b3945b5 | 77 | } |
gsfan | 5:78943b3945b5 | 78 | |
gsfan | 11:71d67fea5ace | 79 | int GSwifi::join() |
gsfan | 5:78943b3945b5 | 80 | { |
gsfan | 11:71d67fea5ace | 81 | int i; |
gsfan | 8:64184a968e3b | 82 | bool r = -1; |
gsfan | 5:78943b3945b5 | 83 | |
gsfan | 8:64184a968e3b | 84 | _state.wm = WM_INFRASTRUCTURE; |
gsfan | 11:71d67fea5ace | 85 | _state.initialized = true; |
gsfan | 8:64184a968e3b | 86 | if (!strlen(_state.name)) { |
gsfan | 8:64184a968e3b | 87 | strncpy(_state.name, CFG_DHCPNAME, sizeof(_state.name)); |
gsfan | 8:64184a968e3b | 88 | } |
gsfan | 22:d25a5a0d2497 | 89 | #ifdef CFG_SPI_DATAINTERFACE |
gsfan | 22:d25a5a0d2497 | 90 | // if (strstr( |
gsfan | 22:d25a5a0d2497 | 91 | #endif |
gsfan | 8:64184a968e3b | 92 | clearFlags(); |
gsfan | 22:d25a5a0d2497 | 93 | _state.buf->flush(); |
gsfan | 12:057089026a20 | 94 | _state.mode = MODE_COMMAND; |
gsfan | 8:64184a968e3b | 95 | sendCommand(NULL, RES_NULL, 0); |
gsfan | 8:64184a968e3b | 96 | if (cmdE(false)) return -1; |
gsfan | 8:64184a968e3b | 97 | if (_flow) { |
gsfan | 8:64184a968e3b | 98 | cmdR(true); |
gsfan | 8:64184a968e3b | 99 | } |
gsfan | 8:64184a968e3b | 100 | cmdBDATA(true); |
gsfan | 8:64184a968e3b | 101 | if (cmdNMAC()) return -1; |
gsfan | 13:189e04ac70bd | 102 | cmdWREGDOMAIN(CFG_WREGDOMAIN); |
gsfan | 8:64184a968e3b | 103 | cmdWM(0); // infrastructure |
gsfan | 5:78943b3945b5 | 104 | wait_ms(100); |
gsfan | 5:78943b3945b5 | 105 | |
gsfan | 11:71d67fea5ace | 106 | switch (_state.sec) { |
gsfan | 5:78943b3945b5 | 107 | case SEC_NONE: |
gsfan | 5:78943b3945b5 | 108 | case SEC_OPEN: |
gsfan | 5:78943b3945b5 | 109 | case SEC_WEP: |
gsfan | 13:189e04ac70bd | 110 | cmdNDHCP(_state.dhcp, _state.name, DEFAULT_WAIT_RESP_TIMEOUT); |
gsfan | 15:086d1a33a197 | 111 | if (! _state.dhcp) { |
gsfan | 15:086d1a33a197 | 112 | cmdNSET(_state.ip, _state.netmask, _state.ip); |
gsfan | 15:086d1a33a197 | 113 | } |
gsfan | 8:64184a968e3b | 114 | cmdWAUTH(_state.sec); |
gsfan | 11:71d67fea5ace | 115 | if (_state.sec != SEC_NONE) { |
gsfan | 8:64184a968e3b | 116 | cmdWWEP(1, _state.pass); |
gsfan | 5:78943b3945b5 | 117 | wait_ms(100); |
gsfan | 5:78943b3945b5 | 118 | } |
gsfan | 11:71d67fea5ace | 119 | for (i = 0; i < CFG_TRYJOIN; i ++) { |
gsfan | 11:71d67fea5ace | 120 | r = cmdWA(_state.ssid); |
gsfan | 11:71d67fea5ace | 121 | if (!r) break; |
gsfan | 8:64184a968e3b | 122 | DBG("retry\r\n"); |
gsfan | 8:64184a968e3b | 123 | wait_ms(1000); |
gsfan | 5:78943b3945b5 | 124 | } |
gsfan | 5:78943b3945b5 | 125 | break; |
gsfan | 5:78943b3945b5 | 126 | case SEC_WPA_PSK: |
gsfan | 5:78943b3945b5 | 127 | case SEC_WPA2_PSK: |
gsfan | 13:189e04ac70bd | 128 | cmdNDHCP(_state.dhcp, _state.name, DEFAULT_WAIT_RESP_TIMEOUT); |
gsfan | 15:086d1a33a197 | 129 | if (! _state.dhcp) { |
gsfan | 15:086d1a33a197 | 130 | cmdNSET(_state.ip, _state.netmask, _state.ip); |
gsfan | 15:086d1a33a197 | 131 | } |
gsfan | 8:64184a968e3b | 132 | cmdWAUTH(0); |
gsfan | 8:64184a968e3b | 133 | cmdWPAPSK(_state.ssid, _state.pass); |
gsfan | 5:78943b3945b5 | 134 | wait_ms(100); |
gsfan | 11:71d67fea5ace | 135 | for (i = 0; i < CFG_TRYJOIN; i ++) { |
gsfan | 11:71d67fea5ace | 136 | r = cmdWA(_state.ssid); |
gsfan | 11:71d67fea5ace | 137 | if (!r) break; |
gsfan | 8:64184a968e3b | 138 | DBG("retry\r\n"); |
gsfan | 8:64184a968e3b | 139 | wait_ms(1000); |
gsfan | 17:c30ed7b1536d | 140 | |
gsfan | 17:c30ed7b1536d | 141 | if (_state.dhcp && i == CFG_TRYJOIN - 1) { |
gsfan | 17:c30ed7b1536d | 142 | cmdNDHCP(0, NULL, DEFAULT_WAIT_RESP_TIMEOUT); |
gsfan | 17:c30ed7b1536d | 143 | r = cmdWA(_state.ssid); |
gsfan | 17:c30ed7b1536d | 144 | if (!r && _state.dhcp) { |
gsfan | 17:c30ed7b1536d | 145 | wait_ms(1000); |
gsfan | 17:c30ed7b1536d | 146 | r = cmdNDHCP(_state.dhcp, NULL, CFG_TIMEOUT); |
gsfan | 17:c30ed7b1536d | 147 | } |
gsfan | 17:c30ed7b1536d | 148 | break; |
gsfan | 17:c30ed7b1536d | 149 | } |
gsfan | 5:78943b3945b5 | 150 | } |
gsfan | 5:78943b3945b5 | 151 | break; |
gsfan | 8:64184a968e3b | 152 | case SEC_WPA_ENT: |
gsfan | 8:64184a968e3b | 153 | case SEC_WPA2_ENT: |
gsfan | 8:64184a968e3b | 154 | cmdWAUTH(0); |
gsfan | 8:64184a968e3b | 155 | DBG("Can't support security\r\n"); |
gsfan | 8:64184a968e3b | 156 | break; |
gsfan | 5:78943b3945b5 | 157 | case SEC_WPS_BUTTON: |
gsfan | 8:64184a968e3b | 158 | cmdNDHCP(false); |
gsfan | 15:086d1a33a197 | 159 | if (! _state.dhcp) { |
gsfan | 15:086d1a33a197 | 160 | cmdNSET(_state.ip, _state.netmask, _state.ip); |
gsfan | 15:086d1a33a197 | 161 | } |
gsfan | 8:64184a968e3b | 162 | cmdWAUTH(0); |
gsfan | 8:64184a968e3b | 163 | r = cmdWWPS(true); |
gsfan | 8:64184a968e3b | 164 | if (r) break; |
gsfan | 8:64184a968e3b | 165 | if (_state.dhcp) { |
gsfan | 8:64184a968e3b | 166 | r = cmdNDHCP(_state.dhcp, _state.name); |
gsfan | 5:78943b3945b5 | 167 | } |
gsfan | 8:64184a968e3b | 168 | cmdWSTATUS(); |
gsfan | 8:64184a968e3b | 169 | cmdWPAPSK(_state.ssid, _state.pass); |
gsfan | 8:64184a968e3b | 170 | break; |
gsfan | 8:64184a968e3b | 171 | case SEC_WPS_PIN: |
gsfan | 8:64184a968e3b | 172 | cmdNDHCP(false); |
gsfan | 15:086d1a33a197 | 173 | if (! _state.dhcp) { |
gsfan | 15:086d1a33a197 | 174 | cmdNSET(_state.ip, _state.netmask, _state.ip); |
gsfan | 15:086d1a33a197 | 175 | } |
gsfan | 8:64184a968e3b | 176 | cmdWAUTH(0); |
gsfan | 8:64184a968e3b | 177 | r = cmdWWPS(true, _state.pass); |
gsfan | 8:64184a968e3b | 178 | if (r) break; |
gsfan | 8:64184a968e3b | 179 | if (_state.dhcp) { |
gsfan | 8:64184a968e3b | 180 | r = cmdNDHCP(_state.dhcp, _state.name); |
gsfan | 5:78943b3945b5 | 181 | } |
gsfan | 8:64184a968e3b | 182 | cmdWSTATUS(); |
gsfan | 8:64184a968e3b | 183 | cmdWPAPSK(_state.ssid, _state.pass); |
gsfan | 5:78943b3945b5 | 184 | break; |
gsfan | 5:78943b3945b5 | 185 | default: |
gsfan | 5:78943b3945b5 | 186 | DBG("Can't use security\r\n"); |
gsfan | 5:78943b3945b5 | 187 | break; |
gsfan | 5:78943b3945b5 | 188 | } |
gsfan | 5:78943b3945b5 | 189 | |
gsfan | 8:64184a968e3b | 190 | if (!r) { |
gsfan | 11:71d67fea5ace | 191 | // connected |
gsfan | 8:64184a968e3b | 192 | if (! _state.dhcp) { |
gsfan | 8:64184a968e3b | 193 | cmdDNSSET(_state.nameserver); |
gsfan | 5:78943b3945b5 | 194 | } |
gsfan | 5:78943b3945b5 | 195 | _state.associated = true; |
gsfan | 11:71d67fea5ace | 196 | #ifdef CFG_ENABLE_RTOS |
gsfan | 8:64184a968e3b | 197 | _threadPoll = new Thread(&threadPoll); |
gsfan | 8:64184a968e3b | 198 | // _threadPoll = new Thread(&threadPoll, NULL, osPriorityLow); |
gsfan | 8:64184a968e3b | 199 | #endif |
gsfan | 5:78943b3945b5 | 200 | } |
gsfan | 5:78943b3945b5 | 201 | return r; |
gsfan | 5:78943b3945b5 | 202 | } |
gsfan | 5:78943b3945b5 | 203 | |
gsfan | 11:71d67fea5ace | 204 | int GSwifi::adhock () |
gsfan | 5:78943b3945b5 | 205 | { |
gsfan | 8:64184a968e3b | 206 | bool r = -1; |
gsfan | 5:78943b3945b5 | 207 | |
gsfan | 8:64184a968e3b | 208 | _state.wm = WM_ADHOCK; |
gsfan | 11:71d67fea5ace | 209 | _state.initialized = true; |
gsfan | 8:64184a968e3b | 210 | clearFlags(); |
gsfan | 22:d25a5a0d2497 | 211 | _state.buf->flush(); |
gsfan | 12:057089026a20 | 212 | _state.mode = MODE_COMMAND; |
gsfan | 8:64184a968e3b | 213 | sendCommand(NULL, RES_NULL, 0); |
gsfan | 8:64184a968e3b | 214 | if (cmdE(false)) return -1; |
gsfan | 8:64184a968e3b | 215 | if (_flow) { |
gsfan | 8:64184a968e3b | 216 | cmdR(true); |
gsfan | 5:78943b3945b5 | 217 | } |
gsfan | 8:64184a968e3b | 218 | if (cmdNMAC()) return -1; |
gsfan | 8:64184a968e3b | 219 | cmdBDATA(true); |
gsfan | 13:189e04ac70bd | 220 | cmdWREGDOMAIN(CFG_WREGDOMAIN); |
gsfan | 8:64184a968e3b | 221 | cmdWM(1); // adhock |
gsfan | 8:64184a968e3b | 222 | wait_ms(100); |
gsfan | 8:64184a968e3b | 223 | |
gsfan | 8:64184a968e3b | 224 | cmdNDHCP(false); |
gsfan | 8:64184a968e3b | 225 | if (! _state.dhcp) { |
gsfan | 8:64184a968e3b | 226 | cmdNSET(_state.ip, _state.netmask, _state.ip); |
gsfan | 5:78943b3945b5 | 227 | } |
gsfan | 5:78943b3945b5 | 228 | |
gsfan | 11:71d67fea5ace | 229 | switch (_state.sec) { |
gsfan | 8:64184a968e3b | 230 | case SEC_NONE: |
gsfan | 8:64184a968e3b | 231 | case SEC_OPEN: |
gsfan | 8:64184a968e3b | 232 | case SEC_WEP: |
gsfan | 8:64184a968e3b | 233 | cmdWAUTH(_state.sec); |
gsfan | 11:71d67fea5ace | 234 | if (_state.sec != SEC_NONE) { |
gsfan | 8:64184a968e3b | 235 | cmdWWEP(1, _state.pass); |
gsfan | 8:64184a968e3b | 236 | wait_ms(100); |
gsfan | 8:64184a968e3b | 237 | } |
gsfan | 8:64184a968e3b | 238 | r = cmdWA(_state.ssid); |
gsfan | 8:64184a968e3b | 239 | break; |
gsfan | 8:64184a968e3b | 240 | default: |
gsfan | 8:64184a968e3b | 241 | DBG("Can't use security\r\n"); |
gsfan | 8:64184a968e3b | 242 | break; |
gsfan | 5:78943b3945b5 | 243 | } |
gsfan | 5:78943b3945b5 | 244 | |
gsfan | 8:64184a968e3b | 245 | if (!r) { |
gsfan | 11:71d67fea5ace | 246 | // connected |
gsfan | 8:64184a968e3b | 247 | _state.associated = true; |
gsfan | 8:64184a968e3b | 248 | } |
gsfan | 8:64184a968e3b | 249 | return r; |
gsfan | 5:78943b3945b5 | 250 | } |
gsfan | 5:78943b3945b5 | 251 | |
gsfan | 11:71d67fea5ace | 252 | int GSwifi::limitedap () |
gsfan | 5:78943b3945b5 | 253 | { |
gsfan | 8:64184a968e3b | 254 | bool r = -1; |
gsfan | 8:64184a968e3b | 255 | |
gsfan | 8:64184a968e3b | 256 | _state.wm = WM_LIMITEDAP; |
gsfan | 11:71d67fea5ace | 257 | _state.initialized = true; |
gsfan | 8:64184a968e3b | 258 | if (!strlen(_state.name)) { |
gsfan | 8:64184a968e3b | 259 | strncpy(_state.name, CFG_DNSNAME, sizeof(_state.name)); |
gsfan | 8:64184a968e3b | 260 | } |
gsfan | 8:64184a968e3b | 261 | clearFlags(); |
gsfan | 22:d25a5a0d2497 | 262 | _state.buf->flush(); |
gsfan | 12:057089026a20 | 263 | _state.mode = MODE_COMMAND; |
gsfan | 8:64184a968e3b | 264 | sendCommand(NULL, RES_NULL, 0); |
gsfan | 8:64184a968e3b | 265 | if (cmdE(false)) return -1; |
gsfan | 8:64184a968e3b | 266 | if (_flow) { |
gsfan | 8:64184a968e3b | 267 | cmdR(true); |
gsfan | 8:64184a968e3b | 268 | } |
gsfan | 8:64184a968e3b | 269 | if (cmdNMAC()) return -1; |
gsfan | 8:64184a968e3b | 270 | cmdBDATA(true); |
gsfan | 13:189e04ac70bd | 271 | cmdWREGDOMAIN(CFG_WREGDOMAIN); |
gsfan | 8:64184a968e3b | 272 | cmdWM(2); // limitedap |
gsfan | 8:64184a968e3b | 273 | wait_ms(100); |
gsfan | 8:64184a968e3b | 274 | |
gsfan | 8:64184a968e3b | 275 | cmdNDHCP(false); |
gsfan | 8:64184a968e3b | 276 | if (! _state.dhcp) { |
gsfan | 8:64184a968e3b | 277 | cmdNSET(_state.ip, _state.netmask, _state.ip); |
gsfan | 8:64184a968e3b | 278 | cmdDNSSET(_state.ip); |
gsfan | 5:78943b3945b5 | 279 | } |
gsfan | 8:64184a968e3b | 280 | cmdDHCPSRVR(true); |
gsfan | 8:64184a968e3b | 281 | cmdDNS(true, _state.name); |
gsfan | 8:64184a968e3b | 282 | |
gsfan | 11:71d67fea5ace | 283 | switch (_state.sec) { |
gsfan | 8:64184a968e3b | 284 | case SEC_NONE: |
gsfan | 8:64184a968e3b | 285 | case SEC_OPEN: |
gsfan | 8:64184a968e3b | 286 | case SEC_WEP: |
gsfan | 8:64184a968e3b | 287 | cmdWAUTH(_state.sec); |
gsfan | 11:71d67fea5ace | 288 | if (_state.sec != SEC_NONE) { |
gsfan | 8:64184a968e3b | 289 | cmdWWEP(1, _state.pass); |
gsfan | 8:64184a968e3b | 290 | wait_ms(100); |
gsfan | 8:64184a968e3b | 291 | } |
gsfan | 8:64184a968e3b | 292 | r = cmdWA(_state.ssid); |
gsfan | 8:64184a968e3b | 293 | break; |
gsfan | 8:64184a968e3b | 294 | default: |
gsfan | 8:64184a968e3b | 295 | DBG("Can't use security\r\n"); |
gsfan | 8:64184a968e3b | 296 | break; |
gsfan | 8:64184a968e3b | 297 | } |
gsfan | 8:64184a968e3b | 298 | |
gsfan | 8:64184a968e3b | 299 | if (!r) { |
gsfan | 11:71d67fea5ace | 300 | // connected |
gsfan | 8:64184a968e3b | 301 | _state.associated = true; |
gsfan | 8:64184a968e3b | 302 | } |
gsfan | 8:64184a968e3b | 303 | return r; |
gsfan | 5:78943b3945b5 | 304 | } |
gsfan | 5:78943b3945b5 | 305 | |
gsfan | 12:057089026a20 | 306 | int GSwifi::dissociate() |
gsfan | 5:78943b3945b5 | 307 | { |
gsfan | 8:64184a968e3b | 308 | int i; |
gsfan | 5:78943b3945b5 | 309 | |
gsfan | 5:78943b3945b5 | 310 | // if already disconnected, return |
gsfan | 5:78943b3945b5 | 311 | if (!_state.associated) |
gsfan | 8:64184a968e3b | 312 | return 0; |
gsfan | 5:78943b3945b5 | 313 | |
gsfan | 11:71d67fea5ace | 314 | #ifdef CFG_ENABLE_RTOS |
gsfan | 8:64184a968e3b | 315 | if (_threadPoll) { |
gsfan | 8:64184a968e3b | 316 | _threadPoll->terminate(); |
gsfan | 8:64184a968e3b | 317 | delete _threadPoll; |
gsfan | 8:64184a968e3b | 318 | } |
gsfan | 8:64184a968e3b | 319 | #endif |
gsfan | 8:64184a968e3b | 320 | for (i = 0; i < 16; i ++) { |
gsfan | 8:64184a968e3b | 321 | if (_con[i].buf) { |
gsfan | 5:78943b3945b5 | 322 | _con[i].buf->flush(); |
gsfan | 8:64184a968e3b | 323 | } |
gsfan | 5:78943b3945b5 | 324 | } |
gsfan | 8:64184a968e3b | 325 | cmdNCLOSEALL(); |
gsfan | 8:64184a968e3b | 326 | cmdWD(); |
gsfan | 8:64184a968e3b | 327 | cmdNDHCP(false); |
gsfan | 5:78943b3945b5 | 328 | wait_ms(100); |
gsfan | 5:78943b3945b5 | 329 | |
gsfan | 5:78943b3945b5 | 330 | _state.associated = false; |
gsfan | 8:64184a968e3b | 331 | return 0; |
gsfan | 5:78943b3945b5 | 332 | |
gsfan | 5:78943b3945b5 | 333 | } |
gsfan | 5:78943b3945b5 | 334 | |
gsfan | 12:057089026a20 | 335 | bool GSwifi::isAssociated() |
gsfan | 5:78943b3945b5 | 336 | { |
gsfan | 8:64184a968e3b | 337 | return _state.associated; |
gsfan | 5:78943b3945b5 | 338 | } |
gsfan | 5:78943b3945b5 | 339 | |
gsfan | 8:64184a968e3b | 340 | void GSwifi::poll () { |
gsfan | 11:71d67fea5ace | 341 | #ifndef CFG_ENABLE_RTOS |
gsfan | 11:71d67fea5ace | 342 | static int t = 0; |
gsfan | 13:189e04ac70bd | 343 | static Timer timer; |
gsfan | 11:71d67fea5ace | 344 | |
gsfan | 12:057089026a20 | 345 | if (_state.wm == WM_INFRASTRUCTURE && (! isAssociated()) && _state.ssid) { |
gsfan | 13:189e04ac70bd | 346 | if (t == 0 || timer.read() > CFG_RECONNECT) { |
gsfan | 11:71d67fea5ace | 347 | // Wi-Fi re-associate |
gsfan | 11:71d67fea5ace | 348 | if (_state.initialized) { |
gsfan | 13:189e04ac70bd | 349 | if (cmdWA(_state.ssid)) { |
gsfan | 13:189e04ac70bd | 350 | timer.reset(); |
gsfan | 13:189e04ac70bd | 351 | timer.start(); |
gsfan | 13:189e04ac70bd | 352 | t = 1; |
gsfan | 13:189e04ac70bd | 353 | } else { |
gsfan | 11:71d67fea5ace | 354 | _state.associated = true; |
gsfan | 13:189e04ac70bd | 355 | timer.stop(); |
gsfan | 11:71d67fea5ace | 356 | t = 0; |
gsfan | 11:71d67fea5ace | 357 | } |
gsfan | 11:71d67fea5ace | 358 | } else { |
gsfan | 11:71d67fea5ace | 359 | if (join()) { |
gsfan | 13:189e04ac70bd | 360 | timer.reset(); |
gsfan | 13:189e04ac70bd | 361 | timer.start(); |
gsfan | 13:189e04ac70bd | 362 | t = 1; |
gsfan | 11:71d67fea5ace | 363 | } else { |
gsfan | 13:189e04ac70bd | 364 | timer.stop(); |
gsfan | 13:189e04ac70bd | 365 | t = 0; |
gsfan | 11:71d67fea5ace | 366 | } |
gsfan | 11:71d67fea5ace | 367 | } |
gsfan | 11:71d67fea5ace | 368 | } |
gsfan | 11:71d67fea5ace | 369 | } |
gsfan | 11:71d67fea5ace | 370 | #else |
gsfan | 12:057089026a20 | 371 | if (_state.wm == WM_INFRASTRUCTURE && (! isAssociated()) && _state.ssid) { |
gsfan | 8:64184a968e3b | 372 | // Wi-Fi re-associate |
gsfan | 11:71d67fea5ace | 373 | if (_state.initialized) { |
gsfan | 11:71d67fea5ace | 374 | if (!cmdWA(_state.ssid)) { |
gsfan | 11:71d67fea5ace | 375 | _state.associated = true; |
gsfan | 11:71d67fea5ace | 376 | } |
gsfan | 11:71d67fea5ace | 377 | } else { |
gsfan | 11:71d67fea5ace | 378 | join(); |
gsfan | 5:78943b3945b5 | 379 | } |
gsfan | 5:78943b3945b5 | 380 | } |
gsfan | 11:71d67fea5ace | 381 | #endif |
gsfan | 12:057089026a20 | 382 | |
gsfan | 12:057089026a20 | 383 | for (int i = 0; i < 16; i ++) { |
gsfan | 16:105b56570533 | 384 | if (isConnected(i) && _con[i].received && _con[i].buf != NULL) |
gsfan | 12:057089026a20 | 385 | if (_con[i].func != NULL && !_con[i].buf->isEmpty()) { |
gsfan | 12:057089026a20 | 386 | _con[i].func(i); |
gsfan | 12:057089026a20 | 387 | if (_con[i].buf->isEmpty()) { |
gsfan | 12:057089026a20 | 388 | _con[i].received = false; |
gsfan | 12:057089026a20 | 389 | } |
gsfan | 12:057089026a20 | 390 | } |
gsfan | 12:057089026a20 | 391 | } |
gsfan | 12:057089026a20 | 392 | |
gsfan | 12:057089026a20 | 393 | #ifdef CFG_ENABLE_HTTPD |
gsfan | 12:057089026a20 | 394 | httpdPoll(); |
gsfan | 12:057089026a20 | 395 | #endif |
gsfan | 5:78943b3945b5 | 396 | } |
gsfan | 5:78943b3945b5 | 397 | |
gsfan | 11:71d67fea5ace | 398 | #ifdef CFG_ENABLE_RTOS |
gsfan | 8:64184a968e3b | 399 | void GSwifi::threadPoll (void const *args) { |
gsfan | 8:64184a968e3b | 400 | GSwifi * _wifi = GSwifi::getInstance(); |
gsfan | 8:64184a968e3b | 401 | if (_wifi == NULL) |
gsfan | 8:64184a968e3b | 402 | error("Socket constructor error: no wifly instance available!\r\n"); |
gsfan | 5:78943b3945b5 | 403 | |
gsfan | 8:64184a968e3b | 404 | INFO("threadPoll"); |
gsfan | 8:64184a968e3b | 405 | for (;;) { |
gsfan | 8:64184a968e3b | 406 | Thread::signal_wait(1); |
gsfan | 8:64184a968e3b | 407 | Thread::wait(1000); |
gsfan | 8:64184a968e3b | 408 | INFO("disassociated"); |
gsfan | 12:057089026a20 | 409 | while (!_wifi->isAssociated()){ |
gsfan | 8:64184a968e3b | 410 | _wifi->poll(); |
gsfan | 13:189e04ac70bd | 411 | Thread::wait(CFG_RECONNECT * 1000); |
gsfan | 5:78943b3945b5 | 412 | } |
gsfan | 5:78943b3945b5 | 413 | } |
gsfan | 5:78943b3945b5 | 414 | } |
gsfan | 8:64184a968e3b | 415 | #endif |
gsfan | 5:78943b3945b5 | 416 | |
gsfan | 12:057089026a20 | 417 | GSwifi::Status GSwifi::getStatus () { |
gsfan | 12:057089026a20 | 418 | return _state.status; |
gsfan | 12:057089026a20 | 419 | } |
gsfan | 12:057089026a20 | 420 | |
gsfan | 12:057089026a20 | 421 | int GSwifi::setMacAddress (const char *mac) { |
gsfan | 12:057089026a20 | 422 | if (cmdNMAC(mac)) return -1; |
gsfan | 12:057089026a20 | 423 | strncpy(_state.mac, mac, sizeof(_state.mac)); |
gsfan | 12:057089026a20 | 424 | return 0; |
gsfan | 12:057089026a20 | 425 | } |
gsfan | 12:057089026a20 | 426 | |
gsfan | 12:057089026a20 | 427 | int GSwifi::getMacAddress (char *mac) { |
gsfan | 12:057089026a20 | 428 | if (cmdNMAC()) return -1; |
gsfan | 12:057089026a20 | 429 | strcpy(mac, _state.mac); |
gsfan | 12:057089026a20 | 430 | return 0; |
gsfan | 12:057089026a20 | 431 | } |
gsfan | 12:057089026a20 | 432 | |
gsfan | 11:71d67fea5ace | 433 | int GSwifi::setAddress (const char *name) { |
gsfan | 11:71d67fea5ace | 434 | _state.dhcp = true; |
gsfan | 11:71d67fea5ace | 435 | strncpy(_state.name, name, sizeof(_state.name)); |
gsfan | 11:71d67fea5ace | 436 | return 0; |
gsfan | 11:71d67fea5ace | 437 | } |
gsfan | 11:71d67fea5ace | 438 | |
gsfan | 15:086d1a33a197 | 439 | int GSwifi::setAddress (const char *ip, const char *netmask, const char *gateway, const char *dns, const char *name) { |
gsfan | 11:71d67fea5ace | 440 | _state.dhcp = false; |
gsfan | 11:71d67fea5ace | 441 | strncpy(_state.ip, ip, sizeof(_state.ip)); |
gsfan | 11:71d67fea5ace | 442 | strncpy(_state.netmask, netmask, sizeof(_state.netmask)); |
gsfan | 11:71d67fea5ace | 443 | strncpy(_state.gateway, gateway, sizeof(_state.gateway)); |
gsfan | 21:6431364fc667 | 444 | if (dns) { |
gsfan | 21:6431364fc667 | 445 | strncpy(_state.nameserver, dns, sizeof(_state.nameserver)); |
gsfan | 21:6431364fc667 | 446 | } |
gsfan | 21:6431364fc667 | 447 | if (name) { |
gsfan | 21:6431364fc667 | 448 | strncpy(_state.name, name, sizeof(_state.name)); |
gsfan | 21:6431364fc667 | 449 | } |
gsfan | 11:71d67fea5ace | 450 | return 0; |
gsfan | 11:71d67fea5ace | 451 | } |
gsfan | 11:71d67fea5ace | 452 | |
gsfan | 11:71d67fea5ace | 453 | int GSwifi::getAddress (char *ip, char *netmask, char *gateway) { |
gsfan | 11:71d67fea5ace | 454 | strcpy(ip, _state.ip); |
gsfan | 11:71d67fea5ace | 455 | strcpy(netmask, _state.netmask); |
gsfan | 11:71d67fea5ace | 456 | strcpy(gateway, _state.gateway); |
gsfan | 11:71d67fea5ace | 457 | return 0; |
gsfan | 11:71d67fea5ace | 458 | } |
gsfan | 11:71d67fea5ace | 459 | |
gsfan | 8:64184a968e3b | 460 | int GSwifi::setSsid (Security sec, const char *ssid, const char *phrase) { |
gsfan | 8:64184a968e3b | 461 | int i; |
gsfan | 5:78943b3945b5 | 462 | |
gsfan | 8:64184a968e3b | 463 | _state.sec = sec; |
gsfan | 11:71d67fea5ace | 464 | |
gsfan | 8:64184a968e3b | 465 | // change all ' ' in '$' in the ssid and the passphrase |
gsfan | 8:64184a968e3b | 466 | strncpy(_state.ssid, ssid, sizeof(_state.ssid)); |
gsfan | 8:64184a968e3b | 467 | for (i = 0; i < strlen(_state.ssid); i++) { |
gsfan | 8:64184a968e3b | 468 | if (_state.ssid[i] == ' ') |
gsfan | 8:64184a968e3b | 469 | _state.ssid[i] = '$'; |
gsfan | 5:78943b3945b5 | 470 | } |
gsfan | 11:71d67fea5ace | 471 | |
gsfan | 11:71d67fea5ace | 472 | if (sec == SEC_WEP) { |
gsfan | 11:71d67fea5ace | 473 | if (strlen(phrase) == 5 || strlen(phrase) == 13) { |
gsfan | 11:71d67fea5ace | 474 | for (i = 0; i < strlen(phrase); i++) { |
gsfan | 11:71d67fea5ace | 475 | _state.pass[i * 2] = '0' + ((phrase[i] >> 4) & 0x0f); |
gsfan | 11:71d67fea5ace | 476 | _state.pass[i * 2 + 1] = '0' + (phrase[i + 1] & 0x0f); |
gsfan | 11:71d67fea5ace | 477 | } |
gsfan | 11:71d67fea5ace | 478 | } else { |
gsfan | 11:71d67fea5ace | 479 | strncpy(_state.pass, phrase, strlen(phrase)); |
gsfan | 11:71d67fea5ace | 480 | } |
gsfan | 11:71d67fea5ace | 481 | } else { |
gsfan | 11:71d67fea5ace | 482 | strncpy(_state.pass, phrase, sizeof(_state.pass)); |
gsfan | 11:71d67fea5ace | 483 | } |
gsfan | 8:64184a968e3b | 484 | for (i = 0; i < strlen(_state.pass); i++) { |
gsfan | 8:64184a968e3b | 485 | if (_state.pass[i] == ' ') |
gsfan | 8:64184a968e3b | 486 | _state.pass[i] = '$'; |
gsfan | 5:78943b3945b5 | 487 | } |
gsfan | 5:78943b3945b5 | 488 | return 0; |
gsfan | 5:78943b3945b5 | 489 | } |
gsfan | 5:78943b3945b5 | 490 |