For a PR
Fork of ublox-at-cellular-interface by
UbloxATCellularInterface.h@1:bc228becc45d, 2017-06-12 (annotated)
- Committer:
- rob.meades@u-blox.com
- Date:
- Mon Jun 12 23:04:27 2017 +0100
- Revision:
- 1:bc228becc45d
- Parent:
- 0:7ccf0e7e8a83
- Child:
- 7:3b2ca10cc23a
Tested on C027.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RobMeades | 0:7ccf0e7e8a83 | 1 | /* Copyright (c) 2017 ARM Limited |
RobMeades | 0:7ccf0e7e8a83 | 2 | * |
RobMeades | 0:7ccf0e7e8a83 | 3 | * Licensed under the Apache License, Version 2.0 (the "License"); |
RobMeades | 0:7ccf0e7e8a83 | 4 | * you may not use this file except in compliance with the License. |
RobMeades | 0:7ccf0e7e8a83 | 5 | * You may obtain a copy of the License at |
RobMeades | 0:7ccf0e7e8a83 | 6 | * |
RobMeades | 0:7ccf0e7e8a83 | 7 | * http://www.apache.org/licenses/LICENSE-2.0 |
RobMeades | 0:7ccf0e7e8a83 | 8 | * |
RobMeades | 0:7ccf0e7e8a83 | 9 | * Unless required by applicable law or agreed to in writing, software |
RobMeades | 0:7ccf0e7e8a83 | 10 | * distributed under the License is distributed on an "AS IS" BASIS, |
RobMeades | 0:7ccf0e7e8a83 | 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
RobMeades | 0:7ccf0e7e8a83 | 12 | * See the License for the specific language governing permissions and |
RobMeades | 0:7ccf0e7e8a83 | 13 | * limitations under the License. |
RobMeades | 0:7ccf0e7e8a83 | 14 | */ |
RobMeades | 0:7ccf0e7e8a83 | 15 | |
rob.meades@u-blox.com | 1:bc228becc45d | 16 | #ifndef _UBLOX_AT_CELLULAR_INTERFACE_ |
rob.meades@u-blox.com | 1:bc228becc45d | 17 | #define _UBLOX_AT_CELLULAR_INTERFACE_ |
RobMeades | 0:7ccf0e7e8a83 | 18 | |
rob.meades@u-blox.com | 1:bc228becc45d | 19 | #include "UbloxCellularBase.h" |
rob.meades@u-blox.com | 1:bc228becc45d | 20 | #include "CellularBase.h" |
RobMeades | 0:7ccf0e7e8a83 | 21 | #include "NetworkStack.h" |
RobMeades | 0:7ccf0e7e8a83 | 22 | |
RobMeades | 0:7ccf0e7e8a83 | 23 | /** UbloxATCellularInterface class. |
RobMeades | 0:7ccf0e7e8a83 | 24 | * |
RobMeades | 0:7ccf0e7e8a83 | 25 | * This uses the cellular-tuned IP stack that |
RobMeades | 0:7ccf0e7e8a83 | 26 | * is on-board the cellular modem instead of the |
RobMeades | 0:7ccf0e7e8a83 | 27 | * LWIP stack on the mbed MCU. |
RobMeades | 0:7ccf0e7e8a83 | 28 | * |
RobMeades | 0:7ccf0e7e8a83 | 29 | * There are three advantages to using this mechanism: |
RobMeades | 0:7ccf0e7e8a83 | 30 | * |
RobMeades | 0:7ccf0e7e8a83 | 31 | * 1. Since the modem interface remains in AT mode |
RobMeades | 0:7ccf0e7e8a83 | 32 | * throughout, it is possible to continue using |
RobMeades | 0:7ccf0e7e8a83 | 33 | * any AT commands (e.g. send SMS, use the module's |
RobMeades | 0:7ccf0e7e8a83 | 34 | * file system, etc.) while the connection is up. |
RobMeades | 0:7ccf0e7e8a83 | 35 | * |
RobMeades | 0:7ccf0e7e8a83 | 36 | * 2. The UbloxATCellularInterfaceExt class can |
RobMeades | 0:7ccf0e7e8a83 | 37 | * be used to perform very simple HTTP and FTP |
RobMeades | 0:7ccf0e7e8a83 | 38 | * operations using the modem's on-board clients. |
RobMeades | 0:7ccf0e7e8a83 | 39 | * |
RobMeades | 0:7ccf0e7e8a83 | 40 | * 3. LWIP is not required (and hence RAM is saved). |
RobMeades | 0:7ccf0e7e8a83 | 41 | * |
RobMeades | 0:7ccf0e7e8a83 | 42 | * The disadvantage is that some additional parsing |
RobMeades | 0:7ccf0e7e8a83 | 43 | * (at the AT interface) has to go on in order to exchange |
RobMeades | 0:7ccf0e7e8a83 | 44 | * IP packets, so this is less efficient under heavy loads. |
RobMeades | 0:7ccf0e7e8a83 | 45 | * Also TCP Server and getting/setting of socket options is |
RobMeades | 0:7ccf0e7e8a83 | 46 | * currently not supported. |
RobMeades | 0:7ccf0e7e8a83 | 47 | */ |
RobMeades | 0:7ccf0e7e8a83 | 48 | |
RobMeades | 0:7ccf0e7e8a83 | 49 | // Forward declaration |
RobMeades | 0:7ccf0e7e8a83 | 50 | class NetworkStack; |
RobMeades | 0:7ccf0e7e8a83 | 51 | |
RobMeades | 0:7ccf0e7e8a83 | 52 | /* |
RobMeades | 0:7ccf0e7e8a83 | 53 | * NOTE: order is important in the inheritance below! PAL takes this class |
RobMeades | 0:7ccf0e7e8a83 | 54 | * and casts it to CellularInterface and so CellularInterface has to be first |
RobMeades | 0:7ccf0e7e8a83 | 55 | * in the last for that to work. |
RobMeades | 0:7ccf0e7e8a83 | 56 | */ |
RobMeades | 0:7ccf0e7e8a83 | 57 | |
RobMeades | 0:7ccf0e7e8a83 | 58 | /** UbloxATCellularInterface class. |
RobMeades | 0:7ccf0e7e8a83 | 59 | * |
RobMeades | 0:7ccf0e7e8a83 | 60 | * This class implements the network stack interface into the cellular |
RobMeades | 0:7ccf0e7e8a83 | 61 | * modems on the C030 and C027 boards for 2G/3G/4G modules using |
RobMeades | 0:7ccf0e7e8a83 | 62 | * the IP stack running on the cellular module. |
RobMeades | 0:7ccf0e7e8a83 | 63 | */ |
RobMeades | 0:7ccf0e7e8a83 | 64 | class UbloxATCellularInterface : public CellularBase, public NetworkStack, virtual public UbloxCellularBase { |
RobMeades | 0:7ccf0e7e8a83 | 65 | |
RobMeades | 0:7ccf0e7e8a83 | 66 | public: |
RobMeades | 0:7ccf0e7e8a83 | 67 | /** Constructor. |
RobMeades | 0:7ccf0e7e8a83 | 68 | * |
RobMeades | 0:7ccf0e7e8a83 | 69 | * @param tx the UART TX data pin to which the modem is attached. |
RobMeades | 0:7ccf0e7e8a83 | 70 | * @param rx the UART RX data pin to which the modem is attached. |
RobMeades | 0:7ccf0e7e8a83 | 71 | * @param baud the UART baud rate. |
RobMeades | 0:7ccf0e7e8a83 | 72 | * @param debug_on true to switch AT interface debug on, otherwise false. |
RobMeades | 0:7ccf0e7e8a83 | 73 | */ |
RobMeades | 0:7ccf0e7e8a83 | 74 | UbloxATCellularInterface(PinName tx = MDMTXD, |
RobMeades | 0:7ccf0e7e8a83 | 75 | PinName rx = MDMRXD, |
RobMeades | 0:7ccf0e7e8a83 | 76 | int baud = MBED_CONF_UBLOX_CELL_BAUD_RATE, |
RobMeades | 0:7ccf0e7e8a83 | 77 | bool debug_on = false); |
RobMeades | 0:7ccf0e7e8a83 | 78 | |
RobMeades | 0:7ccf0e7e8a83 | 79 | /* Destructor. |
RobMeades | 0:7ccf0e7e8a83 | 80 | */ |
RobMeades | 0:7ccf0e7e8a83 | 81 | virtual ~UbloxATCellularInterface(); |
RobMeades | 0:7ccf0e7e8a83 | 82 | |
RobMeades | 0:7ccf0e7e8a83 | 83 | /** The amount of extra space needed in terms of AT interface |
RobMeades | 0:7ccf0e7e8a83 | 84 | * characters to get a chunk of user data (i.e. one UDP packet |
RobMeades | 0:7ccf0e7e8a83 | 85 | * or a portion of a TCP packet) across the AT interface. |
RobMeades | 0:7ccf0e7e8a83 | 86 | */ |
RobMeades | 0:7ccf0e7e8a83 | 87 | #define AT_PACKET_OVERHEAD 77 |
RobMeades | 0:7ccf0e7e8a83 | 88 | |
RobMeades | 0:7ccf0e7e8a83 | 89 | /** The profile to use (on board the modem). |
RobMeades | 0:7ccf0e7e8a83 | 90 | */ |
RobMeades | 0:7ccf0e7e8a83 | 91 | #define PROFILE "0" |
RobMeades | 0:7ccf0e7e8a83 | 92 | |
RobMeades | 0:7ccf0e7e8a83 | 93 | /** Translates a host name to an IP address with specific IP version. |
RobMeades | 0:7ccf0e7e8a83 | 94 | * |
RobMeades | 0:7ccf0e7e8a83 | 95 | * The host name may be either a domain name or an IP address. If the |
RobMeades | 0:7ccf0e7e8a83 | 96 | * host name is an IP address, no network transactions will be performed. |
RobMeades | 0:7ccf0e7e8a83 | 97 | * |
RobMeades | 0:7ccf0e7e8a83 | 98 | * If no stack-specific DNS resolution is provided, the host name |
RobMeades | 0:7ccf0e7e8a83 | 99 | * will be resolved using a UDP socket on the stack. |
RobMeades | 0:7ccf0e7e8a83 | 100 | * |
RobMeades | 0:7ccf0e7e8a83 | 101 | * @param host Host name to resolve. |
RobMeades | 0:7ccf0e7e8a83 | 102 | * @param address Destination for the host SocketAddress. |
RobMeades | 0:7ccf0e7e8a83 | 103 | * @param version IP version of address to resolve, NSAPI_UNSPEC indicates |
RobMeades | 0:7ccf0e7e8a83 | 104 | * version is chosen by the stack (defaults to NSAPI_UNSPEC). |
RobMeades | 0:7ccf0e7e8a83 | 105 | * @return 0 on success, negative error code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 106 | */ |
RobMeades | 0:7ccf0e7e8a83 | 107 | virtual nsapi_error_t gethostbyname(const char *host, |
RobMeades | 0:7ccf0e7e8a83 | 108 | SocketAddress *address, |
RobMeades | 0:7ccf0e7e8a83 | 109 | nsapi_version_t version = NSAPI_UNSPEC); |
RobMeades | 0:7ccf0e7e8a83 | 110 | |
RobMeades | 0:7ccf0e7e8a83 | 111 | /** Set the authentication scheme. |
RobMeades | 0:7ccf0e7e8a83 | 112 | * |
RobMeades | 0:7ccf0e7e8a83 | 113 | * @param auth The authentication scheme, chose from |
RobMeades | 0:7ccf0e7e8a83 | 114 | * NSAPI_SECURITY_NONE, NSAPI_SECURITY_PAP, |
RobMeades | 0:7ccf0e7e8a83 | 115 | * NSAPI_SECURITY_CHAP or NSAPI_SECURITY_UNKNOWN; |
RobMeades | 0:7ccf0e7e8a83 | 116 | * use NSAPI_SECURITY_UNKNOWN to try all of none, |
RobMeades | 0:7ccf0e7e8a83 | 117 | * PAP and CHAP. |
RobMeades | 0:7ccf0e7e8a83 | 118 | */ |
RobMeades | 0:7ccf0e7e8a83 | 119 | virtual void set_authentication(nsapi_security_t auth); |
RobMeades | 0:7ccf0e7e8a83 | 120 | |
RobMeades | 0:7ccf0e7e8a83 | 121 | /** Set the cellular network credentials. |
RobMeades | 0:7ccf0e7e8a83 | 122 | * |
RobMeades | 0:7ccf0e7e8a83 | 123 | * Please check documentation of connect() for default behaviour of APN settings. |
RobMeades | 0:7ccf0e7e8a83 | 124 | * |
RobMeades | 0:7ccf0e7e8a83 | 125 | * @param apn Access point name. |
RobMeades | 0:7ccf0e7e8a83 | 126 | * @param uname Optionally, user name. |
RobMeades | 0:7ccf0e7e8a83 | 127 | * @param pwd Optionally, password. |
RobMeades | 0:7ccf0e7e8a83 | 128 | */ |
RobMeades | 0:7ccf0e7e8a83 | 129 | virtual void set_credentials(const char *apn, const char *uname = 0, |
RobMeades | 0:7ccf0e7e8a83 | 130 | const char *pwd = 0); |
RobMeades | 0:7ccf0e7e8a83 | 131 | |
RobMeades | 0:7ccf0e7e8a83 | 132 | /** Set the PIN code for the SIM card. |
RobMeades | 0:7ccf0e7e8a83 | 133 | * |
RobMeades | 0:7ccf0e7e8a83 | 134 | * @param sim_pin PIN for the SIM card. |
RobMeades | 0:7ccf0e7e8a83 | 135 | */ |
RobMeades | 0:7ccf0e7e8a83 | 136 | virtual void set_sim_pin(const char *sim_pin); |
RobMeades | 0:7ccf0e7e8a83 | 137 | |
RobMeades | 0:7ccf0e7e8a83 | 138 | /** Connect to the cellular network and start the interface. |
RobMeades | 0:7ccf0e7e8a83 | 139 | * |
RobMeades | 0:7ccf0e7e8a83 | 140 | * Attempts to connect to a cellular network. Note: if init() has |
RobMeades | 0:7ccf0e7e8a83 | 141 | * not been called beforehand, connect() will call it first. |
RobMeades | 0:7ccf0e7e8a83 | 142 | * |
RobMeades | 0:7ccf0e7e8a83 | 143 | * @param sim_pin PIN for the SIM card. |
RobMeades | 0:7ccf0e7e8a83 | 144 | * @param apn Optionally, access point name. |
RobMeades | 0:7ccf0e7e8a83 | 145 | * @param uname Optionally, user name. |
RobMeades | 0:7ccf0e7e8a83 | 146 | * @param pwd Optionally, password. |
RobMeades | 0:7ccf0e7e8a83 | 147 | * @return NSAPI_ERROR_OK on success, or negative error code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 148 | */ |
RobMeades | 0:7ccf0e7e8a83 | 149 | virtual nsapi_error_t connect(const char *sim_pin, const char *apn = 0, |
RobMeades | 0:7ccf0e7e8a83 | 150 | const char *uname = 0, const char *pwd = 0); |
RobMeades | 0:7ccf0e7e8a83 | 151 | |
RobMeades | 0:7ccf0e7e8a83 | 152 | /** Attempt to connect to the cellular network. |
RobMeades | 0:7ccf0e7e8a83 | 153 | * |
RobMeades | 0:7ccf0e7e8a83 | 154 | * Brings up the network interface. Connects to the cellular radio |
RobMeades | 0:7ccf0e7e8a83 | 155 | * network and then brings up IP stack on the cellular modem to be used |
RobMeades | 0:7ccf0e7e8a83 | 156 | * indirectly via AT commands, rather than LWIP. Note: if init() has |
RobMeades | 0:7ccf0e7e8a83 | 157 | * not been called beforehand, connect() will call it first. |
RobMeades | 0:7ccf0e7e8a83 | 158 | * NOTE: even a failed attempt to connect will cause the modem to remain |
RobMeades | 0:7ccf0e7e8a83 | 159 | * powered up. To power it down, call deinit(). |
RobMeades | 0:7ccf0e7e8a83 | 160 | * |
RobMeades | 0:7ccf0e7e8a83 | 161 | * For APN setup, default behaviour is to use 'internet' as APN string |
RobMeades | 0:7ccf0e7e8a83 | 162 | * and assuming no authentication is required, i.e., user name and password |
RobMeades | 0:7ccf0e7e8a83 | 163 | * are not set. Optionally, a database lookup can be requested by turning |
RobMeades | 0:7ccf0e7e8a83 | 164 | * on the APN database lookup feature. The APN database is by no means |
RobMeades | 0:7ccf0e7e8a83 | 165 | * exhaustive (feel free to submit a pull request with additional values). |
RobMeades | 0:7ccf0e7e8a83 | 166 | * It contains a short list of some public APNs with publicly available |
RobMeades | 0:7ccf0e7e8a83 | 167 | * user names and passwords (if required) in some particular countries only. |
RobMeades | 0:7ccf0e7e8a83 | 168 | * Lookup is done using IMSI (International mobile subscriber identifier). |
RobMeades | 0:7ccf0e7e8a83 | 169 | * |
RobMeades | 0:7ccf0e7e8a83 | 170 | * The preferred method is to setup APN using 'set_credentials()' API. |
RobMeades | 0:7ccf0e7e8a83 | 171 | * |
RobMeades | 0:7ccf0e7e8a83 | 172 | * If you find that the AT interface returns "CONNECT" but shortly afterwards |
RobMeades | 0:7ccf0e7e8a83 | 173 | * drops the connection then 99% of the time this will be because the APN |
RobMeades | 0:7ccf0e7e8a83 | 174 | * is incorrect. |
RobMeades | 0:7ccf0e7e8a83 | 175 | * |
RobMeades | 0:7ccf0e7e8a83 | 176 | * @return 0 on success, negative error code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 177 | */ |
RobMeades | 0:7ccf0e7e8a83 | 178 | virtual nsapi_error_t connect(); |
RobMeades | 0:7ccf0e7e8a83 | 179 | |
RobMeades | 0:7ccf0e7e8a83 | 180 | /** Attempt to disconnect from the network. |
RobMeades | 0:7ccf0e7e8a83 | 181 | * |
RobMeades | 0:7ccf0e7e8a83 | 182 | * Brings down the network interface. |
RobMeades | 0:7ccf0e7e8a83 | 183 | * Does not bring down the Radio network. |
RobMeades | 0:7ccf0e7e8a83 | 184 | * |
RobMeades | 0:7ccf0e7e8a83 | 185 | * @return 0 on success, negative error code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 186 | */ |
RobMeades | 0:7ccf0e7e8a83 | 187 | virtual nsapi_error_t disconnect(); |
RobMeades | 0:7ccf0e7e8a83 | 188 | |
RobMeades | 0:7ccf0e7e8a83 | 189 | /** Adds or removes a SIM facility lock. |
RobMeades | 0:7ccf0e7e8a83 | 190 | * |
RobMeades | 0:7ccf0e7e8a83 | 191 | * Can be used to enable or disable SIM PIN check at device startup. |
RobMeades | 0:7ccf0e7e8a83 | 192 | * |
RobMeades | 0:7ccf0e7e8a83 | 193 | * @param set Can be set to true if the SIM PIN check is supposed |
RobMeades | 0:7ccf0e7e8a83 | 194 | * to be enabled and vice versa. |
RobMeades | 0:7ccf0e7e8a83 | 195 | * @param immediate If true, change the SIM PIN now, else set a flag |
RobMeades | 0:7ccf0e7e8a83 | 196 | * and make the change only when connect() is called. |
RobMeades | 0:7ccf0e7e8a83 | 197 | * If this is true and init() has not been called previously, |
RobMeades | 0:7ccf0e7e8a83 | 198 | * it will be called first. |
RobMeades | 0:7ccf0e7e8a83 | 199 | * @param sim_pin The current SIM PIN, must be a const. If this is not |
RobMeades | 0:7ccf0e7e8a83 | 200 | * provided, the SIM PIN must have previously been set by a |
RobMeades | 0:7ccf0e7e8a83 | 201 | * call to set_sim_pin(). |
RobMeades | 0:7ccf0e7e8a83 | 202 | * @return 0 on success, negative error code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 203 | */ |
RobMeades | 0:7ccf0e7e8a83 | 204 | nsapi_error_t set_sim_pin_check(bool set, bool immediate = false, |
RobMeades | 0:7ccf0e7e8a83 | 205 | const char *sim_pin = NULL); |
RobMeades | 0:7ccf0e7e8a83 | 206 | |
RobMeades | 0:7ccf0e7e8a83 | 207 | /** Change the PIN for the SIM card. |
RobMeades | 0:7ccf0e7e8a83 | 208 | * |
RobMeades | 0:7ccf0e7e8a83 | 209 | * Provide the new PIN for your SIM card with this API. It is ONLY possible to |
RobMeades | 0:7ccf0e7e8a83 | 210 | * change the SIM PIN when SIM PIN checking is ENABLED. |
RobMeades | 0:7ccf0e7e8a83 | 211 | * |
RobMeades | 0:7ccf0e7e8a83 | 212 | * @param new_pin New PIN to be used in string format, must be a const. |
RobMeades | 0:7ccf0e7e8a83 | 213 | * @param immediate If true, change the SIM PIN now, else set a flag |
RobMeades | 0:7ccf0e7e8a83 | 214 | * and make the change only when connect() is called. |
RobMeades | 0:7ccf0e7e8a83 | 215 | * If this is true and init() has not been called previously, |
RobMeades | 0:7ccf0e7e8a83 | 216 | * it will be called first. |
RobMeades | 0:7ccf0e7e8a83 | 217 | * @param old_pin Old PIN, must be a const. If this is not provided, the SIM PIN |
RobMeades | 0:7ccf0e7e8a83 | 218 | * must have previously been set by a call to set_sim_pin(). |
RobMeades | 0:7ccf0e7e8a83 | 219 | * @return 0 on success, negative error code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 220 | */ |
RobMeades | 0:7ccf0e7e8a83 | 221 | nsapi_error_t set_new_sim_pin(const char *new_pin, bool immediate = false, |
RobMeades | 0:7ccf0e7e8a83 | 222 | const char *old_pin = NULL); |
RobMeades | 0:7ccf0e7e8a83 | 223 | |
RobMeades | 0:7ccf0e7e8a83 | 224 | /** Check if the connection is currently established or not. |
RobMeades | 0:7ccf0e7e8a83 | 225 | * |
RobMeades | 0:7ccf0e7e8a83 | 226 | * @return True if connected to a data network, otherwise false. |
RobMeades | 0:7ccf0e7e8a83 | 227 | */ |
RobMeades | 0:7ccf0e7e8a83 | 228 | virtual bool is_connected(); |
RobMeades | 0:7ccf0e7e8a83 | 229 | |
RobMeades | 0:7ccf0e7e8a83 | 230 | /** Get the local IP address |
RobMeades | 0:7ccf0e7e8a83 | 231 | * |
RobMeades | 0:7ccf0e7e8a83 | 232 | * @return Null-terminated representation of the local IP address |
RobMeades | 0:7ccf0e7e8a83 | 233 | * or null if no IP address has been received. |
RobMeades | 0:7ccf0e7e8a83 | 234 | */ |
RobMeades | 0:7ccf0e7e8a83 | 235 | virtual const char *get_ip_address(); |
RobMeades | 0:7ccf0e7e8a83 | 236 | |
RobMeades | 0:7ccf0e7e8a83 | 237 | /** Get the local network mask. |
RobMeades | 0:7ccf0e7e8a83 | 238 | * |
RobMeades | 0:7ccf0e7e8a83 | 239 | * @return Null-terminated representation of the local network mask |
RobMeades | 0:7ccf0e7e8a83 | 240 | * or null if no network mask has been received. |
RobMeades | 0:7ccf0e7e8a83 | 241 | */ |
RobMeades | 0:7ccf0e7e8a83 | 242 | virtual const char *get_netmask(); |
RobMeades | 0:7ccf0e7e8a83 | 243 | |
RobMeades | 0:7ccf0e7e8a83 | 244 | /** Get the local gateways. |
RobMeades | 0:7ccf0e7e8a83 | 245 | * |
RobMeades | 0:7ccf0e7e8a83 | 246 | * @return Null-terminated representation of the local gateway |
RobMeades | 0:7ccf0e7e8a83 | 247 | * or null if no network mask has been received. |
RobMeades | 0:7ccf0e7e8a83 | 248 | */ |
RobMeades | 0:7ccf0e7e8a83 | 249 | virtual const char *get_gateway(); |
RobMeades | 0:7ccf0e7e8a83 | 250 | |
RobMeades | 0:7ccf0e7e8a83 | 251 | /** Call back in case connection is lost. |
RobMeades | 0:7ccf0e7e8a83 | 252 | * |
RobMeades | 0:7ccf0e7e8a83 | 253 | * @param cb The function to call. |
RobMeades | 0:7ccf0e7e8a83 | 254 | */ |
RobMeades | 0:7ccf0e7e8a83 | 255 | void connection_status_cb(Callback<void(nsapi_error_t)> cb); |
RobMeades | 0:7ccf0e7e8a83 | 256 | |
RobMeades | 0:7ccf0e7e8a83 | 257 | protected: |
RobMeades | 0:7ccf0e7e8a83 | 258 | |
RobMeades | 0:7ccf0e7e8a83 | 259 | /** Socket "unused" value. |
RobMeades | 0:7ccf0e7e8a83 | 260 | */ |
RobMeades | 0:7ccf0e7e8a83 | 261 | #define SOCKET_UNUSED -1 |
RobMeades | 0:7ccf0e7e8a83 | 262 | |
RobMeades | 0:7ccf0e7e8a83 | 263 | /** Socket timeout value in milliseconds. |
RobMeades | 0:7ccf0e7e8a83 | 264 | * Note: the sockets layer above will retry the |
RobMeades | 0:7ccf0e7e8a83 | 265 | * call to the functions here when they return NSAPI_ERROR_WOULD_BLOCK |
RobMeades | 0:7ccf0e7e8a83 | 266 | * and the user has set a larger timeout or full blocking. |
RobMeades | 0:7ccf0e7e8a83 | 267 | */ |
RobMeades | 0:7ccf0e7e8a83 | 268 | #define SOCKET_TIMEOUT 1000 |
RobMeades | 0:7ccf0e7e8a83 | 269 | |
RobMeades | 0:7ccf0e7e8a83 | 270 | /** The maximum number of bytes in a packet that can be written |
RobMeades | 0:7ccf0e7e8a83 | 271 | * to the AT interface in one go. |
RobMeades | 0:7ccf0e7e8a83 | 272 | */ |
RobMeades | 0:7ccf0e7e8a83 | 273 | #define MAX_WRITE_SIZE 1024 |
RobMeades | 0:7ccf0e7e8a83 | 274 | |
RobMeades | 0:7ccf0e7e8a83 | 275 | /** The maximum number of bytes in a packet that can be read from |
RobMeades | 0:7ccf0e7e8a83 | 276 | * from the AT interface in one go. |
RobMeades | 0:7ccf0e7e8a83 | 277 | */ |
RobMeades | 0:7ccf0e7e8a83 | 278 | #define MAX_READ_SIZE 1024 |
RobMeades | 0:7ccf0e7e8a83 | 279 | |
RobMeades | 0:7ccf0e7e8a83 | 280 | /** Management structure for sockets. |
RobMeades | 0:7ccf0e7e8a83 | 281 | */ |
RobMeades | 0:7ccf0e7e8a83 | 282 | typedef struct { |
RobMeades | 0:7ccf0e7e8a83 | 283 | int modem_handle; //!< The modem's handle for the socket. |
RobMeades | 0:7ccf0e7e8a83 | 284 | volatile nsapi_size_t pending; //!< The number of received bytes pending. |
RobMeades | 0:7ccf0e7e8a83 | 285 | void (*callback)(void *); //!< A callback for events. |
RobMeades | 0:7ccf0e7e8a83 | 286 | void *data; //!< A data pointer that must be passed to the callback. |
RobMeades | 0:7ccf0e7e8a83 | 287 | } SockCtrl; |
RobMeades | 0:7ccf0e7e8a83 | 288 | |
RobMeades | 0:7ccf0e7e8a83 | 289 | /** Sockets storage. |
RobMeades | 0:7ccf0e7e8a83 | 290 | */ |
RobMeades | 0:7ccf0e7e8a83 | 291 | SockCtrl _sockets[7]; |
RobMeades | 0:7ccf0e7e8a83 | 292 | |
RobMeades | 0:7ccf0e7e8a83 | 293 | /** Storage for a single IP address. |
RobMeades | 0:7ccf0e7e8a83 | 294 | */ |
RobMeades | 0:7ccf0e7e8a83 | 295 | char *_ip; |
RobMeades | 0:7ccf0e7e8a83 | 296 | |
RobMeades | 0:7ccf0e7e8a83 | 297 | /** The APN to use. |
RobMeades | 0:7ccf0e7e8a83 | 298 | */ |
RobMeades | 0:7ccf0e7e8a83 | 299 | const char *_apn; |
RobMeades | 0:7ccf0e7e8a83 | 300 | |
RobMeades | 0:7ccf0e7e8a83 | 301 | /** The user name to use. |
RobMeades | 0:7ccf0e7e8a83 | 302 | */ |
RobMeades | 0:7ccf0e7e8a83 | 303 | const char *_uname; |
RobMeades | 0:7ccf0e7e8a83 | 304 | |
RobMeades | 0:7ccf0e7e8a83 | 305 | /** The password to use. |
RobMeades | 0:7ccf0e7e8a83 | 306 | */ |
RobMeades | 0:7ccf0e7e8a83 | 307 | const char *_pwd; |
RobMeades | 0:7ccf0e7e8a83 | 308 | |
RobMeades | 0:7ccf0e7e8a83 | 309 | /** The type of authentication to use. |
RobMeades | 0:7ccf0e7e8a83 | 310 | */ |
RobMeades | 0:7ccf0e7e8a83 | 311 | nsapi_security_t _auth; |
RobMeades | 0:7ccf0e7e8a83 | 312 | |
RobMeades | 0:7ccf0e7e8a83 | 313 | /** Get the next set of credentials from the database. |
RobMeades | 0:7ccf0e7e8a83 | 314 | */ |
RobMeades | 0:7ccf0e7e8a83 | 315 | virtual void get_next_credentials(const char * config); |
RobMeades | 0:7ccf0e7e8a83 | 316 | |
RobMeades | 0:7ccf0e7e8a83 | 317 | /** Activate one of the on-board modem's connection profiles. |
RobMeades | 0:7ccf0e7e8a83 | 318 | * |
RobMeades | 0:7ccf0e7e8a83 | 319 | * @param apn The APN to use. |
RobMeades | 0:7ccf0e7e8a83 | 320 | * @param username The user name to use. |
RobMeades | 0:7ccf0e7e8a83 | 321 | * @param password The password to use. |
RobMeades | 0:7ccf0e7e8a83 | 322 | * @param auth The authentication method to use |
RobMeades | 0:7ccf0e7e8a83 | 323 | * (NSAPI_SECURITY_NONE, NSAPI_SECURITY_PAP, |
RobMeades | 0:7ccf0e7e8a83 | 324 | * NSAPI_SECURITY_CHAP or NSAPI_SECURITY_UNKNOWN). |
RobMeades | 0:7ccf0e7e8a83 | 325 | * @return True if successful, otherwise false. |
RobMeades | 0:7ccf0e7e8a83 | 326 | */ |
RobMeades | 0:7ccf0e7e8a83 | 327 | virtual bool activate_profile(const char* apn, const char* username, |
RobMeades | 0:7ccf0e7e8a83 | 328 | const char* password, nsapi_security_t auth); |
RobMeades | 0:7ccf0e7e8a83 | 329 | |
RobMeades | 0:7ccf0e7e8a83 | 330 | /** Activate a profile using the existing external connection. |
RobMeades | 0:7ccf0e7e8a83 | 331 | * |
RobMeades | 0:7ccf0e7e8a83 | 332 | * @return true if successful, otherwise false. |
RobMeades | 0:7ccf0e7e8a83 | 333 | */ |
RobMeades | 0:7ccf0e7e8a83 | 334 | virtual bool activate_profile_reuse_external(void); |
RobMeades | 0:7ccf0e7e8a83 | 335 | |
RobMeades | 0:7ccf0e7e8a83 | 336 | /** Activate a profile based on connection ID. |
RobMeades | 0:7ccf0e7e8a83 | 337 | * |
RobMeades | 0:7ccf0e7e8a83 | 338 | * @param cid The connection ID. |
RobMeades | 0:7ccf0e7e8a83 | 339 | * @param apn The APN to use. |
RobMeades | 0:7ccf0e7e8a83 | 340 | * @param username The user name to use. |
RobMeades | 0:7ccf0e7e8a83 | 341 | * @param password The password to use. |
RobMeades | 0:7ccf0e7e8a83 | 342 | * @param auth The authentication method to use. |
RobMeades | 0:7ccf0e7e8a83 | 343 | * @return True if successful, otherwise false. |
RobMeades | 0:7ccf0e7e8a83 | 344 | */ |
RobMeades | 0:7ccf0e7e8a83 | 345 | virtual bool activate_profile_by_cid(int cid, const char* apn, const char* username, |
RobMeades | 0:7ccf0e7e8a83 | 346 | const char* password, nsapi_security_t auth); |
RobMeades | 0:7ccf0e7e8a83 | 347 | |
RobMeades | 0:7ccf0e7e8a83 | 348 | /** Connect the on board IP stack of the modem. |
RobMeades | 0:7ccf0e7e8a83 | 349 | * |
RobMeades | 0:7ccf0e7e8a83 | 350 | * @return True if successful, otherwise false. |
RobMeades | 0:7ccf0e7e8a83 | 351 | */ |
RobMeades | 0:7ccf0e7e8a83 | 352 | virtual bool connect_modem_stack(); |
RobMeades | 0:7ccf0e7e8a83 | 353 | |
RobMeades | 0:7ccf0e7e8a83 | 354 | /** Disconnect the on board IP stack of the modem. |
RobMeades | 0:7ccf0e7e8a83 | 355 | * |
RobMeades | 0:7ccf0e7e8a83 | 356 | * @return True if successful, otherwise false. |
RobMeades | 0:7ccf0e7e8a83 | 357 | */ |
RobMeades | 0:7ccf0e7e8a83 | 358 | virtual bool disconnect_modem_stack(); |
RobMeades | 0:7ccf0e7e8a83 | 359 | |
RobMeades | 0:7ccf0e7e8a83 | 360 | /** Provide access to the NetworkStack object |
RobMeades | 0:7ccf0e7e8a83 | 361 | * |
RobMeades | 0:7ccf0e7e8a83 | 362 | * @return The underlying NetworkStack object. |
RobMeades | 0:7ccf0e7e8a83 | 363 | */ |
RobMeades | 0:7ccf0e7e8a83 | 364 | virtual NetworkStack *get_stack(); |
RobMeades | 0:7ccf0e7e8a83 | 365 | |
RobMeades | 0:7ccf0e7e8a83 | 366 | protected: |
RobMeades | 0:7ccf0e7e8a83 | 367 | |
RobMeades | 0:7ccf0e7e8a83 | 368 | /** Open a socket. |
RobMeades | 0:7ccf0e7e8a83 | 369 | * |
RobMeades | 0:7ccf0e7e8a83 | 370 | * Creates a network socket and stores it in the specified handle. |
RobMeades | 0:7ccf0e7e8a83 | 371 | * The handle must be passed to following calls on the socket. |
RobMeades | 0:7ccf0e7e8a83 | 372 | * |
RobMeades | 0:7ccf0e7e8a83 | 373 | * @param handle Destination for the handle to a newly created socket. |
RobMeades | 0:7ccf0e7e8a83 | 374 | * @param proto Protocol of socket to open, NSAPI_TCP or NSAPI_UDP. |
RobMeades | 0:7ccf0e7e8a83 | 375 | * @return 0 on success, negative error code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 376 | */ |
RobMeades | 0:7ccf0e7e8a83 | 377 | virtual nsapi_error_t socket_open(nsapi_socket_t *handle, |
RobMeades | 0:7ccf0e7e8a83 | 378 | nsapi_protocol_t proto); |
RobMeades | 0:7ccf0e7e8a83 | 379 | |
RobMeades | 0:7ccf0e7e8a83 | 380 | /** Close a socket. |
RobMeades | 0:7ccf0e7e8a83 | 381 | * |
RobMeades | 0:7ccf0e7e8a83 | 382 | * Closes any open connection and deallocates any memory associated |
RobMeades | 0:7ccf0e7e8a83 | 383 | * with the socket. |
RobMeades | 0:7ccf0e7e8a83 | 384 | * |
RobMeades | 0:7ccf0e7e8a83 | 385 | * @param handle Socket handle. |
RobMeades | 0:7ccf0e7e8a83 | 386 | * @return 0 on success, negative error code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 387 | */ |
RobMeades | 0:7ccf0e7e8a83 | 388 | virtual nsapi_error_t socket_close(nsapi_socket_t handle); |
RobMeades | 0:7ccf0e7e8a83 | 389 | |
RobMeades | 0:7ccf0e7e8a83 | 390 | /** Bind a specific port to a socket. |
RobMeades | 0:7ccf0e7e8a83 | 391 | * |
RobMeades | 0:7ccf0e7e8a83 | 392 | * Binding a socket specifies port on which to receive |
RobMeades | 0:7ccf0e7e8a83 | 393 | * data. The IP address is ignored. Note that binding |
RobMeades | 0:7ccf0e7e8a83 | 394 | * a socket involves closing it and reopening and so the |
RobMeades | 0:7ccf0e7e8a83 | 395 | * bind operation should be carried out before any others. |
RobMeades | 0:7ccf0e7e8a83 | 396 | * |
RobMeades | 0:7ccf0e7e8a83 | 397 | * @param handle Socket handle. |
RobMeades | 0:7ccf0e7e8a83 | 398 | * @param address Local address to bind (of which only the port is used). |
RobMeades | 0:7ccf0e7e8a83 | 399 | * @return 0 on success, negative error code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 400 | */ |
RobMeades | 0:7ccf0e7e8a83 | 401 | virtual nsapi_error_t socket_bind(nsapi_socket_t handle, |
RobMeades | 0:7ccf0e7e8a83 | 402 | const SocketAddress &address); |
RobMeades | 0:7ccf0e7e8a83 | 403 | |
RobMeades | 0:7ccf0e7e8a83 | 404 | /** Connects TCP socket to a remote host. |
RobMeades | 0:7ccf0e7e8a83 | 405 | * |
RobMeades | 0:7ccf0e7e8a83 | 406 | * Initiates a connection to a remote server specified by the |
RobMeades | 0:7ccf0e7e8a83 | 407 | * indicated address. |
RobMeades | 0:7ccf0e7e8a83 | 408 | * |
RobMeades | 0:7ccf0e7e8a83 | 409 | * @param handle Socket handle. |
RobMeades | 0:7ccf0e7e8a83 | 410 | * @param address The SocketAddress of the remote host. |
RobMeades | 0:7ccf0e7e8a83 | 411 | * @return 0 on success, negative error code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 412 | */ |
RobMeades | 0:7ccf0e7e8a83 | 413 | virtual nsapi_error_t socket_connect(nsapi_socket_t handle, |
RobMeades | 0:7ccf0e7e8a83 | 414 | const SocketAddress &address); |
RobMeades | 0:7ccf0e7e8a83 | 415 | |
RobMeades | 0:7ccf0e7e8a83 | 416 | /** Send data over a TCP socket. |
RobMeades | 0:7ccf0e7e8a83 | 417 | * |
RobMeades | 0:7ccf0e7e8a83 | 418 | * The socket must be connected to a remote host. Returns the number of |
RobMeades | 0:7ccf0e7e8a83 | 419 | * bytes sent from the buffer. This class sets no upper buffer limit on |
RobMeades | 0:7ccf0e7e8a83 | 420 | * buffer size and the maximum packet size is not connected with the |
RobMeades | 0:7ccf0e7e8a83 | 421 | * platform.buffered-serial-txbuf-size/platform.buffered-serial-rxbuf-size |
RobMeades | 0:7ccf0e7e8a83 | 422 | * definitions. |
RobMeades | 0:7ccf0e7e8a83 | 423 | * |
RobMeades | 0:7ccf0e7e8a83 | 424 | * @param handle Socket handle. |
RobMeades | 0:7ccf0e7e8a83 | 425 | * @param data Buffer of data to send to the host. |
RobMeades | 0:7ccf0e7e8a83 | 426 | * @param size Size of the buffer in bytes. |
RobMeades | 0:7ccf0e7e8a83 | 427 | * @return Number of sent bytes on success, negative error |
RobMeades | 0:7ccf0e7e8a83 | 428 | * code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 429 | */ |
RobMeades | 0:7ccf0e7e8a83 | 430 | virtual nsapi_size_or_error_t socket_send(nsapi_socket_t handle, |
RobMeades | 0:7ccf0e7e8a83 | 431 | const void *data, nsapi_size_t size); |
RobMeades | 0:7ccf0e7e8a83 | 432 | |
RobMeades | 0:7ccf0e7e8a83 | 433 | /** Send a packet over a UDP socket. |
RobMeades | 0:7ccf0e7e8a83 | 434 | * |
RobMeades | 0:7ccf0e7e8a83 | 435 | * Sends data to the specified address. Returns the number of bytes |
RobMeades | 0:7ccf0e7e8a83 | 436 | * sent from the buffer. |
RobMeades | 0:7ccf0e7e8a83 | 437 | * |
RobMeades | 0:7ccf0e7e8a83 | 438 | * PACKET SIZES: the maximum packet size that can be sent in a single |
RobMeades | 0:7ccf0e7e8a83 | 439 | * UDP packet is limited by the configuration value |
RobMeades | 0:7ccf0e7e8a83 | 440 | * platform.buffered-serial-txbuf-size (defaults to 256). |
RobMeades | 0:7ccf0e7e8a83 | 441 | * The maximum UDP packet size is: |
RobMeades | 0:7ccf0e7e8a83 | 442 | * |
RobMeades | 0:7ccf0e7e8a83 | 443 | * platform.buffered-serial-txbuf-size - AT_PACKET_OVERHEAD |
RobMeades | 0:7ccf0e7e8a83 | 444 | * |
RobMeades | 0:7ccf0e7e8a83 | 445 | * ...with a limit of 1024 bytes (at the AT interface). So, to allow sending |
RobMeades | 0:7ccf0e7e8a83 | 446 | * of a 1024 byte UDP packet, edit your mbed_app.json to add a target override |
RobMeades | 0:7ccf0e7e8a83 | 447 | * setting platform.buffered-serial-txbuf-size to 1101. However, for |
RobMeades | 0:7ccf0e7e8a83 | 448 | * UDP packets, 508 bytes is considered a more realistic size, taking into |
RobMeades | 0:7ccf0e7e8a83 | 449 | * account fragmentation sizes over the public internet, which leads to a |
RobMeades | 0:7ccf0e7e8a83 | 450 | * platform.buffered-serial-txbuf-size/platform.buffered-serial-rxbuf-size |
RobMeades | 0:7ccf0e7e8a83 | 451 | * setting of 585. |
RobMeades | 0:7ccf0e7e8a83 | 452 | * |
RobMeades | 0:7ccf0e7e8a83 | 453 | * If size is larger than this limit, the data will be split across separate |
RobMeades | 0:7ccf0e7e8a83 | 454 | * UDP packets. |
RobMeades | 0:7ccf0e7e8a83 | 455 | * |
RobMeades | 0:7ccf0e7e8a83 | 456 | * @param handle Socket handle. |
RobMeades | 0:7ccf0e7e8a83 | 457 | * @param address The SocketAddress of the remote host. |
RobMeades | 0:7ccf0e7e8a83 | 458 | * @param data Buffer of data to send to the host. |
RobMeades | 0:7ccf0e7e8a83 | 459 | * @param size Size of the buffer in bytes. |
RobMeades | 0:7ccf0e7e8a83 | 460 | * @return Number of sent bytes on success, negative error |
RobMeades | 0:7ccf0e7e8a83 | 461 | * code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 462 | */ |
RobMeades | 0:7ccf0e7e8a83 | 463 | virtual nsapi_size_or_error_t socket_sendto(nsapi_socket_t handle, |
RobMeades | 0:7ccf0e7e8a83 | 464 | const SocketAddress &address, |
RobMeades | 0:7ccf0e7e8a83 | 465 | const void *data, |
RobMeades | 0:7ccf0e7e8a83 | 466 | nsapi_size_t size); |
RobMeades | 0:7ccf0e7e8a83 | 467 | |
RobMeades | 0:7ccf0e7e8a83 | 468 | /** Receive data over a TCP socket. |
RobMeades | 0:7ccf0e7e8a83 | 469 | * |
RobMeades | 0:7ccf0e7e8a83 | 470 | * The socket must be connected to a remote host. Returns the number of |
RobMeades | 0:7ccf0e7e8a83 | 471 | * bytes received into the buffer. This class sets no upper limit on the |
RobMeades | 0:7ccf0e7e8a83 | 472 | * buffer size and the maximum packet size is not connected with the |
RobMeades | 0:7ccf0e7e8a83 | 473 | * platform.buffered-serial-txbuf-size/platform.buffered-serial-rxbuf-size |
RobMeades | 0:7ccf0e7e8a83 | 474 | * definitions. |
RobMeades | 0:7ccf0e7e8a83 | 475 | * |
RobMeades | 0:7ccf0e7e8a83 | 476 | * @param handle Socket handle. |
RobMeades | 0:7ccf0e7e8a83 | 477 | * @param data Destination buffer for data received from the host. |
RobMeades | 0:7ccf0e7e8a83 | 478 | * @param size Size of the buffer in bytes. |
RobMeades | 0:7ccf0e7e8a83 | 479 | * @return Number of received bytes on success, negative error |
RobMeades | 0:7ccf0e7e8a83 | 480 | * code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 481 | */ |
RobMeades | 0:7ccf0e7e8a83 | 482 | virtual nsapi_size_or_error_t socket_recv(nsapi_socket_t handle, |
RobMeades | 0:7ccf0e7e8a83 | 483 | void *data, nsapi_size_t size); |
RobMeades | 0:7ccf0e7e8a83 | 484 | |
RobMeades | 0:7ccf0e7e8a83 | 485 | /** Receive a packet over a UDP socket. |
RobMeades | 0:7ccf0e7e8a83 | 486 | * |
RobMeades | 0:7ccf0e7e8a83 | 487 | * Receives data and stores the source address in address if address |
RobMeades | 0:7ccf0e7e8a83 | 488 | * is not NULL. Returns the number of bytes received into the buffer. |
RobMeades | 0:7ccf0e7e8a83 | 489 | * |
RobMeades | 0:7ccf0e7e8a83 | 490 | * PACKET SIZES: the maximum packet size that can be retrieved in a |
RobMeades | 0:7ccf0e7e8a83 | 491 | * single call to this method is limited by the configuration value |
RobMeades | 0:7ccf0e7e8a83 | 492 | * platform.buffered-serial-rxbuf-size (default 256). The maximum |
RobMeades | 0:7ccf0e7e8a83 | 493 | * UDP packet size is: |
RobMeades | 0:7ccf0e7e8a83 | 494 | * |
RobMeades | 0:7ccf0e7e8a83 | 495 | * platform.buffered-serial-rxbuf-size - AT_PACKET_OVERHEAD |
RobMeades | 0:7ccf0e7e8a83 | 496 | * |
RobMeades | 0:7ccf0e7e8a83 | 497 | * ...with a limit of 1024 (at the AT interface). So to allow reception of a |
RobMeades | 0:7ccf0e7e8a83 | 498 | * 1024 byte UDP packet in a single call, edit your mbed_app.json to add a |
RobMeades | 0:7ccf0e7e8a83 | 499 | * target override setting platform.buffered-serial-rxbuf-size to 1101. |
RobMeades | 0:7ccf0e7e8a83 | 500 | * |
RobMeades | 0:7ccf0e7e8a83 | 501 | * If the received packet is larger than this limit, any remainder will |
RobMeades | 0:7ccf0e7e8a83 | 502 | * be returned in subsequent calls to this method. Once a single UDP |
RobMeades | 0:7ccf0e7e8a83 | 503 | * packet has been received, this method will return. |
RobMeades | 0:7ccf0e7e8a83 | 504 | * |
RobMeades | 0:7ccf0e7e8a83 | 505 | * @param handle Socket handle. |
RobMeades | 0:7ccf0e7e8a83 | 506 | * @param address Destination for the source address or NULL. |
RobMeades | 0:7ccf0e7e8a83 | 507 | * @param data Destination buffer for data received from the host. |
RobMeades | 0:7ccf0e7e8a83 | 508 | * @param size Size of the buffer in bytes. |
RobMeades | 0:7ccf0e7e8a83 | 509 | * @return Number of received bytes on success, negative error |
RobMeades | 0:7ccf0e7e8a83 | 510 | * code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 511 | */ |
RobMeades | 0:7ccf0e7e8a83 | 512 | virtual nsapi_size_or_error_t socket_recvfrom(nsapi_socket_t handle, |
RobMeades | 0:7ccf0e7e8a83 | 513 | SocketAddress *address, |
RobMeades | 0:7ccf0e7e8a83 | 514 | void *data, nsapi_size_t size); |
RobMeades | 0:7ccf0e7e8a83 | 515 | |
RobMeades | 0:7ccf0e7e8a83 | 516 | /** Register a callback on state change of the socket. |
RobMeades | 0:7ccf0e7e8a83 | 517 | * |
RobMeades | 0:7ccf0e7e8a83 | 518 | * The specified callback will be called on state changes such as when |
RobMeades | 0:7ccf0e7e8a83 | 519 | * the socket can recv/send/accept successfully and on when an error |
RobMeades | 0:7ccf0e7e8a83 | 520 | * occurs. The callback may also be called spuriously without reason. |
RobMeades | 0:7ccf0e7e8a83 | 521 | * |
RobMeades | 0:7ccf0e7e8a83 | 522 | * The callback may be called in an interrupt context and should not |
RobMeades | 0:7ccf0e7e8a83 | 523 | * perform expensive operations such as recv/send calls. |
RobMeades | 0:7ccf0e7e8a83 | 524 | * |
RobMeades | 0:7ccf0e7e8a83 | 525 | * @param handle Socket handle. |
RobMeades | 0:7ccf0e7e8a83 | 526 | * @param callback Function to call on state change. |
RobMeades | 0:7ccf0e7e8a83 | 527 | * @param data Argument to pass to callback. |
RobMeades | 0:7ccf0e7e8a83 | 528 | */ |
RobMeades | 0:7ccf0e7e8a83 | 529 | virtual void socket_attach(nsapi_socket_t handle, void (*callback)(void *), |
RobMeades | 0:7ccf0e7e8a83 | 530 | void *data); |
RobMeades | 0:7ccf0e7e8a83 | 531 | |
RobMeades | 0:7ccf0e7e8a83 | 532 | /** Listen for connections on a TCP socket. |
RobMeades | 0:7ccf0e7e8a83 | 533 | * |
RobMeades | 0:7ccf0e7e8a83 | 534 | * Marks the socket as a passive socket that can be used to accept |
RobMeades | 0:7ccf0e7e8a83 | 535 | * incoming connections. |
RobMeades | 0:7ccf0e7e8a83 | 536 | * |
RobMeades | 0:7ccf0e7e8a83 | 537 | * @param handle Socket handle. |
RobMeades | 0:7ccf0e7e8a83 | 538 | * @param backlog Number of pending connections that can be queued |
RobMeades | 0:7ccf0e7e8a83 | 539 | * simultaneously, defaults to 1. |
RobMeades | 0:7ccf0e7e8a83 | 540 | * @return 0 on success, negative error code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 541 | */ |
RobMeades | 0:7ccf0e7e8a83 | 542 | virtual nsapi_error_t socket_listen(nsapi_socket_t handle, int backlog); |
RobMeades | 0:7ccf0e7e8a83 | 543 | |
RobMeades | 0:7ccf0e7e8a83 | 544 | /** Accepts a connection on a TCP socket. |
RobMeades | 0:7ccf0e7e8a83 | 545 | * |
RobMeades | 0:7ccf0e7e8a83 | 546 | * The server socket must be bound and set to listen for connections. |
RobMeades | 0:7ccf0e7e8a83 | 547 | * On a new connection, creates a network socket and stores it in the |
RobMeades | 0:7ccf0e7e8a83 | 548 | * specified handle. The handle must be passed to following calls on |
RobMeades | 0:7ccf0e7e8a83 | 549 | * the socket. |
RobMeades | 0:7ccf0e7e8a83 | 550 | * |
RobMeades | 0:7ccf0e7e8a83 | 551 | * A stack may have a finite number of sockets, in this case |
RobMeades | 0:7ccf0e7e8a83 | 552 | * NSAPI_ERROR_NO_SOCKET is returned if no socket is available. |
RobMeades | 0:7ccf0e7e8a83 | 553 | * |
RobMeades | 0:7ccf0e7e8a83 | 554 | * This call is non-blocking. If accept would block, |
RobMeades | 0:7ccf0e7e8a83 | 555 | * NSAPI_ERROR_WOULD_BLOCK is returned immediately. |
RobMeades | 0:7ccf0e7e8a83 | 556 | * |
RobMeades | 0:7ccf0e7e8a83 | 557 | * @param server Socket handle to server to accept from. |
RobMeades | 0:7ccf0e7e8a83 | 558 | * @param handle Destination for a handle to the newly created socket. |
RobMeades | 0:7ccf0e7e8a83 | 559 | * @param address Destination for the remote address or NULL. |
RobMeades | 0:7ccf0e7e8a83 | 560 | * @return 0 on success, negative error code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 561 | */ |
RobMeades | 0:7ccf0e7e8a83 | 562 | virtual nsapi_error_t socket_accept(nsapi_socket_t server, |
RobMeades | 0:7ccf0e7e8a83 | 563 | nsapi_socket_t *handle, |
RobMeades | 0:7ccf0e7e8a83 | 564 | SocketAddress *address = 0); |
RobMeades | 0:7ccf0e7e8a83 | 565 | |
RobMeades | 0:7ccf0e7e8a83 | 566 | /** Set stack-specific socket options. |
RobMeades | 0:7ccf0e7e8a83 | 567 | * |
RobMeades | 0:7ccf0e7e8a83 | 568 | * The setsockopt allow an application to pass stack-specific hints |
RobMeades | 0:7ccf0e7e8a83 | 569 | * to the underlying stack. For unsupported options, |
RobMeades | 0:7ccf0e7e8a83 | 570 | * NSAPI_ERROR_UNSUPPORTED is returned and the socket is unmodified. |
RobMeades | 0:7ccf0e7e8a83 | 571 | * |
RobMeades | 0:7ccf0e7e8a83 | 572 | * @param handle Socket handle. |
RobMeades | 0:7ccf0e7e8a83 | 573 | * @param level Stack-specific protocol level. |
RobMeades | 0:7ccf0e7e8a83 | 574 | * @param optname Stack-specific option identifier. |
RobMeades | 0:7ccf0e7e8a83 | 575 | * @param optval Option value. |
RobMeades | 0:7ccf0e7e8a83 | 576 | * @param optlen Length of the option value. |
RobMeades | 0:7ccf0e7e8a83 | 577 | * @return 0 on success, negative error code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 578 | */ |
RobMeades | 0:7ccf0e7e8a83 | 579 | virtual nsapi_error_t setsockopt(nsapi_socket_t handle, int level, |
RobMeades | 0:7ccf0e7e8a83 | 580 | int optname, const void *optval, |
RobMeades | 0:7ccf0e7e8a83 | 581 | unsigned optlen); |
RobMeades | 0:7ccf0e7e8a83 | 582 | |
RobMeades | 0:7ccf0e7e8a83 | 583 | /** Get stack-specific socket options. |
RobMeades | 0:7ccf0e7e8a83 | 584 | * |
RobMeades | 0:7ccf0e7e8a83 | 585 | * The getstackopt allow an application to retrieve stack-specific hints |
RobMeades | 0:7ccf0e7e8a83 | 586 | * from the underlying stack. For unsupported options, |
RobMeades | 0:7ccf0e7e8a83 | 587 | * NSAPI_ERROR_UNSUPPORTED is returned and optval is unmodified. |
RobMeades | 0:7ccf0e7e8a83 | 588 | * |
RobMeades | 0:7ccf0e7e8a83 | 589 | * @param handle Socket handle. |
RobMeades | 0:7ccf0e7e8a83 | 590 | * @param level Stack-specific protocol level. |
RobMeades | 0:7ccf0e7e8a83 | 591 | * @param optname Stack-specific option identifier. |
RobMeades | 0:7ccf0e7e8a83 | 592 | * @param optval Destination for option value. |
RobMeades | 0:7ccf0e7e8a83 | 593 | * @param optlen Length of the option value. |
RobMeades | 0:7ccf0e7e8a83 | 594 | * @return 0 on success, negative error code on failure. |
RobMeades | 0:7ccf0e7e8a83 | 595 | */ |
RobMeades | 0:7ccf0e7e8a83 | 596 | virtual nsapi_error_t getsockopt(nsapi_socket_t handle, int level, |
RobMeades | 0:7ccf0e7e8a83 | 597 | int optname, void *optval, |
RobMeades | 0:7ccf0e7e8a83 | 598 | unsigned *optlen); |
RobMeades | 0:7ccf0e7e8a83 | 599 | |
RobMeades | 0:7ccf0e7e8a83 | 600 | private: |
RobMeades | 0:7ccf0e7e8a83 | 601 | |
RobMeades | 0:7ccf0e7e8a83 | 602 | // u_ added to namespace us somewhat as this darned macro |
RobMeades | 0:7ccf0e7e8a83 | 603 | // is defined by everyone and their dog |
RobMeades | 0:7ccf0e7e8a83 | 604 | #define u_stringify(a) str(a) |
RobMeades | 0:7ccf0e7e8a83 | 605 | #define str(a) #a |
RobMeades | 0:7ccf0e7e8a83 | 606 | |
RobMeades | 0:7ccf0e7e8a83 | 607 | bool _sim_pin_check_change_pending; |
RobMeades | 0:7ccf0e7e8a83 | 608 | bool _sim_pin_check_change_pending_enabled_value; |
RobMeades | 0:7ccf0e7e8a83 | 609 | bool _sim_pin_change_pending; |
RobMeades | 0:7ccf0e7e8a83 | 610 | const char *_sim_pin_change_pending_new_pin_value; |
RobMeades | 0:7ccf0e7e8a83 | 611 | Thread event_thread; |
RobMeades | 0:7ccf0e7e8a83 | 612 | void handle_event(); |
RobMeades | 0:7ccf0e7e8a83 | 613 | SockCtrl * find_socket(int modem_handle = SOCKET_UNUSED); |
RobMeades | 0:7ccf0e7e8a83 | 614 | void clear_socket(SockCtrl * socket); |
RobMeades | 0:7ccf0e7e8a83 | 615 | bool check_socket(SockCtrl * socket); |
RobMeades | 0:7ccf0e7e8a83 | 616 | int nsapi_security_to_modem_security(nsapi_security_t nsapi_security); |
RobMeades | 0:7ccf0e7e8a83 | 617 | Callback<void(nsapi_error_t)> _connection_status_cb; |
RobMeades | 0:7ccf0e7e8a83 | 618 | void UUSORD_URC(); |
RobMeades | 0:7ccf0e7e8a83 | 619 | void UUSORF_URC(); |
RobMeades | 0:7ccf0e7e8a83 | 620 | void UUSOCL_URC(); |
RobMeades | 0:7ccf0e7e8a83 | 621 | void UUPSDD_URC(); |
RobMeades | 0:7ccf0e7e8a83 | 622 | }; |
RobMeades | 0:7ccf0e7e8a83 | 623 | |
rob.meades@u-blox.com | 1:bc228becc45d | 624 | #endif // _UBLOX_AT_CELLULAR_INTERFACE_ |
RobMeades | 0:7ccf0e7e8a83 | 625 |