Cellular example code for Seeed Wio 3G and Wio LTE-M1/NB1(BG96)

Example cellular application for Mbed OS

This is an example based on `mbed-os` cellular APIs that demonstrates a TCP or UDP echo transaction with a public echo server.

(Note: To see this example in a rendered form you can import into the Arm Mbed Online Compiler, please see the documentation.)

Getting started

This particular cellular application uses a cellular network and network-socket APIs that are part of `mbed-os`.

The program uses a cellular modem driver using an external IP stack (LWIP) standard 3GPP AT 27.007 AT commands to setup the cellular modem and registers to the network.

After registration, the driver opens a point-to-point protocol (PPP) pipe using LWIP with the cellular modem and connects to internet. This driver currently supports UART data connection type only between your cellular modem and MCU.

For more information on Arm Mbed OS cellular APIs and porting guide, please visit the Mbed OS cellular API and contributing documentation.

Download the application

$ mbed import mbed-os-example-cellular
$ cd mbed-os-example-cellular
 
#OR
 
$ git clone git@github.com:ARMmbed/mbed-os-example-cellular.git
$ cd mbed-os-example-cellular

Change the network and SIM credentials

See the file `mbed_app.json` in the root directory of your application. This file contains all the user specific configurations your application needs. Provide the pin code for your SIM card, as well as any APN settings if needed. For example:

        "nsapi.default-cellular-plmn": 0,
        "nsapi.default-cellular-sim-pin": "\"1234\"",
        "nsapi.default-cellular-apn": 0,
        "nsapi.default-cellular-username": 0,
        "nsapi.default-cellular-password": 0

Selecting socket type (TCP, UDP or NONIP)

You can choose which socket type the application should use; however, please note that TCP is a more reliable transmission protocol. For example:

 
     "sock-type": "TCP",
 

Turning modem AT echo trace on

If you like details and wish to know about all the AT interactions between the modem and your driver, turn on the modem AT echo trace.

        "cellular.debug-at": true

Turning on the tracing and trace level

If you like to add more traces or follow the current ones you can turn traces on by changing `mbed-trace.enable` in mbed_app.json

