Library that implements the CellularInterface using PPP and LWIP on the mbed MCU. May be used on the C027 and C030 (non-N2xx flavour) boards from mbed 5.5 onwards.

Dependents:   example-ublox-cellular-interface HelloMQTT example-ublox-cellular-interface_r410M example-ublox-mbed-client

Committer:
rob.meades@u-blox.com
Date:
Fri Jun 30 13:30:20 2017 +0100
Revision:
2:4c533665168c
Parent:
0:44dd95724bc2
Child:
3:9863dcade75d
Connect now fails correctly if it cannot achieve a connection, rather than trying for ever.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RobMeades 0:44dd95724bc2 1 /* Copyright (c) 2017 ublox Limited
RobMeades 0:44dd95724bc2 2 *
RobMeades 0:44dd95724bc2 3 * Licensed under the Apache License, Version 2.0 (the "License");
RobMeades 0:44dd95724bc2 4 * you may not use this file except in compliance with the License.
RobMeades 0:44dd95724bc2 5 * You may obtain a copy of the License at
RobMeades 0:44dd95724bc2 6 *
RobMeades 0:44dd95724bc2 7 * http://www.apache.org/licenses/LICENSE-2.0
RobMeades 0:44dd95724bc2 8 *
RobMeades 0:44dd95724bc2 9 * Unless required by applicable law or agreed to in writing, software
RobMeades 0:44dd95724bc2 10 * distributed under the License is distributed on an "AS IS" BASIS,
RobMeades 0:44dd95724bc2 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
RobMeades 0:44dd95724bc2 12 * See the License for the specific language governing permissions and
RobMeades 0:44dd95724bc2 13 * limitations under the License.
RobMeades 0:44dd95724bc2 14 */
RobMeades 0:44dd95724bc2 15
RobMeades 0:44dd95724bc2 16 #include "cellular/onboard_modem_api.h"
RobMeades 0:44dd95724bc2 17 #include "nsapi_ppp.h"
RobMeades 0:44dd95724bc2 18 #include "utils/APN_db.h"
RobMeades 0:44dd95724bc2 19 #include "UbloxPPPCellularInterface.h"
RobMeades 0:44dd95724bc2 20 #ifdef FEATURE_COMMON_PAL
RobMeades 0:44dd95724bc2 21 #include "mbed_trace.h"
RobMeades 0:44dd95724bc2 22 #define TRACE_GROUP "UPCI"
RobMeades 0:44dd95724bc2 23 #else
RobMeades 0:44dd95724bc2 24 #define tr_debug(format, ...) debug_if(_debug_trace_on, format "\n", ## __VA_ARGS__)
RobMeades 0:44dd95724bc2 25 #define tr_info(format, ...) debug_if(_debug_trace_on, format "\n", ## __VA_ARGS__)
RobMeades 0:44dd95724bc2 26 #define tr_warn(format, ...) debug_if(_debug_trace_on, format "\n", ## __VA_ARGS__)
RobMeades 0:44dd95724bc2 27 #define tr_error(format, ...) debug_if(_debug_trace_on, format "\n", ## __VA_ARGS__)
RobMeades 0:44dd95724bc2 28 #endif
RobMeades 0:44dd95724bc2 29
RobMeades 0:44dd95724bc2 30 #if NSAPI_PPP_AVAILABLE
RobMeades 0:44dd95724bc2 31
RobMeades 0:44dd95724bc2 32 /**********************************************************************
RobMeades 0:44dd95724bc2 33 * PRIVATE METHODS
RobMeades 0:44dd95724bc2 34 **********************************************************************/
RobMeades 0:44dd95724bc2 35
RobMeades 0:44dd95724bc2 36 // Send the credentials to the modem.
RobMeades 0:44dd95724bc2 37 nsapi_error_t UbloxPPPCellularInterface::setup_context_and_credentials()
RobMeades 0:44dd95724bc2 38 {
RobMeades 0:44dd95724bc2 39 nsapi_error_t nsapi_error = NSAPI_ERROR_PARAMETER;
RobMeades 0:44dd95724bc2 40 const char *auth = _uname && _pwd ? "CHAP:" : "";
RobMeades 0:44dd95724bc2 41 LOCK();
RobMeades 0:44dd95724bc2 42
RobMeades 0:44dd95724bc2 43 if (_apn) {
RobMeades 0:44dd95724bc2 44 // TODO: IPV6
RobMeades 0:44dd95724bc2 45 if (_at->send("AT+CGDCONT=1,\"%s\",\"%s%s\"", "IP", auth, _apn) &&
RobMeades 0:44dd95724bc2 46 _at->recv("OK")) {
RobMeades 0:44dd95724bc2 47 nsapi_error = NSAPI_ERROR_OK;
RobMeades 0:44dd95724bc2 48 // C030 needs a short delay before the connection is triggered
RobMeades 0:44dd95724bc2 49 wait_ms(100);
RobMeades 0:44dd95724bc2 50 }
RobMeades 0:44dd95724bc2 51 }
RobMeades 0:44dd95724bc2 52
RobMeades 0:44dd95724bc2 53 UNLOCK();
RobMeades 0:44dd95724bc2 54 return nsapi_error;
RobMeades 0:44dd95724bc2 55
RobMeades 0:44dd95724bc2 56 }
RobMeades 0:44dd95724bc2 57
RobMeades 0:44dd95724bc2 58 // Enter data mode.
RobMeades 0:44dd95724bc2 59 bool UbloxPPPCellularInterface::set_atd()
RobMeades 0:44dd95724bc2 60 {
RobMeades 0:44dd95724bc2 61 bool success;
RobMeades 0:44dd95724bc2 62 LOCK();
RobMeades 0:44dd95724bc2 63
RobMeades 0:44dd95724bc2 64 success = _at->send("ATD*99***1#") && _at->recv("CONNECT");
RobMeades 0:44dd95724bc2 65
RobMeades 0:44dd95724bc2 66 UNLOCK();
RobMeades 0:44dd95724bc2 67 return success;
RobMeades 0:44dd95724bc2 68 }
RobMeades 0:44dd95724bc2 69
RobMeades 0:44dd95724bc2 70 /**********************************************************************
RobMeades 0:44dd95724bc2 71 * PROTECTED METHODS
RobMeades 0:44dd95724bc2 72 **********************************************************************/
RobMeades 0:44dd95724bc2 73
RobMeades 0:44dd95724bc2 74 // Gain access to the underlying network stack.
RobMeades 0:44dd95724bc2 75 NetworkStack *UbloxPPPCellularInterface::get_stack()
RobMeades 0:44dd95724bc2 76 {
RobMeades 0:44dd95724bc2 77 return nsapi_ppp_get_stack();
RobMeades 0:44dd95724bc2 78 }
RobMeades 0:44dd95724bc2 79
RobMeades 0:44dd95724bc2 80 // Get the next set of credentials, based on IMSI.
rob.meades@u-blox.com 2:4c533665168c 81 void UbloxPPPCellularInterface::get_next_credentials(const char ** config)
RobMeades 0:44dd95724bc2 82 {
rob.meades@u-blox.com 2:4c533665168c 83 if (*config) {
rob.meades@u-blox.com 2:4c533665168c 84 _apn = _APN_GET(*config);
rob.meades@u-blox.com 2:4c533665168c 85 _uname = _APN_GET(*config);
rob.meades@u-blox.com 2:4c533665168c 86 _pwd = _APN_GET(*config);
RobMeades 0:44dd95724bc2 87 }
RobMeades 0:44dd95724bc2 88
RobMeades 0:44dd95724bc2 89 _apn = _apn ? _apn : "";
RobMeades 0:44dd95724bc2 90 _uname = _uname ? _uname : "";
RobMeades 0:44dd95724bc2 91 _pwd = _pwd ? _pwd : "";
RobMeades 0:44dd95724bc2 92 }
RobMeades 0:44dd95724bc2 93
RobMeades 0:44dd95724bc2 94 /**********************************************************************
RobMeades 0:44dd95724bc2 95 * PUBLIC METHODS
RobMeades 0:44dd95724bc2 96 **********************************************************************/
RobMeades 0:44dd95724bc2 97
RobMeades 0:44dd95724bc2 98 // Constructor.
RobMeades 0:44dd95724bc2 99 UbloxPPPCellularInterface::UbloxPPPCellularInterface(PinName tx,
RobMeades 0:44dd95724bc2 100 PinName rx,
RobMeades 0:44dd95724bc2 101 int baud,
RobMeades 0:44dd95724bc2 102 bool debug_on)
RobMeades 0:44dd95724bc2 103 {
RobMeades 0:44dd95724bc2 104 _apn = NULL;
RobMeades 0:44dd95724bc2 105 _uname = NULL;
RobMeades 0:44dd95724bc2 106 _pwd = NULL;
RobMeades 0:44dd95724bc2 107 _sim_pin_check_change_pending = false;
RobMeades 0:44dd95724bc2 108 _sim_pin_check_change_pending_enabled_value = false;
RobMeades 0:44dd95724bc2 109 _sim_pin_change_pending = false;
RobMeades 0:44dd95724bc2 110 _sim_pin_change_pending_new_pin_value = NULL;
RobMeades 0:44dd95724bc2 111 _ppp_connection_up = false;
RobMeades 0:44dd95724bc2 112 _connection_status_cb = NULL;
RobMeades 0:44dd95724bc2 113
RobMeades 0:44dd95724bc2 114 // Initialise the base class, which starts the AT parser`
RobMeades 0:44dd95724bc2 115 baseClassInit(tx, rx, baud, debug_on);
RobMeades 0:44dd95724bc2 116 }
RobMeades 0:44dd95724bc2 117
RobMeades 0:44dd95724bc2 118 // Destructor.
RobMeades 0:44dd95724bc2 119 UbloxPPPCellularInterface::~UbloxPPPCellularInterface()
RobMeades 0:44dd95724bc2 120 {
RobMeades 0:44dd95724bc2 121 if (_ppp_connection_up) {
RobMeades 0:44dd95724bc2 122 disconnect();
RobMeades 0:44dd95724bc2 123 }
RobMeades 0:44dd95724bc2 124 }
RobMeades 0:44dd95724bc2 125
RobMeades 0:44dd95724bc2 126 // Set APN, user name and password.
RobMeades 0:44dd95724bc2 127 void UbloxPPPCellularInterface::set_credentials(const char *apn,
RobMeades 0:44dd95724bc2 128 const char *uname,
RobMeades 0:44dd95724bc2 129 const char *pwd)
RobMeades 0:44dd95724bc2 130 {
RobMeades 0:44dd95724bc2 131 _apn = apn;
RobMeades 0:44dd95724bc2 132 _uname = uname;
RobMeades 0:44dd95724bc2 133 _pwd = pwd;
RobMeades 0:44dd95724bc2 134 }
RobMeades 0:44dd95724bc2 135
RobMeades 0:44dd95724bc2 136 // Set PIN.
RobMeades 0:44dd95724bc2 137 void UbloxPPPCellularInterface::set_sim_pin(const char *pin) {
RobMeades 0:44dd95724bc2 138 set_pin(pin);
RobMeades 0:44dd95724bc2 139 }
RobMeades 0:44dd95724bc2 140
RobMeades 0:44dd95724bc2 141 // Make a cellular connection.
RobMeades 0:44dd95724bc2 142 nsapi_error_t UbloxPPPCellularInterface::connect(const char *sim_pin,
RobMeades 0:44dd95724bc2 143 const char *apn,
RobMeades 0:44dd95724bc2 144 const char *uname,
RobMeades 0:44dd95724bc2 145 const char *pwd)
RobMeades 0:44dd95724bc2 146 {
RobMeades 0:44dd95724bc2 147 nsapi_error_t nsapi_error;
RobMeades 0:44dd95724bc2 148
RobMeades 0:44dd95724bc2 149 if (sim_pin != NULL) {
RobMeades 0:44dd95724bc2 150 set_pin(sim_pin);
RobMeades 0:44dd95724bc2 151 }
RobMeades 0:44dd95724bc2 152
RobMeades 0:44dd95724bc2 153 if (apn != NULL) {
RobMeades 0:44dd95724bc2 154 _apn = apn;
RobMeades 0:44dd95724bc2 155 }
RobMeades 0:44dd95724bc2 156
RobMeades 0:44dd95724bc2 157 if ((uname != NULL) && (pwd != NULL)) {
RobMeades 0:44dd95724bc2 158 _uname = uname;
RobMeades 0:44dd95724bc2 159 _pwd = pwd;
RobMeades 0:44dd95724bc2 160 } else {
RobMeades 0:44dd95724bc2 161 _uname = NULL;
RobMeades 0:44dd95724bc2 162 _pwd = NULL;
RobMeades 0:44dd95724bc2 163 }
RobMeades 0:44dd95724bc2 164
RobMeades 0:44dd95724bc2 165 nsapi_error = connect();
RobMeades 0:44dd95724bc2 166
RobMeades 0:44dd95724bc2 167 return nsapi_error;
RobMeades 0:44dd95724bc2 168 }
RobMeades 0:44dd95724bc2 169
RobMeades 0:44dd95724bc2 170 // Make a cellular connection
RobMeades 0:44dd95724bc2 171 nsapi_error_t UbloxPPPCellularInterface::connect()
RobMeades 0:44dd95724bc2 172 {
RobMeades 0:44dd95724bc2 173 nsapi_error_t nsapi_error = NSAPI_ERROR_IS_CONNECTED;
RobMeades 0:44dd95724bc2 174 const char * config = NULL;
RobMeades 0:44dd95724bc2 175
RobMeades 0:44dd95724bc2 176 if (!_ppp_connection_up) {
RobMeades 0:44dd95724bc2 177
RobMeades 0:44dd95724bc2 178 // Set up modem and then register with the network
RobMeades 0:44dd95724bc2 179 if (init()) {
RobMeades 0:44dd95724bc2 180 // Perform any pending SIM actions
RobMeades 0:44dd95724bc2 181 if (_sim_pin_check_change_pending) {
RobMeades 0:44dd95724bc2 182 if (!sim_pin_check_enable(_sim_pin_check_change_pending_enabled_value)) {
RobMeades 0:44dd95724bc2 183 nsapi_error = NSAPI_ERROR_AUTH_FAILURE;
RobMeades 0:44dd95724bc2 184 }
RobMeades 0:44dd95724bc2 185 _sim_pin_check_change_pending = false;
RobMeades 0:44dd95724bc2 186 }
RobMeades 0:44dd95724bc2 187 if (_sim_pin_change_pending) {
RobMeades 0:44dd95724bc2 188 if (!change_sim_pin(_sim_pin_change_pending_new_pin_value)) {
RobMeades 0:44dd95724bc2 189 nsapi_error = NSAPI_ERROR_AUTH_FAILURE;
RobMeades 0:44dd95724bc2 190 }
RobMeades 0:44dd95724bc2 191 _sim_pin_change_pending = false;
RobMeades 0:44dd95724bc2 192 }
RobMeades 0:44dd95724bc2 193
RobMeades 0:44dd95724bc2 194 if (nsapi_error != NSAPI_ERROR_AUTH_FAILURE) {
RobMeades 0:44dd95724bc2 195 nsapi_error = NSAPI_ERROR_NO_CONNECTION;
RobMeades 0:44dd95724bc2 196 for (int retries = 0; (nsapi_error == NSAPI_ERROR_NO_CONNECTION) && (retries < 3); retries++) {
RobMeades 0:44dd95724bc2 197 if (nwk_registration()) {
RobMeades 0:44dd95724bc2 198 nsapi_error = NSAPI_ERROR_OK;
RobMeades 0:44dd95724bc2 199 }
RobMeades 0:44dd95724bc2 200 }
RobMeades 0:44dd95724bc2 201 }
RobMeades 0:44dd95724bc2 202 } else {
RobMeades 0:44dd95724bc2 203 nsapi_error = NSAPI_ERROR_DEVICE_ERROR;
RobMeades 0:44dd95724bc2 204 }
RobMeades 0:44dd95724bc2 205
RobMeades 0:44dd95724bc2 206 if (nsapi_error == NSAPI_ERROR_OK) {
RobMeades 0:44dd95724bc2 207 // If the caller hasn't entered an APN, try to find it
RobMeades 0:44dd95724bc2 208 if (_apn == NULL) {
RobMeades 0:44dd95724bc2 209 config = apnconfig(_dev_info.imsi);
RobMeades 0:44dd95724bc2 210 }
RobMeades 0:44dd95724bc2 211
RobMeades 0:44dd95724bc2 212 // Attempt to connect
RobMeades 0:44dd95724bc2 213 do {
RobMeades 0:44dd95724bc2 214 // Set up APN and IP protocol for external PDP context
rob.meades@u-blox.com 2:4c533665168c 215 get_next_credentials(&config);
RobMeades 0:44dd95724bc2 216 nsapi_error = setup_context_and_credentials();
RobMeades 0:44dd95724bc2 217
RobMeades 0:44dd95724bc2 218 // Attempt to enter data mode
RobMeades 0:44dd95724bc2 219 if ((nsapi_error == NSAPI_ERROR_OK) && set_atd()) {
rob.meades@u-blox.com 2:4c533665168c 220 wait_ms(1000);
RobMeades 0:44dd95724bc2 221 // Initialise PPP
RobMeades 0:44dd95724bc2 222 // nsapi_ppp_connect() is a blocking call, it will block until
RobMeades 0:44dd95724bc2 223 // connected, or timeout after 30 seconds
RobMeades 0:44dd95724bc2 224 nsapi_error = nsapi_ppp_connect(_fh, _connection_status_cb, _uname, _pwd);
RobMeades 0:44dd95724bc2 225 _ppp_connection_up = (nsapi_error == NSAPI_ERROR_OK);
rob.meades@u-blox.com 2:4c533665168c 226 if (!_ppp_connection_up) {
rob.meades@u-blox.com 2:4c533665168c 227 // If the connection has failed we may or may not still be
rob.meades@u-blox.com 2:4c533665168c 228 // in data mode, depending on the nature of the failure,
rob.meades@u-blox.com 2:4c533665168c 229 // so it's safest to force us back to command mode here
rob.meades@u-blox.com 2:4c533665168c 230 // (if we're already in command mode the recv() call will
rob.meades@u-blox.com 2:4c533665168c 231 // just time out)
rob.meades@u-blox.com 2:4c533665168c 232 _at->send("~+++");
rob.meades@u-blox.com 2:4c533665168c 233 _at->recv("NO CARRIER");
rob.meades@u-blox.com 2:4c533665168c 234 }
RobMeades 0:44dd95724bc2 235 }
RobMeades 0:44dd95724bc2 236 } while (!_ppp_connection_up && config && *config);
RobMeades 0:44dd95724bc2 237 }
RobMeades 0:44dd95724bc2 238
RobMeades 0:44dd95724bc2 239 if (!_ppp_connection_up) {
RobMeades 0:44dd95724bc2 240 tr_error("Failed to connect, check your APN/username/password");
RobMeades 0:44dd95724bc2 241 }
RobMeades 0:44dd95724bc2 242 }
RobMeades 0:44dd95724bc2 243
RobMeades 0:44dd95724bc2 244 return nsapi_error;
RobMeades 0:44dd95724bc2 245 }
RobMeades 0:44dd95724bc2 246
RobMeades 0:44dd95724bc2 247 // User initiated disconnect.
RobMeades 0:44dd95724bc2 248 nsapi_error_t UbloxPPPCellularInterface::disconnect()
RobMeades 0:44dd95724bc2 249 {
RobMeades 0:44dd95724bc2 250 nsapi_error_t nsapi_error = NSAPI_ERROR_DEVICE_ERROR;
RobMeades 0:44dd95724bc2 251
RobMeades 0:44dd95724bc2 252 if (nsapi_ppp_disconnect(_fh) == NSAPI_ERROR_OK) {
RobMeades 0:44dd95724bc2 253 _ppp_connection_up = false;
RobMeades 0:44dd95724bc2 254 // Get the "NO CARRIER" response out of the modem
RobMeades 0:44dd95724bc2 255 // so as not to confuse subsequent AT commands
RobMeades 0:44dd95724bc2 256 _at->send("AT") && _at->recv("NO CARRIER");
RobMeades 0:44dd95724bc2 257
RobMeades 0:44dd95724bc2 258 if (nwk_deregistration()) {
RobMeades 0:44dd95724bc2 259 nsapi_error = NSAPI_ERROR_OK;
RobMeades 0:44dd95724bc2 260 }
RobMeades 0:44dd95724bc2 261 }
RobMeades 0:44dd95724bc2 262
RobMeades 0:44dd95724bc2 263 return nsapi_error;
RobMeades 0:44dd95724bc2 264 }
RobMeades 0:44dd95724bc2 265
RobMeades 0:44dd95724bc2 266 // Enable or disable SIM PIN check lock.
RobMeades 0:44dd95724bc2 267 nsapi_error_t UbloxPPPCellularInterface::set_sim_pin_check(bool set,
RobMeades 0:44dd95724bc2 268 bool immediate,
RobMeades 0:44dd95724bc2 269 const char *sim_pin)
RobMeades 0:44dd95724bc2 270 {
RobMeades 0:44dd95724bc2 271 nsapi_error_t nsapi_error = NSAPI_ERROR_AUTH_FAILURE;
RobMeades 0:44dd95724bc2 272
RobMeades 0:44dd95724bc2 273 if (sim_pin != NULL) {
RobMeades 0:44dd95724bc2 274 _pin = sim_pin;
RobMeades 0:44dd95724bc2 275 }
RobMeades 0:44dd95724bc2 276
RobMeades 0:44dd95724bc2 277 if (immediate) {
RobMeades 0:44dd95724bc2 278 if (init()) {
RobMeades 0:44dd95724bc2 279 if (sim_pin_check_enable(set)) {
RobMeades 0:44dd95724bc2 280 nsapi_error = NSAPI_ERROR_OK;
RobMeades 0:44dd95724bc2 281 }
RobMeades 0:44dd95724bc2 282 } else {
RobMeades 0:44dd95724bc2 283 nsapi_error = NSAPI_ERROR_DEVICE_ERROR;
RobMeades 0:44dd95724bc2 284 }
RobMeades 0:44dd95724bc2 285 } else {
RobMeades 0:44dd95724bc2 286 nsapi_error = NSAPI_ERROR_OK;
RobMeades 0:44dd95724bc2 287 _sim_pin_check_change_pending = true;
RobMeades 0:44dd95724bc2 288 _sim_pin_check_change_pending_enabled_value = set;
RobMeades 0:44dd95724bc2 289 }
RobMeades 0:44dd95724bc2 290
RobMeades 0:44dd95724bc2 291 return nsapi_error;
RobMeades 0:44dd95724bc2 292 }
RobMeades 0:44dd95724bc2 293
RobMeades 0:44dd95724bc2 294 // Change the PIN code for the SIM card.
RobMeades 0:44dd95724bc2 295 nsapi_error_t UbloxPPPCellularInterface::set_new_sim_pin(const char *new_pin,
RobMeades 0:44dd95724bc2 296 bool immediate,
RobMeades 0:44dd95724bc2 297 const char *old_pin)
RobMeades 0:44dd95724bc2 298 {
RobMeades 0:44dd95724bc2 299 nsapi_error_t nsapi_error = NSAPI_ERROR_AUTH_FAILURE;
RobMeades 0:44dd95724bc2 300
RobMeades 0:44dd95724bc2 301 if (old_pin != NULL) {
RobMeades 0:44dd95724bc2 302 _pin = old_pin;
RobMeades 0:44dd95724bc2 303 }
RobMeades 0:44dd95724bc2 304
RobMeades 0:44dd95724bc2 305 if (immediate) {
RobMeades 0:44dd95724bc2 306 if (init()) {
RobMeades 0:44dd95724bc2 307 if (change_sim_pin(new_pin)) {
RobMeades 0:44dd95724bc2 308 nsapi_error = NSAPI_ERROR_OK;
RobMeades 0:44dd95724bc2 309 }
RobMeades 0:44dd95724bc2 310 } else {
RobMeades 0:44dd95724bc2 311 nsapi_error = NSAPI_ERROR_DEVICE_ERROR;
RobMeades 0:44dd95724bc2 312 }
RobMeades 0:44dd95724bc2 313 } else {
RobMeades 0:44dd95724bc2 314 nsapi_error = NSAPI_ERROR_OK;
RobMeades 0:44dd95724bc2 315 _sim_pin_change_pending = true;
RobMeades 0:44dd95724bc2 316 _sim_pin_change_pending_new_pin_value = new_pin;
RobMeades 0:44dd95724bc2 317 }
RobMeades 0:44dd95724bc2 318
RobMeades 0:44dd95724bc2 319 return nsapi_error;
RobMeades 0:44dd95724bc2 320 }
RobMeades 0:44dd95724bc2 321
RobMeades 0:44dd95724bc2 322 // Determine if PPP is up.
RobMeades 0:44dd95724bc2 323 bool UbloxPPPCellularInterface::is_connected()
RobMeades 0:44dd95724bc2 324 {
RobMeades 0:44dd95724bc2 325 return _ppp_connection_up;
RobMeades 0:44dd95724bc2 326 }
RobMeades 0:44dd95724bc2 327
RobMeades 0:44dd95724bc2 328 // Get our IP address.
RobMeades 0:44dd95724bc2 329 const char *UbloxPPPCellularInterface::get_ip_address()
RobMeades 0:44dd95724bc2 330 {
RobMeades 0:44dd95724bc2 331 return nsapi_ppp_get_ip_addr(_fh);
RobMeades 0:44dd95724bc2 332 }
RobMeades 0:44dd95724bc2 333
RobMeades 0:44dd95724bc2 334 // Get the local network mask.
RobMeades 0:44dd95724bc2 335 const char *UbloxPPPCellularInterface::get_netmask()
RobMeades 0:44dd95724bc2 336 {
RobMeades 0:44dd95724bc2 337 return nsapi_ppp_get_netmask(_fh);
RobMeades 0:44dd95724bc2 338 }
RobMeades 0:44dd95724bc2 339
RobMeades 0:44dd95724bc2 340 // Get the local gateways.
RobMeades 0:44dd95724bc2 341 const char *UbloxPPPCellularInterface::get_gateway()
RobMeades 0:44dd95724bc2 342 {
RobMeades 0:44dd95724bc2 343 return nsapi_ppp_get_ip_addr(_fh);
RobMeades 0:44dd95724bc2 344 }
RobMeades 0:44dd95724bc2 345
RobMeades 0:44dd95724bc2 346 // Set the callback to be called in case the connection is lost.
RobMeades 0:44dd95724bc2 347 void UbloxPPPCellularInterface::connection_status_cb(Callback<void(nsapi_error_t)> cb)
RobMeades 0:44dd95724bc2 348 {
RobMeades 0:44dd95724bc2 349 _connection_status_cb = cb;
RobMeades 0:44dd95724bc2 350 }
RobMeades 0:44dd95724bc2 351
RobMeades 0:44dd95724bc2 352 #endif // NSAPI_PPP_AVAILABLE
RobMeades 0:44dd95724bc2 353
RobMeades 0:44dd95724bc2 354 // End of File
RobMeades 0:44dd95724bc2 355