ublox-at-cellular-interface_R412M
UbloxATCellularInterface.h@14:e7dcf3388403, 2018-03-02 (annotated)
- Committer:
- RobMeades
- Date:
- Fri Mar 02 13:28:32 2018 +0000
- Revision:
- 14:e7dcf3388403
- Parent:
- 7:3b2ca10cc23a
- Child:
- 16:2b30a056ae54
Make sure that the event handler thread is closed cleanly in all cases and add tests that this is the case, both for sleep and for memory.
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 | */ |
rob.meades@u-blox.com | 7:3b2ca10cc23a | 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 | 14:e7dcf3388403 | 612 | volatile bool _run_event_thread; |
RobMeades | 0:7ccf0e7e8a83 | 613 | void handle_event(); |
RobMeades | 0:7ccf0e7e8a83 | 614 | SockCtrl * find_socket(int modem_handle = SOCKET_UNUSED); |
RobMeades | 0:7ccf0e7e8a83 | 615 | void clear_socket(SockCtrl * socket); |
RobMeades | 0:7ccf0e7e8a83 | 616 | bool check_socket(SockCtrl * socket); |
RobMeades | 0:7ccf0e7e8a83 | 617 | int nsapi_security_to_modem_security(nsapi_security_t nsapi_security); |
RobMeades | 0:7ccf0e7e8a83 | 618 | Callback<void(nsapi_error_t)> _connection_status_cb; |
RobMeades | 0:7ccf0e7e8a83 | 619 | void UUSORD_URC(); |
RobMeades | 0:7ccf0e7e8a83 | 620 | void UUSORF_URC(); |
RobMeades | 0:7ccf0e7e8a83 | 621 | void UUSOCL_URC(); |
RobMeades | 0:7ccf0e7e8a83 | 622 | void UUPSDD_URC(); |
RobMeades | 0:7ccf0e7e8a83 | 623 | }; |
RobMeades | 0:7ccf0e7e8a83 | 624 | |
rob.meades@u-blox.com | 1:bc228becc45d | 625 | #endif // _UBLOX_AT_CELLULAR_INTERFACE_ |
RobMeades | 0:7ccf0e7e8a83 | 626 |