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