ThingPlug Test

Dependents:   WizFi310_ThingPlug_Test WizFi310_ThingPlug_Test_P

Fork of WizFi310Interface by WIZnet

Committer:
kaizen
Date:
Mon Apr 17 06:44:26 2017 +0000
Revision:
4:176b6f3addd6
Parent:
3:dae9a0924a73
Child:
5:72212beb817c
Added TCP Server Function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jehoon 0:df571f8f8c03 1 /* WizFi310 implementation of NetworkInterfaceAPI
jehoon 0:df571f8f8c03 2 * Copyright (c) 2015 ARM Limited
jehoon 0:df571f8f8c03 3 *
jehoon 0:df571f8f8c03 4 * Licensed under the Apache License, Version 2.0 (the "License");
jehoon 0:df571f8f8c03 5 * you may not use this file except in compliance with the License.
jehoon 0:df571f8f8c03 6 * You may obtain a copy of the License at
jehoon 0:df571f8f8c03 7 *
jehoon 0:df571f8f8c03 8 * http://www.apache.org/licenses/LICENSE-2.0
jehoon 0:df571f8f8c03 9 *
jehoon 0:df571f8f8c03 10 * Unless required by applicable law or agreed to in writing, software
jehoon 0:df571f8f8c03 11 * distributed under the License is distributed on an "AS IS" BASIS,
jehoon 0:df571f8f8c03 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
jehoon 0:df571f8f8c03 13 * See the License for the specific language governing permissions and
jehoon 0:df571f8f8c03 14 * limitations under the License.
jehoon 0:df571f8f8c03 15 */
jehoon 0:df571f8f8c03 16
jehoon 0:df571f8f8c03 17
jehoon 0:df571f8f8c03 18 #include "WizFi310Interface.h"
jehoon 0:df571f8f8c03 19
jehoon 0:df571f8f8c03 20 // Various timeouts for different WizFi310 operations
jehoon 0:df571f8f8c03 21 #define WizFi310_CONNECT_TIMEOUT 15000
jehoon 0:df571f8f8c03 22 #define WizFi310_SEND_TIMEOUT 500
jehoon 0:df571f8f8c03 23 #define WizFi310_RECV_TIMEOUT 0
jehoon 0:df571f8f8c03 24 #define WizFi310_MISC_TIMEOUT 500
jehoon 0:df571f8f8c03 25
jehoon 0:df571f8f8c03 26 #define WizFi310_DELAY_MS 300
jehoon 0:df571f8f8c03 27
jehoon 0:df571f8f8c03 28
jehoon 0:df571f8f8c03 29 // WizFi310Interface implementation
jehoon 0:df571f8f8c03 30 WizFi310Interface::WizFi310Interface(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm, int baud)
jehoon 0:df571f8f8c03 31 : _wizfi310(tx, rx, cts, rts, reset, alarm, baud)
jehoon 0:df571f8f8c03 32 {
jehoon 0:df571f8f8c03 33 memset(_ids, 0, sizeof(_ids));
jehoon 0:df571f8f8c03 34 }
jehoon 0:df571f8f8c03 35
jehoon 0:df571f8f8c03 36 int WizFi310Interface::connect(
jehoon 0:df571f8f8c03 37 const char *ssid,
jehoon 0:df571f8f8c03 38 const char *pass,
jehoon 0:df571f8f8c03 39 nsapi_security_t security)
jehoon 0:df571f8f8c03 40 {
jehoon 0:df571f8f8c03 41 if (!_wizfi310.startup())
jehoon 0:df571f8f8c03 42 {
jehoon 0:df571f8f8c03 43 return NSAPI_ERROR_DEVICE_ERROR;
jehoon 0:df571f8f8c03 44 }
jehoon 0:df571f8f8c03 45
jehoon 0:df571f8f8c03 46 _wizfi310.setSsid(ssid);
jehoon 0:df571f8f8c03 47 _wizfi310.setSec(security, pass);
jehoon 0:df571f8f8c03 48 _wizfi310.setAddress("");
jehoon 0:df571f8f8c03 49
jehoon 0:df571f8f8c03 50 if( _wizfi310.join(WizFi310::WM_STATION) == -1)
jehoon 0:df571f8f8c03 51 {
jehoon 0:df571f8f8c03 52 return NSAPI_ERROR_NO_CONNECTION;
jehoon 0:df571f8f8c03 53 }
jehoon 0:df571f8f8c03 54
jehoon 0:df571f8f8c03 55 return 0;
jehoon 0:df571f8f8c03 56 }
jehoon 0:df571f8f8c03 57
stkim92 3:dae9a0924a73 58 int WizFi310Interface::connectAP(
stkim92 3:dae9a0924a73 59 const char *ssid,
stkim92 3:dae9a0924a73 60 const char *pass,
stkim92 3:dae9a0924a73 61 nsapi_security_t security)
stkim92 3:dae9a0924a73 62 {
stkim92 3:dae9a0924a73 63 if (!_wizfi310.startup())
stkim92 3:dae9a0924a73 64 {
stkim92 3:dae9a0924a73 65 return NSAPI_ERROR_DEVICE_ERROR;
stkim92 3:dae9a0924a73 66 }
stkim92 3:dae9a0924a73 67
stkim92 3:dae9a0924a73 68 _wizfi310.setSsid(ssid);
stkim92 3:dae9a0924a73 69 _wizfi310.setSec(security, pass);
stkim92 3:dae9a0924a73 70 //_wizfi310.setAddress("192.168.1.1");
stkim92 3:dae9a0924a73 71 _wizfi310.setAddress("192.168.100.1","255.255.255.0","192.168.100.1");
stkim92 3:dae9a0924a73 72
stkim92 3:dae9a0924a73 73 if( _wizfi310.join(WizFi310::WM_AP) == -1)
stkim92 3:dae9a0924a73 74 {
stkim92 3:dae9a0924a73 75 return NSAPI_ERROR_NO_CONNECTION;
stkim92 3:dae9a0924a73 76 }
stkim92 3:dae9a0924a73 77
stkim92 3:dae9a0924a73 78 return 0;
stkim92 3:dae9a0924a73 79 }
stkim92 3:dae9a0924a73 80
stkim92 3:dae9a0924a73 81
jehoon 0:df571f8f8c03 82 int WizFi310Interface::disconnect()
jehoon 0:df571f8f8c03 83 {
jehoon 0:df571f8f8c03 84 if ( _wizfi310.cmdWLEAVE() == -1 ) return NSAPI_ERROR_DEVICE_ERROR;
jehoon 0:df571f8f8c03 85
jehoon 0:df571f8f8c03 86 return 0;
jehoon 0:df571f8f8c03 87 }
jehoon 0:df571f8f8c03 88
jehoon 0:df571f8f8c03 89 const char *WizFi310Interface::get_ip_address()
jehoon 0:df571f8f8c03 90 {
jehoon 0:df571f8f8c03 91 return _wizfi310.getIPAddress();
jehoon 0:df571f8f8c03 92 }
jehoon 0:df571f8f8c03 93
jehoon 0:df571f8f8c03 94 const char *WizFi310Interface::get_mac_address()
jehoon 0:df571f8f8c03 95 {
jehoon 0:df571f8f8c03 96 return _wizfi310.getMACAddress();
jehoon 0:df571f8f8c03 97 }
jehoon 0:df571f8f8c03 98
jehoon 0:df571f8f8c03 99 struct wizfi310_socket {
jehoon 0:df571f8f8c03 100 int id;
jehoon 0:df571f8f8c03 101 nsapi_protocol_t proto;
jehoon 0:df571f8f8c03 102 bool connected;
kaizen 4:176b6f3addd6 103 uint16_t port;
jehoon 0:df571f8f8c03 104 };
jehoon 0:df571f8f8c03 105
jehoon 0:df571f8f8c03 106 int WizFi310Interface::socket_open(void **handle, nsapi_protocol_t proto)
jehoon 0:df571f8f8c03 107 {
jehoon 0:df571f8f8c03 108 // Look for an unused socket
jehoon 0:df571f8f8c03 109
jehoon 0:df571f8f8c03 110 /*
jehoon 0:df571f8f8c03 111 int id = -1;
jehoon 0:df571f8f8c03 112
jehoon 0:df571f8f8c03 113 for (int i = 0; i < WIZFI310_SOCKET_COUNT; i++) {
jehoon 0:df571f8f8c03 114 if (_ids[i] == false) {
jehoon 0:df571f8f8c03 115 id = i;
jehoon 0:df571f8f8c03 116 _ids[i] = true;
jehoon 0:df571f8f8c03 117 break;
jehoon 0:df571f8f8c03 118 }
jehoon 0:df571f8f8c03 119 }
jehoon 0:df571f8f8c03 120
jehoon 0:df571f8f8c03 121 if (id == -1) {
jehoon 0:df571f8f8c03 122 return NSAPI_ERROR_NO_SOCKET;
jehoon 0:df571f8f8c03 123 }
jehoon 0:df571f8f8c03 124 */
jehoon 0:df571f8f8c03 125
jehoon 0:df571f8f8c03 126 struct wizfi310_socket *socket = new struct wizfi310_socket;
jehoon 0:df571f8f8c03 127 if (!socket) {
jehoon 0:df571f8f8c03 128 return NSAPI_ERROR_NO_SOCKET;
jehoon 0:df571f8f8c03 129 }
jehoon 0:df571f8f8c03 130
jehoon 0:df571f8f8c03 131 socket->id = -1;
jehoon 0:df571f8f8c03 132 socket->proto = proto;
jehoon 0:df571f8f8c03 133 socket->connected = false;
jehoon 0:df571f8f8c03 134 *handle = socket;
jehoon 0:df571f8f8c03 135 return 0;
jehoon 0:df571f8f8c03 136 }
jehoon 0:df571f8f8c03 137
jehoon 0:df571f8f8c03 138 int WizFi310Interface::socket_close(void *handle)
jehoon 0:df571f8f8c03 139 {
jehoon 0:df571f8f8c03 140 struct wizfi310_socket *socket = (struct wizfi310_socket *)handle;
jehoon 0:df571f8f8c03 141 int err = 0;
jehoon 0:df571f8f8c03 142
jehoon 0:df571f8f8c03 143 if(socket->id == -1){
jehoon 0:df571f8f8c03 144 err = NSAPI_ERROR_NO_SOCKET;
jehoon 0:df571f8f8c03 145 }
jehoon 0:df571f8f8c03 146 else if (_wizfi310.close(socket->id) == -1) {
jehoon 0:df571f8f8c03 147 err = NSAPI_ERROR_DEVICE_ERROR;
jehoon 0:df571f8f8c03 148 }
jehoon 0:df571f8f8c03 149
jehoon 0:df571f8f8c03 150 _ids[socket->id] = false;
jehoon 0:df571f8f8c03 151 wait_ms(WizFi310_DELAY_MS);
jehoon 0:df571f8f8c03 152 delete socket;
jehoon 0:df571f8f8c03 153 return err;
jehoon 0:df571f8f8c03 154 }
jehoon 0:df571f8f8c03 155
jehoon 0:df571f8f8c03 156 int WizFi310Interface::socket_bind(void *handle, const SocketAddress &address)
jehoon 0:df571f8f8c03 157 {
kaizen 4:176b6f3addd6 158 struct wizfi310_socket *socket = (struct wizfi310_socket *)handle;
kaizen 4:176b6f3addd6 159 socket->port = address.get_port();
kaizen 4:176b6f3addd6 160
kaizen 4:176b6f3addd6 161 return 0;
jehoon 0:df571f8f8c03 162 }
jehoon 0:df571f8f8c03 163
jehoon 0:df571f8f8c03 164 int WizFi310Interface::socket_listen(void *handle, int backlog)
jehoon 0:df571f8f8c03 165 {
kaizen 4:176b6f3addd6 166 int cid=-1;
kaizen 4:176b6f3addd6 167 struct wizfi310_socket *socket = (struct wizfi310_socket *)handle;
kaizen 4:176b6f3addd6 168
kaizen 4:176b6f3addd6 169 if((cid = _wizfi310.listen(WizFi310::PROTO_TCP, socket->port)) == -1 )
kaizen 4:176b6f3addd6 170 {
kaizen 4:176b6f3addd6 171 return NSAPI_ERROR_DEVICE_ERROR;
kaizen 4:176b6f3addd6 172 }
kaizen 4:176b6f3addd6 173 if(cid >= WIZFI310_SOCKET_COUNT)
kaizen 4:176b6f3addd6 174 {
kaizen 4:176b6f3addd6 175 return NSAPI_ERROR_NO_SOCKET;
kaizen 4:176b6f3addd6 176 }
kaizen 4:176b6f3addd6 177 _ids[cid] = true;
kaizen 4:176b6f3addd6 178 socket->id = cid;
kaizen 4:176b6f3addd6 179 socket->connected = false;
kaizen 4:176b6f3addd6 180 return 0;
jehoon 0:df571f8f8c03 181 }
jehoon 0:df571f8f8c03 182
jehoon 0:df571f8f8c03 183 int WizFi310Interface::socket_connect(void *handle, const SocketAddress &addr)
jehoon 0:df571f8f8c03 184 {
jehoon 0:df571f8f8c03 185 int cid=-1;
jehoon 0:df571f8f8c03 186 struct wizfi310_socket *socket = (struct wizfi310_socket *)handle;
jehoon 0:df571f8f8c03 187
jehoon 0:df571f8f8c03 188 WizFi310::Protocol proto = (socket->proto == NSAPI_UDP) ? WizFi310::PROTO_UDP : WizFi310::PROTO_TCP;
jehoon 0:df571f8f8c03 189 if((cid = _wizfi310.open(proto, addr.get_ip_address(), addr.get_port())) == -1 )
jehoon 0:df571f8f8c03 190 {
jehoon 0:df571f8f8c03 191 return NSAPI_ERROR_DEVICE_ERROR;
jehoon 0:df571f8f8c03 192 }
jehoon 0:df571f8f8c03 193
jehoon 0:df571f8f8c03 194 if(cid >= WIZFI310_SOCKET_COUNT)
jehoon 0:df571f8f8c03 195 {
jehoon 0:df571f8f8c03 196 return NSAPI_ERROR_NO_SOCKET;
jehoon 0:df571f8f8c03 197 }
jehoon 0:df571f8f8c03 198
jehoon 0:df571f8f8c03 199 _ids[cid] = true;
jehoon 0:df571f8f8c03 200 socket->id = cid;
jehoon 0:df571f8f8c03 201 socket->connected = true;
jehoon 0:df571f8f8c03 202 wait_ms(WizFi310_DELAY_MS);
jehoon 0:df571f8f8c03 203 return 0;
jehoon 0:df571f8f8c03 204 }
jehoon 0:df571f8f8c03 205
jehoon 0:df571f8f8c03 206 int WizFi310Interface::socket_accept(void **handle, void *server)
jehoon 0:df571f8f8c03 207 {
kaizen 4:176b6f3addd6 208 struct wizfi310_socket *socket = (struct wizfi310_socket *)server;
kaizen 4:176b6f3addd6 209 struct wizfi310_socket *new_socket = new struct wizfi310_socket;
kaizen 4:176b6f3addd6 210
kaizen 4:176b6f3addd6 211 if( !new_socket )
kaizen 4:176b6f3addd6 212 {
kaizen 4:176b6f3addd6 213 return NSAPI_ERROR_NO_SOCKET;
kaizen 4:176b6f3addd6 214 }
kaizen 4:176b6f3addd6 215
kaizen 4:176b6f3addd6 216 memset(new_socket, 0, sizeof(new_socket));
kaizen 4:176b6f3addd6 217
kaizen 4:176b6f3addd6 218 for(int cid=0; cid<WIZFI310_SOCKET_COUNT; cid++)
kaizen 4:176b6f3addd6 219 {
kaizen 4:176b6f3addd6 220 if( _wizfi310.accept(cid) != -1 )
kaizen 4:176b6f3addd6 221 {
kaizen 4:176b6f3addd6 222 _ids[cid] = true;
kaizen 4:176b6f3addd6 223 new_socket->id = cid;
kaizen 4:176b6f3addd6 224 new_socket->connected = true;
kaizen 4:176b6f3addd6 225
kaizen 4:176b6f3addd6 226 *handle = new_socket;
kaizen 4:176b6f3addd6 227 return 0;
kaizen 4:176b6f3addd6 228 }
kaizen 4:176b6f3addd6 229 }
kaizen 4:176b6f3addd6 230
kaizen 4:176b6f3addd6 231 return NSAPI_ERROR_WOULD_BLOCK;
jehoon 0:df571f8f8c03 232 }
jehoon 0:df571f8f8c03 233
jehoon 0:df571f8f8c03 234 int WizFi310Interface::socket_send(void *handle, const void *data, unsigned size)
jehoon 0:df571f8f8c03 235 {
jehoon 0:df571f8f8c03 236 struct wizfi310_socket *socket = (struct wizfi310_socket *)handle;
jehoon 0:df571f8f8c03 237
jehoon 0:df571f8f8c03 238 if ( _wizfi310.send(socket->id, (const char*)data, size) == -1 ) {
jehoon 0:df571f8f8c03 239 return NSAPI_ERROR_DEVICE_ERROR;
jehoon 0:df571f8f8c03 240 }
jehoon 0:df571f8f8c03 241
jehoon 0:df571f8f8c03 242 return size;
jehoon 0:df571f8f8c03 243 }
jehoon 0:df571f8f8c03 244
jehoon 0:df571f8f8c03 245 int WizFi310Interface::socket_recv(void *handle, void *data, unsigned size)
jehoon 0:df571f8f8c03 246 {
jehoon 0:df571f8f8c03 247 struct wizfi310_socket *socket = (struct wizfi310_socket *)handle;
jehoon 0:df571f8f8c03 248
jehoon 0:df571f8f8c03 249 int32_t recv = _wizfi310.recv(socket->id, (char*)data, size);
kaizen 4:176b6f3addd6 250 if (recv == 0) {
jehoon 0:df571f8f8c03 251 return NSAPI_ERROR_WOULD_BLOCK;
jehoon 0:df571f8f8c03 252 }
kaizen 4:176b6f3addd6 253 else if(recv == -1){
kaizen 4:176b6f3addd6 254 return NSAPI_ERROR_NO_SOCKET;
kaizen 4:176b6f3addd6 255 }
jehoon 0:df571f8f8c03 256
jehoon 0:df571f8f8c03 257 return recv;
jehoon 0:df571f8f8c03 258 }
jehoon 0:df571f8f8c03 259
jehoon 0:df571f8f8c03 260 int WizFi310Interface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
jehoon 0:df571f8f8c03 261 {
jehoon 0:df571f8f8c03 262 struct wizfi310_socket *socket = (struct wizfi310_socket *)handle;
jehoon 0:df571f8f8c03 263 if (!socket->connected) {
jehoon 0:df571f8f8c03 264 int err = socket_connect(socket, addr);
jehoon 0:df571f8f8c03 265 if (err < 0) {
jehoon 0:df571f8f8c03 266 return err;
jehoon 0:df571f8f8c03 267 }
jehoon 0:df571f8f8c03 268 }
jehoon 0:df571f8f8c03 269
jehoon 0:df571f8f8c03 270 return socket_send(socket, data, size);
jehoon 0:df571f8f8c03 271 }
jehoon 0:df571f8f8c03 272
jehoon 0:df571f8f8c03 273 int WizFi310Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
jehoon 0:df571f8f8c03 274 {
jehoon 0:df571f8f8c03 275 struct wizfi310_socket *socket = (struct wizfi310_socket *)handle;
jehoon 0:df571f8f8c03 276 return socket_recv(socket, data, size);
jehoon 0:df571f8f8c03 277 }
jehoon 0:df571f8f8c03 278
jehoon 0:df571f8f8c03 279 void WizFi310Interface::socket_attach(void *handle, void (*callback)(void *), void *data)
jehoon 0:df571f8f8c03 280 {
jehoon 0:df571f8f8c03 281 }