Implementation of the WifiPlusClick hardware module.

Dependents:   WifiPlusKlickExample

WifiPlusClick Libary

Overview

http://www.mikroe.com/img/development-tools/accessory-boards/click/wifi-plus/wifi_plus_click_main.png

This library implements the functionality exposed by a WifiPlusClick module from MikroElektronika (http://www.mikroe.com/click/wifi-plus/).

The WifiPlusClick module is an easy to handle module which provides access to up to 8 simultaneous socket objects - which is an an important aspect when you want to implement your own web server.

When I first started with the more commonly used Wifly module, I found out that the Wifly module does not reliably serve webpages which include other resources like images, JavaScript files or CSS files. The root cause seems to be the limitation that Wifly is only able to handle a single socket at this time. So I searched for an alternative and found this (actually cheaper) alternative :

WifiPlusClick HW Module

This module comes with its own limitations. The WifiPlusClick Module interface does not allow to use broadcasting or multicasting on UDP sockets. There are some additional limitations, but I think these are not so important. The following functionality is provided by the module and my library implementation :

  1. Wifi functionality
    1. Connections using AD-HOC or INFRASTRUCTURE mode
    2. List all available Wifi beacons
    3. WEP and WPA/WPA2 security modes including binary and ASCII keys
    4. reading binary WPA key after successfull Connection to speed up connection time
  2. Socket functionality
    1. UDP sockets
    2. TCP sockets

Limitations

I found the following limitations:

  1. UDP sockets cannot use multicasting or broadcasting
  2. set_option functionality is not provided by the HW
  3. 8 sockets can be configured with 1024 bytes of buffer each or 1 socket with 8192 bytes of buffer.

Sample application

Here is my sample application which you can use as a starting point.

Import programWifiPlusKlickExample

Example application of the WifiPlusClick library for use of WifiPlusClick HW Module from Mikroe.com

NOTE

The implementation of the Sockets in this library is still not completely tested. I only tested the TCP part of the sockets. Please let me know what your experiences are when using the library. I will be working on a multithreaded version of this library...

Committer:
leihen
Date:
Mon Jul 29 15:15:21 2013 +0000
Revision:
0:2a179bd4cc02
Initial Version of the WifiPlusClick Library.
; Tested in INFRASTRUCTURE mode only.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
leihen 0:2a179bd4cc02 1 /* Copyright (c) 2013 Henry Leinen (henry[dot]leinen [at] online [dot] de)
leihen 0:2a179bd4cc02 2 *
leihen 0:2a179bd4cc02 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
leihen 0:2a179bd4cc02 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
leihen 0:2a179bd4cc02 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
leihen 0:2a179bd4cc02 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
leihen 0:2a179bd4cc02 7 * furnished to do so, subject to the following conditions:
leihen 0:2a179bd4cc02 8 *
leihen 0:2a179bd4cc02 9 * The above copyright notice and this permission notice shall be included in all copies or
leihen 0:2a179bd4cc02 10 * substantial portions of the Software.
leihen 0:2a179bd4cc02 11 *
leihen 0:2a179bd4cc02 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
leihen 0:2a179bd4cc02 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
leihen 0:2a179bd4cc02 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
leihen 0:2a179bd4cc02 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
leihen 0:2a179bd4cc02 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
leihen 0:2a179bd4cc02 17 */
leihen 0:2a179bd4cc02 18 #include "mbed.h"
leihen 0:2a179bd4cc02 19 #include "Wifi.h"
leihen 0:2a179bd4cc02 20 #include "DnsQuery.h"
leihen 0:2a179bd4cc02 21
leihen 0:2a179bd4cc02 22 #define DEBUG
leihen 0:2a179bd4cc02 23 #include "debug.h"
leihen 0:2a179bd4cc02 24
leihen 0:2a179bd4cc02 25 #define LOBYTE(x) ((x)&0xFF)
leihen 0:2a179bd4cc02 26 #define HIBYTE(x) (((x)>>8)&0xFF)
leihen 0:2a179bd4cc02 27
leihen 0:2a179bd4cc02 28 static Wifi::RX_STATE_t state = Wifi::Idle;
leihen 0:2a179bd4cc02 29 static int ResponseType = 0;
leihen 0:2a179bd4cc02 30 static int DataLen = 0;
leihen 0:2a179bd4cc02 31 static int DataPtr = 0;
leihen 0:2a179bd4cc02 32
leihen 0:2a179bd4cc02 33 Wifi* Wifi::_Wifi = NULL;
leihen 0:2a179bd4cc02 34
leihen 0:2a179bd4cc02 35
leihen 0:2a179bd4cc02 36 Wifi::Wifi(PinName tx, PinName rx, PinName rst)
leihen 0:2a179bd4cc02 37 : m_wifi(tx, rx), m_reset(rst), m_msgReceived(false), m_ackReceived(false), m_bWifiConnected(false), m_WifiConnectionError(NoFailure), m_lastError(NoError)
leihen 0:2a179bd4cc02 38 , m_bScanResultsReady(false), m_NumLastScanResults(0)
leihen 0:2a179bd4cc02 39 {
leihen 0:2a179bd4cc02 40 _Wifi = this;
leihen 0:2a179bd4cc02 41 m_reset = 1;
leihen 0:2a179bd4cc02 42 m_wifi.baud(115200);
leihen 0:2a179bd4cc02 43 m_wifi.format(8, Serial::None, 2);
leihen 0:2a179bd4cc02 44
leihen 0:2a179bd4cc02 45 m_buffer = new char [1024];
leihen 0:2a179bd4cc02 46
leihen 0:2a179bd4cc02 47 if (m_buffer == NULL) {
leihen 0:2a179bd4cc02 48 ERR("Failed to allocate buffer !");
leihen 0:2a179bd4cc02 49 error("WIFI");
leihen 0:2a179bd4cc02 50 }
leihen 0:2a179bd4cc02 51
leihen 0:2a179bd4cc02 52 m_wifi.attach(this, &Wifi::rx_int);
leihen 0:2a179bd4cc02 53 }
leihen 0:2a179bd4cc02 54
leihen 0:2a179bd4cc02 55 void Wifi::Reset()
leihen 0:2a179bd4cc02 56 {
leihen 0:2a179bd4cc02 57 m_reset = 0;
leihen 0:2a179bd4cc02 58 wait(0.2);
leihen 0:2a179bd4cc02 59 m_msgReceived = 0;
leihen 0:2a179bd4cc02 60 m_ackReceived = false;
leihen 0:2a179bd4cc02 61 m_bWifiConnected = false;
leihen 0:2a179bd4cc02 62 m_WifiConnectionError = NoFailure;
leihen 0:2a179bd4cc02 63 state = Idle;
leihen 0:2a179bd4cc02 64 m_reset = 1;
leihen 0:2a179bd4cc02 65 wait(0.2);
leihen 0:2a179bd4cc02 66 }
leihen 0:2a179bd4cc02 67
leihen 0:2a179bd4cc02 68 void Wifi::SendCommand(CMD_MSG_t cmd, int msgDataLen1, char* pData1, int msgDataLen2, char* pData2)
leihen 0:2a179bd4cc02 69 {
leihen 0:2a179bd4cc02 70 // Wifi Plus Click has little endian format (means LSB comes first)
leihen 0:2a179bd4cc02 71 // btw. MBED is also little endian format
leihen 0:2a179bd4cc02 72 // Send Header
leihen 0:2a179bd4cc02 73 m_wifi.putc(0x55);
leihen 0:2a179bd4cc02 74 m_wifi.putc(0xAA);
leihen 0:2a179bd4cc02 75 // Send Message Command
leihen 0:2a179bd4cc02 76 m_wifi.putc( LOBYTE((short)cmd) );
leihen 0:2a179bd4cc02 77 m_wifi.putc( HIBYTE((short)cmd) );
leihen 0:2a179bd4cc02 78 // Send Message Data1 Length
leihen 0:2a179bd4cc02 79 m_wifi.putc( LOBYTE((short)msgDataLen1+msgDataLen2) );
leihen 0:2a179bd4cc02 80 m_wifi.putc( HIBYTE((short)msgDataLen1+msgDataLen2) );
leihen 0:2a179bd4cc02 81
leihen 0:2a179bd4cc02 82 // Send Data1
leihen 0:2a179bd4cc02 83 if ((msgDataLen1 > 0) && (pData1 != NULL)) {
leihen 0:2a179bd4cc02 84 for (int i = 0 ; i < msgDataLen1 ; i++) {
leihen 0:2a179bd4cc02 85 m_wifi.putc(pData1[i]);
leihen 0:2a179bd4cc02 86 }
leihen 0:2a179bd4cc02 87 }
leihen 0:2a179bd4cc02 88 // Send Data2
leihen 0:2a179bd4cc02 89 if ((msgDataLen2 > 0) && (pData2 != NULL)) {
leihen 0:2a179bd4cc02 90 for (int i = 0 ; i < msgDataLen2 ; i++) {
leihen 0:2a179bd4cc02 91 m_wifi.putc(pData2[i]);
leihen 0:2a179bd4cc02 92 }
leihen 0:2a179bd4cc02 93 }
leihen 0:2a179bd4cc02 94
leihen 0:2a179bd4cc02 95 // Reset Acknowledge Recevied flag
leihen 0:2a179bd4cc02 96 m_ackReceived = false;
leihen 0:2a179bd4cc02 97 m_lastError = NoError;
leihen 0:2a179bd4cc02 98 // Send Trailer
leihen 0:2a179bd4cc02 99 m_wifi.putc(0x45);
leihen 0:2a179bd4cc02 100 }
leihen 0:2a179bd4cc02 101
leihen 0:2a179bd4cc02 102 void Wifi::rx_int()
leihen 0:2a179bd4cc02 103 {
leihen 0:2a179bd4cc02 104 char c = m_wifi.getc();
leihen 0:2a179bd4cc02 105
leihen 0:2a179bd4cc02 106 switch (state) {
leihen 0:2a179bd4cc02 107 case Idle:
leihen 0:2a179bd4cc02 108 if (c == 0x55) {
leihen 0:2a179bd4cc02 109 state = Header1_received;
leihen 0:2a179bd4cc02 110 } else {
leihen 0:2a179bd4cc02 111 if (c == 0x00) {
leihen 0:2a179bd4cc02 112 m_ackReceived = true;
leihen 0:2a179bd4cc02 113 INFO("ACK");
leihen 0:2a179bd4cc02 114 } else {
leihen 0:2a179bd4cc02 115 INFO("c = 0x%02x", c);
leihen 0:2a179bd4cc02 116 }
leihen 0:2a179bd4cc02 117 }
leihen 0:2a179bd4cc02 118 break;
leihen 0:2a179bd4cc02 119 case Header1_received:
leihen 0:2a179bd4cc02 120 if (c == 0xAA) {
leihen 0:2a179bd4cc02 121 state = Header2_received;
leihen 0:2a179bd4cc02 122 ResponseType = 0;
leihen 0:2a179bd4cc02 123 DataLen = 0;
leihen 0:2a179bd4cc02 124 } else {
leihen 0:2a179bd4cc02 125 if (c == 0x55) {
leihen 0:2a179bd4cc02 126 state = Header1_received;
leihen 0:2a179bd4cc02 127 } else {
leihen 0:2a179bd4cc02 128 state = Idle;
leihen 0:2a179bd4cc02 129 }
leihen 0:2a179bd4cc02 130 }
leihen 0:2a179bd4cc02 131 break;
leihen 0:2a179bd4cc02 132 case Header2_received:
leihen 0:2a179bd4cc02 133 ResponseType = c;
leihen 0:2a179bd4cc02 134 state = MessageType_low_received;
leihen 0:2a179bd4cc02 135 break;
leihen 0:2a179bd4cc02 136 case MessageType_low_received:
leihen 0:2a179bd4cc02 137 ResponseType |= (((short)c)<<8);
leihen 0:2a179bd4cc02 138 state = MessageType_high_received;
leihen 0:2a179bd4cc02 139 break;
leihen 0:2a179bd4cc02 140 case MessageType_high_received:
leihen 0:2a179bd4cc02 141 DataLen = c;
leihen 0:2a179bd4cc02 142 state = DataLen_low_received;
leihen 0:2a179bd4cc02 143 break;
leihen 0:2a179bd4cc02 144 case DataLen_low_received:
leihen 0:2a179bd4cc02 145 DataLen |= (((short)c)<<8);
leihen 0:2a179bd4cc02 146 if (DataLen == 0) {
leihen 0:2a179bd4cc02 147 state = Awaiting_trailer;
leihen 0:2a179bd4cc02 148 } else {
leihen 0:2a179bd4cc02 149 DataPtr = 0;
leihen 0:2a179bd4cc02 150 state = Data_receiving;
leihen 0:2a179bd4cc02 151 }
leihen 0:2a179bd4cc02 152 break;
leihen 0:2a179bd4cc02 153 case Data_receiving:
leihen 0:2a179bd4cc02 154 m_buffer[DataPtr++] = c;
leihen 0:2a179bd4cc02 155 if (DataPtr == DataLen) {
leihen 0:2a179bd4cc02 156 state = Awaiting_trailer;
leihen 0:2a179bd4cc02 157 }
leihen 0:2a179bd4cc02 158 break;
leihen 0:2a179bd4cc02 159 case Awaiting_trailer:
leihen 0:2a179bd4cc02 160 if (c != 0x45) {
leihen 0:2a179bd4cc02 161 ERR("Trailer information received is incorrect !");
leihen 0:2a179bd4cc02 162 ERR("Full Message : ");
leihen 0:2a179bd4cc02 163 ERR("Response Type : 0x%02x", ResponseType);
leihen 0:2a179bd4cc02 164 for ( int i = 0; i < DataPtr++ ; i++) {
leihen 0:2a179bd4cc02 165 ERR ("0x%02x", m_buffer[i]);
leihen 0:2a179bd4cc02 166 }
leihen 0:2a179bd4cc02 167 ERR("Trailer : 0x%02x", c);
leihen 0:2a179bd4cc02 168 } else {
leihen 0:2a179bd4cc02 169 // Complete Message received, so submit it for processing
leihen 0:2a179bd4cc02 170 SubmitResponse((RSP_MSG_t)ResponseType, DataLen);
leihen 0:2a179bd4cc02 171 }
leihen 0:2a179bd4cc02 172 state = Idle;
leihen 0:2a179bd4cc02 173 break;
leihen 0:2a179bd4cc02 174 default:
leihen 0:2a179bd4cc02 175 state = Idle;
leihen 0:2a179bd4cc02 176 }
leihen 0:2a179bd4cc02 177 }
leihen 0:2a179bd4cc02 178
leihen 0:2a179bd4cc02 179 void Wifi::SubmitResponse(RSP_MSG_t rsp, int msgLen)
leihen 0:2a179bd4cc02 180 {
leihen 0:2a179bd4cc02 181 // Check if Event was received
leihen 0:2a179bd4cc02 182 if (rsp == EVENT_MSG) {
leihen 0:2a179bd4cc02 183 INFO("EVENT !!!!");
leihen 0:2a179bd4cc02 184 switch( m_buffer[0] ) {
leihen 0:2a179bd4cc02 185 case Event_IP_Address_Assigned :
leihen 0:2a179bd4cc02 186 // IP Address assigned, set the IP Address
leihen 0:2a179bd4cc02 187 m_ipAddress.sin_addr.o1 = m_buffer[2];
leihen 0:2a179bd4cc02 188 m_ipAddress.sin_addr.o2 = m_buffer[3];
leihen 0:2a179bd4cc02 189 m_ipAddress.sin_addr.o3 = m_buffer[4];
leihen 0:2a179bd4cc02 190 m_ipAddress.sin_addr.o4 = m_buffer[5];
leihen 0:2a179bd4cc02 191 INFO("NEW IPADDRESS SET !");
leihen 0:2a179bd4cc02 192 return;
leihen 0:2a179bd4cc02 193 case Event_WiFi_Connection_Status_Changed :
leihen 0:2a179bd4cc02 194 if ((m_buffer[1] == 1) || (m_buffer[1] == 4)) {
leihen 0:2a179bd4cc02 195 m_bWifiConnected = true;
leihen 0:2a179bd4cc02 196 m_WifiConnectionError = NoFailure;
leihen 0:2a179bd4cc02 197 INFO("EVENT WIFI CONNECTED !");
leihen 0:2a179bd4cc02 198 DigitalOut led2(LED2);
leihen 0:2a179bd4cc02 199 led2 = 1;
leihen 0:2a179bd4cc02 200 } else {
leihen 0:2a179bd4cc02 201 DigitalOut led2(LED2);
leihen 0:2a179bd4cc02 202 led2 = 0;
leihen 0:2a179bd4cc02 203 m_bWifiConnected = false;
leihen 0:2a179bd4cc02 204 m_WifiConnectionError = (CONN_ERROR_t)m_buffer[2];
leihen 0:2a179bd4cc02 205 if (m_buffer[1] != 2) {
leihen 0:2a179bd4cc02 206 m_WifiConnectionError = (CONN_ERROR_t)((char)m_WifiConnectionError+20);
leihen 0:2a179bd4cc02 207 DigitalOut led3(LED3);
leihen 0:2a179bd4cc02 208 led3 = 1;
leihen 0:2a179bd4cc02 209
leihen 0:2a179bd4cc02 210 }
leihen 0:2a179bd4cc02 211 INFO("EVENT WIFI DISCONNECTED !");
leihen 0:2a179bd4cc02 212 }
leihen 0:2a179bd4cc02 213 return;
leihen 0:2a179bd4cc02 214 case Event_Error_Event :
leihen 0:2a179bd4cc02 215 INFO("ERROR EVENT %d (%d, %d, %d, %d) !", *((short*)&m_buffer[2]), m_buffer[4], m_buffer[5], m_buffer[6], m_buffer[7]);
leihen 0:2a179bd4cc02 216 m_lastError = (ERR_t)*((short*)&m_buffer[2]);
leihen 0:2a179bd4cc02 217 return ;
leihen 0:2a179bd4cc02 218 case Event_WiFi_Scan_Results_Ready :
leihen 0:2a179bd4cc02 219 m_NumLastScanResults = m_buffer[1];
leihen 0:2a179bd4cc02 220 INFO("SCAN RESULTS (#%d) READY !", m_NumLastScanResults);
leihen 0:2a179bd4cc02 221 m_bScanResultsReady = true;
leihen 0:2a179bd4cc02 222 return ;
leihen 0:2a179bd4cc02 223 default:
leihen 0:2a179bd4cc02 224 INFO("EVT %d", m_buffer[0])
leihen 0:2a179bd4cc02 225 break;
leihen 0:2a179bd4cc02 226 }
leihen 0:2a179bd4cc02 227 }
leihen 0:2a179bd4cc02 228
leihen 0:2a179bd4cc02 229 if (m_msgReceived) {
leihen 0:2a179bd4cc02 230 ERR("BUFFER FULL !");
leihen 0:2a179bd4cc02 231 }
leihen 0:2a179bd4cc02 232 m_msgResponse = rsp;
leihen 0:2a179bd4cc02 233 m_msgDataLen = msgLen;
leihen 0:2a179bd4cc02 234 m_msgReceived = true;
leihen 0:2a179bd4cc02 235 INFO("Message received (%d)", rsp);
leihen 0:2a179bd4cc02 236 }
leihen 0:2a179bd4cc02 237
leihen 0:2a179bd4cc02 238
leihen 0:2a179bd4cc02 239 bool Wifi::WaitMessage(RSP_MSG_t msg, int timeout)
leihen 0:2a179bd4cc02 240 {
leihen 0:2a179bd4cc02 241 Timer t;
leihen 0:2a179bd4cc02 242
leihen 0:2a179bd4cc02 243 t.start();
leihen 0:2a179bd4cc02 244
leihen 0:2a179bd4cc02 245 while(t.read_ms() < timeout) {
leihen 0:2a179bd4cc02 246 if (m_msgReceived) {
leihen 0:2a179bd4cc02 247 // Successfully received a message
leihen 0:2a179bd4cc02 248 if (m_msgResponse == msg) {
leihen 0:2a179bd4cc02 249 // Successfull received correct message
leihen 0:2a179bd4cc02 250 m_msgReceived = false;
leihen 0:2a179bd4cc02 251 return true;
leihen 0:2a179bd4cc02 252 } else {
leihen 0:2a179bd4cc02 253 // Not the message we wanted to hear, so wait for next one
leihen 0:2a179bd4cc02 254 m_msgReceived = false;
leihen 0:2a179bd4cc02 255 }
leihen 0:2a179bd4cc02 256 }
leihen 0:2a179bd4cc02 257 }
leihen 0:2a179bd4cc02 258
leihen 0:2a179bd4cc02 259 // Timeout
leihen 0:2a179bd4cc02 260 return false;
leihen 0:2a179bd4cc02 261 }
leihen 0:2a179bd4cc02 262
leihen 0:2a179bd4cc02 263 bool Wifi::WaitEvent(EVT_MSG_t evt, int timeout)
leihen 0:2a179bd4cc02 264 {
leihen 0:2a179bd4cc02 265 Timer t;
leihen 0:2a179bd4cc02 266
leihen 0:2a179bd4cc02 267 t.start();
leihen 0:2a179bd4cc02 268
leihen 0:2a179bd4cc02 269 while(t.read_ms() < timeout) {
leihen 0:2a179bd4cc02 270 if (m_msgReceived) {
leihen 0:2a179bd4cc02 271 // Successfully received a message
leihen 0:2a179bd4cc02 272 if ((m_msgResponse == EVENT_MSG) && (m_buffer[0] == evt)) {
leihen 0:2a179bd4cc02 273 // Successfull received correct message
leihen 0:2a179bd4cc02 274 m_msgReceived = false;
leihen 0:2a179bd4cc02 275 return true;
leihen 0:2a179bd4cc02 276 } else {
leihen 0:2a179bd4cc02 277 // Not the message or eventwe wanted to hear, so wait for next one
leihen 0:2a179bd4cc02 278 m_msgReceived = false;
leihen 0:2a179bd4cc02 279 }
leihen 0:2a179bd4cc02 280 }
leihen 0:2a179bd4cc02 281 }
leihen 0:2a179bd4cc02 282
leihen 0:2a179bd4cc02 283 // Timeout
leihen 0:2a179bd4cc02 284 return false;
leihen 0:2a179bd4cc02 285 }
leihen 0:2a179bd4cc02 286
leihen 0:2a179bd4cc02 287 bool Wifi::WaitAck(int timeout)
leihen 0:2a179bd4cc02 288 {
leihen 0:2a179bd4cc02 289 Timer t;
leihen 0:2a179bd4cc02 290
leihen 0:2a179bd4cc02 291 t.start();
leihen 0:2a179bd4cc02 292
leihen 0:2a179bd4cc02 293 while(t.read_ms() < timeout) {
leihen 0:2a179bd4cc02 294 if (m_ackReceived) {
leihen 0:2a179bd4cc02 295 INFO("ACK after %d ms", t.read_ms());
leihen 0:2a179bd4cc02 296 m_ackReceived = false;
leihen 0:2a179bd4cc02 297 return true;
leihen 0:2a179bd4cc02 298 }
leihen 0:2a179bd4cc02 299 }
leihen 0:2a179bd4cc02 300
leihen 0:2a179bd4cc02 301 return false;
leihen 0:2a179bd4cc02 302 }
leihen 0:2a179bd4cc02 303
leihen 0:2a179bd4cc02 304
leihen 0:2a179bd4cc02 305
leihen 0:2a179bd4cc02 306
leihen 0:2a179bd4cc02 307 bool Wifi::ResetMsg()
leihen 0:2a179bd4cc02 308 {
leihen 0:2a179bd4cc02 309 bool bRetVal = false;
leihen 0:2a179bd4cc02 310
leihen 0:2a179bd4cc02 311 INFO("SENDING RESET_MSG");
leihen 0:2a179bd4cc02 312 SendCommand(RESET_MSG, 0, NULL);
leihen 0:2a179bd4cc02 313
leihen 0:2a179bd4cc02 314 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 315 // Now wait for the Startup Event
leihen 0:2a179bd4cc02 316
leihen 0:2a179bd4cc02 317 if (WaitEvent (Event_Startup_Event, 10000)) {
leihen 0:2a179bd4cc02 318 // Startup Event received
leihen 0:2a179bd4cc02 319 bRetVal = true;
leihen 0:2a179bd4cc02 320 INFO("Successfully Reset the device !");
leihen 0:2a179bd4cc02 321 INFO("Startup condition : 0x%02d", m_buffer[1]);
leihen 0:2a179bd4cc02 322 } else {
leihen 0:2a179bd4cc02 323 ERR("Did not receive a startup event from device after reset !");
leihen 0:2a179bd4cc02 324 }
leihen 0:2a179bd4cc02 325 } else {
leihen 0:2a179bd4cc02 326 ERR("Did not get acknowledge from WifiPlusClick Board !");
leihen 0:2a179bd4cc02 327 }
leihen 0:2a179bd4cc02 328
leihen 0:2a179bd4cc02 329 return bRetVal;
leihen 0:2a179bd4cc02 330 }
leihen 0:2a179bd4cc02 331
leihen 0:2a179bd4cc02 332 bool Wifi::GetVersionMsg(char &sw_ver_lo, char &sw_ver_hi, char &rad_ver_lo, char &rad_ver_hi)
leihen 0:2a179bd4cc02 333 {
leihen 0:2a179bd4cc02 334 bool bRetVal = false;
leihen 0:2a179bd4cc02 335
leihen 0:2a179bd4cc02 336 INFO("SENDING GET_VERSION_MSG");
leihen 0:2a179bd4cc02 337 SendCommand(GET_VERSION_MSG, 0, NULL);
leihen 0:2a179bd4cc02 338
leihen 0:2a179bd4cc02 339 if (WaitAck (1000)) {
leihen 0:2a179bd4cc02 340 // Now wait for the asynchroneous Startup Event
leihen 0:2a179bd4cc02 341
leihen 0:2a179bd4cc02 342 if (WaitEvent (Event_Startup_Event, 2000)) {
leihen 0:2a179bd4cc02 343 // Startup Event received
leihen 0:2a179bd4cc02 344 bRetVal = true;
leihen 0:2a179bd4cc02 345 sw_ver_hi = m_buffer[3];
leihen 0:2a179bd4cc02 346 sw_ver_lo = m_buffer[2];
leihen 0:2a179bd4cc02 347 rad_ver_hi = m_buffer[5];
leihen 0:2a179bd4cc02 348 rad_ver_lo = m_buffer[4];
leihen 0:2a179bd4cc02 349 } else {
leihen 0:2a179bd4cc02 350 ERR("Did not receive an answer event from device after GET_VERSION_MSG !");
leihen 0:2a179bd4cc02 351 }
leihen 0:2a179bd4cc02 352 } else {
leihen 0:2a179bd4cc02 353 ERR("Did not get acknowledge from WifiPlusClick Board !");
leihen 0:2a179bd4cc02 354 }
leihen 0:2a179bd4cc02 355
leihen 0:2a179bd4cc02 356 return bRetVal;
leihen 0:2a179bd4cc02 357 }
leihen 0:2a179bd4cc02 358
leihen 0:2a179bd4cc02 359 bool Wifi::GpioMsg(GPIO_IDX_t pin, GPIO_OP_t operation, GPIO_RES_t &result)
leihen 0:2a179bd4cc02 360 {
leihen 0:2a179bd4cc02 361 char buf[2] = { (char)pin, (char)operation };
leihen 0:2a179bd4cc02 362 bool bRetVal = false;
leihen 0:2a179bd4cc02 363
leihen 0:2a179bd4cc02 364 INFO("SENDING GPIO_MSG");
leihen 0:2a179bd4cc02 365 SendCommand(GPIO_MSG, 2, buf);
leihen 0:2a179bd4cc02 366
leihen 0:2a179bd4cc02 367 if (WaitMessage (GPIO_RESPONSE_MSG, 1000)) {
leihen 0:2a179bd4cc02 368 bRetVal = true;
leihen 0:2a179bd4cc02 369 result = (GPIO_RES_t)m_buffer[1];
leihen 0:2a179bd4cc02 370 } else {
leihen 0:2a179bd4cc02 371 ERR("Did not get answer from device after GPIO_MSG !");
leihen 0:2a179bd4cc02 372 }
leihen 0:2a179bd4cc02 373
leihen 0:2a179bd4cc02 374 return bRetVal;
leihen 0:2a179bd4cc02 375 }
leihen 0:2a179bd4cc02 376
leihen 0:2a179bd4cc02 377 bool Wifi::SetIpAddress(bool bUseDHCP, IPADDRESS_t *ipAddress)
leihen 0:2a179bd4cc02 378 {
leihen 0:2a179bd4cc02 379 bool bRetVal = false;
leihen 0:2a179bd4cc02 380 char buf[18] = {255, (bUseDHCP ? 0 : 1), 0};
leihen 0:2a179bd4cc02 381
leihen 0:2a179bd4cc02 382 if (!bUseDHCP) {
leihen 0:2a179bd4cc02 383 if ( ipAddress == NULL) {
leihen 0:2a179bd4cc02 384 ERR("Invalid argument, ipAdress is NULL !");
leihen 0:2a179bd4cc02 385 return false;
leihen 0:2a179bd4cc02 386 }
leihen 0:2a179bd4cc02 387 memcpy( &buf[2], (void*)ipAddress, 16 );
leihen 0:2a179bd4cc02 388 } else {
leihen 0:2a179bd4cc02 389 memset( &buf[2], 0, 16);
leihen 0:2a179bd4cc02 390 }
leihen 0:2a179bd4cc02 391
leihen 0:2a179bd4cc02 392 INFO("SENDING SET_IP_ADDRESS_MSG");
leihen 0:2a179bd4cc02 393 SendCommand(SET_IP_ADDRESS_MSG, 18, buf);
leihen 0:2a179bd4cc02 394
leihen 0:2a179bd4cc02 395 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 396 bRetVal = true;
leihen 0:2a179bd4cc02 397 } else {
leihen 0:2a179bd4cc02 398 ERR("Did not get acknowledge after SET_IP_ADDRESS_MSG !");
leihen 0:2a179bd4cc02 399 }
leihen 0:2a179bd4cc02 400
leihen 0:2a179bd4cc02 401 return bRetVal;
leihen 0:2a179bd4cc02 402 }
leihen 0:2a179bd4cc02 403
leihen 0:2a179bd4cc02 404 bool Wifi::SetSubnetMask(IPADDRESS_t *NetworkMask)
leihen 0:2a179bd4cc02 405 {
leihen 0:2a179bd4cc02 406 bool bRetVal = false;
leihen 0:2a179bd4cc02 407
leihen 0:2a179bd4cc02 408 if (NetworkMask == NULL)
leihen 0:2a179bd4cc02 409 return false;
leihen 0:2a179bd4cc02 410
leihen 0:2a179bd4cc02 411 INFO("SENDING SET_NETWORK_MASK_MSG");
leihen 0:2a179bd4cc02 412 SendCommand(SET_NETWORK_MASK_MSG, 16, NetworkMask->sin_addr.o);
leihen 0:2a179bd4cc02 413
leihen 0:2a179bd4cc02 414 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 415 bRetVal = true;
leihen 0:2a179bd4cc02 416 } else {
leihen 0:2a179bd4cc02 417 ERR("Did not get acknowledge after SET_NETWORK_MASK_MSG !");
leihen 0:2a179bd4cc02 418 }
leihen 0:2a179bd4cc02 419
leihen 0:2a179bd4cc02 420 return bRetVal;
leihen 0:2a179bd4cc02 421 }
leihen 0:2a179bd4cc02 422
leihen 0:2a179bd4cc02 423 bool Wifi::SetGatewayIpAddress(IPADDRESS_t *IPAddress)
leihen 0:2a179bd4cc02 424 {
leihen 0:2a179bd4cc02 425 bool bRetVal = false;
leihen 0:2a179bd4cc02 426
leihen 0:2a179bd4cc02 427 if (IPAddress == NULL)
leihen 0:2a179bd4cc02 428 return false;
leihen 0:2a179bd4cc02 429
leihen 0:2a179bd4cc02 430 INFO("SENDING SET_GATEWAY_IP_ADDRESS");
leihen 0:2a179bd4cc02 431 SendCommand(SET_GATEWAY_IP_ADDRESS_MSG, 16, IPAddress->sin_addr.o);
leihen 0:2a179bd4cc02 432
leihen 0:2a179bd4cc02 433 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 434 bRetVal = true;
leihen 0:2a179bd4cc02 435 } else {
leihen 0:2a179bd4cc02 436 ERR("Did not get acknowledge after SET_GATEWAY_IP_ADDRESS_MSG !");
leihen 0:2a179bd4cc02 437 }
leihen 0:2a179bd4cc02 438
leihen 0:2a179bd4cc02 439 return bRetVal;
leihen 0:2a179bd4cc02 440 }
leihen 0:2a179bd4cc02 441
leihen 0:2a179bd4cc02 442 bool Wifi::GetNetworkStatus(char *MacAddress, IPADDRESS_t *IPAddress, IPADDRESS_t *NetworkMask, IPADDRESS_t *GatewayAddress, NET_STAT_t &stat)
leihen 0:2a179bd4cc02 443 {
leihen 0:2a179bd4cc02 444 bool bRetVal = false;
leihen 0:2a179bd4cc02 445
leihen 0:2a179bd4cc02 446 INFO("SENDING GET_NETWORK_STATUS_MSG");
leihen 0:2a179bd4cc02 447 SendCommand(GET_NETWORK_STATUS_MSG, 0, NULL);
leihen 0:2a179bd4cc02 448
leihen 0:2a179bd4cc02 449 if (WaitMessage (NETWORK_STATUS_RESPONSE_MSG, 1000)) {
leihen 0:2a179bd4cc02 450 if (MacAddress != NULL) {
leihen 0:2a179bd4cc02 451 memcpy (MacAddress, &m_buffer[1], 6);
leihen 0:2a179bd4cc02 452 }
leihen 0:2a179bd4cc02 453 if (IPAddress != NULL) {
leihen 0:2a179bd4cc02 454 memcpy( IPAddress, &m_buffer[7], 4);
leihen 0:2a179bd4cc02 455 }
leihen 0:2a179bd4cc02 456 if (NetworkMask != NULL) {
leihen 0:2a179bd4cc02 457 memcpy( NetworkMask, &m_buffer[23], 4);
leihen 0:2a179bd4cc02 458 }
leihen 0:2a179bd4cc02 459 if (GatewayAddress != NULL) {
leihen 0:2a179bd4cc02 460 memcpy( GatewayAddress, &m_buffer[39], 4);
leihen 0:2a179bd4cc02 461 }
leihen 0:2a179bd4cc02 462 stat = (NET_STAT_t)m_buffer[55];
leihen 0:2a179bd4cc02 463 bRetVal = true;
leihen 0:2a179bd4cc02 464 } else {
leihen 0:2a179bd4cc02 465 ERR("Did not get Response after GET_NETWORK_STATUS_MSG !");
leihen 0:2a179bd4cc02 466 }
leihen 0:2a179bd4cc02 467
leihen 0:2a179bd4cc02 468 return bRetVal;
leihen 0:2a179bd4cc02 469 }
leihen 0:2a179bd4cc02 470
leihen 0:2a179bd4cc02 471 bool Wifi::SetMACAddress( char MACAddress[6])
leihen 0:2a179bd4cc02 472 {
leihen 0:2a179bd4cc02 473 bool bRetVal = false;
leihen 0:2a179bd4cc02 474
leihen 0:2a179bd4cc02 475 INFO("SENDING SET_MACADDRESS_MSG");
leihen 0:2a179bd4cc02 476 SendCommand(SET_MACADDRESS_MSG, 6, MACAddress);
leihen 0:2a179bd4cc02 477
leihen 0:2a179bd4cc02 478 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 479 bRetVal = true;
leihen 0:2a179bd4cc02 480 } else {
leihen 0:2a179bd4cc02 481 ERR("Did not get acknowledge after SET_MACADDRESS_MSG !");
leihen 0:2a179bd4cc02 482 }
leihen 0:2a179bd4cc02 483
leihen 0:2a179bd4cc02 484 return bRetVal;
leihen 0:2a179bd4cc02 485 }
leihen 0:2a179bd4cc02 486
leihen 0:2a179bd4cc02 487 bool Wifi::SetARPTime(unsigned short ARPTime)
leihen 0:2a179bd4cc02 488 {
leihen 0:2a179bd4cc02 489 char buf[2] = { ARPTime&0xFF, (ARPTime>>8)&0xFF };
leihen 0:2a179bd4cc02 490
leihen 0:2a179bd4cc02 491 bool bRetVal = false;
leihen 0:2a179bd4cc02 492
leihen 0:2a179bd4cc02 493 INFO("SENDING SET_ARP_TIME_MSG");
leihen 0:2a179bd4cc02 494 SendCommand(SET_ARP_TIME_MSG, 2, buf);
leihen 0:2a179bd4cc02 495
leihen 0:2a179bd4cc02 496 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 497 bRetVal = true;
leihen 0:2a179bd4cc02 498 } else {
leihen 0:2a179bd4cc02 499 ERR("Did not get acknowledge after SET_ARP_TIME_MSG !");
leihen 0:2a179bd4cc02 500 }
leihen 0:2a179bd4cc02 501
leihen 0:2a179bd4cc02 502 return bRetVal;
leihen 0:2a179bd4cc02 503 }
leihen 0:2a179bd4cc02 504
leihen 0:2a179bd4cc02 505 bool Wifi::SetNetworkMode(char ProfileNum, NETW_MODE_t NetMode)
leihen 0:2a179bd4cc02 506 {
leihen 0:2a179bd4cc02 507 char buf[2] = { ProfileNum, (char)NetMode };
leihen 0:2a179bd4cc02 508 bool bRetVal = false;
leihen 0:2a179bd4cc02 509
leihen 0:2a179bd4cc02 510 INFO("SENDING SET_CP_NETWORK_MODE_MSG");
leihen 0:2a179bd4cc02 511 SendCommand(SET_CP_NETWORK_MODE_MSG, 2, buf);
leihen 0:2a179bd4cc02 512
leihen 0:2a179bd4cc02 513 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 514 bRetVal = true;
leihen 0:2a179bd4cc02 515 } else {
leihen 0:2a179bd4cc02 516 ERR("Did not get acknowledge after SET_CP_NETWORK_MODE_MSG !");
leihen 0:2a179bd4cc02 517 }
leihen 0:2a179bd4cc02 518
leihen 0:2a179bd4cc02 519 return bRetVal;
leihen 0:2a179bd4cc02 520 }
leihen 0:2a179bd4cc02 521
leihen 0:2a179bd4cc02 522 bool Wifi::SetPowerSaveMode(POWERSAVE_MODE_t pwrsave, short DTIM_Listen)
leihen 0:2a179bd4cc02 523 {
leihen 0:2a179bd4cc02 524 bool bRetVal = false;
leihen 0:2a179bd4cc02 525 char buf[4] = { (char)pwrsave, 0, LOBYTE(DTIM_Listen), HIBYTE(DTIM_Listen) };
leihen 0:2a179bd4cc02 526
leihen 0:2a179bd4cc02 527 INFO("SENDING SET_POWER_SAVE_MODE_MSG");
leihen 0:2a179bd4cc02 528 SendCommand(SET_POWER_SAVE_MODE_MSG, 4, buf);
leihen 0:2a179bd4cc02 529
leihen 0:2a179bd4cc02 530 if (WaitMessage(ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 531 bRetVal = true;
leihen 0:2a179bd4cc02 532 } else {
leihen 0:2a179bd4cc02 533 ERR("Did not get acknowledge after SET_POWER_SAVE_MODE_MSG !");
leihen 0:2a179bd4cc02 534 }
leihen 0:2a179bd4cc02 535
leihen 0:2a179bd4cc02 536 return bRetVal;
leihen 0:2a179bd4cc02 537 }
leihen 0:2a179bd4cc02 538
leihen 0:2a179bd4cc02 539
leihen 0:2a179bd4cc02 540 bool Wifi::SetSSID(char Profile, const char* ssid)
leihen 0:2a179bd4cc02 541 {
leihen 0:2a179bd4cc02 542 bool bRetVal = false;
leihen 0:2a179bd4cc02 543 char len = strlen(ssid);
leihen 0:2a179bd4cc02 544 char buf[2] = { Profile, len };
leihen 0:2a179bd4cc02 545
leihen 0:2a179bd4cc02 546 if (len <= 32 ) {
leihen 0:2a179bd4cc02 547 INFO("SENDING SET_CP_SSID_MSG");
leihen 0:2a179bd4cc02 548 SendCommand(SET_CP_SSID_MSG, 2, buf, len, (char*)ssid);
leihen 0:2a179bd4cc02 549
leihen 0:2a179bd4cc02 550 if (WaitMessage (ACK_MSG, 10000)) {
leihen 0:2a179bd4cc02 551 if (m_lastError != NoError) {
leihen 0:2a179bd4cc02 552 ERR("Failed to set SSID with error code %d", m_lastError);
leihen 0:2a179bd4cc02 553 m_lastError = NoError;
leihen 0:2a179bd4cc02 554 } else {
leihen 0:2a179bd4cc02 555 bRetVal = true;
leihen 0:2a179bd4cc02 556 }
leihen 0:2a179bd4cc02 557 } else {
leihen 0:2a179bd4cc02 558 ERR("Did not get acknowledge after SET_CP_SSID_MSG !");
leihen 0:2a179bd4cc02 559 }
leihen 0:2a179bd4cc02 560 } else {
leihen 0:2a179bd4cc02 561 ERR("SSID is too long !");
leihen 0:2a179bd4cc02 562 }
leihen 0:2a179bd4cc02 563
leihen 0:2a179bd4cc02 564 return bRetVal;
leihen 0:2a179bd4cc02 565 }
leihen 0:2a179bd4cc02 566
leihen 0:2a179bd4cc02 567 bool Wifi::SetRegionalDomain(DOMAIN_COUNTRY_CODE_t dcode)
leihen 0:2a179bd4cc02 568 {
leihen 0:2a179bd4cc02 569 bool bRetVal = false;
leihen 0:2a179bd4cc02 570 char buf[2] = { (char)dcode, 0 };
leihen 0:2a179bd4cc02 571
leihen 0:2a179bd4cc02 572 INFO("SENDING SET_REGIONAL_DOMAIN_MSG");
leihen 0:2a179bd4cc02 573 SendCommand(SET_REGIONAL_DOMAIN_MSG, 2, buf);
leihen 0:2a179bd4cc02 574
leihen 0:2a179bd4cc02 575 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 576 bRetVal = true;
leihen 0:2a179bd4cc02 577 } else {
leihen 0:2a179bd4cc02 578 ERR("Did not get acknowledge after SET_REGIONAL_DOMAIN_MSG !");
leihen 0:2a179bd4cc02 579 }
leihen 0:2a179bd4cc02 580
leihen 0:2a179bd4cc02 581 return bRetVal;
leihen 0:2a179bd4cc02 582 }
leihen 0:2a179bd4cc02 583
leihen 0:2a179bd4cc02 584 bool Wifi::SetChannelList(char numListItems, char *ListItems)
leihen 0:2a179bd4cc02 585 {
leihen 0:2a179bd4cc02 586 bool bRetVal = false;
leihen 0:2a179bd4cc02 587 char buf[2] = { numListItems, 0 };
leihen 0:2a179bd4cc02 588
leihen 0:2a179bd4cc02 589 INFO("SENDING SET_CHANNEL_LIST_MSG");
leihen 0:2a179bd4cc02 590 SendCommand(SET_CHANNEL_LIST_MSG, 2, buf, numListItems, ListItems);
leihen 0:2a179bd4cc02 591
leihen 0:2a179bd4cc02 592 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 593 bRetVal = true;
leihen 0:2a179bd4cc02 594 } else {
leihen 0:2a179bd4cc02 595 ERR("Did not get acknowledge after SET_CHANNEL_LIST_MSG !");
leihen 0:2a179bd4cc02 596 }
leihen 0:2a179bd4cc02 597
leihen 0:2a179bd4cc02 598 return bRetVal;
leihen 0:2a179bd4cc02 599 }
leihen 0:2a179bd4cc02 600
leihen 0:2a179bd4cc02 601 bool Wifi::SetRetryCount(char infrastructureRetryCount, char adhocRetryCount)
leihen 0:2a179bd4cc02 602 {
leihen 0:2a179bd4cc02 603 bool bRetVal = false;
leihen 0:2a179bd4cc02 604 char buf[2] = { infrastructureRetryCount, adhocRetryCount };
leihen 0:2a179bd4cc02 605
leihen 0:2a179bd4cc02 606 INFO("SENDING SET_LIST_RETRY_COUNT_MSG");
leihen 0:2a179bd4cc02 607 SendCommand(SET_LIST_RETRY_COUNT_MSG, 2, buf);
leihen 0:2a179bd4cc02 608
leihen 0:2a179bd4cc02 609 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 610 bRetVal = true;
leihen 0:2a179bd4cc02 611 } else {
leihen 0:2a179bd4cc02 612 ERR("Did not get acknowledge after SET_LIST_RETRY_COUNT_MSG !");
leihen 0:2a179bd4cc02 613 }
leihen 0:2a179bd4cc02 614
leihen 0:2a179bd4cc02 615 return bRetVal;
leihen 0:2a179bd4cc02 616 }
leihen 0:2a179bd4cc02 617
leihen 0:2a179bd4cc02 618 bool Wifi::SetSecurityOpen(char Profile)
leihen 0:2a179bd4cc02 619 {
leihen 0:2a179bd4cc02 620 bool bRetVal = false;
leihen 0:2a179bd4cc02 621 char buf[2] = { Profile, 0 };
leihen 0:2a179bd4cc02 622
leihen 0:2a179bd4cc02 623 INFO("SENDING SET_CP_SECURITY_OPEN_MSG");
leihen 0:2a179bd4cc02 624 SendCommand(SET_CP_SECURITY_OPEN_MSG, 2, buf);
leihen 0:2a179bd4cc02 625
leihen 0:2a179bd4cc02 626 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 627 bRetVal = true;
leihen 0:2a179bd4cc02 628 } else {
leihen 0:2a179bd4cc02 629 ERR("Did not get acknowledge after SET_CP_SECURITY_OPEN_MSG !");
leihen 0:2a179bd4cc02 630 }
leihen 0:2a179bd4cc02 631
leihen 0:2a179bd4cc02 632 return bRetVal;
leihen 0:2a179bd4cc02 633 }
leihen 0:2a179bd4cc02 634
leihen 0:2a179bd4cc02 635 bool Wifi::SetSecurityWEP40(char Profile, bool bSharedKey, char DefaultWEPKeyIdx, char SecurityKeys[20])
leihen 0:2a179bd4cc02 636 {
leihen 0:2a179bd4cc02 637 bool bRetVal = false;
leihen 0:2a179bd4cc02 638 char buf[4];
leihen 0:2a179bd4cc02 639
leihen 0:2a179bd4cc02 640 buf[0] = Profile;
leihen 0:2a179bd4cc02 641 buf[1] = bSharedKey ? 1 : 0;
leihen 0:2a179bd4cc02 642 buf[2] = DefaultWEPKeyIdx;
leihen 0:2a179bd4cc02 643
leihen 0:2a179bd4cc02 644 INFO("SENDING SET_CP_SECURITY_WEP40_MSG");
leihen 0:2a179bd4cc02 645 SendCommand(SET_CP_SECURITY_WEP40_MSG, 4, buf, 20, SecurityKeys);
leihen 0:2a179bd4cc02 646
leihen 0:2a179bd4cc02 647 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 648 bRetVal = true;
leihen 0:2a179bd4cc02 649 } else {
leihen 0:2a179bd4cc02 650 ERR("Did not get acknowledge after SET_CP_SECURITY_WEP40_MSG !");
leihen 0:2a179bd4cc02 651 }
leihen 0:2a179bd4cc02 652
leihen 0:2a179bd4cc02 653 return bRetVal;
leihen 0:2a179bd4cc02 654 }
leihen 0:2a179bd4cc02 655
leihen 0:2a179bd4cc02 656 bool Wifi::SetSecurityWEP104(char Profile, bool bSharedKey, char DefaultWEPKeyIdx, char SecurityKeys[52])
leihen 0:2a179bd4cc02 657 {
leihen 0:2a179bd4cc02 658 bool bRetVal = false;
leihen 0:2a179bd4cc02 659 char buf[4];
leihen 0:2a179bd4cc02 660
leihen 0:2a179bd4cc02 661 buf[0] = Profile;
leihen 0:2a179bd4cc02 662 buf[1] = bSharedKey ? 1 : 0;
leihen 0:2a179bd4cc02 663 buf[2] = DefaultWEPKeyIdx;
leihen 0:2a179bd4cc02 664
leihen 0:2a179bd4cc02 665 INFO("SENDING SET_CP_SECURITY_WEP104_MSG");
leihen 0:2a179bd4cc02 666 SendCommand(SET_CP_SECURITY_WEP104_MSG, 4, buf, 52, SecurityKeys);
leihen 0:2a179bd4cc02 667
leihen 0:2a179bd4cc02 668 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 669 bRetVal = true;
leihen 0:2a179bd4cc02 670 } else {
leihen 0:2a179bd4cc02 671 ERR("Did not get acknowledge after SET_CP_SECURITY_WEP104_MSG !");
leihen 0:2a179bd4cc02 672 }
leihen 0:2a179bd4cc02 673
leihen 0:2a179bd4cc02 674 return bRetVal;
leihen 0:2a179bd4cc02 675 }
leihen 0:2a179bd4cc02 676
leihen 0:2a179bd4cc02 677 bool Wifi::SetSecurityWPA(char Profile, WPA_SECURITY_t sec, int len, const char* secKeyOrPSK)
leihen 0:2a179bd4cc02 678 {
leihen 0:2a179bd4cc02 679 bool bRetVal = false;
leihen 0:2a179bd4cc02 680 char buf[4];
leihen 0:2a179bd4cc02 681 if ((secKeyOrPSK == NULL) || (*secKeyOrPSK == 0))
leihen 0:2a179bd4cc02 682 return false;
leihen 0:2a179bd4cc02 683
leihen 0:2a179bd4cc02 684 if (buf != NULL) {
leihen 0:2a179bd4cc02 685 buf[0] = Profile;
leihen 0:2a179bd4cc02 686 buf[1] = sec;
leihen 0:2a179bd4cc02 687 buf[2] = 0;
leihen 0:2a179bd4cc02 688 buf[3] = len;
leihen 0:2a179bd4cc02 689
leihen 0:2a179bd4cc02 690 INFO("SENDING SET_CP_SECURITY_WPA_MSG");
leihen 0:2a179bd4cc02 691 SendCommand(SET_CP_SECURITY_WPA_MSG, 4, buf, len, (char*)secKeyOrPSK);
leihen 0:2a179bd4cc02 692
leihen 0:2a179bd4cc02 693 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 694 bRetVal = true;
leihen 0:2a179bd4cc02 695 } else {
leihen 0:2a179bd4cc02 696 ERR("Did not get acknowledge after SET_CP_SECURITY_WPA_MSG !");
leihen 0:2a179bd4cc02 697 }
leihen 0:2a179bd4cc02 698 } else {
leihen 0:2a179bd4cc02 699 ERR("Out of memory error in SetCPSecurityWPA !");
leihen 0:2a179bd4cc02 700 }
leihen 0:2a179bd4cc02 701
leihen 0:2a179bd4cc02 702 return bRetVal;
leihen 0:2a179bd4cc02 703 }
leihen 0:2a179bd4cc02 704
leihen 0:2a179bd4cc02 705 bool Wifi::GetWPAKey(char Profile, char Key[32])
leihen 0:2a179bd4cc02 706 {
leihen 0:2a179bd4cc02 707 bool bRetVal = false;
leihen 0:2a179bd4cc02 708 char buf[2] = { Profile, 0 };
leihen 0:2a179bd4cc02 709
leihen 0:2a179bd4cc02 710 INFO("SENDING GET_CP_WPAKEY_MSG");
leihen 0:2a179bd4cc02 711 SendCommand(GET_CP_WPAKEY_MSG, 2, buf);
leihen 0:2a179bd4cc02 712
leihen 0:2a179bd4cc02 713 if (WaitMessage (WPAKEY_RESPONSE_MSG, 1000)) {
leihen 0:2a179bd4cc02 714 bRetVal = true;
leihen 0:2a179bd4cc02 715 memcpy(Key, m_buffer, 32);
leihen 0:2a179bd4cc02 716 } else {
leihen 0:2a179bd4cc02 717 ERR("Did not get answer from device !");
leihen 0:2a179bd4cc02 718 }
leihen 0:2a179bd4cc02 719
leihen 0:2a179bd4cc02 720 return bRetVal;
leihen 0:2a179bd4cc02 721 }
leihen 0:2a179bd4cc02 722
leihen 0:2a179bd4cc02 723 bool Wifi::ScanStartMsg(char Profile)
leihen 0:2a179bd4cc02 724 {
leihen 0:2a179bd4cc02 725 bool bRetVal = false;
leihen 0:2a179bd4cc02 726
leihen 0:2a179bd4cc02 727 if (m_bWifiConnected) {
leihen 0:2a179bd4cc02 728 ERR("Can not start scan while Wifi is connected !");
leihen 0:2a179bd4cc02 729 } else {
leihen 0:2a179bd4cc02 730 char buf[2] = { Profile, 0 };
leihen 0:2a179bd4cc02 731
leihen 0:2a179bd4cc02 732 INFO("SENDING SCAN_START_MSG");
leihen 0:2a179bd4cc02 733 m_bScanResultsReady = false;
leihen 0:2a179bd4cc02 734 m_NumLastScanResults = 0;
leihen 0:2a179bd4cc02 735 SendCommand(SCAN_START_MSG, 2, buf);
leihen 0:2a179bd4cc02 736
leihen 0:2a179bd4cc02 737 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 738 bRetVal = true;
leihen 0:2a179bd4cc02 739 } else {
leihen 0:2a179bd4cc02 740 ERR("Did not get acknowledge after SCAN_START_MSG !");
leihen 0:2a179bd4cc02 741 }
leihen 0:2a179bd4cc02 742 }
leihen 0:2a179bd4cc02 743
leihen 0:2a179bd4cc02 744 return bRetVal;
leihen 0:2a179bd4cc02 745 }
leihen 0:2a179bd4cc02 746
leihen 0:2a179bd4cc02 747 bool Wifi::ScanGetResults(char index, char ssid[32], AP_CONFIG_t &apCfg, short &beaconInterval, short &ATIMWindow, char &RSSI, NETW_MODE_t &bssType, char &channelNo)
leihen 0:2a179bd4cc02 748 {
leihen 0:2a179bd4cc02 749 bool bRetVal = false;
leihen 0:2a179bd4cc02 750
leihen 0:2a179bd4cc02 751 if (!m_bScanResultsReady) {
leihen 0:2a179bd4cc02 752 ERR("No scan results !");
leihen 0:2a179bd4cc02 753 } else {
leihen 0:2a179bd4cc02 754 if (index >= m_NumLastScanResults) {
leihen 0:2a179bd4cc02 755 ERR ("No more scan results !");
leihen 0:2a179bd4cc02 756 } else {
leihen 0:2a179bd4cc02 757 char buf[2] = { index, 0 };
leihen 0:2a179bd4cc02 758
leihen 0:2a179bd4cc02 759 INFO("SENDING SCAN_GET_RESULTS_MSG");
leihen 0:2a179bd4cc02 760 SendCommand(SCAN_GET_RESULTS_MSG, 2, buf);
leihen 0:2a179bd4cc02 761
leihen 0:2a179bd4cc02 762 if (WaitMessage (SCAN_RESULT_MSG, 1000)) {
leihen 0:2a179bd4cc02 763 bRetVal = true;
leihen 0:2a179bd4cc02 764 memcpy(ssid, &m_buffer[7], m_buffer[6]);
leihen 0:2a179bd4cc02 765 memcpy(&apCfg, &m_buffer[39], 1);
leihen 0:2a179bd4cc02 766 beaconInterval = *(short*)&m_buffer[40];
leihen 0:2a179bd4cc02 767 ATIMWindow = *(short*)&m_buffer[42];
leihen 0:2a179bd4cc02 768 RSSI = m_buffer[52];
leihen 0:2a179bd4cc02 769 bssType = (NETW_MODE_t)m_buffer[55];
leihen 0:2a179bd4cc02 770 channelNo = m_buffer[56];
leihen 0:2a179bd4cc02 771 } else {
leihen 0:2a179bd4cc02 772 ERR("Did not receive message after SCAN_GET_RESULTS_MSG !");
leihen 0:2a179bd4cc02 773 }
leihen 0:2a179bd4cc02 774 }
leihen 0:2a179bd4cc02 775 }
leihen 0:2a179bd4cc02 776
leihen 0:2a179bd4cc02 777 return bRetVal;
leihen 0:2a179bd4cc02 778 }
leihen 0:2a179bd4cc02 779
leihen 0:2a179bd4cc02 780 bool Wifi::Connect(char Profile)
leihen 0:2a179bd4cc02 781 {
leihen 0:2a179bd4cc02 782 bool bRetVal = false;
leihen 0:2a179bd4cc02 783
leihen 0:2a179bd4cc02 784 if (m_bWifiConnected) {
leihen 0:2a179bd4cc02 785 ERR("WIFI is already connected !");
leihen 0:2a179bd4cc02 786 } else {
leihen 0:2a179bd4cc02 787 char buf[2] = { Profile, 0 };
leihen 0:2a179bd4cc02 788
leihen 0:2a179bd4cc02 789 INFO("SENDING WIFI_CONNECT_MSG");
leihen 0:2a179bd4cc02 790 SendCommand(WIFI_CONNECT_MSG, 2, buf);
leihen 0:2a179bd4cc02 791
leihen 0:2a179bd4cc02 792 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 793 bRetVal = true;
leihen 0:2a179bd4cc02 794 } else {
leihen 0:2a179bd4cc02 795 ERR("Did not get any acknowledge after WIFI_CONNECT_MSG !");
leihen 0:2a179bd4cc02 796 }
leihen 0:2a179bd4cc02 797 }
leihen 0:2a179bd4cc02 798
leihen 0:2a179bd4cc02 799 return bRetVal;
leihen 0:2a179bd4cc02 800 }
leihen 0:2a179bd4cc02 801
leihen 0:2a179bd4cc02 802 bool Wifi::Disconnect()
leihen 0:2a179bd4cc02 803 {
leihen 0:2a179bd4cc02 804 bool bRetVal = false;
leihen 0:2a179bd4cc02 805
leihen 0:2a179bd4cc02 806 if (!m_bWifiConnected) {
leihen 0:2a179bd4cc02 807 ERR("WIFI is not yet connected !");
leihen 0:2a179bd4cc02 808 } else {
leihen 0:2a179bd4cc02 809 INFO("SENDING WIFI_DISCONNECT_MSG");
leihen 0:2a179bd4cc02 810 SendCommand(WIFI_DISCONNECT_MSG, 0, NULL);
leihen 0:2a179bd4cc02 811
leihen 0:2a179bd4cc02 812 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 813 bRetVal = true;
leihen 0:2a179bd4cc02 814 } else {
leihen 0:2a179bd4cc02 815 ERR("Did not get any acknowledge after WIFI_DISCONNECT_MSG !");
leihen 0:2a179bd4cc02 816 }
leihen 0:2a179bd4cc02 817
leihen 0:2a179bd4cc02 818 }
leihen 0:2a179bd4cc02 819
leihen 0:2a179bd4cc02 820 return bRetVal;
leihen 0:2a179bd4cc02 821 }
leihen 0:2a179bd4cc02 822
leihen 0:2a179bd4cc02 823
leihen 0:2a179bd4cc02 824 bool Wifi::SocketAllocate(char nTCPSvr, char nTCPClnt, unsigned short TCPSvrRxBuf, unsigned short TCPSvrTxBuf, unsigned short TCPClntRxBuf, unsigned short TCPClntTxBuf)
leihen 0:2a179bd4cc02 825 {
leihen 0:2a179bd4cc02 826 bool bRetVal = false;
leihen 0:2a179bd4cc02 827 __packed struct _sendBuf {
leihen 0:2a179bd4cc02 828 char _nTcpSvr;
leihen 0:2a179bd4cc02 829 char _nTcpClnt;
leihen 0:2a179bd4cc02 830 unsigned short _TcpSvrRxBuf, _TcpSvrTxBuf, _TcpClntRxBuf, _TcpClntTxBuf;
leihen 0:2a179bd4cc02 831 } buf = { nTCPSvr, nTCPClnt, TCPSvrRxBuf, TCPSvrTxBuf, TCPClntRxBuf, TCPClntTxBuf };
leihen 0:2a179bd4cc02 832
leihen 0:2a179bd4cc02 833 INFO("SENDING SOCKET_ALLOCATE_MSG");
leihen 0:2a179bd4cc02 834 SendCommand(SOCKET_ALLOCATE_MSG, sizeof(buf), (char*)&buf);
leihen 0:2a179bd4cc02 835
leihen 0:2a179bd4cc02 836 if (WaitMessage (SOCKET_ALLOCATE_RESPONSE_MSG, 2000)) {
leihen 0:2a179bd4cc02 837 if (m_buffer[0] == 0) {
leihen 0:2a179bd4cc02 838 bRetVal = true;
leihen 0:2a179bd4cc02 839 } else if (m_buffer[0] == 0xFF) {
leihen 0:2a179bd4cc02 840 ERR("Too many sockets requested in SOCKET_ALLOCATE_MSG !");
leihen 0:2a179bd4cc02 841 } else if (m_buffer[0] == 0xFE) {
leihen 0:2a179bd4cc02 842 ERR("Too much buffer requested in SOCKET_ALLOCATE_MSG !");
leihen 0:2a179bd4cc02 843 } else {
leihen 0:2a179bd4cc02 844 ERR("Unknown error in SOCKET_ALLOCATE_MSG !");
leihen 0:2a179bd4cc02 845 }
leihen 0:2a179bd4cc02 846 } else {
leihen 0:2a179bd4cc02 847 ERR("Did not get expected message SOCKET_ALLOCATE_RESPONSE_MSG !");
leihen 0:2a179bd4cc02 848 }
leihen 0:2a179bd4cc02 849
leihen 0:2a179bd4cc02 850 return bRetVal;
leihen 0:2a179bd4cc02 851 }
leihen 0:2a179bd4cc02 852
leihen 0:2a179bd4cc02 853
leihen 0:2a179bd4cc02 854
leihen 0:2a179bd4cc02 855 SOCKET_HANDLE_t Wifi::SocketCreate( SOCKET_TYPE_t sockType )
leihen 0:2a179bd4cc02 856 {
leihen 0:2a179bd4cc02 857 char sockHandle = InvalidSocketHandle;
leihen 0:2a179bd4cc02 858 char buf[2] = { sockType, 0 };
leihen 0:2a179bd4cc02 859
leihen 0:2a179bd4cc02 860 INFO("SENDING SOCKET_CREATE_MSG");
leihen 0:2a179bd4cc02 861 SendCommand(SOCKET_CREATE_MSG, 2, buf);
leihen 0:2a179bd4cc02 862
leihen 0:2a179bd4cc02 863 if (WaitMessage (SOCKET_CREATE_RESPONSE_MSG, 1000)) {
leihen 0:2a179bd4cc02 864 sockHandle = (SOCKET_HANDLE_t)m_buffer[0];
leihen 0:2a179bd4cc02 865 if (m_buffer[0] == 254) {
leihen 0:2a179bd4cc02 866 ERR("Invalid socket handle received after SOCKET_CREATE_MSG !");
leihen 0:2a179bd4cc02 867 } else if (m_buffer[0] == 255) {
leihen 0:2a179bd4cc02 868 ERR("Unknown socket type specified in call to SOCKET_CREATE_MSG !");
leihen 0:2a179bd4cc02 869 } else {
leihen 0:2a179bd4cc02 870 INFO("Valid socket handle received !");
leihen 0:2a179bd4cc02 871 }
leihen 0:2a179bd4cc02 872 } else {
leihen 0:2a179bd4cc02 873 ERR("Did not get expected response after SOCKET_CREATE_MSG !");
leihen 0:2a179bd4cc02 874 }
leihen 0:2a179bd4cc02 875
leihen 0:2a179bd4cc02 876 return (SOCKET_HANDLE_t)sockHandle;
leihen 0:2a179bd4cc02 877 }
leihen 0:2a179bd4cc02 878
leihen 0:2a179bd4cc02 879 bool Wifi::SocketClose(SOCKET_HANDLE_t hSock)
leihen 0:2a179bd4cc02 880 {
leihen 0:2a179bd4cc02 881 bool bRetVal = false;
leihen 0:2a179bd4cc02 882 char buf[2] = { hSock, 0 };
leihen 0:2a179bd4cc02 883
leihen 0:2a179bd4cc02 884 INFO("SENDING SOCKET_CLOSE_MSG");
leihen 0:2a179bd4cc02 885 m_lastError = NoError;
leihen 0:2a179bd4cc02 886 SendCommand(SOCKET_CLOSE_MSG, 2, buf);
leihen 0:2a179bd4cc02 887
leihen 0:2a179bd4cc02 888 if (WaitMessage (ACK_MSG, 1000)) {
leihen 0:2a179bd4cc02 889 wait(0.1);
leihen 0:2a179bd4cc02 890 if (m_lastError != NoError) {
leihen 0:2a179bd4cc02 891 bRetVal = false;
leihen 0:2a179bd4cc02 892 } else {
leihen 0:2a179bd4cc02 893 bRetVal = true;
leihen 0:2a179bd4cc02 894 }
leihen 0:2a179bd4cc02 895 } else {
leihen 0:2a179bd4cc02 896 ERR("Did not get expected acknowledge message after SOCKET_CLOSE_MSG !");
leihen 0:2a179bd4cc02 897 }
leihen 0:2a179bd4cc02 898
leihen 0:2a179bd4cc02 899 return bRetVal;
leihen 0:2a179bd4cc02 900 }
leihen 0:2a179bd4cc02 901
leihen 0:2a179bd4cc02 902 bool Wifi::SocketBind(SOCKET_HANDLE_t hSock, int Port)
leihen 0:2a179bd4cc02 903 {
leihen 0:2a179bd4cc02 904 bool bRetVal = false;
leihen 0:2a179bd4cc02 905 char buf[4] = { LOBYTE(Port), HIBYTE(Port), hSock, 0 };
leihen 0:2a179bd4cc02 906
leihen 0:2a179bd4cc02 907 INFO("SENDING SOCKET_BIND_MSG");
leihen 0:2a179bd4cc02 908 SendCommand(SOCKET_BIND_MSG, 4, buf);
leihen 0:2a179bd4cc02 909
leihen 0:2a179bd4cc02 910 if (WaitMessage (SOCKET_BIND_RESPONSE_MSG, 1000)) {
leihen 0:2a179bd4cc02 911 if (m_buffer[2] == 0) {
leihen 0:2a179bd4cc02 912 bRetVal = true;
leihen 0:2a179bd4cc02 913 } else {
leihen 0:2a179bd4cc02 914 ERR("Bind operation return non-zero result !");
leihen 0:2a179bd4cc02 915 }
leihen 0:2a179bd4cc02 916 } else {
leihen 0:2a179bd4cc02 917 ERR("Did not get expected acknowledge message after SOCKET_CLOSE_MSG !");
leihen 0:2a179bd4cc02 918 }
leihen 0:2a179bd4cc02 919
leihen 0:2a179bd4cc02 920 return bRetVal;
leihen 0:2a179bd4cc02 921 }
leihen 0:2a179bd4cc02 922
leihen 0:2a179bd4cc02 923 bool Wifi::SocketListen(SOCKET_HANDLE_t hSock, int& Backlog)
leihen 0:2a179bd4cc02 924 {
leihen 0:2a179bd4cc02 925 bool bRetVal = false;
leihen 0:2a179bd4cc02 926 char buf[2] = { hSock, Backlog };
leihen 0:2a179bd4cc02 927
leihen 0:2a179bd4cc02 928 INFO("SENDING SOCKET_LISTEN_MSG");
leihen 0:2a179bd4cc02 929 SendCommand(SOCKET_LISTEN_MSG, 2, buf);
leihen 0:2a179bd4cc02 930
leihen 0:2a179bd4cc02 931 if (WaitMessage (SOCKET_LISTEN_RESPONSE_MSG, 1000)) {
leihen 0:2a179bd4cc02 932 Backlog = m_buffer[1];
leihen 0:2a179bd4cc02 933 if (m_buffer[0] != 255) {
leihen 0:2a179bd4cc02 934 if (m_buffer[0] != 254) {
leihen 0:2a179bd4cc02 935 bRetVal = true;
leihen 0:2a179bd4cc02 936 } else {
leihen 0:2a179bd4cc02 937 ERR("SOCKET Listen failed because a socket connection is currently in progress !");
leihen 0:2a179bd4cc02 938 }
leihen 0:2a179bd4cc02 939 } else {
leihen 0:2a179bd4cc02 940 ERR("Socket Listen failed because the socket is already connected !");
leihen 0:2a179bd4cc02 941 }
leihen 0:2a179bd4cc02 942 } else {
leihen 0:2a179bd4cc02 943 ERR("Did not get expected acknowledge message after SOCKET_LISTEN_RESPONSE !");
leihen 0:2a179bd4cc02 944 }
leihen 0:2a179bd4cc02 945
leihen 0:2a179bd4cc02 946 return bRetVal;
leihen 0:2a179bd4cc02 947 }
leihen 0:2a179bd4cc02 948
leihen 0:2a179bd4cc02 949 bool Wifi::SocketAccept(SOCKET_HANDLE_t hSock, SOCKET_HANDLE_t &client, int &remotePort, IPADDRESS_t &remoteAddress)
leihen 0:2a179bd4cc02 950 {
leihen 0:2a179bd4cc02 951 bool bRetVal = false;
leihen 0:2a179bd4cc02 952 char buf[2] = { hSock, 0 };
leihen 0:2a179bd4cc02 953
leihen 0:2a179bd4cc02 954 INFO("SENDING SOCKET_ACCEPT_MSG");
leihen 0:2a179bd4cc02 955 SendCommand(SOCKET_ACCEPT_MSG, 2, buf);
leihen 0:2a179bd4cc02 956
leihen 0:2a179bd4cc02 957 if (WaitMessage (SOCKET_ACCEPT_RESPONSE_MSG, 1000)) {
leihen 0:2a179bd4cc02 958 client = (SOCKET_HANDLE_t)m_buffer[0];
leihen 0:2a179bd4cc02 959 remotePort = m_buffer[1] + ((int)m_buffer[2])<<8;
leihen 0:2a179bd4cc02 960 memcpy(&remoteAddress, (const void*)&m_buffer[3], 4);
leihen 0:2a179bd4cc02 961 bRetVal = true;
leihen 0:2a179bd4cc02 962 } else {
leihen 0:2a179bd4cc02 963 ERR("Did not get expected response after SOCKET_ACCEPT_MSG !");
leihen 0:2a179bd4cc02 964 }
leihen 0:2a179bd4cc02 965
leihen 0:2a179bd4cc02 966 return bRetVal;
leihen 0:2a179bd4cc02 967 }
leihen 0:2a179bd4cc02 968
leihen 0:2a179bd4cc02 969 SOCKET_HANDLE_t Wifi::SocketConnect(SOCKET_HANDLE_t hSock, IPADDRESS_t *IpAddress, int Port)
leihen 0:2a179bd4cc02 970 {
leihen 0:2a179bd4cc02 971 SOCKET_HANDLE_t bRetVal = InvalidSocketHandle;
leihen 0:2a179bd4cc02 972 char buf[4] = { hSock, 0, LOBYTE(Port), HIBYTE(Port) };
leihen 0:2a179bd4cc02 973
leihen 0:2a179bd4cc02 974 INFO("SENDING SOCKET_CONNECT_MSG");
leihen 0:2a179bd4cc02 975 SendCommand(SOCKET_CONNECT_MSG, 4, buf, 16, (char*)IpAddress);
leihen 0:2a179bd4cc02 976
leihen 0:2a179bd4cc02 977 if (WaitMessage (SOCKET_CONNECT_RESPONSE_MSG, 1000)) {
leihen 0:2a179bd4cc02 978 bRetVal = (SOCKET_HANDLE_t)m_buffer[0];
leihen 0:2a179bd4cc02 979 } else {
leihen 0:2a179bd4cc02 980 ERR("Did not get expected response after SOCKET_CONNECT_MSG !");
leihen 0:2a179bd4cc02 981 }
leihen 0:2a179bd4cc02 982
leihen 0:2a179bd4cc02 983 return bRetVal;
leihen 0:2a179bd4cc02 984 }
leihen 0:2a179bd4cc02 985
leihen 0:2a179bd4cc02 986 int Wifi::SocketSend(SOCKET_HANDLE_t hSock, char* data, int length)
leihen 0:2a179bd4cc02 987 {
leihen 0:2a179bd4cc02 988 int nRetVal = -1;
leihen 0:2a179bd4cc02 989 char buf[4] = { hSock, 0, LOBYTE(length), HIBYTE(length) };
leihen 0:2a179bd4cc02 990
leihen 0:2a179bd4cc02 991 INFO("SENDING SOCKET_SEND_MSG");
leihen 0:2a179bd4cc02 992 SendCommand(SOCKET_SEND_MSG, 4, buf, length, data);
leihen 0:2a179bd4cc02 993
leihen 0:2a179bd4cc02 994 if (WaitMessage (SOCKET_SEND_RESPONSE_MSG, 1000)) {
leihen 0:2a179bd4cc02 995 nRetVal = m_buffer[0] + ((int)m_buffer[1])<<8;
leihen 0:2a179bd4cc02 996 } else {
leihen 0:2a179bd4cc02 997 ERR("Did not get expected response after SOCKET_SEND_MSG !");
leihen 0:2a179bd4cc02 998 }
leihen 0:2a179bd4cc02 999
leihen 0:2a179bd4cc02 1000 return nRetVal;
leihen 0:2a179bd4cc02 1001 }
leihen 0:2a179bd4cc02 1002
leihen 0:2a179bd4cc02 1003 int Wifi::SocketRecv(SOCKET_HANDLE_t hSock, char* data, int length)
leihen 0:2a179bd4cc02 1004 {
leihen 0:2a179bd4cc02 1005 int nRetVal = -1;
leihen 0:2a179bd4cc02 1006 char buf[4] = { hSock, 0, LOBYTE(length), HIBYTE(length) };
leihen 0:2a179bd4cc02 1007
leihen 0:2a179bd4cc02 1008 INFO("SENDING SOCKET_RECV_MSG");
leihen 0:2a179bd4cc02 1009 SendCommand(SOCKET_RECV_MSG, 4, buf);
leihen 0:2a179bd4cc02 1010
leihen 0:2a179bd4cc02 1011 if (WaitMessage (SOCKET_RECV_RESPONSE_MSG, 1000)) {
leihen 0:2a179bd4cc02 1012 nRetVal = m_buffer[2] + ((int)m_buffer[3])<<8;
leihen 0:2a179bd4cc02 1013 memcpy(data, &m_buffer[4], nRetVal);
leihen 0:2a179bd4cc02 1014 } else {
leihen 0:2a179bd4cc02 1015 ERR("Did not get expected response after SOCKET_RECV_MSG !");
leihen 0:2a179bd4cc02 1016 }
leihen 0:2a179bd4cc02 1017
leihen 0:2a179bd4cc02 1018 return nRetVal;
leihen 0:2a179bd4cc02 1019 }
leihen 0:2a179bd4cc02 1020
leihen 0:2a179bd4cc02 1021 int Wifi::SocketSendTo(SOCKET_HANDLE_t hSock, IPADDRESS_t* remoteAddress, int remotePort, char *data, int length)
leihen 0:2a179bd4cc02 1022 {
leihen 0:2a179bd4cc02 1023 int nRetVal = -1;
leihen 0:2a179bd4cc02 1024 char buf[22] = { hSock, 0, LOBYTE(remotePort), HIBYTE(remotePort) };
leihen 0:2a179bd4cc02 1025
leihen 0:2a179bd4cc02 1026 memcpy(&buf[4], remoteAddress, 16);
leihen 0:2a179bd4cc02 1027 buf[20] = LOBYTE(length);
leihen 0:2a179bd4cc02 1028 buf[21] = HIBYTE(length);
leihen 0:2a179bd4cc02 1029 INFO("SENDING SOCKET_SEND_TO_MSG");
leihen 0:2a179bd4cc02 1030 SendCommand(SOCKET_SEND_TO_MSG, 22, buf, length, data);
leihen 0:2a179bd4cc02 1031
leihen 0:2a179bd4cc02 1032 if (WaitMessage (SOCKET_SEND_TO_RESPONSE_MSG, 1000)) {
leihen 0:2a179bd4cc02 1033 nRetVal = m_buffer[0] + (((int)m_buffer[1])<<8);
leihen 0:2a179bd4cc02 1034 } else {
leihen 0:2a179bd4cc02 1035 ERR("Did not get expected response after SOCKET_SEND_TO_MSG !");
leihen 0:2a179bd4cc02 1036 }
leihen 0:2a179bd4cc02 1037
leihen 0:2a179bd4cc02 1038 return nRetVal;
leihen 0:2a179bd4cc02 1039 }
leihen 0:2a179bd4cc02 1040
leihen 0:2a179bd4cc02 1041 int Wifi::SocketRecvFrom(SOCKET_HANDLE_t hSock, IPADDRESS_t *remoteAddress, int *port, char *data, int length)
leihen 0:2a179bd4cc02 1042 {
leihen 0:2a179bd4cc02 1043 int nRetVal = -1;
leihen 0:2a179bd4cc02 1044 char buf[4] = { hSock, 0, LOBYTE(length), HIBYTE(length) };
leihen 0:2a179bd4cc02 1045
leihen 0:2a179bd4cc02 1046 INFO("SENDING SOCKET_RECV_FROM_MSG");
leihen 0:2a179bd4cc02 1047 SendCommand(SOCKET_RECV_FROM_MSG, 4, buf);
leihen 0:2a179bd4cc02 1048
leihen 0:2a179bd4cc02 1049 if (WaitMessage (SOCKET_RECV_FROM_RESPONSE_MSG, 1000)) {
leihen 0:2a179bd4cc02 1050 if (port != NULL)
leihen 0:2a179bd4cc02 1051 *port = m_buffer[2] + (((int)m_buffer[3])<<8);
leihen 0:2a179bd4cc02 1052 if (remoteAddress != NULL)
leihen 0:2a179bd4cc02 1053 memcpy(remoteAddress, &m_buffer[4], 4);
leihen 0:2a179bd4cc02 1054 nRetVal = m_buffer[20] + (((int)m_buffer[21])<<8);
leihen 0:2a179bd4cc02 1055
leihen 0:2a179bd4cc02 1056 memcpy(data, &m_buffer[22], nRetVal > length ? length : nRetVal);
leihen 0:2a179bd4cc02 1057 if (nRetVal > length) {
leihen 0:2a179bd4cc02 1058 INFO("Socket received %d bytes on port %d which is more than the %d provided by buffer !", nRetVal, *port, length);
leihen 0:2a179bd4cc02 1059 }
leihen 0:2a179bd4cc02 1060 } else {
leihen 0:2a179bd4cc02 1061 ERR("Did not get expected response after SOCKET_RECV_FROM_MSG !");
leihen 0:2a179bd4cc02 1062 }
leihen 0:2a179bd4cc02 1063
leihen 0:2a179bd4cc02 1064 return nRetVal;
leihen 0:2a179bd4cc02 1065 }
leihen 0:2a179bd4cc02 1066
leihen 0:2a179bd4cc02 1067
leihen 0:2a179bd4cc02 1068 int Wifi::gethostbyname(const char* host, IPADDRESS_t *IpAddress)
leihen 0:2a179bd4cc02 1069 {
leihen 0:2a179bd4cc02 1070 // First issue a get network status message to retrieve the gateway address. The gateway will be used as the DNS.
leihen 0:2a179bd4cc02 1071 IPADDRESS_t GatewayIP;
leihen 0:2a179bd4cc02 1072 NET_STAT_t netStat;
leihen 0:2a179bd4cc02 1073
leihen 0:2a179bd4cc02 1074 if (IpAddress == NULL)
leihen 0:2a179bd4cc02 1075 return -1;
leihen 0:2a179bd4cc02 1076
leihen 0:2a179bd4cc02 1077 // Get the gateway ip address for use as DNS server
leihen 0:2a179bd4cc02 1078 if (!GetNetworkStatus(NULL, NULL, NULL, &GatewayIP, netStat)) {
leihen 0:2a179bd4cc02 1079 return -1;
leihen 0:2a179bd4cc02 1080 }
leihen 0:2a179bd4cc02 1081 INFO("Using gateway on %d.%d.%d.%d as DNS !", GatewayIP.sin_addr.o1, GatewayIP.sin_addr.o2, GatewayIP.sin_addr.o3, GatewayIP.sin_addr.o4);
leihen 0:2a179bd4cc02 1082 // Now create the DNS query
leihen 0:2a179bd4cc02 1083 DnsQuery dns(this, &GatewayIP);
leihen 0:2a179bd4cc02 1084
leihen 0:2a179bd4cc02 1085 if( !dns.gethostbyname(host, *IpAddress) ) {
leihen 0:2a179bd4cc02 1086 ERR("Failed to get host by name !");
leihen 0:2a179bd4cc02 1087 return -1;
leihen 0:2a179bd4cc02 1088 }
leihen 0:2a179bd4cc02 1089
leihen 0:2a179bd4cc02 1090 return 0;
leihen 0:2a179bd4cc02 1091 }
leihen 0:2a179bd4cc02 1092
leihen 0:2a179bd4cc02 1093 int Wifi::convert(const char* hostip, IPADDRESS_t *ipAddress)
leihen 0:2a179bd4cc02 1094 {
leihen 0:2a179bd4cc02 1095 if ((hostip == NULL) || (ipAddress == NULL))
leihen 0:2a179bd4cc02 1096 return -1;
leihen 0:2a179bd4cc02 1097
leihen 0:2a179bd4cc02 1098 int nCnt = 0;
leihen 0:2a179bd4cc02 1099 int val = 0;
leihen 0:2a179bd4cc02 1100 while(*hostip != 0) {
leihen 0:2a179bd4cc02 1101 if (*hostip != '.') {
leihen 0:2a179bd4cc02 1102 val = val*10 + (*hostip)-'0';
leihen 0:2a179bd4cc02 1103 } else {
leihen 0:2a179bd4cc02 1104 if (nCnt > 3)
leihen 0:2a179bd4cc02 1105 return -1;
leihen 0:2a179bd4cc02 1106 ipAddress->sin_addr.o[nCnt++] = val;
leihen 0:2a179bd4cc02 1107 val = 0;
leihen 0:2a179bd4cc02 1108 }
leihen 0:2a179bd4cc02 1109 }
leihen 0:2a179bd4cc02 1110 ipAddress->sin_addr.o[nCnt++] = val;
leihen 0:2a179bd4cc02 1111
leihen 0:2a179bd4cc02 1112 return 0;
leihen 0:2a179bd4cc02 1113 }