This is Wi-Fi interface of WizFi310 for mbed os 5

Dependents:   mbed-os-example-wifi

Committer:
kaizen
Date:
Tue Dec 19 16:59:33 2017 +0900
Revision:
1:8e468bb83e1e
Parent:
0:d0e3f515f99d
This is WizFi310 Library for mbed os5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kaizen 0:d0e3f515f99d 1 /* WizFi310 Example
kaizen 0:d0e3f515f99d 2 * Copyright (c) 2015 ARM Limited
kaizen 0:d0e3f515f99d 3 *
kaizen 0:d0e3f515f99d 4 * Licensed under the Apache License, Version 2.0 (the "License");
kaizen 0:d0e3f515f99d 5 * you may not use this file except in compliance with the License.
kaizen 0:d0e3f515f99d 6 * You may obtain a copy of the License at
kaizen 0:d0e3f515f99d 7 *
kaizen 0:d0e3f515f99d 8 * http://www.apache.org/licenses/LICENSE-2.0
kaizen 0:d0e3f515f99d 9 *
kaizen 0:d0e3f515f99d 10 * Unless required by applicable law or agreed to in writing, software
kaizen 0:d0e3f515f99d 11 * distributed under the License is distributed on an "AS IS" BASIS,
kaizen 0:d0e3f515f99d 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kaizen 0:d0e3f515f99d 13 * See the License for the specific language governing permissions and
kaizen 0:d0e3f515f99d 14 * limitations under the License.
kaizen 0:d0e3f515f99d 15 */
kaizen 0:d0e3f515f99d 16
kaizen 0:d0e3f515f99d 17 #include "WizFi310.h"
kaizen 0:d0e3f515f99d 18 #define WIZFI310_DEFAULT_BAUD_RATE 115200
kaizen 0:d0e3f515f99d 19
kaizen 0:d0e3f515f99d 20 WizFi310::WizFi310(PinName tx, PinName rx, bool debug)
kaizen 0:d0e3f515f99d 21 : _serial(tx, rx, WIZFI310_DEFAULT_BAUD_RATE),
kaizen 0:d0e3f515f99d 22 _parser(&_serial),
kaizen 0:d0e3f515f99d 23 _packets(0),
kaizen 0:d0e3f515f99d 24 _packets_end(&_packets)
kaizen 0:d0e3f515f99d 25 {
kaizen 0:d0e3f515f99d 26 _serial.set_baud( WIZFI310_DEFAULT_BAUD_RATE );
kaizen 0:d0e3f515f99d 27 _parser.debug_on(debug);
kaizen 0:d0e3f515f99d 28 _parser.set_delimiter("\r");
kaizen 0:d0e3f515f99d 29
kaizen 0:d0e3f515f99d 30 //_parser.recv("WizFi310 Version %s (WIZnet Co.Ltd)", _firmware_version);
kaizen 0:d0e3f515f99d 31 for(int i=0; i<10; i++)
kaizen 0:d0e3f515f99d 32 {
kaizen 0:d0e3f515f99d 33 if( _parser.send("AT") && _parser.recv("[OK]") )
kaizen 0:d0e3f515f99d 34 {
kaizen 0:d0e3f515f99d 35 _parser.send("AT+MRESET");
kaizen 0:d0e3f515f99d 36 _parser.recv("[OK]");
kaizen 0:d0e3f515f99d 37 break;
kaizen 0:d0e3f515f99d 38 }
kaizen 0:d0e3f515f99d 39 }
kaizen 0:d0e3f515f99d 40
kaizen 0:d0e3f515f99d 41 _parser.recv("WizFi310 Version %s (WIZnet Co.Ltd)", _firmware_version);
kaizen 0:d0e3f515f99d 42 }
kaizen 0:d0e3f515f99d 43
kaizen 0:d0e3f515f99d 44 const char* WizFi310::get_firmware_version()
kaizen 0:d0e3f515f99d 45 {
kaizen 0:d0e3f515f99d 46 if( strlen(_firmware_version) != 0 )
kaizen 0:d0e3f515f99d 47 {
kaizen 0:d0e3f515f99d 48 return _firmware_version;
kaizen 0:d0e3f515f99d 49 }
kaizen 0:d0e3f515f99d 50
kaizen 0:d0e3f515f99d 51 _parser.send("AT+MINFO");
kaizen 0:d0e3f515f99d 52 if( _parser.recv("%s/WizFi310 Rev", _firmware_version) )
kaizen 0:d0e3f515f99d 53 {
kaizen 0:d0e3f515f99d 54 return _firmware_version;
kaizen 0:d0e3f515f99d 55 }
kaizen 0:d0e3f515f99d 56
kaizen 0:d0e3f515f99d 57 return 0;
kaizen 0:d0e3f515f99d 58 }
kaizen 0:d0e3f515f99d 59
kaizen 0:d0e3f515f99d 60 bool WizFi310::startup(int mode)
kaizen 0:d0e3f515f99d 61 {
kaizen 0:d0e3f515f99d 62 if( mode != 0 && mode != 1 )
kaizen 0:d0e3f515f99d 63 {
kaizen 0:d0e3f515f99d 64 return false;
kaizen 0:d0e3f515f99d 65 }
kaizen 0:d0e3f515f99d 66 _op_mode = mode;
kaizen 0:d0e3f515f99d 67
kaizen 0:d0e3f515f99d 68 _parser.oob("{", callback(this, &WizFi310::_packet_handler));
kaizen 0:d0e3f515f99d 69 return true;
kaizen 0:d0e3f515f99d 70 }
kaizen 0:d0e3f515f99d 71
kaizen 0:d0e3f515f99d 72 bool WizFi310::reset(void)
kaizen 0:d0e3f515f99d 73 {
kaizen 0:d0e3f515f99d 74 for (int i=0; i<2; i++)
kaizen 0:d0e3f515f99d 75 {
kaizen 0:d0e3f515f99d 76 if(_parser.send("AT+MRESET")
kaizen 0:d0e3f515f99d 77 && _parser.recv("[OK]"))
kaizen 0:d0e3f515f99d 78 {
kaizen 0:d0e3f515f99d 79 return true;
kaizen 0:d0e3f515f99d 80 }
kaizen 0:d0e3f515f99d 81 }
kaizen 0:d0e3f515f99d 82
kaizen 0:d0e3f515f99d 83 return false;
kaizen 0:d0e3f515f99d 84 }
kaizen 0:d0e3f515f99d 85
kaizen 0:d0e3f515f99d 86 bool WizFi310::dhcp(bool enabled)
kaizen 0:d0e3f515f99d 87 {
kaizen 0:d0e3f515f99d 88 _dhcp = enabled;
kaizen 0:d0e3f515f99d 89 return _dhcp;
kaizen 0:d0e3f515f99d 90 }
kaizen 0:d0e3f515f99d 91
kaizen 0:d0e3f515f99d 92 bool WizFi310::connect(const char *ap, const char *passPhrase, const char *sec)
kaizen 0:d0e3f515f99d 93 {
kaizen 0:d0e3f515f99d 94 if ( !(_parser.send("AT+WSET=0,%s", ap) && _parser.recv("[OK]")) )
kaizen 0:d0e3f515f99d 95 {
kaizen 0:d0e3f515f99d 96 return false;
kaizen 0:d0e3f515f99d 97 }
kaizen 0:d0e3f515f99d 98
kaizen 0:d0e3f515f99d 99 if ( !(_parser.send("AT+WSEC=0,%s,%s", sec, passPhrase) && _parser.recv("[OK]")) )
kaizen 0:d0e3f515f99d 100 {
kaizen 0:d0e3f515f99d 101 return false;
kaizen 0:d0e3f515f99d 102 }
kaizen 0:d0e3f515f99d 103
kaizen 0:d0e3f515f99d 104 if (_dhcp)
kaizen 0:d0e3f515f99d 105 {
kaizen 0:d0e3f515f99d 106 if ( !(_parser.send("AT+WNET=1") && _parser.recv("[OK]")) )
kaizen 0:d0e3f515f99d 107 {
kaizen 0:d0e3f515f99d 108 return false;
kaizen 0:d0e3f515f99d 109 }
kaizen 0:d0e3f515f99d 110 }
kaizen 0:d0e3f515f99d 111 else
kaizen 0:d0e3f515f99d 112 {
kaizen 0:d0e3f515f99d 113 if ( !(_parser.send("AT+WNET=0,%s,%s,%s",_ip_buffer,_netmask_buffer,_gateway_buffer)
kaizen 0:d0e3f515f99d 114 && _parser.recv("[OK]")) )
kaizen 0:d0e3f515f99d 115 {
kaizen 0:d0e3f515f99d 116 return false;
kaizen 0:d0e3f515f99d 117 }
kaizen 0:d0e3f515f99d 118 }
kaizen 0:d0e3f515f99d 119
kaizen 0:d0e3f515f99d 120 if ( !(_parser.send("AT+WJOIN") && _parser.recv("[Link-Up Event]")
kaizen 0:d0e3f515f99d 121 && _parser.recv(" IP Addr : %[^\n]\r\n",_ip_buffer)
kaizen 0:d0e3f515f99d 122 && _parser.recv(" Gateway : %[^\n]\r\n",_gateway_buffer)
kaizen 0:d0e3f515f99d 123 && _parser.recv("[OK]")) )
kaizen 0:d0e3f515f99d 124 {
kaizen 0:d0e3f515f99d 125 return false;
kaizen 0:d0e3f515f99d 126 }
kaizen 0:d0e3f515f99d 127
kaizen 0:d0e3f515f99d 128 return true;
kaizen 0:d0e3f515f99d 129 }
kaizen 0:d0e3f515f99d 130
kaizen 0:d0e3f515f99d 131 bool WizFi310::disconnect(void)
kaizen 0:d0e3f515f99d 132 {
kaizen 0:d0e3f515f99d 133 return _parser.send("AT+WLEAVE") && _parser.recv("[OK]");
kaizen 0:d0e3f515f99d 134 }
kaizen 0:d0e3f515f99d 135
kaizen 0:d0e3f515f99d 136 const char *WizFi310::getIPAddress(void)
kaizen 0:d0e3f515f99d 137 {
kaizen 0:d0e3f515f99d 138 if (!(_parser.send("AT+WSTATUS") && _parser.recv("IF/SSID/IP-Addr/Gateway/MAC/TxPower(dBm)/RSSI(-dBm)")
kaizen 0:d0e3f515f99d 139 && _parser.recv("%*[^/]/%*[^/]/%15[^/]/",_ip_buffer)
kaizen 0:d0e3f515f99d 140 && _parser.recv("[OK]")) )
kaizen 0:d0e3f515f99d 141 {
kaizen 0:d0e3f515f99d 142 return 0;
kaizen 0:d0e3f515f99d 143 }
kaizen 0:d0e3f515f99d 144
kaizen 0:d0e3f515f99d 145 return _ip_buffer;
kaizen 0:d0e3f515f99d 146 }
kaizen 0:d0e3f515f99d 147
kaizen 0:d0e3f515f99d 148 const char *WizFi310::getMACAddress(void)
kaizen 0:d0e3f515f99d 149 {
kaizen 0:d0e3f515f99d 150 if (!(_parser.send("AT+MMAC=?")
kaizen 0:d0e3f515f99d 151 && _parser.recv("%[^\n]\r\n",_mac_buffer)
kaizen 0:d0e3f515f99d 152 && _parser.recv("[OK]"))) {
kaizen 0:d0e3f515f99d 153 return 0;
kaizen 0:d0e3f515f99d 154 }
kaizen 0:d0e3f515f99d 155
kaizen 0:d0e3f515f99d 156 return _mac_buffer;
kaizen 0:d0e3f515f99d 157 }
kaizen 0:d0e3f515f99d 158
kaizen 0:d0e3f515f99d 159 const char *WizFi310::getGateway()
kaizen 0:d0e3f515f99d 160 {
kaizen 0:d0e3f515f99d 161 return _gateway_buffer;
kaizen 0:d0e3f515f99d 162 }
kaizen 0:d0e3f515f99d 163
kaizen 0:d0e3f515f99d 164 const char *WizFi310::getNetmask()
kaizen 0:d0e3f515f99d 165 {
kaizen 0:d0e3f515f99d 166 return _netmask_buffer;
kaizen 0:d0e3f515f99d 167 }
kaizen 0:d0e3f515f99d 168
kaizen 0:d0e3f515f99d 169 int8_t WizFi310::getRSSI()
kaizen 0:d0e3f515f99d 170 {
kaizen 0:d0e3f515f99d 171 char rssi[3];
kaizen 0:d0e3f515f99d 172
kaizen 0:d0e3f515f99d 173 if (!(_parser.send("AT+WSTATUS") && _parser.recv("IF/SSID/IP-Addr/Gateway/MAC/TxPower(dBm)/RSSI(-dBm)")
kaizen 0:d0e3f515f99d 174 //&& _parser.recv("%*[^/]/%*[^/]/%*[^/]/%*[^/]/%*[^/]/%*[^/]/%[^\n]\r\n",&rssi)
kaizen 0:d0e3f515f99d 175 && _parser.recv("%*[^/]/%*[^/]/%*[^/]/%*[^/]/%*[^/]//%[^\n]\r\n",rssi)
kaizen 0:d0e3f515f99d 176 && _parser.recv("[OK]")) )
kaizen 0:d0e3f515f99d 177 {
kaizen 0:d0e3f515f99d 178 return 0;
kaizen 0:d0e3f515f99d 179 }
kaizen 0:d0e3f515f99d 180
kaizen 0:d0e3f515f99d 181 return atoi(rssi);
kaizen 0:d0e3f515f99d 182 }
kaizen 0:d0e3f515f99d 183
kaizen 0:d0e3f515f99d 184 bool WizFi310::isConnected(void)
kaizen 0:d0e3f515f99d 185 {
kaizen 0:d0e3f515f99d 186 return getIPAddress() != 0;
kaizen 0:d0e3f515f99d 187 }
kaizen 0:d0e3f515f99d 188
kaizen 0:d0e3f515f99d 189 int WizFi310::scan(WiFiAccessPoint *res, unsigned limit)
kaizen 0:d0e3f515f99d 190 {
kaizen 0:d0e3f515f99d 191 unsigned int cnt = 0;
kaizen 0:d0e3f515f99d 192 nsapi_wifi_ap_t ap;
kaizen 0:d0e3f515f99d 193
kaizen 1:8e468bb83e1e 194 // Scan Time out : 50ms
kaizen 1:8e468bb83e1e 195 if (!(_parser.send("AT+WSCAN=,,,50")
kaizen 0:d0e3f515f99d 196 && _parser.recv("Index/SSID/BSSID/RSSI(-dBm)/MaxDataRate(Mbps)/Security/RadioBand(GHz)/Channel")))
kaizen 0:d0e3f515f99d 197 {
kaizen 0:d0e3f515f99d 198 return NSAPI_ERROR_DEVICE_ERROR;
kaizen 0:d0e3f515f99d 199 }
kaizen 0:d0e3f515f99d 200
kaizen 0:d0e3f515f99d 201 while (recv_ap(&ap)) {
kaizen 0:d0e3f515f99d 202 if (cnt < limit)
kaizen 0:d0e3f515f99d 203 {
kaizen 0:d0e3f515f99d 204 res[cnt] = WiFiAccessPoint(ap);
kaizen 0:d0e3f515f99d 205 }
kaizen 0:d0e3f515f99d 206 cnt++;
kaizen 0:d0e3f515f99d 207 if (limit != 0 && cnt >= limit)
kaizen 0:d0e3f515f99d 208 {
kaizen 0:d0e3f515f99d 209 break;
kaizen 0:d0e3f515f99d 210 }
kaizen 0:d0e3f515f99d 211 }
kaizen 0:d0e3f515f99d 212
kaizen 0:d0e3f515f99d 213 return cnt;
kaizen 0:d0e3f515f99d 214 }
kaizen 0:d0e3f515f99d 215
kaizen 0:d0e3f515f99d 216 bool WizFi310::open(const char *type, int id, const char* addr, int port)
kaizen 0:d0e3f515f99d 217 {
kaizen 0:d0e3f515f99d 218 int created_sock_id;
kaizen 0:d0e3f515f99d 219
kaizen 0:d0e3f515f99d 220 //IDs only 0-7
kaizen 0:d0e3f515f99d 221 if(id > 7) {
kaizen 0:d0e3f515f99d 222 return false;
kaizen 0:d0e3f515f99d 223 }
kaizen 0:d0e3f515f99d 224
kaizen 1:8e468bb83e1e 225 if( !(_parser.send("AT+SCON=O,%s,%s,%d,,0",type,addr,port) && _parser.recv("[OK]")
kaizen 1:8e468bb83e1e 226 && _parser.recv("[CONNECT %d]",&created_sock_id))) {
kaizen 1:8e468bb83e1e 227 return false;
kaizen 0:d0e3f515f99d 228 }
kaizen 0:d0e3f515f99d 229
kaizen 0:d0e3f515f99d 230 if( created_sock_id != id ) {
kaizen 0:d0e3f515f99d 231 close(created_sock_id);
kaizen 0:d0e3f515f99d 232 return false;
kaizen 0:d0e3f515f99d 233 }
kaizen 0:d0e3f515f99d 234
kaizen 0:d0e3f515f99d 235 return true;
kaizen 0:d0e3f515f99d 236 }
kaizen 0:d0e3f515f99d 237
kaizen 0:d0e3f515f99d 238 bool WizFi310::dns_lookup(const char* name, char* ip)
kaizen 0:d0e3f515f99d 239 {
kaizen 1:8e468bb83e1e 240 return (_parser.send("AT+FDNS=%s,5000", name) && _parser.recv("%[^\n]\r\n",ip) && _parser.recv("[OK]"));
kaizen 0:d0e3f515f99d 241 }
kaizen 0:d0e3f515f99d 242
kaizen 0:d0e3f515f99d 243 bool WizFi310::send(int id, const void *data, uint32_t amount)
kaizen 0:d0e3f515f99d 244 {
kaizen 0:d0e3f515f99d 245 char str_result[20];
kaizen 1:8e468bb83e1e 246
kaizen 1:8e468bb83e1e 247 if(id > 8) {
kaizen 1:8e468bb83e1e 248 return false;
kaizen 1:8e468bb83e1e 249 }
kaizen 1:8e468bb83e1e 250
kaizen 1:8e468bb83e1e 251 sprintf(str_result,"[%d,,,%d]",id,(int)amount);
kaizen 0:d0e3f515f99d 252
kaizen 0:d0e3f515f99d 253 for (unsigned i=0; i<2; i++) {
kaizen 1:8e468bb83e1e 254 if( _parser.send("AT+SSEND=%d,,,%d",id, (int)amount)
kaizen 0:d0e3f515f99d 255 && _parser.recv(str_result)
kaizen 0:d0e3f515f99d 256 && _parser.write((char*)data, (int)amount) >= 0
kaizen 0:d0e3f515f99d 257 && _parser.recv("[OK]") ){
kaizen 0:d0e3f515f99d 258 return true;
kaizen 0:d0e3f515f99d 259 }
kaizen 0:d0e3f515f99d 260 }
kaizen 0:d0e3f515f99d 261 return false;
kaizen 0:d0e3f515f99d 262 }
kaizen 0:d0e3f515f99d 263
kaizen 0:d0e3f515f99d 264 void WizFi310::_packet_handler()
kaizen 0:d0e3f515f99d 265 {
kaizen 0:d0e3f515f99d 266 int id;
kaizen 0:d0e3f515f99d 267 char ip_addr[16];
kaizen 0:d0e3f515f99d 268 int port;
kaizen 0:d0e3f515f99d 269 uint32_t amount;
kaizen 0:d0e3f515f99d 270
kaizen 0:d0e3f515f99d 271 // parse out the packet
kaizen 0:d0e3f515f99d 272 if (!_parser.recv("%d,%[^,],%d,%d}",&id, ip_addr,&port, &amount) ) {
kaizen 0:d0e3f515f99d 273 return;
kaizen 0:d0e3f515f99d 274 }
kaizen 0:d0e3f515f99d 275
kaizen 0:d0e3f515f99d 276 struct packet *packet = (struct packet*)malloc(
kaizen 0:d0e3f515f99d 277 sizeof(struct packet) + amount);
kaizen 0:d0e3f515f99d 278 if (!packet) {
kaizen 0:d0e3f515f99d 279 return;
kaizen 0:d0e3f515f99d 280 }
kaizen 0:d0e3f515f99d 281
kaizen 0:d0e3f515f99d 282 packet->id = id;
kaizen 0:d0e3f515f99d 283 packet->len = amount;
kaizen 0:d0e3f515f99d 284 packet->next = 0;
kaizen 0:d0e3f515f99d 285
kaizen 0:d0e3f515f99d 286 if (!(_parser.read((char*)(packet + 1), amount))) {
kaizen 0:d0e3f515f99d 287 free(packet);
kaizen 0:d0e3f515f99d 288 return;
kaizen 0:d0e3f515f99d 289 }
kaizen 0:d0e3f515f99d 290
kaizen 0:d0e3f515f99d 291 *_packets_end = packet;
kaizen 0:d0e3f515f99d 292 _packets_end = &packet->next;
kaizen 0:d0e3f515f99d 293 }
kaizen 0:d0e3f515f99d 294
kaizen 0:d0e3f515f99d 295 int32_t WizFi310::recv(int id, void *data, uint32_t amount)
kaizen 0:d0e3f515f99d 296 {
kaizen 1:8e468bb83e1e 297 while (true) {
kaizen 1:8e468bb83e1e 298 // check if any packets are ready for us
kaizen 0:d0e3f515f99d 299 for (struct packet **p = &_packets; *p; p = &(*p)->next) {
kaizen 0:d0e3f515f99d 300 if ((*p)->id == id) {
kaizen 0:d0e3f515f99d 301 struct packet *q = *p;
kaizen 0:d0e3f515f99d 302
kaizen 0:d0e3f515f99d 303 if (q->len <= amount) {
kaizen 0:d0e3f515f99d 304 memcpy(data, q+1, q->len);
kaizen 0:d0e3f515f99d 305
kaizen 0:d0e3f515f99d 306 if (_packets_end == &(*p)->next) {
kaizen 0:d0e3f515f99d 307 _packets_end = p;
kaizen 0:d0e3f515f99d 308 }
kaizen 0:d0e3f515f99d 309 *p = (*p)->next;
kaizen 0:d0e3f515f99d 310
kaizen 0:d0e3f515f99d 311 uint32_t len = q->len;
kaizen 0:d0e3f515f99d 312 free(q);
kaizen 0:d0e3f515f99d 313 return len;
kaizen 0:d0e3f515f99d 314 } else { // return only partial packet
kaizen 0:d0e3f515f99d 315 memcpy(data, q+1, amount);
kaizen 0:d0e3f515f99d 316
kaizen 0:d0e3f515f99d 317 q->len -= amount;
kaizen 0:d0e3f515f99d 318 memmove(q+1, (uint8_t*)(q+1) + amount, q->len);
kaizen 0:d0e3f515f99d 319 return amount;
kaizen 0:d0e3f515f99d 320 }
kaizen 0:d0e3f515f99d 321 }
kaizen 0:d0e3f515f99d 322 }
kaizen 0:d0e3f515f99d 323
kaizen 0:d0e3f515f99d 324 // check for inbound packets
kaizen 0:d0e3f515f99d 325 if (!_parser.process_oob()) {
kaizen 0:d0e3f515f99d 326 return -1;
kaizen 0:d0e3f515f99d 327 }
kaizen 0:d0e3f515f99d 328 }
kaizen 0:d0e3f515f99d 329 }
kaizen 0:d0e3f515f99d 330
kaizen 0:d0e3f515f99d 331 bool WizFi310::close(int id)
kaizen 0:d0e3f515f99d 332 {
kaizen 0:d0e3f515f99d 333 char sock_event_msg[15];
kaizen 0:d0e3f515f99d 334
kaizen 1:8e468bb83e1e 335 if(id > 7) {
kaizen 1:8e468bb83e1e 336 return false;
kaizen 1:8e468bb83e1e 337 }
kaizen 1:8e468bb83e1e 338
kaizen 1:8e468bb83e1e 339 sprintf(sock_event_msg,"[DISCONNECT %d]",id);
kaizen 1:8e468bb83e1e 340 if (_parser.send("AT+SMGMT=%d", id) && _parser.recv(sock_event_msg) && _parser.recv("[OK]") )
kaizen 0:d0e3f515f99d 341 {
kaizen 0:d0e3f515f99d 342 return true;
kaizen 0:d0e3f515f99d 343 }
kaizen 0:d0e3f515f99d 344
kaizen 0:d0e3f515f99d 345 return false;
kaizen 0:d0e3f515f99d 346 }
kaizen 0:d0e3f515f99d 347
kaizen 0:d0e3f515f99d 348 void WizFi310::setTimeout(uint32_t timeout_ms)
kaizen 0:d0e3f515f99d 349 {
kaizen 0:d0e3f515f99d 350 _parser.set_timeout(timeout_ms);
kaizen 0:d0e3f515f99d 351 }
kaizen 0:d0e3f515f99d 352
kaizen 0:d0e3f515f99d 353 bool WizFi310::readable()
kaizen 0:d0e3f515f99d 354 {
kaizen 0:d0e3f515f99d 355 return _serial.FileHandle::readable();
kaizen 0:d0e3f515f99d 356 }
kaizen 0:d0e3f515f99d 357
kaizen 0:d0e3f515f99d 358 bool WizFi310::writeable()
kaizen 0:d0e3f515f99d 359 {
kaizen 0:d0e3f515f99d 360 return _serial.FileHandle::writable();
kaizen 0:d0e3f515f99d 361 }
kaizen 0:d0e3f515f99d 362
kaizen 0:d0e3f515f99d 363 void WizFi310::attach(Callback<void()> func)
kaizen 0:d0e3f515f99d 364 {
kaizen 0:d0e3f515f99d 365 _serial.sigio(func);
kaizen 0:d0e3f515f99d 366 }
kaizen 0:d0e3f515f99d 367
kaizen 0:d0e3f515f99d 368 bool WizFi310::recv_ap(nsapi_wifi_ap_t *ap)
kaizen 0:d0e3f515f99d 369 {
kaizen 0:d0e3f515f99d 370 char scan_result[100];
kaizen 0:d0e3f515f99d 371 char sec[10];
kaizen 0:d0e3f515f99d 372 char bssid[32];
kaizen 0:d0e3f515f99d 373 char* idx_ptr;
kaizen 0:d0e3f515f99d 374 char* bssid_ptr;
kaizen 0:d0e3f515f99d 375
kaizen 0:d0e3f515f99d 376 _parser.recv("%s\r\n",scan_result);
kaizen 0:d0e3f515f99d 377 if( strcmp(scan_result,"[OK]") == 0 )
kaizen 0:d0e3f515f99d 378 {
kaizen 0:d0e3f515f99d 379 return false;
kaizen 0:d0e3f515f99d 380 }
kaizen 0:d0e3f515f99d 381
kaizen 0:d0e3f515f99d 382 idx_ptr = strtok((char*)scan_result, "/"); // index
kaizen 0:d0e3f515f99d 383
kaizen 0:d0e3f515f99d 384 idx_ptr = strtok( NULL, "/" ); // ssid
kaizen 0:d0e3f515f99d 385 strncpy(ap->ssid,idx_ptr,strlen(idx_ptr));
kaizen 0:d0e3f515f99d 386 ap->ssid[strlen(idx_ptr)] = '\0';
kaizen 0:d0e3f515f99d 387
kaizen 0:d0e3f515f99d 388 idx_ptr = strtok( NULL, "/" ); // bssid
kaizen 0:d0e3f515f99d 389 strncpy(bssid,idx_ptr,strlen(idx_ptr));
kaizen 0:d0e3f515f99d 390 bssid[strlen(idx_ptr)] = '\0';
kaizen 0:d0e3f515f99d 391
kaizen 0:d0e3f515f99d 392 idx_ptr = strtok( NULL, "/" ); // RSSI
kaizen 0:d0e3f515f99d 393 ap->rssi = atoi(idx_ptr);
kaizen 0:d0e3f515f99d 394
kaizen 0:d0e3f515f99d 395 //idx_ptr = strtok( NULL, "/" ); // DataRate
kaizen 0:d0e3f515f99d 396
kaizen 0:d0e3f515f99d 397 idx_ptr = strtok( NULL, "/" ); // Security
kaizen 0:d0e3f515f99d 398 strncpy(sec,idx_ptr,strlen(idx_ptr));
kaizen 0:d0e3f515f99d 399 sec[strlen(idx_ptr)] = '\0';
kaizen 0:d0e3f515f99d 400 ap->security = str2sec(sec);
kaizen 0:d0e3f515f99d 401
kaizen 0:d0e3f515f99d 402 idx_ptr = strtok( NULL, "/" ); // RadioBand
kaizen 0:d0e3f515f99d 403
kaizen 0:d0e3f515f99d 404 idx_ptr = strtok( NULL, "/" ); // Channel
kaizen 0:d0e3f515f99d 405 ap->channel = atoi(idx_ptr);
kaizen 0:d0e3f515f99d 406
kaizen 0:d0e3f515f99d 407 // Set BSSID
kaizen 0:d0e3f515f99d 408 bssid_ptr = strtok( (char*)bssid, ":");
kaizen 0:d0e3f515f99d 409 ap->bssid[0] = hex_str_to_int(bssid_ptr);
kaizen 0:d0e3f515f99d 410
kaizen 0:d0e3f515f99d 411 for(int i=1; i<6; i++)
kaizen 0:d0e3f515f99d 412 {
kaizen 0:d0e3f515f99d 413 bssid_ptr = strtok( NULL, ":");
kaizen 0:d0e3f515f99d 414 ap->bssid[i] = hex_str_to_int(bssid_ptr);
kaizen 0:d0e3f515f99d 415 }
kaizen 0:d0e3f515f99d 416
kaizen 0:d0e3f515f99d 417 return true;
kaizen 0:d0e3f515f99d 418 }
kaizen 0:d0e3f515f99d 419
kaizen 0:d0e3f515f99d 420 nsapi_security_t WizFi310::str2sec(const char *str_sec)
kaizen 0:d0e3f515f99d 421 {
kaizen 0:d0e3f515f99d 422 if( strcmp(str_sec,"Open") == 0 )
kaizen 0:d0e3f515f99d 423 {
kaizen 0:d0e3f515f99d 424 return NSAPI_SECURITY_NONE;
kaizen 0:d0e3f515f99d 425 }
kaizen 0:d0e3f515f99d 426 else if( strcmp(str_sec,"WEP") == 0 )
kaizen 0:d0e3f515f99d 427 {
kaizen 0:d0e3f515f99d 428 return NSAPI_SECURITY_WEP;
kaizen 0:d0e3f515f99d 429 }
kaizen 0:d0e3f515f99d 430 else if( strcmp(str_sec,"WPA") == 0 )
kaizen 0:d0e3f515f99d 431 {
kaizen 0:d0e3f515f99d 432 return NSAPI_SECURITY_WPA;
kaizen 0:d0e3f515f99d 433 }
kaizen 0:d0e3f515f99d 434 else if( strcmp(str_sec,"WPA2") == 0 )
kaizen 0:d0e3f515f99d 435 {
kaizen 0:d0e3f515f99d 436 return NSAPI_SECURITY_WPA2;
kaizen 0:d0e3f515f99d 437 }
kaizen 0:d0e3f515f99d 438 else if( strcmp(str_sec,"WPAWPA2") == 0 )
kaizen 0:d0e3f515f99d 439 {
kaizen 0:d0e3f515f99d 440 return NSAPI_SECURITY_WPA_WPA2;
kaizen 0:d0e3f515f99d 441 }
kaizen 0:d0e3f515f99d 442
kaizen 0:d0e3f515f99d 443 return NSAPI_SECURITY_UNKNOWN;
kaizen 0:d0e3f515f99d 444 }
kaizen 0:d0e3f515f99d 445
kaizen 0:d0e3f515f99d 446 int WizFi310::hex_str_to_int(const char* hex_str)
kaizen 0:d0e3f515f99d 447 {
kaizen 0:d0e3f515f99d 448 int n = 0;
kaizen 0:d0e3f515f99d 449 uint32_t value = 0;
kaizen 0:d0e3f515f99d 450 int shift = 7;
kaizen 0:d0e3f515f99d 451 while (hex_str[n] != '\0' && n < 8)
kaizen 0:d0e3f515f99d 452 {
kaizen 0:d0e3f515f99d 453 if ( hex_str[n] > 0x21 && hex_str[n] < 0x40 )
kaizen 0:d0e3f515f99d 454 {
kaizen 0:d0e3f515f99d 455 value |= (hex_str[n] & 0x0f) << (shift << 2);
kaizen 0:d0e3f515f99d 456 }
kaizen 0:d0e3f515f99d 457 else if ( (hex_str[n] >= 'a' && hex_str[n] <= 'f') || (hex_str[n] >= 'A' && hex_str[n] <= 'F') )
kaizen 0:d0e3f515f99d 458 {
kaizen 0:d0e3f515f99d 459 value |= ((hex_str[n] & 0x0f) + 9) << (shift << 2);
kaizen 0:d0e3f515f99d 460 }
kaizen 0:d0e3f515f99d 461 else
kaizen 0:d0e3f515f99d 462 {
kaizen 0:d0e3f515f99d 463 break;
kaizen 0:d0e3f515f99d 464 }
kaizen 0:d0e3f515f99d 465 n++;
kaizen 0:d0e3f515f99d 466 shift--;
kaizen 0:d0e3f515f99d 467 }
kaizen 0:d0e3f515f99d 468
kaizen 0:d0e3f515f99d 469 return (value >> ((shift + 1) << 2));
kaizen 0:d0e3f515f99d 470 }
kaizen 0:d0e3f515f99d 471