This library can be used in mbed driver or mbed OS2. So If you want to use WizFi310 on mbed OS5, You have to use another WizFi310 library(wizfi310-driver). That is git repository for wizfi310-driver. - https://github.com/ARMmbed/wizfi310-driver

Dependents:   KT_IoTMakers_WizFi310_Example WizFi310_STATION_HelloWorld WizFi310_DNS_TCP_HelloWorld WizFi310_Ubidots ... more

This library can be used in mbed driver or mbed OS2. So If you want to use WizFi310 on mbed OS5, You have to use another WizFi310 library(wizfi310-driver).

That is git repository for wizfi310-driver. - https://github.com/ARMmbed/wizfi310-driver

Committer:
kaizen
Date:
Mon Apr 10 09:54:34 2017 +0000
Revision:
2:04c8d61984a3
Parent:
1:16e57103a7dd
Child:
3:dae9a0924a73
Modified Socket Blocking Problem

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
jehoon 0:df571f8f8c03 58 int WizFi310Interface::disconnect()
jehoon 0:df571f8f8c03 59 {
jehoon 0:df571f8f8c03 60 if ( _wizfi310.cmdWLEAVE() == -1 ) return NSAPI_ERROR_DEVICE_ERROR;
jehoon 0:df571f8f8c03 61
jehoon 0:df571f8f8c03 62 return 0;
jehoon 0:df571f8f8c03 63 }
jehoon 0:df571f8f8c03 64
jehoon 0:df571f8f8c03 65 const char *WizFi310Interface::get_ip_address()
jehoon 0:df571f8f8c03 66 {
jehoon 0:df571f8f8c03 67 return _wizfi310.getIPAddress();
jehoon 0:df571f8f8c03 68 }
jehoon 0:df571f8f8c03 69
jehoon 0:df571f8f8c03 70 const char *WizFi310Interface::get_mac_address()
jehoon 0:df571f8f8c03 71 {
jehoon 0:df571f8f8c03 72 return _wizfi310.getMACAddress();
jehoon 0:df571f8f8c03 73 }
jehoon 0:df571f8f8c03 74
jehoon 0:df571f8f8c03 75 struct wizfi310_socket {
jehoon 0:df571f8f8c03 76 int id;
jehoon 0:df571f8f8c03 77 nsapi_protocol_t proto;
jehoon 0:df571f8f8c03 78 bool connected;
jehoon 0:df571f8f8c03 79 };
jehoon 0:df571f8f8c03 80
jehoon 0:df571f8f8c03 81 int WizFi310Interface::socket_open(void **handle, nsapi_protocol_t proto)
jehoon 0:df571f8f8c03 82 {
jehoon 0:df571f8f8c03 83 // Look for an unused socket
jehoon 0:df571f8f8c03 84
jehoon 0:df571f8f8c03 85 /*
jehoon 0:df571f8f8c03 86 int id = -1;
jehoon 0:df571f8f8c03 87
jehoon 0:df571f8f8c03 88 for (int i = 0; i < WIZFI310_SOCKET_COUNT; i++) {
jehoon 0:df571f8f8c03 89 if (_ids[i] == false) {
jehoon 0:df571f8f8c03 90 id = i;
jehoon 0:df571f8f8c03 91 _ids[i] = true;
jehoon 0:df571f8f8c03 92 break;
jehoon 0:df571f8f8c03 93 }
jehoon 0:df571f8f8c03 94 }
jehoon 0:df571f8f8c03 95
jehoon 0:df571f8f8c03 96 if (id == -1) {
jehoon 0:df571f8f8c03 97 return NSAPI_ERROR_NO_SOCKET;
jehoon 0:df571f8f8c03 98 }
jehoon 0:df571f8f8c03 99 */
jehoon 0:df571f8f8c03 100
jehoon 0:df571f8f8c03 101 struct wizfi310_socket *socket = new struct wizfi310_socket;
jehoon 0:df571f8f8c03 102 if (!socket) {
jehoon 0:df571f8f8c03 103 return NSAPI_ERROR_NO_SOCKET;
jehoon 0:df571f8f8c03 104 }
jehoon 0:df571f8f8c03 105
jehoon 0:df571f8f8c03 106 socket->id = -1;
jehoon 0:df571f8f8c03 107 socket->proto = proto;
jehoon 0:df571f8f8c03 108 socket->connected = false;
jehoon 0:df571f8f8c03 109 *handle = socket;
jehoon 0:df571f8f8c03 110 return 0;
jehoon 0:df571f8f8c03 111 }
jehoon 0:df571f8f8c03 112
jehoon 0:df571f8f8c03 113 int WizFi310Interface::socket_close(void *handle)
jehoon 0:df571f8f8c03 114 {
jehoon 0:df571f8f8c03 115 struct wizfi310_socket *socket = (struct wizfi310_socket *)handle;
jehoon 0:df571f8f8c03 116 int err = 0;
jehoon 0:df571f8f8c03 117
jehoon 0:df571f8f8c03 118 if(socket->id == -1){
jehoon 0:df571f8f8c03 119 err = NSAPI_ERROR_NO_SOCKET;
jehoon 0:df571f8f8c03 120 }
jehoon 0:df571f8f8c03 121 else if (_wizfi310.close(socket->id) == -1) {
jehoon 0:df571f8f8c03 122 err = NSAPI_ERROR_DEVICE_ERROR;
jehoon 0:df571f8f8c03 123 }
jehoon 0:df571f8f8c03 124
jehoon 0:df571f8f8c03 125 _ids[socket->id] = false;
jehoon 0:df571f8f8c03 126 wait_ms(WizFi310_DELAY_MS);
jehoon 0:df571f8f8c03 127 delete socket;
jehoon 0:df571f8f8c03 128 return err;
jehoon 0:df571f8f8c03 129 }
jehoon 0:df571f8f8c03 130
jehoon 0:df571f8f8c03 131 int WizFi310Interface::socket_bind(void *handle, const SocketAddress &address)
jehoon 0:df571f8f8c03 132 {
jehoon 0:df571f8f8c03 133 return NSAPI_ERROR_UNSUPPORTED;
jehoon 0:df571f8f8c03 134 }
jehoon 0:df571f8f8c03 135
jehoon 0:df571f8f8c03 136 int WizFi310Interface::socket_listen(void *handle, int backlog)
jehoon 0:df571f8f8c03 137 {
jehoon 0:df571f8f8c03 138 return NSAPI_ERROR_UNSUPPORTED;
jehoon 0:df571f8f8c03 139 }
jehoon 0:df571f8f8c03 140
jehoon 0:df571f8f8c03 141 int WizFi310Interface::socket_connect(void *handle, const SocketAddress &addr)
jehoon 0:df571f8f8c03 142 {
jehoon 0:df571f8f8c03 143 int cid=-1;
jehoon 0:df571f8f8c03 144 struct wizfi310_socket *socket = (struct wizfi310_socket *)handle;
jehoon 0:df571f8f8c03 145
jehoon 0:df571f8f8c03 146 WizFi310::Protocol proto = (socket->proto == NSAPI_UDP) ? WizFi310::PROTO_UDP : WizFi310::PROTO_TCP;
jehoon 0:df571f8f8c03 147 if((cid = _wizfi310.open(proto, addr.get_ip_address(), addr.get_port())) == -1 )
jehoon 0:df571f8f8c03 148 {
jehoon 0:df571f8f8c03 149 return NSAPI_ERROR_DEVICE_ERROR;
jehoon 0:df571f8f8c03 150 }
jehoon 0:df571f8f8c03 151
jehoon 0:df571f8f8c03 152 if(cid >= WIZFI310_SOCKET_COUNT)
jehoon 0:df571f8f8c03 153 {
jehoon 0:df571f8f8c03 154 return NSAPI_ERROR_NO_SOCKET;
jehoon 0:df571f8f8c03 155 }
jehoon 0:df571f8f8c03 156
jehoon 0:df571f8f8c03 157 _ids[cid] = true;
jehoon 0:df571f8f8c03 158 socket->id = cid;
jehoon 0:df571f8f8c03 159 socket->connected = true;
jehoon 0:df571f8f8c03 160 wait_ms(WizFi310_DELAY_MS);
jehoon 0:df571f8f8c03 161 return 0;
jehoon 0:df571f8f8c03 162 }
jehoon 0:df571f8f8c03 163
jehoon 0:df571f8f8c03 164 int WizFi310Interface::socket_accept(void **handle, void *server)
jehoon 0:df571f8f8c03 165 {
jehoon 0:df571f8f8c03 166 return NSAPI_ERROR_UNSUPPORTED;
jehoon 0:df571f8f8c03 167 }
jehoon 0:df571f8f8c03 168
jehoon 0:df571f8f8c03 169 int WizFi310Interface::socket_send(void *handle, const void *data, unsigned size)
jehoon 0:df571f8f8c03 170 {
jehoon 0:df571f8f8c03 171 struct wizfi310_socket *socket = (struct wizfi310_socket *)handle;
jehoon 0:df571f8f8c03 172
jehoon 0:df571f8f8c03 173 if ( _wizfi310.send(socket->id, (const char*)data, size) == -1 ) {
jehoon 0:df571f8f8c03 174 return NSAPI_ERROR_DEVICE_ERROR;
jehoon 0:df571f8f8c03 175 }
jehoon 0:df571f8f8c03 176
jehoon 0:df571f8f8c03 177 return size;
jehoon 0:df571f8f8c03 178 }
jehoon 0:df571f8f8c03 179
jehoon 0:df571f8f8c03 180 int WizFi310Interface::socket_recv(void *handle, void *data, unsigned size)
jehoon 0:df571f8f8c03 181 {
jehoon 0:df571f8f8c03 182 struct wizfi310_socket *socket = (struct wizfi310_socket *)handle;
jehoon 0:df571f8f8c03 183
jehoon 0:df571f8f8c03 184 int32_t recv = _wizfi310.recv(socket->id, (char*)data, size);
kaizen 2:04c8d61984a3 185 if (recv <= 0) {
jehoon 0:df571f8f8c03 186 return NSAPI_ERROR_WOULD_BLOCK;
jehoon 0:df571f8f8c03 187 }
jehoon 0:df571f8f8c03 188
jehoon 0:df571f8f8c03 189 return recv;
jehoon 0:df571f8f8c03 190 }
jehoon 0:df571f8f8c03 191
jehoon 0:df571f8f8c03 192 int WizFi310Interface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
jehoon 0:df571f8f8c03 193 {
jehoon 0:df571f8f8c03 194 struct wizfi310_socket *socket = (struct wizfi310_socket *)handle;
jehoon 0:df571f8f8c03 195 if (!socket->connected) {
jehoon 0:df571f8f8c03 196 int err = socket_connect(socket, addr);
jehoon 0:df571f8f8c03 197 if (err < 0) {
jehoon 0:df571f8f8c03 198 return err;
jehoon 0:df571f8f8c03 199 }
jehoon 0:df571f8f8c03 200 }
jehoon 0:df571f8f8c03 201
jehoon 0:df571f8f8c03 202 return socket_send(socket, data, size);
jehoon 0:df571f8f8c03 203 }
jehoon 0:df571f8f8c03 204
jehoon 0:df571f8f8c03 205 int WizFi310Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
jehoon 0:df571f8f8c03 206 {
jehoon 0:df571f8f8c03 207 struct wizfi310_socket *socket = (struct wizfi310_socket *)handle;
jehoon 0:df571f8f8c03 208 return socket_recv(socket, data, size);
jehoon 0:df571f8f8c03 209 }
jehoon 0:df571f8f8c03 210
jehoon 0:df571f8f8c03 211 void WizFi310Interface::socket_attach(void *handle, void (*callback)(void *), void *data)
jehoon 0:df571f8f8c03 212 {
jehoon 0:df571f8f8c03 213 }