Host library for controlling a WiConnect enabled Wi-Fi module.

Dependents:   wiconnect-ota_example wiconnect-web_setup_example wiconnect-test-console wiconnect-tcp_server_example ... more

Committer:
dan_ackme
Date:
Mon Aug 11 09:58:24 2014 +0000
Revision:
0:ea85c4bb5e1f
Child:
1:6ec9998427ad
initial check-in

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dan_ackme 0:ea85c4bb5e1f 1 /*
dan_ackme 0:ea85c4bb5e1f 2 * Copyright 2014, ACKme Networks
dan_ackme 0:ea85c4bb5e1f 3 * All Rights Reserved.
dan_ackme 0:ea85c4bb5e1f 4 *
dan_ackme 0:ea85c4bb5e1f 5 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of ACKme Networks;
dan_ackme 0:ea85c4bb5e1f 6 * the contents of this file may not be disclosed to third parties, copied
dan_ackme 0:ea85c4bb5e1f 7 * or duplicated in any form, in whole or in part, without the prior
dan_ackme 0:ea85c4bb5e1f 8 * written permission of ACKme Networks.
dan_ackme 0:ea85c4bb5e1f 9 */
dan_ackme 0:ea85c4bb5e1f 10
dan_ackme 0:ea85c4bb5e1f 11
dan_ackme 0:ea85c4bb5e1f 12 #include "Wiconnect.h"
dan_ackme 0:ea85c4bb5e1f 13 #include "internal/common.h"
dan_ackme 0:ea85c4bb5e1f 14 #include "StringUtil.h"
dan_ackme 0:ea85c4bb5e1f 15
dan_ackme 0:ea85c4bb5e1f 16
dan_ackme 0:ea85c4bb5e1f 17 #define IPV4_FORMAT "%d.%d.%d.%d"
dan_ackme 0:ea85c4bb5e1f 18 #define IPV4_ARGS(ip) \
dan_ackme 0:ea85c4bb5e1f 19 (int)( (ip) & 0xff), \
dan_ackme 0:ea85c4bb5e1f 20 (int)(((ip) >> 8) & 0xff), \
dan_ackme 0:ea85c4bb5e1f 21 (int)(((ip) >> 16) & 0xff), \
dan_ackme 0:ea85c4bb5e1f 22 (int)(((ip) >> 24) & 0xff)
dan_ackme 0:ea85c4bb5e1f 23
dan_ackme 0:ea85c4bb5e1f 24
dan_ackme 0:ea85c4bb5e1f 25
dan_ackme 0:ea85c4bb5e1f 26 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 27 NetworkInterface::NetworkInterface(Wiconnect *wiconnect_)
dan_ackme 0:ea85c4bb5e1f 28 {
dan_ackme 0:ea85c4bb5e1f 29 wiconnect = wiconnect_;
dan_ackme 0:ea85c4bb5e1f 30 }
dan_ackme 0:ea85c4bb5e1f 31
dan_ackme 0:ea85c4bb5e1f 32 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 33 WiconnectResult NetworkInterface::ping(const char *domain, uint32_t *timeMsPtr)
dan_ackme 0:ea85c4bb5e1f 34 {
dan_ackme 0:ea85c4bb5e1f 35 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 36
dan_ackme 0:ea85c4bb5e1f 37 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 38
dan_ackme 0:ea85c4bb5e1f 39 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand(completeHandler, "ping %s", (domain == NULL) ? "-g" : domain)) &&
dan_ackme 0:ea85c4bb5e1f 40 timeMsPtr != NULL)
dan_ackme 0:ea85c4bb5e1f 41 {
dan_ackme 0:ea85c4bb5e1f 42 if(sscanf(wiconnect->internalBuffer, "Ping reply in %ums", timeMsPtr) != 1)
dan_ackme 0:ea85c4bb5e1f 43 {
dan_ackme 0:ea85c4bb5e1f 44 result = WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 45 }
dan_ackme 0:ea85c4bb5e1f 46 }
dan_ackme 0:ea85c4bb5e1f 47
dan_ackme 0:ea85c4bb5e1f 48 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 49
dan_ackme 0:ea85c4bb5e1f 50 return result;
dan_ackme 0:ea85c4bb5e1f 51 }
dan_ackme 0:ea85c4bb5e1f 52
dan_ackme 0:ea85c4bb5e1f 53 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 54 WiconnectResult NetworkInterface::lookup(const char *domain, uint32_t *ipAddressPtr)
dan_ackme 0:ea85c4bb5e1f 55 {
dan_ackme 0:ea85c4bb5e1f 56 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 57
dan_ackme 0:ea85c4bb5e1f 58 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 59
dan_ackme 0:ea85c4bb5e1f 60 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("nlo %s", domain)))
dan_ackme 0:ea85c4bb5e1f 61 {
dan_ackme 0:ea85c4bb5e1f 62 if(!NetworkInterface::strToIp(wiconnect->internalBuffer, ipAddressPtr))
dan_ackme 0:ea85c4bb5e1f 63 {
dan_ackme 0:ea85c4bb5e1f 64 result = WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 65 }
dan_ackme 0:ea85c4bb5e1f 66 }
dan_ackme 0:ea85c4bb5e1f 67
dan_ackme 0:ea85c4bb5e1f 68 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 69
dan_ackme 0:ea85c4bb5e1f 70 return result;
dan_ackme 0:ea85c4bb5e1f 71 }
dan_ackme 0:ea85c4bb5e1f 72
dan_ackme 0:ea85c4bb5e1f 73 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 74 WiconnectResult NetworkInterface::setDhcpEnabled(bool enabled)
dan_ackme 0:ea85c4bb5e1f 75 {
dan_ackme 0:ea85c4bb5e1f 76 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 77
dan_ackme 0:ea85c4bb5e1f 78 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 79
dan_ackme 0:ea85c4bb5e1f 80 result = wiconnect->sendCommand(CMD_SET_NETWORK_DHCP, enabled);
dan_ackme 0:ea85c4bb5e1f 81
dan_ackme 0:ea85c4bb5e1f 82 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 83
dan_ackme 0:ea85c4bb5e1f 84 return result;
dan_ackme 0:ea85c4bb5e1f 85 }
dan_ackme 0:ea85c4bb5e1f 86
dan_ackme 0:ea85c4bb5e1f 87 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 88 WiconnectResult NetworkInterface::getDhcpEnabled(bool *enabledPtr)
dan_ackme 0:ea85c4bb5e1f 89 {
dan_ackme 0:ea85c4bb5e1f 90 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 91
dan_ackme 0:ea85c4bb5e1f 92 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 93
dan_ackme 0:ea85c4bb5e1f 94 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("get network.dhcp")))
dan_ackme 0:ea85c4bb5e1f 95 {
dan_ackme 0:ea85c4bb5e1f 96 int32_t enabled;
dan_ackme 0:ea85c4bb5e1f 97 if(WICONNECT_SUCCEEDED(result, wiconnect->responseToInt32(&enabled)))
dan_ackme 0:ea85c4bb5e1f 98 {
dan_ackme 0:ea85c4bb5e1f 99 *enabledPtr = (bool)enabled;
dan_ackme 0:ea85c4bb5e1f 100 }
dan_ackme 0:ea85c4bb5e1f 101 }
dan_ackme 0:ea85c4bb5e1f 102
dan_ackme 0:ea85c4bb5e1f 103 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 104
dan_ackme 0:ea85c4bb5e1f 105 return result;
dan_ackme 0:ea85c4bb5e1f 106 }
dan_ackme 0:ea85c4bb5e1f 107
dan_ackme 0:ea85c4bb5e1f 108 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 109 WiconnectResult NetworkInterface::setIpSettings(uint32_t ip, uint32_t netmask, uint32_t gateway)
dan_ackme 0:ea85c4bb5e1f 110 {
dan_ackme 0:ea85c4bb5e1f 111 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 112
dan_ackme 0:ea85c4bb5e1f 113 enum
dan_ackme 0:ea85c4bb5e1f 114 {
dan_ackme 0:ea85c4bb5e1f 115 FS_SET_IP,
dan_ackme 0:ea85c4bb5e1f 116 FS_SET_NETMASK,
dan_ackme 0:ea85c4bb5e1f 117 FS_SET_GATEWAY
dan_ackme 0:ea85c4bb5e1f 118 };
dan_ackme 0:ea85c4bb5e1f 119
dan_ackme 0:ea85c4bb5e1f 120 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 121
dan_ackme 0:ea85c4bb5e1f 122 if(wiconnect->internalProcessingState == FS_SET_IP)
dan_ackme 0:ea85c4bb5e1f 123 {
dan_ackme 0:ea85c4bb5e1f 124 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand(CMD_SET_STATIC_IP, IPV4_ARGS(ip))))
dan_ackme 0:ea85c4bb5e1f 125 {
dan_ackme 0:ea85c4bb5e1f 126 wiconnect->internalProcessingState = FS_SET_NETMASK;
dan_ackme 0:ea85c4bb5e1f 127 }
dan_ackme 0:ea85c4bb5e1f 128 }
dan_ackme 0:ea85c4bb5e1f 129
dan_ackme 0:ea85c4bb5e1f 130 if(wiconnect->internalProcessingState == FS_SET_NETMASK)
dan_ackme 0:ea85c4bb5e1f 131 {
dan_ackme 0:ea85c4bb5e1f 132 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand(CMD_SET_STATIC_NETMASK, IPV4_ARGS(netmask))))
dan_ackme 0:ea85c4bb5e1f 133 {
dan_ackme 0:ea85c4bb5e1f 134 wiconnect->internalProcessingState = FS_SET_GATEWAY;
dan_ackme 0:ea85c4bb5e1f 135 }
dan_ackme 0:ea85c4bb5e1f 136 }
dan_ackme 0:ea85c4bb5e1f 137
dan_ackme 0:ea85c4bb5e1f 138 if(wiconnect->internalProcessingState == FS_SET_GATEWAY)
dan_ackme 0:ea85c4bb5e1f 139 {
dan_ackme 0:ea85c4bb5e1f 140 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand(CMD_SET_STATIC_GATEWAY, IPV4_ARGS(gateway))))
dan_ackme 0:ea85c4bb5e1f 141 {
dan_ackme 0:ea85c4bb5e1f 142 }
dan_ackme 0:ea85c4bb5e1f 143 }
dan_ackme 0:ea85c4bb5e1f 144
dan_ackme 0:ea85c4bb5e1f 145 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 146
dan_ackme 0:ea85c4bb5e1f 147 return result;
dan_ackme 0:ea85c4bb5e1f 148 }
dan_ackme 0:ea85c4bb5e1f 149
dan_ackme 0:ea85c4bb5e1f 150 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 151 WiconnectResult NetworkInterface::setIpSettings(const char* ipStr, const char* netmaskStr, const char* gatewayStr)
dan_ackme 0:ea85c4bb5e1f 152 {
dan_ackme 0:ea85c4bb5e1f 153 uint32_t ip, nm, gw;
dan_ackme 0:ea85c4bb5e1f 154
dan_ackme 0:ea85c4bb5e1f 155 if( !NetworkInterface::strToIp(ipStr, &ip) ||
dan_ackme 0:ea85c4bb5e1f 156 !NetworkInterface::strToIp(netmaskStr, &nm) ||
dan_ackme 0:ea85c4bb5e1f 157 !NetworkInterface::strToIp(gatewayStr, &gw))
dan_ackme 0:ea85c4bb5e1f 158 {
dan_ackme 0:ea85c4bb5e1f 159 return WICONNECT_ERROR;
dan_ackme 0:ea85c4bb5e1f 160 }
dan_ackme 0:ea85c4bb5e1f 161 return setIpSettings(ip, nm, gw);
dan_ackme 0:ea85c4bb5e1f 162 }
dan_ackme 0:ea85c4bb5e1f 163
dan_ackme 0:ea85c4bb5e1f 164 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 165 WiconnectResult NetworkInterface::getIpSettings(uint32_t *ip, uint32_t *netmask, uint32_t *gateway)
dan_ackme 0:ea85c4bb5e1f 166 {
dan_ackme 0:ea85c4bb5e1f 167 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 168
dan_ackme 0:ea85c4bb5e1f 169 enum
dan_ackme 0:ea85c4bb5e1f 170 {
dan_ackme 0:ea85c4bb5e1f 171 FS_GET_IP,
dan_ackme 0:ea85c4bb5e1f 172 FS_GET_NETMASK,
dan_ackme 0:ea85c4bb5e1f 173 FS_GET_GATEWAY
dan_ackme 0:ea85c4bb5e1f 174 };
dan_ackme 0:ea85c4bb5e1f 175
dan_ackme 0:ea85c4bb5e1f 176 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 177
dan_ackme 0:ea85c4bb5e1f 178 if(wiconnect->internalProcessingState == FS_GET_IP)
dan_ackme 0:ea85c4bb5e1f 179 {
dan_ackme 0:ea85c4bb5e1f 180 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("get network.ip")))
dan_ackme 0:ea85c4bb5e1f 181 {
dan_ackme 0:ea85c4bb5e1f 182 if(!NetworkInterface::strToIp(wiconnect->internalBuffer, ip))
dan_ackme 0:ea85c4bb5e1f 183 {
dan_ackme 0:ea85c4bb5e1f 184 result = WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 185 wiconnect->internalProcessingState = FS_GET_NETMASK;
dan_ackme 0:ea85c4bb5e1f 186 }
dan_ackme 0:ea85c4bb5e1f 187 }
dan_ackme 0:ea85c4bb5e1f 188 }
dan_ackme 0:ea85c4bb5e1f 189
dan_ackme 0:ea85c4bb5e1f 190 if(wiconnect->internalProcessingState == FS_GET_NETMASK)
dan_ackme 0:ea85c4bb5e1f 191 {
dan_ackme 0:ea85c4bb5e1f 192 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("get network.netmask")))
dan_ackme 0:ea85c4bb5e1f 193 {
dan_ackme 0:ea85c4bb5e1f 194 if(!NetworkInterface::strToIp(wiconnect->internalBuffer, netmask))
dan_ackme 0:ea85c4bb5e1f 195 {
dan_ackme 0:ea85c4bb5e1f 196 result = WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 197 wiconnect->internalProcessingState = FS_GET_GATEWAY;
dan_ackme 0:ea85c4bb5e1f 198 }
dan_ackme 0:ea85c4bb5e1f 199 }
dan_ackme 0:ea85c4bb5e1f 200 }
dan_ackme 0:ea85c4bb5e1f 201
dan_ackme 0:ea85c4bb5e1f 202 if(wiconnect->internalProcessingState == FS_GET_GATEWAY)
dan_ackme 0:ea85c4bb5e1f 203 {
dan_ackme 0:ea85c4bb5e1f 204 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("get network.gateway")))
dan_ackme 0:ea85c4bb5e1f 205 {
dan_ackme 0:ea85c4bb5e1f 206 if(!NetworkInterface::strToIp(wiconnect->internalBuffer, gateway))
dan_ackme 0:ea85c4bb5e1f 207 {
dan_ackme 0:ea85c4bb5e1f 208 result = WICONNECT_RESPONSE_PARSE_ERROR;
dan_ackme 0:ea85c4bb5e1f 209 }
dan_ackme 0:ea85c4bb5e1f 210 }
dan_ackme 0:ea85c4bb5e1f 211 }
dan_ackme 0:ea85c4bb5e1f 212
dan_ackme 0:ea85c4bb5e1f 213 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 214
dan_ackme 0:ea85c4bb5e1f 215 return result;
dan_ackme 0:ea85c4bb5e1f 216 }
dan_ackme 0:ea85c4bb5e1f 217 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 218 WiconnectResult NetworkInterface::getSignalStrength(NetworkSignalStrength *signalStrengthPtr)
dan_ackme 0:ea85c4bb5e1f 219 {
dan_ackme 0:ea85c4bb5e1f 220 WiconnectResult result;
dan_ackme 0:ea85c4bb5e1f 221 int32_t rssi_dbm;
dan_ackme 0:ea85c4bb5e1f 222
dan_ackme 0:ea85c4bb5e1f 223 CHECK_OTHER_COMMAND_EXECUTING();
dan_ackme 0:ea85c4bb5e1f 224
dan_ackme 0:ea85c4bb5e1f 225 if(WICONNECT_SUCCEEDED(result, wiconnect->sendCommand("rssi")))
dan_ackme 0:ea85c4bb5e1f 226 {
dan_ackme 0:ea85c4bb5e1f 227 if(!WICONNECT_FAILED(result, wiconnect->responseToInt32(&rssi_dbm)))
dan_ackme 0:ea85c4bb5e1f 228 {
dan_ackme 0:ea85c4bb5e1f 229 *signalStrengthPtr = NetworkInterface::rssiToSignalStrength(rssi_dbm);
dan_ackme 0:ea85c4bb5e1f 230 }
dan_ackme 0:ea85c4bb5e1f 231 }
dan_ackme 0:ea85c4bb5e1f 232
dan_ackme 0:ea85c4bb5e1f 233 if(result == WICONNECT_CMD_RESPONSE_ERROR)
dan_ackme 0:ea85c4bb5e1f 234 {
dan_ackme 0:ea85c4bb5e1f 235 *signalStrengthPtr = NETWORK_RSSI_UNKNOWN;
dan_ackme 0:ea85c4bb5e1f 236 result = WICONNECT_SUCCESS;
dan_ackme 0:ea85c4bb5e1f 237 }
dan_ackme 0:ea85c4bb5e1f 238
dan_ackme 0:ea85c4bb5e1f 239 CHECK_CLEANUP_COMMAND();
dan_ackme 0:ea85c4bb5e1f 240
dan_ackme 0:ea85c4bb5e1f 241 return result;
dan_ackme 0:ea85c4bb5e1f 242 }
dan_ackme 0:ea85c4bb5e1f 243
dan_ackme 0:ea85c4bb5e1f 244
dan_ackme 0:ea85c4bb5e1f 245 //-----------------------------------------------------------------------------------------------
dan_ackme 0:ea85c4bb5e1f 246
dan_ackme 0:ea85c4bb5e1f 247
dan_ackme 0:ea85c4bb5e1f 248 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 249 bool NetworkInterface::strToIp(const char *str, uint32_t *intPtr)
dan_ackme 0:ea85c4bb5e1f 250 {
dan_ackme 0:ea85c4bb5e1f 251 if (!intPtr)
dan_ackme 0:ea85c4bb5e1f 252 {
dan_ackme 0:ea85c4bb5e1f 253 return false;
dan_ackme 0:ea85c4bb5e1f 254 }
dan_ackme 0:ea85c4bb5e1f 255 int temp[4];
dan_ackme 0:ea85c4bb5e1f 256
dan_ackme 0:ea85c4bb5e1f 257 if(sscanf(str, "%d.%d.%d.%d", &temp[0], &temp[1], &temp[2], &temp[3] ) != 4)
dan_ackme 0:ea85c4bb5e1f 258 {
dan_ackme 0:ea85c4bb5e1f 259 return false;
dan_ackme 0:ea85c4bb5e1f 260 }
dan_ackme 0:ea85c4bb5e1f 261 else if(temp[0] > 255 || temp[1] > 255 || temp[2] > 255 || temp[3] > 255)
dan_ackme 0:ea85c4bb5e1f 262 {
dan_ackme 0:ea85c4bb5e1f 263 return false;
dan_ackme 0:ea85c4bb5e1f 264 }
dan_ackme 0:ea85c4bb5e1f 265 *intPtr = (uint32_t)temp[3] << 24 | temp[2] << 16 | temp[1] << 8 | temp[0];
dan_ackme 0:ea85c4bb5e1f 266
dan_ackme 0:ea85c4bb5e1f 267 return true;
dan_ackme 0:ea85c4bb5e1f 268 }
dan_ackme 0:ea85c4bb5e1f 269
dan_ackme 0:ea85c4bb5e1f 270 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 271 const char* NetworkInterface::ipToStr(uint32_t ip, char *ipStrBuffer)
dan_ackme 0:ea85c4bb5e1f 272 {
dan_ackme 0:ea85c4bb5e1f 273 SET_STR_BUFFER(ipStrBuffer, 16);
dan_ackme 0:ea85c4bb5e1f 274 sprintf(ptr, IPV4_FORMAT, IPV4_ARGS(ip));
dan_ackme 0:ea85c4bb5e1f 275 return ptr;
dan_ackme 0:ea85c4bb5e1f 276 }
dan_ackme 0:ea85c4bb5e1f 277
dan_ackme 0:ea85c4bb5e1f 278 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 279 const char* NetworkInterface::networkStatusToStr(NetworkStatus status)
dan_ackme 0:ea85c4bb5e1f 280 {
dan_ackme 0:ea85c4bb5e1f 281 switch(status)
dan_ackme 0:ea85c4bb5e1f 282 {
dan_ackme 0:ea85c4bb5e1f 283 case NETWORK_STATUS_DOWN:
dan_ackme 0:ea85c4bb5e1f 284 return "Down";
dan_ackme 0:ea85c4bb5e1f 285 case NETWORK_STATUS_WIFI_ONLY:
dan_ackme 0:ea85c4bb5e1f 286 return "WiFi Only";
dan_ackme 0:ea85c4bb5e1f 287 case NETWORK_STATUS_UP:
dan_ackme 0:ea85c4bb5e1f 288 return "Up";
dan_ackme 0:ea85c4bb5e1f 289 default:
dan_ackme 0:ea85c4bb5e1f 290 return "Unknown";
dan_ackme 0:ea85c4bb5e1f 291 }
dan_ackme 0:ea85c4bb5e1f 292 }
dan_ackme 0:ea85c4bb5e1f 293
dan_ackme 0:ea85c4bb5e1f 294 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 295 const char* NetworkInterface::signalStrengthToStr(NetworkSignalStrength signalStrenth)
dan_ackme 0:ea85c4bb5e1f 296 {
dan_ackme 0:ea85c4bb5e1f 297 switch(signalStrenth)
dan_ackme 0:ea85c4bb5e1f 298 {
dan_ackme 0:ea85c4bb5e1f 299 case NETWORK_RSSI_EXCELLENT:
dan_ackme 0:ea85c4bb5e1f 300 return "Excellent";
dan_ackme 0:ea85c4bb5e1f 301 case NETWORK_RSSI_VERY_GOOD:
dan_ackme 0:ea85c4bb5e1f 302 return "Very Good";
dan_ackme 0:ea85c4bb5e1f 303 case NETWORK_RSSI_GOOD:
dan_ackme 0:ea85c4bb5e1f 304 return "Good";
dan_ackme 0:ea85c4bb5e1f 305 case NETWORK_RSSI_POOR:
dan_ackme 0:ea85c4bb5e1f 306 return "Poor";
dan_ackme 0:ea85c4bb5e1f 307 case NETWORK_RSSI_VERY_POOR:
dan_ackme 0:ea85c4bb5e1f 308 return "Very Poor";
dan_ackme 0:ea85c4bb5e1f 309 case NETWORK_RSSI_UNKNOWN:
dan_ackme 0:ea85c4bb5e1f 310 default:
dan_ackme 0:ea85c4bb5e1f 311 return "Unknown";
dan_ackme 0:ea85c4bb5e1f 312 }
dan_ackme 0:ea85c4bb5e1f 313 }
dan_ackme 0:ea85c4bb5e1f 314
dan_ackme 0:ea85c4bb5e1f 315 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 316 NetworkSignalStrength NetworkInterface::rssiToSignalStrength(int rssi_dbm)
dan_ackme 0:ea85c4bb5e1f 317 {
dan_ackme 0:ea85c4bb5e1f 318 if(rssi_dbm > -20)
dan_ackme 0:ea85c4bb5e1f 319 {
dan_ackme 0:ea85c4bb5e1f 320 return NETWORK_RSSI_EXCELLENT;
dan_ackme 0:ea85c4bb5e1f 321 }
dan_ackme 0:ea85c4bb5e1f 322 else if(rssi_dbm > -35)
dan_ackme 0:ea85c4bb5e1f 323 {
dan_ackme 0:ea85c4bb5e1f 324 return NETWORK_RSSI_VERY_GOOD;
dan_ackme 0:ea85c4bb5e1f 325 }
dan_ackme 0:ea85c4bb5e1f 326 else if(rssi_dbm > -50)
dan_ackme 0:ea85c4bb5e1f 327 {
dan_ackme 0:ea85c4bb5e1f 328 return NETWORK_RSSI_GOOD;
dan_ackme 0:ea85c4bb5e1f 329 }
dan_ackme 0:ea85c4bb5e1f 330 else if(rssi_dbm > -70)
dan_ackme 0:ea85c4bb5e1f 331 {
dan_ackme 0:ea85c4bb5e1f 332 return NETWORK_RSSI_POOR;
dan_ackme 0:ea85c4bb5e1f 333 }
dan_ackme 0:ea85c4bb5e1f 334 else
dan_ackme 0:ea85c4bb5e1f 335 {
dan_ackme 0:ea85c4bb5e1f 336 return NETWORK_RSSI_VERY_POOR;
dan_ackme 0:ea85c4bb5e1f 337 }
dan_ackme 0:ea85c4bb5e1f 338 }
dan_ackme 0:ea85c4bb5e1f 339
dan_ackme 0:ea85c4bb5e1f 340
dan_ackme 0:ea85c4bb5e1f 341 typedef struct
dan_ackme 0:ea85c4bb5e1f 342 {
dan_ackme 0:ea85c4bb5e1f 343 const char* key;
dan_ackme 0:ea85c4bb5e1f 344 NetworkSecurity value;
dan_ackme 0:ea85c4bb5e1f 345 } NetworkSecurityTableEntry;
dan_ackme 0:ea85c4bb5e1f 346
dan_ackme 0:ea85c4bb5e1f 347 static const NetworkSecurityTableEntry networkSecurityTable[] = {
dan_ackme 0:ea85c4bb5e1f 348 {"Auto", NETWORK_SECURITY_UNKNOWN},
dan_ackme 0:ea85c4bb5e1f 349 {"Open", NETWORK_SECURITY_OPEN},
dan_ackme 0:ea85c4bb5e1f 350 {"Unknown", NETWORK_SECURITY_UNKNOWN},
dan_ackme 0:ea85c4bb5e1f 351 {"WEP", NETWORK_SECURITY_WEP_PSK},
dan_ackme 0:ea85c4bb5e1f 352 {"WPA-AES", NETWORK_SECURITY_WPA_AES_PSK},
dan_ackme 0:ea85c4bb5e1f 353 {"WPA-TKIP", NETWORK_SECURITY_WPA_TKIP_PSK},
dan_ackme 0:ea85c4bb5e1f 354 {"WPA2-AES", NETWORK_SECURITY_WPA2_AES_PSK},
dan_ackme 0:ea85c4bb5e1f 355 {"WPA2-Mixed", NETWORK_SECURITY_WPA2_MIXED_PSK},
dan_ackme 0:ea85c4bb5e1f 356 {"WPA2-TKIP", NETWORK_SECURITY_WPA2_TKIP_PSK},
dan_ackme 0:ea85c4bb5e1f 357 };
dan_ackme 0:ea85c4bb5e1f 358
dan_ackme 0:ea85c4bb5e1f 359
dan_ackme 0:ea85c4bb5e1f 360 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 361 NetworkSecurity NetworkInterface::strToNetworkSecurity(const char *str)
dan_ackme 0:ea85c4bb5e1f 362 {
dan_ackme 0:ea85c4bb5e1f 363 const NetworkSecurityTableEntry *end = &networkSecurityTable[ARRAY_COUNT(networkSecurityTable)];
dan_ackme 0:ea85c4bb5e1f 364
dan_ackme 0:ea85c4bb5e1f 365 for(const NetworkSecurityTableEntry *e = networkSecurityTable; e < end; ++e)
dan_ackme 0:ea85c4bb5e1f 366 {
dan_ackme 0:ea85c4bb5e1f 367 if(StringUtil::strcasecmp(e->key, str) == 0)
dan_ackme 0:ea85c4bb5e1f 368 {
dan_ackme 0:ea85c4bb5e1f 369 return e->value;
dan_ackme 0:ea85c4bb5e1f 370 }
dan_ackme 0:ea85c4bb5e1f 371 }
dan_ackme 0:ea85c4bb5e1f 372 return NETWORK_SECURITY_UNKNOWN;
dan_ackme 0:ea85c4bb5e1f 373 }
dan_ackme 0:ea85c4bb5e1f 374
dan_ackme 0:ea85c4bb5e1f 375 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 376 const char* NetworkInterface::networkSecurityToStr(NetworkSecurity security)
dan_ackme 0:ea85c4bb5e1f 377 {
dan_ackme 0:ea85c4bb5e1f 378 const NetworkSecurityTableEntry *end = &networkSecurityTable[ARRAY_COUNT(networkSecurityTable)];
dan_ackme 0:ea85c4bb5e1f 379
dan_ackme 0:ea85c4bb5e1f 380 for(const NetworkSecurityTableEntry *e = networkSecurityTable; e < end; ++e)
dan_ackme 0:ea85c4bb5e1f 381 {
dan_ackme 0:ea85c4bb5e1f 382 if(e->value == security)
dan_ackme 0:ea85c4bb5e1f 383 {
dan_ackme 0:ea85c4bb5e1f 384 return e->key;
dan_ackme 0:ea85c4bb5e1f 385 }
dan_ackme 0:ea85c4bb5e1f 386 }
dan_ackme 0:ea85c4bb5e1f 387 return "Unknown";
dan_ackme 0:ea85c4bb5e1f 388 }
dan_ackme 0:ea85c4bb5e1f 389
dan_ackme 0:ea85c4bb5e1f 390 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 391 bool NetworkInterface::strToSsid(const char *str, Ssid *ssid)
dan_ackme 0:ea85c4bb5e1f 392 {
dan_ackme 0:ea85c4bb5e1f 393 #define ESCAPE_CHARACTER_DELIMITER '\\'
dan_ackme 0:ea85c4bb5e1f 394 #define HEX_ESCAPE_CHARACTER 'x'
dan_ackme 0:ea85c4bb5e1f 395 int c;
dan_ackme 0:ea85c4bb5e1f 396 uint8_t *ssidPtr = ssid->val;
dan_ackme 0:ea85c4bb5e1f 397 int ssidLen = 0;
dan_ackme 0:ea85c4bb5e1f 398
dan_ackme 0:ea85c4bb5e1f 399 while((c = (int)(*str++)) != 0)
dan_ackme 0:ea85c4bb5e1f 400 {
dan_ackme 0:ea85c4bb5e1f 401 if(c == ESCAPE_CHARACTER_DELIMITER)
dan_ackme 0:ea85c4bb5e1f 402 {
dan_ackme 0:ea85c4bb5e1f 403 if(*str == HEX_ESCAPE_CHARACTER)
dan_ackme 0:ea85c4bb5e1f 404 {
dan_ackme 0:ea85c4bb5e1f 405 c = StringUtil::hexToInt(str+1);
dan_ackme 0:ea85c4bb5e1f 406 if(c == -1)
dan_ackme 0:ea85c4bb5e1f 407 return false;
dan_ackme 0:ea85c4bb5e1f 408 str += 3;
dan_ackme 0:ea85c4bb5e1f 409 }
dan_ackme 0:ea85c4bb5e1f 410 else
dan_ackme 0:ea85c4bb5e1f 411 {
dan_ackme 0:ea85c4bb5e1f 412 return false;
dan_ackme 0:ea85c4bb5e1f 413 }
dan_ackme 0:ea85c4bb5e1f 414 }
dan_ackme 0:ea85c4bb5e1f 415 if(ssidLen >= sizeof(ssid->val))
dan_ackme 0:ea85c4bb5e1f 416 return false;
dan_ackme 0:ea85c4bb5e1f 417 ++ssidLen;
dan_ackme 0:ea85c4bb5e1f 418 *ssidPtr++ = (uint8_t)c;
dan_ackme 0:ea85c4bb5e1f 419 }
dan_ackme 0:ea85c4bb5e1f 420
dan_ackme 0:ea85c4bb5e1f 421 ssid->len = ssidLen;
dan_ackme 0:ea85c4bb5e1f 422
dan_ackme 0:ea85c4bb5e1f 423 return true;
dan_ackme 0:ea85c4bb5e1f 424 }
dan_ackme 0:ea85c4bb5e1f 425
dan_ackme 0:ea85c4bb5e1f 426 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 427 const char* NetworkInterface::ssidToStr(const Ssid *ssid, char *ssidStrBuffer)
dan_ackme 0:ea85c4bb5e1f 428 {
dan_ackme 0:ea85c4bb5e1f 429 SET_STR_BUFFER(ssidStrBuffer, sizeof(SsidStrBuffer));
dan_ackme 0:ea85c4bb5e1f 430 const char *src = (const char*)ssid->val;
dan_ackme 0:ea85c4bb5e1f 431 int len = ssid->len;
dan_ackme 0:ea85c4bb5e1f 432
dan_ackme 0:ea85c4bb5e1f 433 while(len--)
dan_ackme 0:ea85c4bb5e1f 434 {
dan_ackme 0:ea85c4bb5e1f 435 if(*src >= 0x20 && *src <= 0x7E)
dan_ackme 0:ea85c4bb5e1f 436 {
dan_ackme 0:ea85c4bb5e1f 437 *ptr++ = *src;
dan_ackme 0:ea85c4bb5e1f 438 }
dan_ackme 0:ea85c4bb5e1f 439 else
dan_ackme 0:ea85c4bb5e1f 440 {
dan_ackme 0:ea85c4bb5e1f 441 ptr += sprintf(ptr, "\\x%02X", (*src) & 0xff);
dan_ackme 0:ea85c4bb5e1f 442 }
dan_ackme 0:ea85c4bb5e1f 443 ++src;
dan_ackme 0:ea85c4bb5e1f 444 }
dan_ackme 0:ea85c4bb5e1f 445 *ptr = 0;
dan_ackme 0:ea85c4bb5e1f 446 return buf;
dan_ackme 0:ea85c4bb5e1f 447 }
dan_ackme 0:ea85c4bb5e1f 448
dan_ackme 0:ea85c4bb5e1f 449 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 450 bool NetworkInterface::strToMacAddress(const char *str, MacAddress *macAddress)
dan_ackme 0:ea85c4bb5e1f 451 {
dan_ackme 0:ea85c4bb5e1f 452 const char* strPtr = str;
dan_ackme 0:ea85c4bb5e1f 453 uint8_t *macPtr = (uint8_t*)macAddress->octet;
dan_ackme 0:ea85c4bb5e1f 454
dan_ackme 0:ea85c4bb5e1f 455 for(int count = 0; count < 6; ++count)
dan_ackme 0:ea85c4bb5e1f 456 {
dan_ackme 0:ea85c4bb5e1f 457 if(count < 5)
dan_ackme 0:ea85c4bb5e1f 458 {
dan_ackme 0:ea85c4bb5e1f 459 const char *idx = strchr(strPtr, ':');
dan_ackme 0:ea85c4bb5e1f 460 if(idx == NULL)
dan_ackme 0:ea85c4bb5e1f 461 {
dan_ackme 0:ea85c4bb5e1f 462 return false;
dan_ackme 0:ea85c4bb5e1f 463 }
dan_ackme 0:ea85c4bb5e1f 464 }
dan_ackme 0:ea85c4bb5e1f 465 int num = StringUtil::hexToInt(strPtr);
dan_ackme 0:ea85c4bb5e1f 466 if(num == -1)
dan_ackme 0:ea85c4bb5e1f 467 {
dan_ackme 0:ea85c4bb5e1f 468 return false;
dan_ackme 0:ea85c4bb5e1f 469 }
dan_ackme 0:ea85c4bb5e1f 470 *macPtr++ = (uint8_t)num;
dan_ackme 0:ea85c4bb5e1f 471 strPtr += 3;
dan_ackme 0:ea85c4bb5e1f 472 }
dan_ackme 0:ea85c4bb5e1f 473
dan_ackme 0:ea85c4bb5e1f 474 return true;
dan_ackme 0:ea85c4bb5e1f 475 }
dan_ackme 0:ea85c4bb5e1f 476
dan_ackme 0:ea85c4bb5e1f 477 /*************************************************************************************************/
dan_ackme 0:ea85c4bb5e1f 478 const char* NetworkInterface::macAddressToStr(const MacAddress *macAddress, char *macStrBuffer)
dan_ackme 0:ea85c4bb5e1f 479 {
dan_ackme 0:ea85c4bb5e1f 480 SET_STR_BUFFER(macStrBuffer, sizeof(MacAddressStrBuffer));
dan_ackme 0:ea85c4bb5e1f 481 const uint8_t *mac = macAddress->octet;
dan_ackme 0:ea85c4bb5e1f 482
dan_ackme 0:ea85c4bb5e1f 483 sprintf(ptr, "%02X:%02X:%02X:%02X:%02X:%02X",
dan_ackme 0:ea85c4bb5e1f 484 (unsigned int)mac[0],
dan_ackme 0:ea85c4bb5e1f 485 (unsigned int)mac[1],
dan_ackme 0:ea85c4bb5e1f 486 (unsigned int)mac[2],
dan_ackme 0:ea85c4bb5e1f 487 (unsigned int)mac[3],
dan_ackme 0:ea85c4bb5e1f 488 (unsigned int)mac[4],
dan_ackme 0:ea85c4bb5e1f 489 (unsigned int)mac[5]);
dan_ackme 0:ea85c4bb5e1f 490
dan_ackme 0:ea85c4bb5e1f 491 return ptr;
dan_ackme 0:ea85c4bb5e1f 492 }
dan_ackme 0:ea85c4bb5e1f 493