"target_overrides": {
        "*": {
            "mbed-trace.enable": true,

After you have defined `mbed-trace.enable: true`, you can set trace levels by changing value in `trace-level`

"trace-level": {
            "help": "Options are TRACE_LEVEL_ERROR,TRACE_LEVEL_WARN,TRACE_LEVEL_INFO,TRACE_LEVEL_DEBUG",
            "macro_name": "MBED_TRACE_MAX_LEVEL",
            "value": "TRACE_LEVEL_INFO"
        }

Board support

The cellular modem driver in this example uses PPP with an Mbed-supported external IP stack. It supports targets when modem exists on the Mbed Enabled target as opposed to plug-in modules (shields). For more details, please see our Mbed OS cellular documentation.

Compiling the application

The master branch is for daily development and it uses the latest mbed-os/master release.

To use older versions update Mbed OS release tag, for example:

mbed releases
 * mbed-os-5.10.4
   ...
mbed update mbed-os-5.10.4

You may need to use `clean` option to discard your local changes (use with caution).

Use Mbed CLI commands to generate a binary for the application. For example, in the case of GCC, use the following command:

$ mbed compile -m YOUR_TARGET_WITH_MODEM -t GCC_ARM

Running the application

Drag and drop the application binary from `BUILD/YOUR_TARGET_WITH_MODEM/GCC_ARM/mbed-os-example-cellular.bin` to your Mbed Enabled target hardware, which appears as a USB device on your host machine.

Attach a serial console emulator of your choice (for example, PuTTY, Minicom or screen) to your USB device. Set the baudrate to 115200 bit/s, and reset your board by pressing the reset button.

You should see an output similar to this:

mbed-os-example-cellular
Establishing connection ......
 
Connection Established.
TCP: connected with echo.mbedcloudtesting.com server
TCP: Sent 4 Bytes to echo.mbedcloudtesting.com
Received from echo server 4 Bytes
 
 
Success. Exiting

Troubleshooting

  • Make sure the fields `sim-pin-code`, `apn`, `username` and `password` from the `mbed_app.json` file are filled in correctly. The correct values should appear in the user manual of the board if using eSIM or in the details of the SIM card if using normal SIM.
  • Enable trace flag to have access to debug information `"mbed-trace.enable": true`.
  • Try both `TCP` and `UDP` socket types.
  • Try both `"lwip.ppp-enabled": true` and `"lwip.ppp-enabled": false`.
  • The modem may support only a fixed baud-rate, such as `"platform.default-serial-baud-rate": 9600`.
  • The modem and network may only support IPv6 in which case `"lwip.ipv6-enabled": true` shall be defined.
  • The SIM and modem must have compatible cellular technology (3G, 4G, NB-IoT, ...) supported and cellular network available.
  • Enable CIoT optimization for NONIP socket `control-plane-opt: true`.

If you have problems to get started with debugging, you can review the documentation for suggestions on what could be wrong and how to fix it.

License and contributions

The software is provided under Apache-2.0 license. Contributions to this project are accepted under the same license. Please see contributing.md for more info.

This project contains code from other projects. The original license text is included in those source files. They must comply with our license guide.

Committer:
MACRUM
Date:
Mon May 20 06:11:03 2019 +0000
Revision:
2:cf787cebee82
Parent:
0:fb5e1789de47
Fix configuration for the Wio 3G

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MACRUM 0:fb5e1789de47 1 /*
MACRUM 0:fb5e1789de47 2 * Copyright (c) 2017 ARM Limited. All rights reserved.
MACRUM 0:fb5e1789de47 3 * SPDX-License-Identifier: Apache-2.0
MACRUM 0:fb5e1789de47 4 * Licensed under the Apache License, Version 2.0 (the License); you may
MACRUM 0:fb5e1789de47 5 * not use this file except in compliance with the License.
MACRUM 0:fb5e1789de47 6 * You may obtain a copy of the License at
MACRUM 0:fb5e1789de47 7 *
MACRUM 0:fb5e1789de47 8 * http://www.apache.org/licenses/LICENSE-2.0
MACRUM 0:fb5e1789de47 9 *
MACRUM 0:fb5e1789de47 10 * Unless required by applicable law or agreed to in writing, software
MACRUM 0:fb5e1789de47 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
MACRUM 0:fb5e1789de47 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
MACRUM 0:fb5e1789de47 13 * See the License for the specific language governing permissions and
MACRUM 0:fb5e1789de47 14 * limitations under the License.
MACRUM 0:fb5e1789de47 15 */
MACRUM 0:fb5e1789de47 16
MACRUM 0:fb5e1789de47 17 #include "mbed.h"
MACRUM 0:fb5e1789de47 18 #include "common_functions.h"
MACRUM 0:fb5e1789de47 19 #include "CellularNonIPSocket.h"
MACRUM 0:fb5e1789de47 20 #include "CellularDevice.h"
MACRUM 0:fb5e1789de47 21 #include "UDPSocket.h"
MACRUM 0:fb5e1789de47 22 #include "CellularLog.h"
MACRUM 0:fb5e1789de47 23
MACRUM 0:fb5e1789de47 24 #define UDP 0
MACRUM 0:fb5e1789de47 25 #define TCP 1
MACRUM 0:fb5e1789de47 26 #define NONIP 2
MACRUM 0:fb5e1789de47 27
MACRUM 0:fb5e1789de47 28 // Number of retries /
MACRUM 0:fb5e1789de47 29 #define RETRY_COUNT 3
MACRUM 0:fb5e1789de47 30
MACRUM 0:fb5e1789de47 31 NetworkInterface *iface;
MACRUM 0:fb5e1789de47 32
MACRUM 0:fb5e1789de47 33 // Echo server hostname
MACRUM 0:fb5e1789de47 34 const char *host_name = MBED_CONF_APP_ECHO_SERVER_HOSTNAME;
MACRUM 0:fb5e1789de47 35
MACRUM 0:fb5e1789de47 36 // Echo server port (same for TCP and UDP)
MACRUM 0:fb5e1789de47 37 const int port = MBED_CONF_APP_ECHO_SERVER_PORT;
MACRUM 0:fb5e1789de47 38
MACRUM 0:fb5e1789de47 39 static rtos::Mutex trace_mutex;
MACRUM 0:fb5e1789de47 40
MACRUM 0:fb5e1789de47 41 #if MBED_CONF_MBED_TRACE_ENABLE
MACRUM 0:fb5e1789de47 42 static void trace_wait()
MACRUM 0:fb5e1789de47 43 {
MACRUM 0:fb5e1789de47 44 trace_mutex.lock();
MACRUM 0:fb5e1789de47 45 }
MACRUM 0:fb5e1789de47 46
MACRUM 0:fb5e1789de47 47 static void trace_release()
MACRUM 0:fb5e1789de47 48 {
MACRUM 0:fb5e1789de47 49 trace_mutex.unlock();
MACRUM 0:fb5e1789de47 50 }
MACRUM 0:fb5e1789de47 51
MACRUM 0:fb5e1789de47 52 static char time_st[50];
MACRUM 0:fb5e1789de47 53
MACRUM 0:fb5e1789de47 54 static char* trace_time(size_t ss)
MACRUM 0:fb5e1789de47 55 {
MACRUM 0:fb5e1789de47 56 snprintf(time_st, 49, "[%08llums]", Kernel::get_ms_count());
MACRUM 0:fb5e1789de47 57 return time_st;
MACRUM 0:fb5e1789de47 58 }
MACRUM 0:fb5e1789de47 59
MACRUM 0:fb5e1789de47 60 static void trace_open()
MACRUM 0:fb5e1789de47 61 {
MACRUM 0:fb5e1789de47 62 mbed_trace_init();
MACRUM 0:fb5e1789de47 63 mbed_trace_prefix_function_set( &trace_time );
MACRUM 0:fb5e1789de47 64
MACRUM 0:fb5e1789de47 65 mbed_trace_mutex_wait_function_set(trace_wait);
MACRUM 0:fb5e1789de47 66 mbed_trace_mutex_release_function_set(trace_release);
MACRUM 0:fb5e1789de47 67
MACRUM 0:fb5e1789de47 68 mbed_cellular_trace::mutex_wait_function_set(trace_wait);
MACRUM 0:fb5e1789de47 69 mbed_cellular_trace::mutex_release_function_set(trace_release);
MACRUM 0:fb5e1789de47 70 }
MACRUM 0:fb5e1789de47 71
MACRUM 0:fb5e1789de47 72 static void trace_close()
MACRUM 0:fb5e1789de47 73 {
MACRUM 0:fb5e1789de47 74 mbed_cellular_trace::mutex_wait_function_set(NULL);
MACRUM 0:fb5e1789de47 75 mbed_cellular_trace::mutex_release_function_set(NULL);
MACRUM 0:fb5e1789de47 76
MACRUM 0:fb5e1789de47 77 mbed_trace_free();
MACRUM 0:fb5e1789de47 78 }
MACRUM 0:fb5e1789de47 79 #endif // #if MBED_CONF_MBED_TRACE_ENABLE
MACRUM 0:fb5e1789de47 80
MACRUM 0:fb5e1789de47 81 Thread dot_thread(osPriorityNormal, 512);
MACRUM 0:fb5e1789de47 82
MACRUM 0:fb5e1789de47 83 void print_function(const char *format, ...)
MACRUM 0:fb5e1789de47 84 {
MACRUM 0:fb5e1789de47 85 trace_mutex.lock();
MACRUM 0:fb5e1789de47 86 va_list arglist;
MACRUM 0:fb5e1789de47 87 va_start( arglist, format );
MACRUM 0:fb5e1789de47 88 vprintf(format, arglist);
MACRUM 0:fb5e1789de47 89 va_end( arglist );
MACRUM 0:fb5e1789de47 90 trace_mutex.unlock();
MACRUM 0:fb5e1789de47 91 }
MACRUM 0:fb5e1789de47 92
MACRUM 0:fb5e1789de47 93 void dot_event()
MACRUM 0:fb5e1789de47 94 {
MACRUM 0:fb5e1789de47 95 while (true) {
MACRUM 0:fb5e1789de47 96 ThisThread::sleep_for(4000);
MACRUM 0:fb5e1789de47 97 if (iface && iface->get_connection_status() == NSAPI_STATUS_GLOBAL_UP) {
MACRUM 0:fb5e1789de47 98 break;
MACRUM 0:fb5e1789de47 99 } else {
MACRUM 0:fb5e1789de47 100 trace_mutex.lock();
MACRUM 0:fb5e1789de47 101 printf(".");
MACRUM 0:fb5e1789de47 102 fflush(stdout);
MACRUM 0:fb5e1789de47 103 trace_mutex.unlock();
MACRUM 0:fb5e1789de47 104 }
MACRUM 0:fb5e1789de47 105 }
MACRUM 0:fb5e1789de47 106 }
MACRUM 0:fb5e1789de47 107
MACRUM 0:fb5e1789de47 108 /**
MACRUM 0:fb5e1789de47 109 * Connects to the Cellular Network
MACRUM 0:fb5e1789de47 110 */
MACRUM 0:fb5e1789de47 111 nsapi_error_t do_connect()
MACRUM 0:fb5e1789de47 112 {
MACRUM 0:fb5e1789de47 113 nsapi_error_t retcode = NSAPI_ERROR_OK;
MACRUM 0:fb5e1789de47 114 uint8_t retry_counter = 0;
MACRUM 0:fb5e1789de47 115
MACRUM 0:fb5e1789de47 116 while (iface->get_connection_status() != NSAPI_STATUS_GLOBAL_UP) {
MACRUM 0:fb5e1789de47 117 retcode = iface->connect();
MACRUM 0:fb5e1789de47 118 if (retcode == NSAPI_ERROR_AUTH_FAILURE) {
MACRUM 0:fb5e1789de47 119 print_function("\n\nAuthentication Failure. Exiting application\n");
MACRUM 0:fb5e1789de47 120 } else if (retcode == NSAPI_ERROR_OK) {
MACRUM 0:fb5e1789de47 121 print_function("\n\nConnection Established.\n");
MACRUM 0:fb5e1789de47 122 } else if (retry_counter > RETRY_COUNT) {
MACRUM 0:fb5e1789de47 123 print_function("\n\nFatal connection failure: %d\n", retcode);
MACRUM 0:fb5e1789de47 124 } else {
MACRUM 0:fb5e1789de47 125 print_function("\n\nCouldn't connect: %d, will retry\n", retcode);
MACRUM 0:fb5e1789de47 126 retry_counter++;
MACRUM 0:fb5e1789de47 127 continue;
MACRUM 0:fb5e1789de47 128 }
MACRUM 0:fb5e1789de47 129 break;
MACRUM 0:fb5e1789de47 130 }
MACRUM 0:fb5e1789de47 131 return retcode;
MACRUM 0:fb5e1789de47 132 }
MACRUM 0:fb5e1789de47 133
MACRUM 0:fb5e1789de47 134 /**
MACRUM 0:fb5e1789de47 135 * Opens:
MACRUM 0:fb5e1789de47 136 * - UDP or TCP socket with the given echo server and performs an echo
MACRUM 0:fb5e1789de47 137 * transaction retrieving current.
MACRUM 0:fb5e1789de47 138 * - Cellular Non-IP socket for which the data delivery path is decided
MACRUM 0:fb5e1789de47 139 * by network's control plane CIoT optimisation setup, for the given APN.
MACRUM 0:fb5e1789de47 140 */
MACRUM 0:fb5e1789de47 141 nsapi_error_t test_send_recv()
MACRUM 0:fb5e1789de47 142 {
MACRUM 0:fb5e1789de47 143 nsapi_size_or_error_t retcode;
MACRUM 0:fb5e1789de47 144 #if MBED_CONF_APP_SOCK_TYPE == TCP
MACRUM 0:fb5e1789de47 145 TCPSocket sock;
MACRUM 0:fb5e1789de47 146 #elif MBED_CONF_APP_SOCK_TYPE == UDP
MACRUM 0:fb5e1789de47 147 UDPSocket sock;
MACRUM 0:fb5e1789de47 148 #elif MBED_CONF_APP_SOCK_TYPE == NONIP
MACRUM 0:fb5e1789de47 149 CellularNonIPSocket sock;
MACRUM 0:fb5e1789de47 150 #endif
MACRUM 0:fb5e1789de47 151
MACRUM 0:fb5e1789de47 152 #if MBED_CONF_APP_SOCK_TYPE == NONIP
MACRUM 0:fb5e1789de47 153 retcode = sock.open((CellularContext*)iface);
MACRUM 0:fb5e1789de47 154 #else
MACRUM 0:fb5e1789de47 155 retcode = sock.open(iface);
MACRUM 0:fb5e1789de47 156 #endif
MACRUM 0:fb5e1789de47 157
MACRUM 0:fb5e1789de47 158 if (retcode != NSAPI_ERROR_OK) {
MACRUM 0:fb5e1789de47 159 #if MBED_CONF_APP_SOCK_TYPE == TCP
MACRUM 0:fb5e1789de47 160 print_function("TCPSocket.open() fails, code: %d\n", retcode);
MACRUM 0:fb5e1789de47 161 #elif MBED_CONF_APP_SOCK_TYPE == UDP
MACRUM 0:fb5e1789de47 162 print_function("UDPSocket.open() fails, code: %d\n", retcode);
MACRUM 0:fb5e1789de47 163 #elif MBED_CONF_APP_SOCK_TYPE == NONIP
MACRUM 0:fb5e1789de47 164 print_function("CellularNonIPSocket.open() fails, code: %d\n", retcode);
MACRUM 0:fb5e1789de47 165 #endif
MACRUM 0:fb5e1789de47 166 return -1;
MACRUM 0:fb5e1789de47 167 }
MACRUM 0:fb5e1789de47 168
MACRUM 0:fb5e1789de47 169 int n = 0;
MACRUM 0:fb5e1789de47 170 const char *echo_string = "TEST";
MACRUM 0:fb5e1789de47 171 char recv_buf[4];
MACRUM 0:fb5e1789de47 172
MACRUM 0:fb5e1789de47 173 sock.set_timeout(15000);
MACRUM 0:fb5e1789de47 174
MACRUM 0:fb5e1789de47 175 #if MBED_CONF_APP_SOCK_TYPE == NONIP
MACRUM 0:fb5e1789de47 176 retcode = sock.send((void*) echo_string, sizeof(echo_string));
MACRUM 0:fb5e1789de47 177 if (retcode < 0) {
MACRUM 0:fb5e1789de47 178 print_function("CellularNonIPSocket.send() fails, code: %d\n", retcode);
MACRUM 0:fb5e1789de47 179 return -1;
MACRUM 0:fb5e1789de47 180 } else {
MACRUM 0:fb5e1789de47 181 print_function("CellularNonIPSocket: Sent %d Bytes\n", retcode);
MACRUM 0:fb5e1789de47 182 }
MACRUM 0:fb5e1789de47 183
MACRUM 0:fb5e1789de47 184 n = sock.recv((void*) recv_buf, sizeof(recv_buf));
MACRUM 0:fb5e1789de47 185
MACRUM 0:fb5e1789de47 186 #else
MACRUM 0:fb5e1789de47 187
MACRUM 0:fb5e1789de47 188 SocketAddress sock_addr;
MACRUM 0:fb5e1789de47 189 retcode = iface->gethostbyname(host_name, &sock_addr);
MACRUM 0:fb5e1789de47 190 if (retcode != NSAPI_ERROR_OK) {
MACRUM 0:fb5e1789de47 191 print_function("Couldn't resolve remote host: %s, code: %d\n", host_name, retcode);
MACRUM 0:fb5e1789de47 192 return -1;
MACRUM 0:fb5e1789de47 193 }
MACRUM 0:fb5e1789de47 194
MACRUM 0:fb5e1789de47 195 sock_addr.set_port(port);
MACRUM 0:fb5e1789de47 196
MACRUM 0:fb5e1789de47 197 #if MBED_CONF_APP_SOCK_TYPE == TCP
MACRUM 0:fb5e1789de47 198 retcode = sock.connect(sock_addr);
MACRUM 0:fb5e1789de47 199 if (retcode < 0) {
MACRUM 0:fb5e1789de47 200 print_function("TCPSocket.connect() fails, code: %d\n", retcode);
MACRUM 0:fb5e1789de47 201 return -1;
MACRUM 0:fb5e1789de47 202 } else {
MACRUM 0:fb5e1789de47 203 print_function("TCP: connected with %s server\n", host_name);
MACRUM 0:fb5e1789de47 204 }
MACRUM 0:fb5e1789de47 205 retcode = sock.send((void*) echo_string, sizeof(echo_string));
MACRUM 0:fb5e1789de47 206 if (retcode < 0) {
MACRUM 0:fb5e1789de47 207 print_function("TCPSocket.send() fails, code: %d\n", retcode);
MACRUM 0:fb5e1789de47 208 return -1;
MACRUM 0:fb5e1789de47 209 } else {
MACRUM 0:fb5e1789de47 210 print_function("TCP: Sent %d Bytes to %s\n", retcode, host_name);
MACRUM 0:fb5e1789de47 211 }
MACRUM 0:fb5e1789de47 212
MACRUM 0:fb5e1789de47 213 n = sock.recv((void*) recv_buf, sizeof(recv_buf));
MACRUM 0:fb5e1789de47 214 #else
MACRUM 0:fb5e1789de47 215
MACRUM 0:fb5e1789de47 216 retcode = sock.sendto(sock_addr, (void*) echo_string, sizeof(echo_string));
MACRUM 0:fb5e1789de47 217 if (retcode < 0) {
MACRUM 0:fb5e1789de47 218 print_function("UDPSocket.sendto() fails, code: %d\n", retcode);
MACRUM 0:fb5e1789de47 219 return -1;
MACRUM 0:fb5e1789de47 220 } else {
MACRUM 0:fb5e1789de47 221 print_function("UDP: Sent %d Bytes to %s\n", retcode, host_name);
MACRUM 0:fb5e1789de47 222 }
MACRUM 0:fb5e1789de47 223
MACRUM 0:fb5e1789de47 224 n = sock.recvfrom(&sock_addr, (void*) recv_buf, sizeof(recv_buf));
MACRUM 0:fb5e1789de47 225 #endif
MACRUM 0:fb5e1789de47 226 #endif
MACRUM 0:fb5e1789de47 227
MACRUM 0:fb5e1789de47 228 sock.close();
MACRUM 0:fb5e1789de47 229
MACRUM 0:fb5e1789de47 230 if (n > 0) {
MACRUM 0:fb5e1789de47 231 print_function("Received from echo server %d Bytes\n", n);
MACRUM 0:fb5e1789de47 232 return 0;
MACRUM 0:fb5e1789de47 233 }
MACRUM 0:fb5e1789de47 234
MACRUM 0:fb5e1789de47 235 return -1;
MACRUM 0:fb5e1789de47 236 }
MACRUM 0:fb5e1789de47 237
MACRUM 0:fb5e1789de47 238 int main()
MACRUM 0:fb5e1789de47 239 {
MACRUM 0:fb5e1789de47 240 print_function("\n\nmbed-os-example-cellular\n");
MACRUM 0:fb5e1789de47 241 print_function("\n\nBuilt: %s, %s\n", __DATE__, __TIME__);
MACRUM 0:fb5e1789de47 242 #ifdef MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN
MACRUM 0:fb5e1789de47 243 print_function("\n\n[MAIN], plmn: %s\n", (MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN ? MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN : "NULL"));
MACRUM 0:fb5e1789de47 244 #endif
MACRUM 0:fb5e1789de47 245
MACRUM 0:fb5e1789de47 246 print_function("Establishing connection\n");
MACRUM 0:fb5e1789de47 247 #if MBED_CONF_MBED_TRACE_ENABLE
MACRUM 0:fb5e1789de47 248 trace_open();
MACRUM 0:fb5e1789de47 249 #else
MACRUM 0:fb5e1789de47 250 dot_thread.start(dot_event);
MACRUM 0:fb5e1789de47 251 #endif // #if MBED_CONF_MBED_TRACE_ENABLE
MACRUM 0:fb5e1789de47 252
MACRUM 0:fb5e1789de47 253 #if MBED_CONF_APP_SOCK_TYPE == NONIP
MACRUM 0:fb5e1789de47 254 iface = CellularContext::get_default_nonip_instance();
MACRUM 0:fb5e1789de47 255 #else
MACRUM 0:fb5e1789de47 256 iface = CellularContext::get_default_instance();
MACRUM 0:fb5e1789de47 257 #endif
MACRUM 0:fb5e1789de47 258
MACRUM 0:fb5e1789de47 259 MBED_ASSERT(iface);
MACRUM 0:fb5e1789de47 260
MACRUM 0:fb5e1789de47 261 // sim pin, apn, credentials and possible plmn are taken automatically from json when using NetworkInterface::set_default_parameters()
MACRUM 0:fb5e1789de47 262 iface->set_default_parameters();
MACRUM 0:fb5e1789de47 263
MACRUM 0:fb5e1789de47 264 nsapi_error_t retcode = NSAPI_ERROR_NO_CONNECTION;
MACRUM 0:fb5e1789de47 265
MACRUM 0:fb5e1789de47 266 /* Attempt to connect to a cellular network */
MACRUM 0:fb5e1789de47 267 if (do_connect() == NSAPI_ERROR_OK) {
MACRUM 0:fb5e1789de47 268 retcode = test_send_recv();
MACRUM 0:fb5e1789de47 269 }
MACRUM 0:fb5e1789de47 270
MACRUM 0:fb5e1789de47 271 if (iface->disconnect() != NSAPI_ERROR_OK) {
MACRUM 0:fb5e1789de47 272 print_function("\n\n disconnect failed.\n\n");
MACRUM 0:fb5e1789de47 273 }
MACRUM 0:fb5e1789de47 274
MACRUM 0:fb5e1789de47 275 if (retcode == NSAPI_ERROR_OK) {
MACRUM 0:fb5e1789de47 276 print_function("\n\nSuccess. Exiting \n\n");
MACRUM 0:fb5e1789de47 277 } else {
MACRUM 0:fb5e1789de47 278 print_function("\n\nFailure. Exiting \n\n");
MACRUM 0:fb5e1789de47 279 }
MACRUM 0:fb5e1789de47 280
MACRUM 0:fb5e1789de47 281 #if MBED_CONF_MBED_TRACE_ENABLE
MACRUM 0:fb5e1789de47 282 trace_close();
MACRUM 0:fb5e1789de47 283 #else
MACRUM 0:fb5e1789de47 284 dot_thread.terminate();
MACRUM 0:fb5e1789de47 285 #endif // #if MBED_CONF_MBED_TRACE_ENABLE
MACRUM 0:fb5e1789de47 286
MACRUM 0:fb5e1789de47 287 return 0;
MACRUM 0:fb5e1789de47 288 }
MACRUM 0:fb5e1789de47 289 // EOF