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
UbloxPPPCellularInterface.cpp@2:4c533665168c, 2017-06-30 (annotated)
- 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?
User | Revision | Line number | New 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 |