Mbed Cloud example program for workshop in W27 2018.

Dependencies:   MMA7660 LM75B

Committer:
MACRUM
Date:
Sat Jun 30 01:40:30 2018 +0000
Revision:
0:119624335925
Initial commit

Who changed what in which revision?

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