X-NUCLEO-IDW01M1 Wi-Fi expansion board mbed OS 2 ("Classic") library. mbed OS 5 library also available (see below).

Dependencies:   SPWF01SA

Dependents:   SpwfInterface_NSAPI_Testsv2 Nucleo_read_a0_thingspace Nucleo_read_a0_thingspace_mems Cayenne-X-NUCLEO-IDW01M1 ... more

Fork of X_NUCLEO_IDW01M1v2 by ST Expansion SW Team

Introduction

X_NUCLEO_IDW01M1 is a mbed library for the Wi-Fi expansion board X-NUCLEO-IDW01M1 compatible with STM32 Nucleo.

The software can be used for building Wi-Fi applications with the SPWF01SA module. It is an implementation of the NetworkSocketAPI library from mbed OS 2 ("Classic").
mbed OS 5 library can instead be found at this link.

Firmware Library

The X_NUCLEO_IDW01M1 library comes with a sample application (HelloWorld_IDW01M1v2) and a NSAPI test suite application (SpwfInterface_NSAPI_Testsv2).

This library is only supported on NUCLEO platforms and any platforms with Arduino connector. However connection to arduino needs to be done manually using 4 wires for Vdd, Gnd, Rx and Tx. Example applications have more specific details on exact connections to be used.

The features of the library are :

  • Supports mbed OS 2 ("Classic") NetworkSocketAPI
  • Supports both client sockets
  • Configuration of USART pins to be used

Class SpwfSAInterface is intended to represent the X-NUCLEO-IDW01M1 expansion board with the SPWF module.

The expansion board is basically featuring the component:

  1. a SPWF01SA Serial-to-Wi-Fi module

Example Applications

NSAPI Test Suite

