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

Dependents:   mbed-os-example-wifi

Committer:
kaizen
Date:
Mon Dec 18 23:25:46 2017 +0000
Revision:
0:d0e3f515f99d
Child:
1:8e468bb83e1e
First commit WizFi310Interface_Draft 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 0:d0e3f515f99d 194 if (!(_parser.send("AT+WSCAN")
kaizen 0:d0e3f515f99d 195 && _parser.recv("Index/SSID/BSSID/RSSI(-dBm)/MaxDataRate(Mbps)/Security/RadioBand(GHz)/Channel")))
kaizen 0:d0e3f515f99d 196 {
kaizen 0:d0e3f515f99d 197 return NSAPI_ERROR_DEVICE_ERROR;
kaizen 0:d0e3f515f99d 198 }
kaizen 0:d0e3f515f99d 199
kaizen 0:d0e3f515f99d 200 while (recv_ap(&ap)) {
kaizen 0:d0e3f515f99d 201 if (cnt < limit)
kaizen 0:d0e3f515f99d 202 {
kaizen 0:d0e3f515f99d 203 res[cnt] = WiFiAccessPoint(ap);
kaizen 0:d0e3f515f99d 204 }
kaizen 0:d0e3f515f99d 205 cnt++;
kaizen 0:d0e3f515f99d 206 if (limit != 0 && cnt >= limit)
kaizen 0:d0e3f515f99d 207 {
kaizen 0:d0e3f515f99d 208 break;
kaizen 0:d0e3f515f99d 209 }
kaizen 0:d0e3f515f99d 210 }
kaizen 0:d0e3f515f99d 211
kaizen 0:d0e3f515f99d 212 return cnt;
kaizen 0:d0e3f515f99d 213 }
kaizen 0:d0e3f515f99d 214
kaizen 0:d0e3f515f99d 215 bool WizFi310::open(const char *type, int id, const char* addr, int port)
kaizen 0:d0e3f515f99d 216 {
kaizen 0:d0e3f515f99d 217 int created_sock_id;
kaizen 0:d0e3f515f99d 218
kaizen 0:d0e3f515f99d 219 //IDs only 0-7
kaizen 0:d0e3f515f99d 220 if(id > 7) {
kaizen 0:d0e3f515f99d 221 return false;
kaizen 0:d0e3f515f99d 222 }
kaizen 0:d0e3f515f99d 223
kaizen 0:d0e3f515f99d 224 if( !(_parser.send("AT+SCON=O,%s,%s,%d,,0",type,addr,port) && _parser.recv("[OK]")) ) {
kaizen 0:d0e3f515f99d 225 return false;
kaizen 0:d0e3f515f99d 226 }
kaizen 0:d0e3f515f99d 227
kaizen 0:d0e3f515f99d 228 if( !(_parser.recv("[CONNECT %d]",&created_sock_id)) ) {
kaizen 0:d0e3f515f99d 229 return false;
kaizen 0:d0e3f515f99d 230 }
kaizen 0:d0e3f515f99d 231
kaizen 0:d0e3f515f99d 232 if( created_sock_id != id ) {
kaizen 0:d0e3f515f99d 233 close(created_sock_id);
kaizen 0:d0e3f515f99d 234 return false;
kaizen 0:d0e3f515f99d 235 }
kaizen 0:d0e3f515f99d 236
kaizen 0:d0e3f515f99d 237 return true;
kaizen 0:d0e3f515f99d 238 }
kaizen 0:d0e3f515f99d 239
kaizen 0:d0e3f515f99d 240 bool WizFi310::dns_lookup(const char* name, char* ip)
kaizen 0:d0e3f515f99d 241 {
kaizen 0:d0e3f515f99d 242 return _parser.send("AT+FDNS=%s,10000", name) && _parser.recv("%s%*[\r]%*[\n]",ip)
kaizen 0:d0e3f515f99d 243 && _parser.recv("[OK]");
kaizen 0:d0e3f515f99d 244 }
kaizen 0:d0e3f515f99d 245
kaizen 0:d0e3f515f99d 246 bool WizFi310::send(int id, const void *data, uint32_t amount)
kaizen 0:d0e3f515f99d 247 {
kaizen 0:d0e3f515f99d 248 char str_result[20];
kaizen 0:d0e3f515f99d 249 sprintf(str_result,"[%d,,,%d]",id,amount);
kaizen 0:d0e3f515f99d 250
kaizen 0:d0e3f515f99d 251 for (unsigned i=0; i<2; i++) {
kaizen 0:d0e3f515f99d 252 if( _parser.send("AT+SSEND=%d,,,%d",id, amount)
kaizen 0:d0e3f515f99d 253 && _parser.recv(str_result)
kaizen 0:d0e3f515f99d 254 && _parser.write((char*)data, (int)amount) >= 0
kaizen 0:d0e3f515f99d 255 && _parser.recv("[OK]") ){
kaizen 0:d0e3f515f99d 256 return true;
kaizen 0:d0e3f515f99d 257 }
kaizen 0:d0e3f515f99d 258 }
kaizen 0:d0e3f515f99d 259 return false;
kaizen 0:d0e3f515f99d 260 }
kaizen 0:d0e3f515f99d 261
kaizen 0:d0e3f515f99d 262 void WizFi310::_packet_handler()
kaizen 0:d0e3f515f99d 263 {
kaizen 0:d0e3f515f99d 264 int id;
kaizen 0:d0e3f515f99d 265 char ip_addr[16];
kaizen 0:d0e3f515f99d 266 int port;
kaizen 0:d0e3f515f99d 267 uint32_t amount;
kaizen 0:d0e3f515f99d 268
kaizen 0:d0e3f515f99d 269 // parse out the packet
kaizen 0:d0e3f515f99d 270 if (!_parser.recv("%d,%[^,],%d,%d}",&id, ip_addr,&port, &amount) ) {
kaizen 0:d0e3f515f99d 271 return;
kaizen 0:d0e3f515f99d 272 }
kaizen 0:d0e3f515f99d 273
kaizen 0:d0e3f515f99d 274 struct packet *packet = (struct packet*)malloc(
kaizen 0:d0e3f515f99d 275 sizeof(struct packet) + amount);
kaizen 0:d0e3f515f99d 276 if (!packet) {
kaizen 0:d0e3f515f99d 277 return;
kaizen 0:d0e3f515f99d 278 }
kaizen 0:d0e3f515f99d 279
kaizen 0:d0e3f515f99d 280 packet->id = id;
kaizen 0:d0e3f515f99d 281 packet->len = amount;
kaizen 0:d0e3f515f99d 282 packet->next = 0;
kaizen 0:d0e3f515f99d 283
kaizen 0:d0e3f515f99d 284 if (!(_parser.read((char*)(packet + 1), amount))) {
kaizen 0:d0e3f515f99d 285 free(packet);
kaizen 0:d0e3f515f99d 286 return;
kaizen 0:d0e3f515f99d 287 }
kaizen 0:d0e3f515f99d 288
kaizen 0:d0e3f515f99d 289 *_packets_end = packet;
kaizen 0:d0e3f515f99d 290 _packets_end = &packet->next;
kaizen 0:d0e3f515f99d 291 }
kaizen 0:d0e3f515f99d 292
kaizen 0:d0e3f515f99d 293 int32_t WizFi310::recv(int id, void *data, uint32_t amount)
kaizen 0:d0e3f515f99d 294 {
kaizen 0:d0e3f515f99d 295 while (true) {
kaizen 0:d0e3f515f99d 296 // check if any packets are ready for us
kaizen 0:d0e3f515f99d 297 for (struct packet **p = &_packets; *p; p = &(*p)->next) {
kaizen 0:d0e3f515f99d 298 if ((*p)->id == id) {
kaizen 0:d0e3f515f99d 299 struct packet *q = *p;
kaizen 0:d0e3f515f99d 300
kaizen 0:d0e3f515f99d 301 if (q->len <= amount) {
kaizen 0:d0e3f515f99d 302 memcpy(data, q+1, q->len);
kaizen 0:d0e3f515f99d 303
kaizen 0:d0e3f515f99d 304 if (_packets_end == &(*p)->next) {
kaizen 0:d0e3f515f99d 305 _packets_end = p;
kaizen 0:d0e3f515f99d 306 }
kaizen 0:d0e3f515f99d 307 *p = (*p)->next;
kaizen 0:d0e3f515f99d 308
kaizen 0:d0e3f515f99d 309 uint32_t len = q->len;
kaizen 0:d0e3f515f99d 310 free(q);
kaizen 0:d0e3f515f99d 311 return len;
kaizen 0:d0e3f515f99d 312 } else { // return only partial packet
kaizen 0:d0e3f515f99d 313 memcpy(data, q+1, amount);
kaizen 0:d0e3f515f99d 314
kaizen 0:d0e3f515f99d 315 q->len -= amount;
kaizen 0:d0e3f515f99d 316 memmove(q+1, (uint8_t*)(q+1) + amount, q->len);
kaizen 0:d0e3f515f99d 317 return amount;
kaizen 0:d0e3f515f99d 318 }
kaizen 0:d0e3f515f99d 319 }
kaizen 0:d0e3f515f99d 320 }
kaizen 0:d0e3f515f99d 321
kaizen 0:d0e3f515f99d 322 // check for inbound packets
kaizen 0:d0e3f515f99d 323 if (!_parser.process_oob()) {
kaizen 0:d0e3f515f99d 324 return -1;
kaizen 0:d0e3f515f99d 325 }
kaizen 0:d0e3f515f99d 326 }
kaizen 0:d0e3f515f99d 327 }
kaizen 0:d0e3f515f99d 328
kaizen 0:d0e3f515f99d 329 bool WizFi310::close(int id)
kaizen 0:d0e3f515f99d 330 {
kaizen 0:d0e3f515f99d 331 char sock_event_msg[15];
kaizen 0:d0e3f515f99d 332 sprintf(sock_event_msg,"[DISCONNECT %d]",id);
kaizen 0:d0e3f515f99d 333
kaizen 0:d0e3f515f99d 334 if (_parser.send("AT+SMGMT=%d", id) && _parser.recv("[OK]") && _parser.recv(sock_event_msg) )
kaizen 0:d0e3f515f99d 335 {
kaizen 0:d0e3f515f99d 336 return true;
kaizen 0:d0e3f515f99d 337 }
kaizen 0:d0e3f515f99d 338
kaizen 0:d0e3f515f99d 339 return false;
kaizen 0:d0e3f515f99d 340 }
kaizen 0:d0e3f515f99d 341
kaizen 0:d0e3f515f99d 342 void WizFi310::setTimeout(uint32_t timeout_ms)
kaizen 0:d0e3f515f99d 343 {
kaizen 0:d0e3f515f99d 344 _parser.set_timeout(timeout_ms);
kaizen 0:d0e3f515f99d 345 }
kaizen 0:d0e3f515f99d 346
kaizen 0:d0e3f515f99d 347 bool WizFi310::readable()
kaizen 0:d0e3f515f99d 348 {
kaizen 0:d0e3f515f99d 349 return _serial.FileHandle::readable();
kaizen 0:d0e3f515f99d 350 }
kaizen 0:d0e3f515f99d 351
kaizen 0:d0e3f515f99d 352 bool WizFi310::writeable()
kaizen 0:d0e3f515f99d 353 {
kaizen 0:d0e3f515f99d 354 return _serial.FileHandle::writable();
kaizen 0:d0e3f515f99d 355 }
kaizen 0:d0e3f515f99d 356
kaizen 0:d0e3f515f99d 357 void WizFi310::attach(Callback<void()> func)
kaizen 0:d0e3f515f99d 358 {
kaizen 0:d0e3f515f99d 359 _serial.sigio(func);
kaizen 0:d0e3f515f99d 360 }
kaizen 0:d0e3f515f99d 361
kaizen 0:d0e3f515f99d 362 bool WizFi310::recv_ap(nsapi_wifi_ap_t *ap)
kaizen 0:d0e3f515f99d 363 {
kaizen 0:d0e3f515f99d 364 char scan_result[100];
kaizen 0:d0e3f515f99d 365 char sec[10];
kaizen 0:d0e3f515f99d 366 char bssid[32];
kaizen 0:d0e3f515f99d 367 char* idx_ptr;
kaizen 0:d0e3f515f99d 368 char* bssid_ptr;
kaizen 0:d0e3f515f99d 369
kaizen 0:d0e3f515f99d 370 _parser.recv("%s\r\n",scan_result);
kaizen 0:d0e3f515f99d 371 if( strcmp(scan_result,"[OK]") == 0 )
kaizen 0:d0e3f515f99d 372 {
kaizen 0:d0e3f515f99d 373 return false;
kaizen 0:d0e3f515f99d 374 }
kaizen 0:d0e3f515f99d 375
kaizen 0:d0e3f515f99d 376 idx_ptr = strtok((char*)scan_result, "/"); // index
kaizen 0:d0e3f515f99d 377
kaizen 0:d0e3f515f99d 378 idx_ptr = strtok( NULL, "/" ); // ssid
kaizen 0:d0e3f515f99d 379 strncpy(ap->ssid,idx_ptr,strlen(idx_ptr));
kaizen 0:d0e3f515f99d 380 ap->ssid[strlen(idx_ptr)] = '\0';
kaizen 0:d0e3f515f99d 381
kaizen 0:d0e3f515f99d 382 idx_ptr = strtok( NULL, "/" ); // bssid
kaizen 0:d0e3f515f99d 383 strncpy(bssid,idx_ptr,strlen(idx_ptr));
kaizen 0:d0e3f515f99d 384 bssid[strlen(idx_ptr)] = '\0';
kaizen 0:d0e3f515f99d 385
kaizen 0:d0e3f515f99d 386 idx_ptr = strtok( NULL, "/" ); // RSSI
kaizen 0:d0e3f515f99d 387 ap->rssi = atoi(idx_ptr);
kaizen 0:d0e3f515f99d 388
kaizen 0:d0e3f515f99d 389 //idx_ptr = strtok( NULL, "/" ); // DataRate
kaizen 0:d0e3f515f99d 390
kaizen 0:d0e3f515f99d 391 idx_ptr = strtok( NULL, "/" ); // Security
kaizen 0:d0e3f515f99d 392 strncpy(sec,idx_ptr,strlen(idx_ptr));
kaizen 0:d0e3f515f99d 393 sec[strlen(idx_ptr)] = '\0';
kaizen 0:d0e3f515f99d 394 ap->security = str2sec(sec);
kaizen 0:d0e3f515f99d 395
kaizen 0:d0e3f515f99d 396 idx_ptr = strtok( NULL, "/" ); // RadioBand
kaizen 0:d0e3f515f99d 397
kaizen 0:d0e3f515f99d 398 idx_ptr = strtok( NULL, "/" ); // Channel
kaizen 0:d0e3f515f99d 399 ap->channel = atoi(idx_ptr);
kaizen 0:d0e3f515f99d 400
kaizen 0:d0e3f515f99d 401 // Set BSSID
kaizen 0:d0e3f515f99d 402 bssid_ptr = strtok( (char*)bssid, ":");
kaizen 0:d0e3f515f99d 403 ap->bssid[0] = hex_str_to_int(bssid_ptr);
kaizen 0:d0e3f515f99d 404
kaizen 0:d0e3f515f99d 405 for(int i=1; i<6; i++)
kaizen 0:d0e3f515f99d 406 {
kaizen 0:d0e3f515f99d 407 bssid_ptr = strtok( NULL, ":");
kaizen 0:d0e3f515f99d 408 ap->bssid[i] = hex_str_to_int(bssid_ptr);
kaizen 0:d0e3f515f99d 409 }
kaizen 0:d0e3f515f99d 410
kaizen 0:d0e3f515f99d 411 return true;
kaizen 0:d0e3f515f99d 412 }
kaizen 0:d0e3f515f99d 413
kaizen 0:d0e3f515f99d 414 nsapi_security_t WizFi310::str2sec(const char *str_sec)
kaizen 0:d0e3f515f99d 415 {
kaizen 0:d0e3f515f99d 416 if( strcmp(str_sec,"Open") == 0 )
kaizen 0:d0e3f515f99d 417 {
kaizen 0:d0e3f515f99d 418 return NSAPI_SECURITY_NONE;
kaizen 0:d0e3f515f99d 419 }
kaizen 0:d0e3f515f99d 420 else if( strcmp(str_sec,"WEP") == 0 )
kaizen 0:d0e3f515f99d 421 {
kaizen 0:d0e3f515f99d 422 return NSAPI_SECURITY_WEP;
kaizen 0:d0e3f515f99d 423 }
kaizen 0:d0e3f515f99d 424 else if( strcmp(str_sec,"WPA") == 0 )
kaizen 0:d0e3f515f99d 425 {
kaizen 0:d0e3f515f99d 426 return NSAPI_SECURITY_WPA;
kaizen 0:d0e3f515f99d 427 }
kaizen 0:d0e3f515f99d 428 else if( strcmp(str_sec,"WPA2") == 0 )
kaizen 0:d0e3f515f99d 429 {
kaizen 0:d0e3f515f99d 430 return NSAPI_SECURITY_WPA2;
kaizen 0:d0e3f515f99d 431 }
kaizen 0:d0e3f515f99d 432 else if( strcmp(str_sec,"WPAWPA2") == 0 )
kaizen 0:d0e3f515f99d 433 {
kaizen 0:d0e3f515f99d 434 return NSAPI_SECURITY_WPA_WPA2;
kaizen 0:d0e3f515f99d 435 }
kaizen 0:d0e3f515f99d 436
kaizen 0:d0e3f515f99d 437 return NSAPI_SECURITY_UNKNOWN;
kaizen 0:d0e3f515f99d 438 }
kaizen 0:d0e3f515f99d 439
kaizen 0:d0e3f515f99d 440 int WizFi310::hex_str_to_int(const char* hex_str)
kaizen 0:d0e3f515f99d 441 {
kaizen 0:d0e3f515f99d 442 int n = 0;
kaizen 0:d0e3f515f99d 443 uint32_t value = 0;
kaizen 0:d0e3f515f99d 444 int shift = 7;
kaizen 0:d0e3f515f99d 445 while (hex_str[n] != '\0' && n < 8)
kaizen 0:d0e3f515f99d 446 {
kaizen 0:d0e3f515f99d 447 if ( hex_str[n] > 0x21 && hex_str[n] < 0x40 )
kaizen 0:d0e3f515f99d 448 {
kaizen 0:d0e3f515f99d 449 value |= (hex_str[n] & 0x0f) << (shift << 2);
kaizen 0:d0e3f515f99d 450 }
kaizen 0:d0e3f515f99d 451 else if ( (hex_str[n] >= 'a' && hex_str[n] <= 'f') || (hex_str[n] >= 'A' && hex_str[n] <= 'F') )
kaizen 0:d0e3f515f99d 452 {
kaizen 0:d0e3f515f99d 453 value |= ((hex_str[n] & 0x0f) + 9) << (shift << 2);
kaizen 0:d0e3f515f99d 454 }
kaizen 0:d0e3f515f99d 455 else
kaizen 0:d0e3f515f99d 456 {
kaizen 0:d0e3f515f99d 457 break;
kaizen 0:d0e3f515f99d 458 }
kaizen 0:d0e3f515f99d 459 n++;
kaizen 0:d0e3f515f99d 460 shift--;
kaizen 0:d0e3f515f99d 461 }
kaizen 0:d0e3f515f99d 462
kaizen 0:d0e3f515f99d 463 return (value >> ((shift + 1) << 2));
kaizen 0:d0e3f515f99d 464 }
kaizen 0:d0e3f515f99d 465