Socket interface for C027Interface. Implements the NetworkSocketAPI

Dependencies:   C027_Support

Dependents:   HelloC027Interface U_Blox_DeviceConnector U_Blox_DeviceConnector U-Blox_Client

Fork of LWIPInterface by NetworkSocketAPI

Committer:
sarahmarshy
Date:
Thu Feb 02 21:16:38 2017 +0000
Revision:
17:3f1e33e638a4
Parent:
16:eaf31bd133f0
Child:
18:d2ad48926718
Update to be compatible CellularInterface changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
geky 12:181a9415736b 1 /* C027 implementation of NetworkInterfaceAPI
geky 12:181a9415736b 2 * Copyright (c) 2015 ARM Limited
geky 12:181a9415736b 3 *
geky 12:181a9415736b 4 * Licensed under the Apache License, Version 2.0 (the "License");
geky 12:181a9415736b 5 * you may not use this file except in compliance with the License.
geky 12:181a9415736b 6 * You may obtain a copy of the License at
geky 12:181a9415736b 7 *
geky 12:181a9415736b 8 * http://www.apache.org/licenses/LICENSE-2.0
geky 12:181a9415736b 9 *
geky 12:181a9415736b 10 * Unless required by applicable law or agreed to in writing, software
geky 12:181a9415736b 11 * distributed under the License is distributed on an "AS IS" BASIS,
geky 12:181a9415736b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
geky 12:181a9415736b 13 * See the License for the specific language governing permissions and
geky 12:181a9415736b 14 * limitations under the License.
geky 12:181a9415736b 15 */
geky 12:181a9415736b 16
geky 12:181a9415736b 17 #include "C027Interface.h"
geky 12:181a9415736b 18 #include "mbed.h"
geky 12:181a9415736b 19
geky 12:181a9415736b 20
geky 12:181a9415736b 21 // C027Interface implementation
geky 12:181a9415736b 22 C027Interface::C027Interface(const char *simpin, bool debug)
geky 12:181a9415736b 23 : _debug(debug)
geky 12:181a9415736b 24 {
geky 12:181a9415736b 25 strcpy(_pin, simpin);
geky 12:181a9415736b 26 }
geky 12:181a9415736b 27
sarahmarshy 17:3f1e33e638a4 28 nsapi_error_t C027Interface::set_credentials(const char *apn, const char *username, const char *password)
sarahmarshy 17:3f1e33e638a4 29 {
sarahmarshy 17:3f1e33e638a4 30 memset(_apn, 0, sizeof(_apn));
sarahmarshy 17:3f1e33e638a4 31 strncpy(_apn, apn, sizeof(apn));
sarahmarshy 17:3f1e33e638a4 32
sarahmarshy 17:3f1e33e638a4 33 memset(_username, 0, sizeof(_username));
sarahmarshy 17:3f1e33e638a4 34 strncpy(_username, username, sizeof(_username));
sarahmarshy 17:3f1e33e638a4 35
sarahmarshy 17:3f1e33e638a4 36 memset(_password, 0, sizeof(_password));
sarahmarshy 17:3f1e33e638a4 37 strncpy(_password, password, sizeof(_password));
sarahmarshy 17:3f1e33e638a4 38 return 0;
sarahmarshy 17:3f1e33e638a4 39 }
sarahmarshy 17:3f1e33e638a4 40
sarahmarshy 17:3f1e33e638a4 41 nsapi_error_t C027Interface::connect()
geky 12:181a9415736b 42 {
geky 12:181a9415736b 43 // create the modem
geky 12:181a9415736b 44 _mdm = new MDMSerial;
geky 12:181a9415736b 45 if (_debug) {
geky 12:181a9415736b 46 _mdm->setDebug(4);
geky 12:181a9415736b 47 } else {
geky 12:181a9415736b 48 _mdm->setDebug(0);
geky 12:181a9415736b 49 }
geky 12:181a9415736b 50
geky 12:181a9415736b 51 // initialize the modem
geky 12:181a9415736b 52 MDMParser::DevStatus devStatus = {};
geky 12:181a9415736b 53 MDMParser::NetStatus netStatus = {};
geky 12:181a9415736b 54 bool mdmOk = _mdm->init(_pin, &devStatus);
geky 12:181a9415736b 55 if (_debug) {
geky 12:181a9415736b 56 _mdm->dumpDevStatus(&devStatus);
geky 12:181a9415736b 57 }
geky 12:181a9415736b 58
geky 12:181a9415736b 59 if (mdmOk) {
geky 12:181a9415736b 60 // wait until we are connected
geky 12:181a9415736b 61 mdmOk = _mdm->registerNet(&netStatus);
geky 12:181a9415736b 62 if (_debug) {
geky 12:181a9415736b 63 _mdm->dumpNetStatus(&netStatus);
geky 12:181a9415736b 64 }
geky 12:181a9415736b 65 }
geky 12:181a9415736b 66
Christopher Haster 14:3d1845f5cd81 67 if (mdmOk) {
geky 12:181a9415736b 68 // join the internet connection
sarahmarshy 17:3f1e33e638a4 69 MDMParser::IP ip = _mdm->join(_apn, _username, _password);
geky 15:21d4f56eb172 70 _ip_address.set_ip_bytes(&ip, NSAPI_IPv4);
geky 12:181a9415736b 71 mdmOk = (ip != NOIP);
geky 12:181a9415736b 72 }
geky 12:181a9415736b 73
Christopher Haster 14:3d1845f5cd81 74 return mdmOk ? 0 : NSAPI_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 75 }
geky 12:181a9415736b 76
sarahmarshy 17:3f1e33e638a4 77 nsapi_error_t C027Interface::connect(const char *apn, const char *username, const char *password)
sarahmarshy 17:3f1e33e638a4 78 {
sarahmarshy 17:3f1e33e638a4 79
sarahmarshy 17:3f1e33e638a4 80 set_credentials(apn, username, password);
sarahmarshy 17:3f1e33e638a4 81 return connect();
sarahmarshy 17:3f1e33e638a4 82 }
sarahmarshy 17:3f1e33e638a4 83
Christopher Haster 14:3d1845f5cd81 84 int C027Interface::disconnect()
geky 12:181a9415736b 85 {
geky 12:181a9415736b 86 if (!_mdm->disconnect()) {
Christopher Haster 14:3d1845f5cd81 87 return NSAPI_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 88 }
geky 12:181a9415736b 89
geky 12:181a9415736b 90 return 0;
geky 12:181a9415736b 91 }
geky 12:181a9415736b 92
Christopher Haster 14:3d1845f5cd81 93 const char *C027Interface::get_ip_address()
geky 12:181a9415736b 94 {
geky 15:21d4f56eb172 95 return _ip_address.get_ip_address();
geky 12:181a9415736b 96 }
geky 12:181a9415736b 97
Christopher Haster 14:3d1845f5cd81 98 const char *C027Interface::get_mac_address()
geky 12:181a9415736b 99 {
geky 12:181a9415736b 100 return 0;
geky 12:181a9415736b 101 }
geky 12:181a9415736b 102
Christopher Haster 14:3d1845f5cd81 103 struct c027_socket {
Christopher Haster 14:3d1845f5cd81 104 int socket;
Christopher Haster 14:3d1845f5cd81 105 MDMParser::IpProtocol proto;
Christopher Haster 14:3d1845f5cd81 106 MDMParser::IP ip;
Christopher Haster 14:3d1845f5cd81 107 int port;
Christopher Haster 14:3d1845f5cd81 108 };
Christopher Haster 14:3d1845f5cd81 109
Christopher Haster 14:3d1845f5cd81 110 int C027Interface::socket_open(void **handle, nsapi_protocol_t proto)
geky 12:181a9415736b 111 {
Christopher Haster 14:3d1845f5cd81 112 MDMParser::IpProtocol mdmproto = (proto == NSAPI_UDP) ? MDMParser::IPPROTO_UDP : MDMParser::IPPROTO_TCP;
Christopher Haster 14:3d1845f5cd81 113 int fd = _mdm->socketSocket(mdmproto);
Christopher Haster 14:3d1845f5cd81 114 if (fd < 0) {
Christopher Haster 14:3d1845f5cd81 115 return NSAPI_ERROR_NO_SOCKET;
geky 12:181a9415736b 116 }
geky 12:181a9415736b 117
Christopher Haster 14:3d1845f5cd81 118 _mdm->socketSetBlocking(fd, 10000);
Christopher Haster 14:3d1845f5cd81 119 struct c027_socket *socket = new struct c027_socket;
Christopher Haster 14:3d1845f5cd81 120 if (!socket) {
Christopher Haster 14:3d1845f5cd81 121 return NSAPI_ERROR_NO_SOCKET;
Christopher Haster 14:3d1845f5cd81 122 }
geky 12:181a9415736b 123
Christopher Haster 14:3d1845f5cd81 124 socket->socket = fd;
Christopher Haster 14:3d1845f5cd81 125 socket->proto = mdmproto;
Christopher Haster 14:3d1845f5cd81 126 *handle = socket;
Christopher Haster 14:3d1845f5cd81 127 return 0;
geky 12:181a9415736b 128 }
geky 12:181a9415736b 129
Christopher Haster 14:3d1845f5cd81 130 int C027Interface::socket_close(void *handle)
geky 12:181a9415736b 131 {
Christopher Haster 14:3d1845f5cd81 132 struct c027_socket *socket = (struct c027_socket *)handle;
Christopher Haster 14:3d1845f5cd81 133 _mdm->socketFree(socket->socket);
geky 12:181a9415736b 134
geky 12:181a9415736b 135 delete socket;
Christopher Haster 14:3d1845f5cd81 136 return 0;
geky 12:181a9415736b 137 }
geky 12:181a9415736b 138
Christopher Haster 14:3d1845f5cd81 139 int C027Interface::socket_bind(void *handle, const SocketAddress &address)
Christopher Haster 14:3d1845f5cd81 140 {
Christopher Haster 14:3d1845f5cd81 141 return NSAPI_ERROR_UNSUPPORTED;
Christopher Haster 14:3d1845f5cd81 142 }
geky 12:181a9415736b 143
Christopher Haster 14:3d1845f5cd81 144 int C027Interface::socket_listen(void *handle, int backlog)
geky 12:181a9415736b 145 {
Christopher Haster 14:3d1845f5cd81 146 return NSAPI_ERROR_UNSUPPORTED;
Christopher Haster 14:3d1845f5cd81 147 }
Christopher Haster 14:3d1845f5cd81 148
Christopher Haster 14:3d1845f5cd81 149 int C027Interface::socket_connect(void *handle, const SocketAddress &addr)
Christopher Haster 14:3d1845f5cd81 150 {
Christopher Haster 14:3d1845f5cd81 151 struct c027_socket *socket = (struct c027_socket *)handle;
geky 12:181a9415736b 152
Christopher Haster 14:3d1845f5cd81 153 if (!_mdm->socketConnect(socket->socket, addr.get_ip_address(), addr.get_port())) {
Christopher Haster 14:3d1845f5cd81 154 return NSAPI_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 155 }
geky 12:181a9415736b 156
geky 12:181a9415736b 157 return 0;
geky 12:181a9415736b 158 }
geky 12:181a9415736b 159
sarahmarshy 17:3f1e33e638a4 160 nsapi_error_t C027Interface::socket_accept(nsapi_socket_t server, nsapi_socket_t *handle, SocketAddress *address)
geky 12:181a9415736b 161 {
Christopher Haster 14:3d1845f5cd81 162 return NSAPI_ERROR_UNSUPPORTED;
geky 12:181a9415736b 163 }
geky 12:181a9415736b 164
Christopher Haster 14:3d1845f5cd81 165 int C027Interface::socket_send(void *handle, const void *data, unsigned size)
geky 12:181a9415736b 166 {
Christopher Haster 14:3d1845f5cd81 167 struct c027_socket *socket = (struct c027_socket *)handle;
Christopher Haster 14:3d1845f5cd81 168
Christopher Haster 14:3d1845f5cd81 169 int sent = _mdm->socketSend(socket->socket, (const char *)data, size);
Christopher Haster 14:3d1845f5cd81 170 if (sent == SOCKET_ERROR) {
Christopher Haster 14:3d1845f5cd81 171 return NSAPI_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 172 }
geky 12:181a9415736b 173
Christopher Haster 14:3d1845f5cd81 174 return sent;
geky 12:181a9415736b 175 }
geky 12:181a9415736b 176
Christopher Haster 14:3d1845f5cd81 177 int C027Interface::socket_recv(void *handle, void *data, unsigned size)
geky 12:181a9415736b 178 {
Christopher Haster 14:3d1845f5cd81 179 struct c027_socket *socket = (struct c027_socket *)handle;
Christopher Haster 14:3d1845f5cd81 180 if (!_mdm->socketReadable(socket->socket)) {
Christopher Haster 14:3d1845f5cd81 181 return NSAPI_ERROR_WOULD_BLOCK;
geky 12:181a9415736b 182 }
geky 12:181a9415736b 183
Christopher Haster 14:3d1845f5cd81 184 int recv = _mdm->socketRecv(socket->socket, (char *)data, size);
geky 12:181a9415736b 185 if (recv == SOCKET_ERROR) {
Christopher Haster 14:3d1845f5cd81 186 return NSAPI_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 187 }
geky 12:181a9415736b 188
geky 12:181a9415736b 189 return recv;
geky 12:181a9415736b 190 }
geky 12:181a9415736b 191
Christopher Haster 14:3d1845f5cd81 192 int C027Interface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
Christopher Haster 14:3d1845f5cd81 193 {
Christopher Haster 14:3d1845f5cd81 194 struct c027_socket *socket = (struct c027_socket *)handle;
geky 12:181a9415736b 195
geky 15:21d4f56eb172 196 int sent = _mdm->socketSendTo(socket->socket,
geky 15:21d4f56eb172 197 *(MDMParser::IP *)addr.get_ip_bytes(), addr.get_port(),
geky 15:21d4f56eb172 198 (const char *)data, size);
geky 15:21d4f56eb172 199
Christopher Haster 14:3d1845f5cd81 200 if (sent == SOCKET_ERROR) {
Christopher Haster 14:3d1845f5cd81 201 return NSAPI_ERROR_DEVICE_ERROR;
Christopher Haster 14:3d1845f5cd81 202 }
Christopher Haster 14:3d1845f5cd81 203
Christopher Haster 14:3d1845f5cd81 204 return sent;
Christopher Haster 14:3d1845f5cd81 205 }
Christopher Haster 14:3d1845f5cd81 206
Christopher Haster 14:3d1845f5cd81 207 int C027Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
Christopher Haster 14:3d1845f5cd81 208 {
Christopher Haster 14:3d1845f5cd81 209 struct c027_socket *socket = (struct c027_socket *)handle;
Christopher Haster 14:3d1845f5cd81 210 if (!_mdm->socketReadable(socket->socket)) {
Christopher Haster 14:3d1845f5cd81 211 return NSAPI_ERROR_WOULD_BLOCK;
Christopher Haster 14:3d1845f5cd81 212 }
Christopher Haster 14:3d1845f5cd81 213
Christopher Haster 14:3d1845f5cd81 214 MDMParser::IP ip;
Christopher Haster 14:3d1845f5cd81 215 int port;
Christopher Haster 14:3d1845f5cd81 216
Christopher Haster 14:3d1845f5cd81 217 int recv = _mdm->socketRecvFrom(socket->socket, &ip, &port, (char *)data, size);
Christopher Haster 14:3d1845f5cd81 218 if (recv == SOCKET_ERROR) {
Christopher Haster 14:3d1845f5cd81 219 return NSAPI_ERROR_DEVICE_ERROR;
Christopher Haster 14:3d1845f5cd81 220 }
Christopher Haster 14:3d1845f5cd81 221
Christopher Haster 14:3d1845f5cd81 222 if (addr) {
geky 15:21d4f56eb172 223 addr->set_ip_bytes(&ip, NSAPI_IPv4);
Christopher Haster 14:3d1845f5cd81 224 addr->set_port(port);
Christopher Haster 14:3d1845f5cd81 225 }
Christopher Haster 14:3d1845f5cd81 226
Christopher Haster 14:3d1845f5cd81 227 return recv;
Christopher Haster 14:3d1845f5cd81 228 }
Christopher Haster 14:3d1845f5cd81 229
sarahmarshy 16:eaf31bd133f0 230 void C027Interface::_run()
sarahmarshy 16:eaf31bd133f0 231 {
sarahmarshy 16:eaf31bd133f0 232 while (true) {
sarahmarshy 16:eaf31bd133f0 233 _callback(_data);
sarahmarshy 16:eaf31bd133f0 234 wait(0.25f);
sarahmarshy 16:eaf31bd133f0 235 }
sarahmarshy 16:eaf31bd133f0 236 }
sarahmarshy 16:eaf31bd133f0 237
Christopher Haster 14:3d1845f5cd81 238 void C027Interface::socket_attach(void *handle, void (*callback)(void *), void *data)
Christopher Haster 14:3d1845f5cd81 239 {
sarahmarshy 16:eaf31bd133f0 240 _callback = callback;
sarahmarshy 16:eaf31bd133f0 241 _data = data;
sarahmarshy 16:eaf31bd133f0 242 _thread.start(this, &C027Interface::_run);
Christopher Haster 14:3d1845f5cd81 243 }