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

This code is forked from https://os.mbed.com/teams/mbed-os-examples/code/mbed-os-example-cellular/

This is an example showing how to use Skywire board with LE910-x module.

In this example, I had used the LE910-EUG module for 4G communication. Mbed OS code wasn't changed for LE910-x, because the Telit' HE910 is included mainline code on Mbed OS already. HE910 and LE910 are most similar. Therefore you can use LE910 via HE910 driver. Please check to configure of mbed_app.json, and initialize code for Skywire board of main.cpp.

Open mbed_app.json, you need to define a UART for the MCU to communicate with the xE910 module.

            "TELIT_HE910.tx"                 : "D1",
            "TELIT_HE910.rx"                 : "D0",
            "TELIT_HE910.provide-default"    : true

If you are using Pelion CM, make the following settings:

            "nsapi.default-cellular-apn"     : "\"stream.co.uk\"",
            "nsapi.default-cellular-username": "\"streamip\"",
            "nsapi.default-cellular-password": "\"streamip\"",

For your information, please see Pelion Connectivity Quick start guide.

320

You can find Skywire sensor shield information though NimbeLink site.

Tested with

  • DISCO_L475VG_IOT01A
  • K64F

1. Import the application into your desktop:

 mbed import https://os.mbed.com/users/Daniel_Lee/code/mbed-os-example-cellular-le910/

 cd mbed-os-example-cellular-le910

2. Compile and program:

mbed compile -t GCC_ARM -m DISCO_L475VG_IOT01A

(supported toolchains : GCC_ARM / ARM / IAR)

3. Download binary to a target board

4. Result

mbed-os-example-cellular


Built: Feb  7 2020, 07:02:27
Starting Skywire board with LE910-EUG Demo...
Waiting for Skywire to Boot...
Wait 15 seconds..
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 
Committer:
mbed_official
Date:
Thu Jun 21 12:15:21 2018 +0100
Revision:
13:4bea5334b419
Parent:
11:23ea0907186e
Child:
21:e356e039f917
Merge pull request #89 from ARMmbed/iface_null_in_dot_thread

Fixed crash bug in dot_event() where interface could have been called?
.
Commit copied from https://github.com/ARMmbed/mbed-os-example-cellular

Who changed what in which revision?

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