Committer:
mapellil
Date:
Tue Jan 10 10:39:56 2017 +0000
Revision:
15:0a075334e0e9
Parent:
14:4ec13009341c
Child:
16:c8697141ce44
Renamed set_un/secure_socket() API

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 0:907910bfb0b5 1 /* mbed Microcontroller Library
mridup 0:907910bfb0b5 2 * Copyright (c) 20015 ARM Limited
mridup 0:907910bfb0b5 3 *
mridup 0:907910bfb0b5 4 * Licensed under the Apache License, Version 2.0 (the "License");
mridup 0:907910bfb0b5 5 * you may not use this file except in compliance with the License.
mridup 0:907910bfb0b5 6 * You may obtain a copy of the License at
mridup 0:907910bfb0b5 7 *
mridup 0:907910bfb0b5 8 * http://www.apache.org/licenses/LICENSE-2.0
mridup 0:907910bfb0b5 9 *
mridup 0:907910bfb0b5 10 * Unless required by applicable law or agreed to in writing, software
mridup 0:907910bfb0b5 11 * distributed under the License is distributed on an "AS IS" BASIS,
mridup 0:907910bfb0b5 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mridup 0:907910bfb0b5 13 * See the License for the specific language governing permissions and
mridup 0:907910bfb0b5 14 * limitations under the License.
mridup 0:907910bfb0b5 15 */
mridup 0:907910bfb0b5 16
mridup 0:907910bfb0b5 17 /**
mridup 0:907910bfb0b5 18 ******************************************************************************
mridup 0:907910bfb0b5 19 * @file SpwfInterface.cpp
mridup 0:907910bfb0b5 20 * @author STMicroelectronics
mridup 0:907910bfb0b5 21 * @brief Implementation of the NetworkStack for the SPWF Device
mridup 0:907910bfb0b5 22 ******************************************************************************
mridup 0:907910bfb0b5 23 * @copy
mridup 0:907910bfb0b5 24 *
mridup 0:907910bfb0b5 25 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
mridup 0:907910bfb0b5 26 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
mridup 0:907910bfb0b5 27 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
mridup 0:907910bfb0b5 28 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
mridup 0:907910bfb0b5 29 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
mridup 0:907910bfb0b5 30 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
mridup 0:907910bfb0b5 31 *
mridup 0:907910bfb0b5 32 * <h2><center>&copy; COPYRIGHT 2016 STMicroelectronics</center></h2>
mridup 0:907910bfb0b5 33 ******************************************************************************
mridup 0:907910bfb0b5 34 */
mridup 0:907910bfb0b5 35
mridup 0:907910bfb0b5 36 #include "SpwfInterface.h"
mridup 0:907910bfb0b5 37
mridup 0:907910bfb0b5 38 // Various timeouts for different SPWF operations
mridup 0:907910bfb0b5 39 #define SPWF_CONNECT_TIMEOUT 20000
mridup 0:907910bfb0b5 40 #define SPWF_SEND_TIMEOUT 500
mridup 9:4cd89586b370 41 #define SPWF_RECV_TIMEOUT 500
mridup 0:907910bfb0b5 42 #define SPWF_MISC_TIMEOUT 15000
mridup 0:907910bfb0b5 43
mridup 0:907910bfb0b5 44 /** spwf_socket class
mridup 0:907910bfb0b5 45 * Implementation of SPWF socket structure
mridup 0:907910bfb0b5 46 */
mridup 0:907910bfb0b5 47 struct spwf_socket {
mridup 0:907910bfb0b5 48 int id;
mridup 0:907910bfb0b5 49 int server_port;
mridup 0:907910bfb0b5 50 nsapi_protocol_t proto;
mridup 0:907910bfb0b5 51 bool connected;
mapellil 14:4ec13009341c 52 bool secure;
mridup 0:907910bfb0b5 53 };
mridup 0:907910bfb0b5 54
mridup 0:907910bfb0b5 55
mridup 0:907910bfb0b5 56 /**
mridup 0:907910bfb0b5 57 * @brief SpwfSAInterface constructor
mridup 0:907910bfb0b5 58 * @param tx: Pin USART TX
mridup 0:907910bfb0b5 59 * rx: Pin USART RX
mridup 0:907910bfb0b5 60 * rst: reset pin for Spwf module
mridup 0:907910bfb0b5 61 * wkup: reset pin for Spwf module
mridup 0:907910bfb0b5 62 * rts: Pin USART RTS
mridup 0:907910bfb0b5 63 * debug : not used
mridup 0:907910bfb0b5 64 * @retval none
mridup 0:907910bfb0b5 65 */
mapellil 13:0368732b5b9d 66 SpwfSAInterface::SpwfSAInterface(PinName tx, PinName rx, bool debug)
mapellil 13:0368732b5b9d 67 : _spwf(tx, rx, PC_12, PC_8, debug)
mapellil 13:0368732b5b9d 68 {
mapellil 13:0368732b5b9d 69 memset(_ids, 0, sizeof(_ids));
mapellil 13:0368732b5b9d 70 isInitialized = false;
mapellil 14:4ec13009341c 71 isListening = false;
mapellil 14:4ec13009341c 72 isSecure = false;
mapellil 13:0368732b5b9d 73 }
mapellil 13:0368732b5b9d 74
mapellil 13:0368732b5b9d 75 SpwfSAInterface::SpwfSAInterface(PinName tx, PinName rx, PinName reset, PinName wakeup, bool debug)
mapellil 13:0368732b5b9d 76 : _spwf(tx, rx, reset, wakeup, debug)
mridup 0:907910bfb0b5 77 {
mridup 0:907910bfb0b5 78 memset(_ids, 0, sizeof(_ids));
mridup 0:907910bfb0b5 79 isInitialized = false;
mridup 0:907910bfb0b5 80 isListening = false;
mapellil 14:4ec13009341c 81 isSecure = false;
mapellil 13:0368732b5b9d 82 }
mridup 0:907910bfb0b5 83
mridup 0:907910bfb0b5 84 /**
mridup 0:907910bfb0b5 85 * @brief SpwfSAInterface destructor
mridup 0:907910bfb0b5 86 * @param none
mridup 0:907910bfb0b5 87 * @retval none
mridup 0:907910bfb0b5 88 */
mridup 0:907910bfb0b5 89 SpwfSAInterface::~SpwfSAInterface()
mridup 0:907910bfb0b5 90 {
mridup 0:907910bfb0b5 91 }
mridup 0:907910bfb0b5 92
mridup 0:907910bfb0b5 93 /**
mridup 0:907910bfb0b5 94 * @brief init function
mridup 0:907910bfb0b5 95 initializes SPWF FW and module
mridup 0:907910bfb0b5 96 * @param none
mridup 0:907910bfb0b5 97 * @retval error value
mridup 0:907910bfb0b5 98 */
mridup 0:907910bfb0b5 99 int SpwfSAInterface::init(void)
mridup 0:907910bfb0b5 100 {
mridup 1:fd7b3df18dd7 101 if(_spwf.startup(0)) {
mridup 1:fd7b3df18dd7 102 isInitialized=true;
mridup 1:fd7b3df18dd7 103 return true;
mridup 1:fd7b3df18dd7 104 }
mridup 1:fd7b3df18dd7 105 else return NSAPI_ERROR_DEVICE_ERROR;
mridup 0:907910bfb0b5 106 }
mridup 0:907910bfb0b5 107
mridup 0:907910bfb0b5 108 /**
mridup 0:907910bfb0b5 109 * @brief network connect
mridup 0:907910bfb0b5 110 connects to Access Point
mridup 0:907910bfb0b5 111 * @param ap: Access Point (AP) Name String
mridup 0:907910bfb0b5 112 * pass_phrase: Password String for AP
mridup 0:907910bfb0b5 113 * security: type of NSAPI security supported
mridup 0:907910bfb0b5 114 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 115 */
mridup 0:907910bfb0b5 116 int SpwfSAInterface::connect(const char *ap,
mridup 0:907910bfb0b5 117 const char *pass_phrase,
mridup 0:907910bfb0b5 118 nsapi_security_t security)
mridup 0:907910bfb0b5 119 {
mridup 0:907910bfb0b5 120 int mode;
mridup 0:907910bfb0b5 121
mridup 0:907910bfb0b5 122 //initialize the device before connecting
mridup 0:907910bfb0b5 123 if(!isInitialized)
mridup 0:907910bfb0b5 124 {
mridup 1:fd7b3df18dd7 125 if(!init())
mridup 1:fd7b3df18dd7 126 return NSAPI_ERROR_DEVICE_ERROR;
mridup 0:907910bfb0b5 127 }
mapellil 13:0368732b5b9d 128
mridup 0:907910bfb0b5 129 switch(security)
mridup 0:907910bfb0b5 130 {
mridup 0:907910bfb0b5 131 case NSAPI_SECURITY_NONE:
mridup 0:907910bfb0b5 132 mode = 0;
mridup 0:907910bfb0b5 133 pass_phrase = NULL;
mridup 0:907910bfb0b5 134 break;
mridup 0:907910bfb0b5 135 case NSAPI_SECURITY_WEP:
mridup 0:907910bfb0b5 136 mode = 1;
mridup 0:907910bfb0b5 137 break;
mridup 0:907910bfb0b5 138 case NSAPI_SECURITY_WPA:
mridup 0:907910bfb0b5 139 case NSAPI_SECURITY_WPA2:
mridup 0:907910bfb0b5 140 mode = 2;
mridup 0:907910bfb0b5 141 break;
mridup 0:907910bfb0b5 142 default:
mridup 0:907910bfb0b5 143 mode = 2;
mridup 0:907910bfb0b5 144 break;
mridup 0:907910bfb0b5 145 }
mridup 0:907910bfb0b5 146 return (_spwf.connect((char*)ap, (char*)pass_phrase, mode));
mridup 0:907910bfb0b5 147 }
mridup 0:907910bfb0b5 148
mridup 0:907910bfb0b5 149 /**
mridup 0:907910bfb0b5 150 * @brief network disconnect
mridup 0:907910bfb0b5 151 disconnects from Access Point
mridup 0:907910bfb0b5 152 * @param none
mridup 0:907910bfb0b5 153 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 154 */
mridup 0:907910bfb0b5 155 int SpwfSAInterface::disconnect()
mridup 0:907910bfb0b5 156 {
mridup 0:907910bfb0b5 157 return (_spwf.disconnect());
mridup 0:907910bfb0b5 158 }
mridup 0:907910bfb0b5 159
mapellil 14:4ec13009341c 160 /**
mapellil 14:4ec13009341c 161 * @brief set UTC time on wifi module
mapellil 14:4ec13009341c 162 * @param time since epoch in UTC format
mapellil 14:4ec13009341c 163 * @retval true on succes
mapellil 14:4ec13009341c 164 */
mapellil 14:4ec13009341c 165 int SpwfSAInterface::set_time(time_t ctTime)
mapellil 14:4ec13009341c 166 {
mapellil 14:4ec13009341c 167 return (_spwf.settime(ctTime));
mapellil 14:4ec13009341c 168 }
mapellil 14:4ec13009341c 169
mapellil 14:4ec13009341c 170 int SpwfSAInterface::set_TLS_certificate(char *cert, unsigned int size, CertType_t type)
mapellil 14:4ec13009341c 171 {
mapellil 14:4ec13009341c 172 return (_spwf.setTLScertificate(cert, size, type));
mapellil 14:4ec13009341c 173 }
mapellil 14:4ec13009341c 174
mapellil 14:4ec13009341c 175 int SpwfSAInterface::set_TLS_SRV_domain(char *domain, CertType_t type)
mapellil 14:4ec13009341c 176 {
mapellil 14:4ec13009341c 177 return (_spwf.setTLSSRVdomain(domain, type));
mapellil 14:4ec13009341c 178 }
mapellil 14:4ec13009341c 179
mapellil 14:4ec13009341c 180 int SpwfSAInterface::clean_TLS_certificate(CertType_t type)
mapellil 14:4ec13009341c 181 {
mapellil 14:4ec13009341c 182 return (_spwf.cleanTLScertificate(type));
mapellil 14:4ec13009341c 183 }
mapellil 14:4ec13009341c 184
mridup 0:907910bfb0b5 185 /**
mridup 0:907910bfb0b5 186 * @brief Get the local IP address
mridup 0:907910bfb0b5 187 * @param none
mridup 0:907910bfb0b5 188 * @retval Null-terminated representation of the local IP address
mridup 0:907910bfb0b5 189 * or null if not yet connected
mridup 0:907910bfb0b5 190 */
mridup 0:907910bfb0b5 191 const char *SpwfSAInterface::get_ip_address()
mridup 0:907910bfb0b5 192 {
mridup 0:907910bfb0b5 193 return _spwf.getIPAddress();
mridup 0:907910bfb0b5 194 }
mridup 0:907910bfb0b5 195
mridup 0:907910bfb0b5 196 /**
mridup 0:907910bfb0b5 197 * @brief Get the MAC address
mridup 0:907910bfb0b5 198 * @param none
mridup 0:907910bfb0b5 199 * @retval Null-terminated representation of the MAC address
mridup 0:907910bfb0b5 200 * or null if not yet connected
mridup 0:907910bfb0b5 201 */
mridup 0:907910bfb0b5 202 const char *SpwfSAInterface::get_mac_address()
mridup 0:907910bfb0b5 203 {
mridup 0:907910bfb0b5 204 return _spwf.getMACAddress();
mridup 0:907910bfb0b5 205 }
mridup 0:907910bfb0b5 206
mridup 0:907910bfb0b5 207 /**
mridup 0:907910bfb0b5 208 * @brief open a socket handle
mridup 0:907910bfb0b5 209 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 210 * proto: TCP/UDP protocol
mridup 0:907910bfb0b5 211 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 212 */
mridup 0:907910bfb0b5 213 int SpwfSAInterface::socket_open(void **handle, nsapi_protocol_t proto)
mridup 0:907910bfb0b5 214 {
mridup 0:907910bfb0b5 215 int id = -1;
mridup 0:907910bfb0b5 216
mapellil 13:0368732b5b9d 217 struct spwf_socket *socket = new struct spwf_socket;
mridup 0:907910bfb0b5 218 if (!socket) {
mridup 0:907910bfb0b5 219 return NSAPI_ERROR_NO_SOCKET;
mridup 0:907910bfb0b5 220 }
mridup 0:907910bfb0b5 221
mridup 0:907910bfb0b5 222 socket->id = id;
mridup 0:907910bfb0b5 223 socket->server_port = id;
mridup 0:907910bfb0b5 224 socket->proto = proto;
mridup 0:907910bfb0b5 225 socket->connected = false;
mapellil 14:4ec13009341c 226 if (isSecure_socket()) socket->secure = true;
mapellil 14:4ec13009341c 227 else socket->secure = false;
mridup 0:907910bfb0b5 228 *handle = socket;
mridup 0:907910bfb0b5 229 return 0;
mridup 0:907910bfb0b5 230 }
mridup 0:907910bfb0b5 231
mridup 0:907910bfb0b5 232 /**
mapellil 14:4ec13009341c 233 * @brief set secure mode for all the subsequently created sockets
mapellil 14:4ec13009341c 234 * @param none
mapellil 14:4ec13009341c 235 * @retval void
mapellil 14:4ec13009341c 236 */
mapellil 15:0a075334e0e9 237 void SpwfSAInterface::set_secure_mode(void)
mapellil 14:4ec13009341c 238 {
mapellil 14:4ec13009341c 239 isSecure = true;
mapellil 14:4ec13009341c 240 }
mapellil 14:4ec13009341c 241
mapellil 14:4ec13009341c 242 /**
mapellil 14:4ec13009341c 243 * @brief set unsecure mode for all the subsequently created sockets
mapellil 14:4ec13009341c 244 * @param none
mapellil 14:4ec13009341c 245 * @retval void
mapellil 14:4ec13009341c 246 */
mapellil 15:0a075334e0e9 247 void SpwfSAInterface::set_unsecure_mode(void)
mapellil 14:4ec13009341c 248 {
mapellil 14:4ec13009341c 249 isSecure = false;
mapellil 14:4ec13009341c 250 }
mapellil 14:4ec13009341c 251
mapellil 14:4ec13009341c 252 /**
mapellil 14:4ec13009341c 253 * @brief Return the interface security mode set
mapellil 14:4ec13009341c 254 * @param none
mapellil 14:4ec13009341c 255 * @retval true if secure
mapellil 14:4ec13009341c 256 */
mapellil 14:4ec13009341c 257 bool SpwfSAInterface::isSecure_socket(void)
mapellil 14:4ec13009341c 258 {
mapellil 14:4ec13009341c 259 return isSecure;
mapellil 14:4ec13009341c 260 }
mapellil 14:4ec13009341c 261
mapellil 14:4ec13009341c 262 /**
mridup 0:907910bfb0b5 263 * @brief connect to a remote socket
mridup 0:907910bfb0b5 264 * @param handle: Pointer to socket handle
mridup 0:907910bfb0b5 265 * addr: Address to connect to
mridup 0:907910bfb0b5 266 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 267 */
mridup 0:907910bfb0b5 268 int SpwfSAInterface::socket_connect(void *handle, const SocketAddress &addr)
mridup 0:907910bfb0b5 269 {
mapellil 14:4ec13009341c 270 // int sock_id = 99;
mapellil 14:4ec13009341c 271 int sock_id = -1;
mapellil 14:4ec13009341c 272 const char* proto;
mridup 0:907910bfb0b5 273 struct spwf_socket *socket = (struct spwf_socket *)handle;
mapellil 14:4ec13009341c 274 if (socket->secure)
mapellil 14:4ec13009341c 275 proto="s";
mapellil 14:4ec13009341c 276 else
mapellil 14:4ec13009341c 277 proto=(socket->proto == NSAPI_UDP) ? "u" : "t";
mridup 0:907910bfb0b5 278
mapellil 14:4ec13009341c 279 if (!_spwf.open(proto, &sock_id, addr.get_ip_address(), addr.get_port())) {//sock ID is allocated NOW
mridup 1:fd7b3df18dd7 280 return NSAPI_ERROR_DEVICE_ERROR;
mridup 1:fd7b3df18dd7 281 }
mridup 0:907910bfb0b5 282
mridup 0:907910bfb0b5 283 //TODO: Maintain a socket table to map socket ID to host & port
mridup 0:907910bfb0b5 284 //TODO: lookup on client table to see if already socket is allocated to same host/port
mridup 0:907910bfb0b5 285 //multimap <char *, vector <uint16_t> > ::iterator i = c_table.find((char*)ip);
mridup 0:907910bfb0b5 286
mridup 0:907910bfb0b5 287 if(sock_id <= SPWFSA_SOCKET_COUNT)
mridup 0:907910bfb0b5 288 {
mridup 0:907910bfb0b5 289 socket->id = sock_id;//the socket ID of this Socket instance
mridup 0:907910bfb0b5 290 _ids[socket->id] = true;
mridup 0:907910bfb0b5 291 socket->connected = true;
mridup 0:907910bfb0b5 292 }
mridup 0:907910bfb0b5 293 else
mridup 0:907910bfb0b5 294 return NSAPI_ERROR_NO_SOCKET;
mridup 0:907910bfb0b5 295
mridup 0:907910bfb0b5 296 return 0;
mridup 0:907910bfb0b5 297 }
mridup 0:907910bfb0b5 298
mridup 0:907910bfb0b5 299 /**
mridup 0:907910bfb0b5 300 * @brief bind to a port number and address
mridup 0:907910bfb0b5 301 * @param handle: Pointer to socket handle
mridup 0:907910bfb0b5 302 * proto: address to bind to
mridup 0:907910bfb0b5 303 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 304 */
mridup 0:907910bfb0b5 305 int SpwfSAInterface::socket_bind(void *handle, const SocketAddress &address)
mridup 0:907910bfb0b5 306 {
mridup 0:907910bfb0b5 307 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:907910bfb0b5 308 socket->server_port = address.get_port();
mridup 0:907910bfb0b5 309 return 0;
mridup 0:907910bfb0b5 310 }
mridup 0:907910bfb0b5 311
mridup 0:907910bfb0b5 312 /**
mridup 0:907910bfb0b5 313 * @brief start listening on a port and address
mridup 0:907910bfb0b5 314 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 315 * backlog: not used (always value is 1)
mridup 0:907910bfb0b5 316 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 317 */
mridup 0:907910bfb0b5 318 int SpwfSAInterface::socket_listen(void *handle, int backlog)
mridup 0:907910bfb0b5 319 {
mridup 0:907910bfb0b5 320 return NSAPI_ERROR_UNSUPPORTED;
mridup 0:907910bfb0b5 321 }
mridup 0:907910bfb0b5 322
mridup 0:907910bfb0b5 323 /**
mridup 0:907910bfb0b5 324 * @brief accept connections from remote sockets
mridup 0:907910bfb0b5 325 * @param handle: Pointer to handle of client socket (connecting)
mridup 0:907910bfb0b5 326 * proto: handle of server socket which will accept connections
mridup 0:907910bfb0b5 327 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 328 */
mridup 0:907910bfb0b5 329 int SpwfSAInterface::socket_accept(void **handle, void *server)
mridup 0:907910bfb0b5 330 {
mridup 0:907910bfb0b5 331 return NSAPI_ERROR_UNSUPPORTED;
mridup 0:907910bfb0b5 332 }
mridup 0:907910bfb0b5 333
mridup 0:907910bfb0b5 334 /**
mridup 0:907910bfb0b5 335 * @brief close a socket
mridup 0:907910bfb0b5 336 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 337 * @retval NSAPI Error Type
mridup 0:907910bfb0b5 338 */
mridup 0:907910bfb0b5 339 int SpwfSAInterface::socket_close(void *handle)
mridup 0:907910bfb0b5 340 {
mridup 0:907910bfb0b5 341 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:907910bfb0b5 342 int err = 0;
mridup 0:907910bfb0b5 343
mridup 0:907910bfb0b5 344 if(socket->id!=-1)
mridup 0:907910bfb0b5 345 {
mridup 1:fd7b3df18dd7 346 if (_spwf.close(socket->id)) {
mridup 1:fd7b3df18dd7 347 if(socket->id==SERVER_SOCKET_NO)
mridup 1:fd7b3df18dd7 348 isListening = false;
mridup 1:fd7b3df18dd7 349 else
mridup 1:fd7b3df18dd7 350 _ids[socket->id] = false;
mridup 0:907910bfb0b5 351 }
mridup 1:fd7b3df18dd7 352 else err = NSAPI_ERROR_DEVICE_ERROR;
mridup 0:907910bfb0b5 353 }
mridup 0:907910bfb0b5 354
mridup 0:907910bfb0b5 355 delete socket;
mridup 0:907910bfb0b5 356 return err;
mridup 0:907910bfb0b5 357 }
mridup 0:907910bfb0b5 358
mridup 0:907910bfb0b5 359 /**
mridup 0:907910bfb0b5 360 * @brief write to a socket
mridup 0:907910bfb0b5 361 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 362 * data: pointer to data
mridup 0:907910bfb0b5 363 * size: size of data
mridup 0:907910bfb0b5 364 * @retval no of bytes sent
mridup 0:907910bfb0b5 365 */
mridup 0:907910bfb0b5 366 int SpwfSAInterface::socket_send(void *handle, const void *data, unsigned size)
mridup 0:907910bfb0b5 367 {
mridup 0:907910bfb0b5 368 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 3:4c2cbca19031 369 //int err;
mridup 0:907910bfb0b5 370
mridup 1:fd7b3df18dd7 371 /*if(socket->id==SERVER_SOCKET_NO)
mridup 0:907910bfb0b5 372 {
mridup 0:907910bfb0b5 373 if(socket->server_port==-1 || !isListening)
mridup 0:907910bfb0b5 374 return NSAPI_ERROR_NO_SOCKET; //server socket not bound or not listening
mridup 0:907910bfb0b5 375
mridup 1:fd7b3df18dd7 376 err = _spwf.socket_server_write((uint16_t)size, (char*)data);
mridup 0:907910bfb0b5 377 }
mridup 0:907910bfb0b5 378 else
mridup 3:4c2cbca19031 379 {
mridup 1:fd7b3df18dd7 380 err = _spwf.send(socket->id, (char*)data, (uint32_t)size);
mridup 3:4c2cbca19031 381 }*/
mridup 3:4c2cbca19031 382 if (!_spwf.send(socket->id, (char*)data, (uint32_t)size)) {
mridup 3:4c2cbca19031 383 return NSAPI_ERROR_DEVICE_ERROR;
mridup 3:4c2cbca19031 384 }
mridup 3:4c2cbca19031 385
mridup 3:4c2cbca19031 386 return size;
mridup 0:907910bfb0b5 387 }
mridup 0:907910bfb0b5 388
mridup 0:907910bfb0b5 389 /**
mridup 0:907910bfb0b5 390 * @brief receive data on a socket
mridup 0:907910bfb0b5 391 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 392 * data: pointer to data
mridup 0:907910bfb0b5 393 * size: size of data
mridup 0:907910bfb0b5 394 * @retval no of bytes read
mridup 0:907910bfb0b5 395 */
mridup 0:907910bfb0b5 396 int SpwfSAInterface::socket_recv(void *handle, void *data, unsigned size)
mridup 0:907910bfb0b5 397 {
mridup 0:907910bfb0b5 398 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:907910bfb0b5 399 int32_t recv;
mridup 0:907910bfb0b5 400
mridup 0:907910bfb0b5 401 //CHECK:Receive for both Client and Server Sockets same?
mridup 1:fd7b3df18dd7 402 recv = _spwf.recv(socket->id, (char*)data, (uint32_t)size);
mridup 1:fd7b3df18dd7 403 if (recv < 0) {
mridup 5:8ee8698d19e3 404 //wait_ms(1);//delay of 1ms <for F4>??
mridup 5:8ee8698d19e3 405 //printf(".");
mridup 5:8ee8698d19e3 406 if (recv == -1) return NSAPI_ERROR_WOULD_BLOCK;//send this if we want to block call (else timeout will happen)
mapellil 13:0368732b5b9d 407 else if (recv == -2)return NSAPI_ERROR_DEVICE_ERROR;
mapellil 13:0368732b5b9d 408 else if (recv == -3)return NSAPI_ERROR_NO_CONNECTION;
mridup 1:fd7b3df18dd7 409 }
mapellil 13:0368732b5b9d 410 return recv;
mridup 0:907910bfb0b5 411 }
mridup 0:907910bfb0b5 412
mridup 0:907910bfb0b5 413 /**
mridup 0:907910bfb0b5 414 * @brief send data to a udp socket
mridup 0:907910bfb0b5 415 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 416 * addr: address of udp socket
mridup 0:907910bfb0b5 417 * data: pointer to data
mridup 0:907910bfb0b5 418 * size: size of data
mridup 0:907910bfb0b5 419 * @retval no of bytes sent
mridup 0:907910bfb0b5 420 */
mridup 0:907910bfb0b5 421 int SpwfSAInterface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
mridup 0:907910bfb0b5 422 {
mridup 0:907910bfb0b5 423 struct spwf_socket *socket = (struct spwf_socket *)handle;
mapellil 13:0368732b5b9d 424 if (!socket->connected) {
mridup 0:907910bfb0b5 425 int err = socket_connect(socket, addr);
mridup 0:907910bfb0b5 426 if (err < 0) {
mridup 0:907910bfb0b5 427 return err;
mridup 0:907910bfb0b5 428 }
mridup 0:907910bfb0b5 429 }
mridup 0:907910bfb0b5 430
mridup 0:907910bfb0b5 431 return socket_send(socket, data, size);
mridup 0:907910bfb0b5 432 }
mridup 0:907910bfb0b5 433
mridup 0:907910bfb0b5 434 /**
mridup 0:907910bfb0b5 435 * @brief receive data on a udp socket
mridup 0:907910bfb0b5 436 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 437 * addr: address of udp socket
mridup 0:907910bfb0b5 438 * data: pointer to data
mridup 0:907910bfb0b5 439 * size: size of data
mridup 0:907910bfb0b5 440 * @retval no of bytes read
mridup 0:907910bfb0b5 441 */
mridup 0:907910bfb0b5 442 int SpwfSAInterface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
mridup 0:907910bfb0b5 443 {
mridup 0:907910bfb0b5 444 struct spwf_socket *socket = (struct spwf_socket *)handle;
mridup 0:907910bfb0b5 445 return socket_recv(socket, data, size);
mridup 0:907910bfb0b5 446 }
mridup 0:907910bfb0b5 447
mridup 0:907910bfb0b5 448 /**
mridup 0:907910bfb0b5 449 * @brief attach function/callback to the socket
mridup 0:907910bfb0b5 450 * Not used
mridup 0:907910bfb0b5 451 * @param handle: Pointer to handle
mridup 0:907910bfb0b5 452 * callback: callback function pointer
mridup 0:907910bfb0b5 453 * data: pointer to data
mridup 0:907910bfb0b5 454 * @retval none
mridup 0:907910bfb0b5 455 */
mridup 0:907910bfb0b5 456 void SpwfSAInterface::socket_attach(void *handle, void (*callback)(void *), void *data)
mridup 0:907910bfb0b5 457 {
mridup 0:907910bfb0b5 458 //No implementation yet
mridup 0:907910bfb0b5 459 }
mridup 0:907910bfb0b5 460
mridup 0:907910bfb0b5 461 /**
mridup 0:907910bfb0b5 462 * @brief utility debug function for printing to serial terminal
mridup 0:907910bfb0b5 463 * @param string: Pointer to data
mridup 0:907910bfb0b5 464 * @retval none
mridup 0:907910bfb0b5 465 */
mridup 0:907910bfb0b5 466 void SpwfSAInterface::debug(const char * string)
mridup 0:907910bfb0b5 467 {
mridup 0:907910bfb0b5 468 //_spwf.debug_print(string);
mridup 0:907910bfb0b5 469 }
mapellil 13:0368732b5b9d 470
mapellil 13:0368732b5b9d 471 /**
mapellil 13:0368732b5b9d 472 * @brief Set the socket options
mapellil 13:0368732b5b9d 473 * Not used
mapellil 13:0368732b5b9d 474 * @param handle: Pointer to handle
mapellil 13:0368732b5b9d 475 * level: SOL_SOCKET
mapellil 13:0368732b5b9d 476 * optname: option name
mapellil 13:0368732b5b9d 477 * optval: pointer to option value
mapellil 13:0368732b5b9d 478 * optlen: option length
mapellil 13:0368732b5b9d 479 @retval NSAPI Error Type
mapellil 13:0368732b5b9d 480 */
mapellil 13:0368732b5b9d 481 int SpwfSAInterface::setsockopt(void *handle, int level, int optname, const void *optval, unsigned optlen)
mapellil 13:0368732b5b9d 482 {
mapellil 13:0368732b5b9d 483 // struct spwf_socket *socket = (struct spwf_socket *)handle;
mapellil 13:0368732b5b9d 484
mapellil 13:0368732b5b9d 485 switch (optname) {
mapellil 13:0368732b5b9d 486 case NSAPI_REUSEADDR: /*!< Allow bind to reuse local addresses */
mapellil 13:0368732b5b9d 487 case NSAPI_KEEPALIVE: /*!< Enables sending of keepalive messages */
mapellil 13:0368732b5b9d 488 case NSAPI_LINGER: /*!< Keeps close from returning until queues empty */
mapellil 13:0368732b5b9d 489 case NSAPI_SNDBUF: /*!< Sets send buffer size */
mapellil 13:0368732b5b9d 490 case NSAPI_RCVBUF: /*!< Sets recv buffer size */
mapellil 13:0368732b5b9d 491 default:
mapellil 13:0368732b5b9d 492 printf("SpwfSAInterface::setsockopt> ERROR!!!! Unknown optname: %d \r\n", optname);
mapellil 13:0368732b5b9d 493 return -1;
mapellil 13:0368732b5b9d 494 }
mapellil 13:0368732b5b9d 495 return NSAPI_ERROR_UNSUPPORTED;
mapellil 13:0368732b5b9d 496 }
mapellil 13:0368732b5b9d 497
mapellil 13:0368732b5b9d 498 /**
mapellil 13:0368732b5b9d 499 * @brief Get the socket options
mapellil 13:0368732b5b9d 500 * Not used
mapellil 13:0368732b5b9d 501 * @param handle: Pointer to handle
mapellil 13:0368732b5b9d 502 * level: SOL_SOCKET
mapellil 13:0368732b5b9d 503 * optname: option name
mapellil 13:0368732b5b9d 504 * optval: pointer to option value
mapellil 13:0368732b5b9d 505 * optlen: pointer to option length
mapellil 13:0368732b5b9d 506 @retval NSAPI Error Type
mapellil 13:0368732b5b9d 507 */
mapellil 13:0368732b5b9d 508 int SpwfSAInterface::getsockopt(void *handle, int level, int optname, void *optval, unsigned *optlen)
mapellil 13:0368732b5b9d 509 {
mapellil 13:0368732b5b9d 510 return NSAPI_ERROR_UNSUPPORTED;
mapellil 13:0368732b5b9d 511 }