This is an example based on mbed-os cellular APIs that demonstrates a TCP or UDP echo transaction with a public echo server. Especially, BG96 operation check based Mbed OS 5.11, tested via SK Telecom in Korea

This code could be access via Cat.M1(BG96 module) of SK telecom network in Korea. Need a WIZnet BG96 board and development board. Before using this code, must be checking your modem is authorized or not from SK telecom. This code is based on Mbed OS 5.11.5.

/media/uploads/Daniel_Lee/img_8560.jpg

Tested with

  • DISCOVERY_L485VG_IOT01A
  • K66F
  • K64F

1. Import the application into your desktop

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

 cd mbed-os-example-cellular-BG96_os511

2. Compile and program

mbed compile -t <toolchain> -m <TARGET_BOARD>

(supported toolchains : GCC_ARM / ARM / IAR)

3. Download binary to a target board

4. Result

mbed-os-example-cellular


Built: Jun  4 2019, 13:45:53


[MAIN], plmn: (null)
Modem power on
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

5. Patched code

If need more information such as how to test, please look at https://os.mbed.com/teams/mbed-os-examples/code/mbed-os-example-cellular/.

Committer:
mbed_official
Date:
Fri Feb 15 15:26:44 2019 +0000
Revision:
34:6f85d44597ac
Parent:
28:232da3ce8a88
Child:
36:6294a71c9e9e
Child:
45:dc095588e1b4
Merge pull request #117 from AnotherButler/patch-1

Add and update links to README.md
.
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 // Number of retries /
mbed_official 0:4611f6cf2413 26 #define RETRY_COUNT 3
mbed_official 0:4611f6cf2413 27
mbed_official 28:232da3ce8a88 28 NetworkInterface *iface;
mbed_official 0:4611f6cf2413 29
mbed_official 0:4611f6cf2413 30 // Echo server hostname
mbed_official 11:23ea0907186e 31 const char *host_name = MBED_CONF_APP_ECHO_SERVER_HOSTNAME;
mbed_official 0:4611f6cf2413 32
mbed_official 0:4611f6cf2413 33 // Echo server port (same for TCP and UDP)
mbed_official 11:23ea0907186e 34 const int port = MBED_CONF_APP_ECHO_SERVER_PORT;
mbed_official 0:4611f6cf2413 35
mbed_official 6:5678c0b6f74e 36 static rtos::Mutex trace_mutex;
mbed_official 6:5678c0b6f74e 37
mbed_official 6:5678c0b6f74e 38 #if MBED_CONF_MBED_TRACE_ENABLE
mbed_official 6:5678c0b6f74e 39 static void trace_wait()
mbed_official 6:5678c0b6f74e 40 {
mbed_official 6:5678c0b6f74e 41 trace_mutex.lock();
mbed_official 6:5678c0b6f74e 42 }
mbed_official 6:5678c0b6f74e 43
mbed_official 6:5678c0b6f74e 44 static void trace_release()
mbed_official 6:5678c0b6f74e 45 {
mbed_official 6:5678c0b6f74e 46 trace_mutex.unlock();
mbed_official 6:5678c0b6f74e 47 }
mbed_official 6:5678c0b6f74e 48
mbed_official 6:5678c0b6f74e 49 static char time_st[50];
mbed_official 6:5678c0b6f74e 50
mbed_official 6:5678c0b6f74e 51 static char* trace_time(size_t ss)
mbed_official 6:5678c0b6f74e 52 {
mbed_official 6:5678c0b6f74e 53 snprintf(time_st, 49, "[%08llums]", Kernel::get_ms_count());
mbed_official 6:5678c0b6f74e 54 return time_st;
mbed_official 6:5678c0b6f74e 55 }
mbed_official 6:5678c0b6f74e 56
mbed_official 6:5678c0b6f74e 57 static void trace_open()
mbed_official 6:5678c0b6f74e 58 {
mbed_official 6:5678c0b6f74e 59 mbed_trace_init();
mbed_official 6:5678c0b6f74e 60 mbed_trace_prefix_function_set( &trace_time );
mbed_official 6:5678c0b6f74e 61
mbed_official 6:5678c0b6f74e 62 mbed_trace_mutex_wait_function_set(trace_wait);
mbed_official 6:5678c0b6f74e 63 mbed_trace_mutex_release_function_set(trace_release);
mbed_official 11:23ea0907186e 64
mbed_official 11:23ea0907186e 65 mbed_cellular_trace::mutex_wait_function_set(trace_wait);
mbed_official 11:23ea0907186e 66 mbed_cellular_trace::mutex_release_function_set(trace_release);
mbed_official 6:5678c0b6f74e 67 }
mbed_official 6:5678c0b6f74e 68
mbed_official 6:5678c0b6f74e 69 static void trace_close()
mbed_official 6:5678c0b6f74e 70 {
mbed_official 11:23ea0907186e 71 mbed_cellular_trace::mutex_wait_function_set(NULL);
mbed_official 11:23ea0907186e 72 mbed_cellular_trace::mutex_release_function_set(NULL);
mbed_official 11:23ea0907186e 73
mbed_official 6:5678c0b6f74e 74 mbed_trace_free();
mbed_official 6:5678c0b6f74e 75 }
mbed_official 6:5678c0b6f74e 76 #endif // #if MBED_CONF_MBED_TRACE_ENABLE
mbed_official 6:5678c0b6f74e 77
mbed_official 2:0f644d6045cf 78 Thread dot_thread(osPriorityNormal, 512);
mbed_official 0:4611f6cf2413 79
mbed_official 6:5678c0b6f74e 80 void print_function(const char *format, ...)
mbed_official 0:4611f6cf2413 81 {
mbed_official 6:5678c0b6f74e 82 trace_mutex.lock();
mbed_official 6:5678c0b6f74e 83 va_list arglist;
mbed_official 6:5678c0b6f74e 84 va_start( arglist, format );
mbed_official 6:5678c0b6f74e 85 vprintf(format, arglist);
mbed_official 6:5678c0b6f74e 86 va_end( arglist );
mbed_official 6:5678c0b6f74e 87 trace_mutex.unlock();
mbed_official 0:4611f6cf2413 88 }
mbed_official 0:4611f6cf2413 89
mbed_official 0:4611f6cf2413 90 void dot_event()
mbed_official 0:4611f6cf2413 91 {
mbed_official 0:4611f6cf2413 92 while (true) {
mbed_official 26:348eec457e58 93 ThisThread::sleep_for(4000);
mbed_official 28:232da3ce8a88 94 if (iface && iface->get_connection_status() == NSAPI_STATUS_GLOBAL_UP) {
mbed_official 13:4bea5334b419 95 break;
mbed_official 13:4bea5334b419 96 } else {
mbed_official 6:5678c0b6f74e 97 trace_mutex.lock();
mbed_official 6:5678c0b6f74e 98 printf(".");
mbed_official 6:5678c0b6f74e 99 fflush(stdout);
mbed_official 6:5678c0b6f74e 100 trace_mutex.unlock();
mbed_official 0:4611f6cf2413 101 }
mbed_official 0:4611f6cf2413 102 }
mbed_official 0:4611f6cf2413 103 }
mbed_official 0:4611f6cf2413 104
mbed_official 0:4611f6cf2413 105 /**
mbed_official 0:4611f6cf2413 106 * Connects to the Cellular Network
mbed_official 0:4611f6cf2413 107 */
mbed_official 0:4611f6cf2413 108 nsapi_error_t do_connect()
mbed_official 0:4611f6cf2413 109 {
mbed_official 6:5678c0b6f74e 110 nsapi_error_t retcode = NSAPI_ERROR_OK;
mbed_official 0:4611f6cf2413 111 uint8_t retry_counter = 0;
mbed_official 0:4611f6cf2413 112
mbed_official 28:232da3ce8a88 113 while (iface->get_connection_status() != NSAPI_STATUS_GLOBAL_UP) {
mbed_official 11:23ea0907186e 114 retcode = iface->connect();
mbed_official 0:4611f6cf2413 115 if (retcode == NSAPI_ERROR_AUTH_FAILURE) {
mbed_official 0:4611f6cf2413 116 print_function("\n\nAuthentication Failure. Exiting application\n");
mbed_official 6:5678c0b6f74e 117 } else if (retcode == NSAPI_ERROR_OK) {
mbed_official 6:5678c0b6f74e 118 print_function("\n\nConnection Established.\n");
mbed_official 6:5678c0b6f74e 119 } else if (retry_counter > RETRY_COUNT) {
mbed_official 6:5678c0b6f74e 120 print_function("\n\nFatal connection failure: %d\n", retcode);
mbed_official 6:5678c0b6f74e 121 } else {
mbed_official 6:5678c0b6f74e 122 print_function("\n\nCouldn't connect: %d, will retry\n", retcode);
mbed_official 0:4611f6cf2413 123 retry_counter++;
mbed_official 0:4611f6cf2413 124 continue;
mbed_official 0:4611f6cf2413 125 }
mbed_official 0:4611f6cf2413 126 break;
mbed_official 0:4611f6cf2413 127 }
mbed_official 6:5678c0b6f74e 128 return retcode;
mbed_official 0:4611f6cf2413 129 }
mbed_official 0:4611f6cf2413 130
mbed_official 0:4611f6cf2413 131 /**
mbed_official 0:4611f6cf2413 132 * Opens a UDP or a TCP socket with the given echo server and performs an echo
mbed_official 0:4611f6cf2413 133 * transaction retrieving current.
mbed_official 0:4611f6cf2413 134 */
mbed_official 0:4611f6cf2413 135 nsapi_error_t test_send_recv()
mbed_official 0:4611f6cf2413 136 {
mbed_official 0:4611f6cf2413 137 nsapi_size_or_error_t retcode;
mbed_official 0:4611f6cf2413 138 #if MBED_CONF_APP_SOCK_TYPE == TCP
mbed_official 0:4611f6cf2413 139 TCPSocket sock;
mbed_official 0:4611f6cf2413 140 #else
mbed_official 0:4611f6cf2413 141 UDPSocket sock;
mbed_official 0:4611f6cf2413 142 #endif
mbed_official 0:4611f6cf2413 143
mbed_official 11:23ea0907186e 144 retcode = sock.open(iface);
mbed_official 0:4611f6cf2413 145 if (retcode != NSAPI_ERROR_OK) {
mbed_official 21:e356e039f917 146 #if MBED_CONF_APP_SOCK_TYPE == TCP
mbed_official 21:e356e039f917 147 print_function("TCPSocket.open() fails, code: %d\n", retcode);
mbed_official 21:e356e039f917 148 #else
mbed_official 6:5678c0b6f74e 149 print_function("UDPSocket.open() fails, code: %d\n", retcode);
mbed_official 21:e356e039f917 150 #endif
mbed_official 0:4611f6cf2413 151 return -1;
mbed_official 0:4611f6cf2413 152 }
mbed_official 0:4611f6cf2413 153
mbed_official 0:4611f6cf2413 154 SocketAddress sock_addr;
mbed_official 11:23ea0907186e 155 retcode = iface->gethostbyname(host_name, &sock_addr);
mbed_official 0:4611f6cf2413 156 if (retcode != NSAPI_ERROR_OK) {
mbed_official 6:5678c0b6f74e 157 print_function("Couldn't resolve remote host: %s, code: %d\n", host_name, retcode);
mbed_official 0:4611f6cf2413 158 return -1;
mbed_official 0:4611f6cf2413 159 }
mbed_official 0:4611f6cf2413 160
mbed_official 0:4611f6cf2413 161 sock_addr.set_port(port);
mbed_official 0:4611f6cf2413 162
mbed_official 0:4611f6cf2413 163 sock.set_timeout(15000);
mbed_official 0:4611f6cf2413 164 int n = 0;
mbed_official 0:4611f6cf2413 165 const char *echo_string = "TEST";
mbed_official 0:4611f6cf2413 166 char recv_buf[4];
mbed_official 0:4611f6cf2413 167 #if MBED_CONF_APP_SOCK_TYPE == TCP
mbed_official 0:4611f6cf2413 168 retcode = sock.connect(sock_addr);
mbed_official 0:4611f6cf2413 169 if (retcode < 0) {
mbed_official 6:5678c0b6f74e 170 print_function("TCPSocket.connect() fails, code: %d\n", retcode);
mbed_official 0:4611f6cf2413 171 return -1;
mbed_official 0:4611f6cf2413 172 } else {
mbed_official 6:5678c0b6f74e 173 print_function("TCP: connected with %s server\n", host_name);
mbed_official 0:4611f6cf2413 174 }
mbed_official 0:4611f6cf2413 175 retcode = sock.send((void*) echo_string, sizeof(echo_string));
mbed_official 0:4611f6cf2413 176 if (retcode < 0) {
mbed_official 6:5678c0b6f74e 177 print_function("TCPSocket.send() fails, code: %d\n", retcode);
mbed_official 0:4611f6cf2413 178 return -1;
mbed_official 0:4611f6cf2413 179 } else {
mbed_official 6:5678c0b6f74e 180 print_function("TCP: Sent %d Bytes to %s\n", retcode, host_name);
mbed_official 0:4611f6cf2413 181 }
mbed_official 0:4611f6cf2413 182
mbed_official 0:4611f6cf2413 183 n = sock.recv((void*) recv_buf, sizeof(recv_buf));
mbed_official 0:4611f6cf2413 184 #else
mbed_official 0:4611f6cf2413 185
mbed_official 0:4611f6cf2413 186 retcode = sock.sendto(sock_addr, (void*) echo_string, sizeof(echo_string));
mbed_official 0:4611f6cf2413 187 if (retcode < 0) {
mbed_official 6:5678c0b6f74e 188 print_function("UDPSocket.sendto() 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("UDP: 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.recvfrom(&sock_addr, (void*) recv_buf, sizeof(recv_buf));
mbed_official 0:4611f6cf2413 195 #endif
mbed_official 0:4611f6cf2413 196
mbed_official 0:4611f6cf2413 197 sock.close();
mbed_official 0:4611f6cf2413 198
mbed_official 0:4611f6cf2413 199 if (n > 0) {
mbed_official 6:5678c0b6f74e 200 print_function("Received from echo server %d Bytes\n", n);
mbed_official 0:4611f6cf2413 201 return 0;
mbed_official 0:4611f6cf2413 202 }
mbed_official 0:4611f6cf2413 203
mbed_official 0:4611f6cf2413 204 return -1;
mbed_official 0:4611f6cf2413 205 }
mbed_official 0:4611f6cf2413 206
mbed_official 0:4611f6cf2413 207 int main()
mbed_official 0:4611f6cf2413 208 {
mbed_official 6:5678c0b6f74e 209 print_function("\n\nmbed-os-example-cellular\n");
mbed_official 34:6f85d44597ac 210 print_function("\n\nBuilt: %s, %s\n", __DATE__, __TIME__);
mbed_official 34:6f85d44597ac 211 #ifdef MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN
mbed_official 34:6f85d44597ac 212 print_function("\n\n[MAIN], plmn: %s\n", MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN);
mbed_official 34:6f85d44597ac 213 #endif
mbed_official 34:6f85d44597ac 214
mbed_official 6:5678c0b6f74e 215 print_function("Establishing connection\n");
mbed_official 6:5678c0b6f74e 216 #if MBED_CONF_MBED_TRACE_ENABLE
mbed_official 6:5678c0b6f74e 217 trace_open();
mbed_official 6:5678c0b6f74e 218 #else
mbed_official 6:5678c0b6f74e 219 dot_thread.start(dot_event);
mbed_official 6:5678c0b6f74e 220 #endif // #if MBED_CONF_MBED_TRACE_ENABLE
mbed_official 27:97054be1a741 221
mbed_official 27:97054be1a741 222 // sim pin, apn, credentials and possible plmn are taken atuomtically from json when using get_default_instance()
mbed_official 28:232da3ce8a88 223 iface = NetworkInterface::get_default_instance();
mbed_official 11:23ea0907186e 224 MBED_ASSERT(iface);
mbed_official 11:23ea0907186e 225
mbed_official 6:5678c0b6f74e 226 nsapi_error_t retcode = NSAPI_ERROR_NO_CONNECTION;
mbed_official 0:4611f6cf2413 227
mbed_official 0:4611f6cf2413 228 /* Attempt to connect to a cellular network */
mbed_official 0:4611f6cf2413 229 if (do_connect() == NSAPI_ERROR_OK) {
mbed_official 6:5678c0b6f74e 230 retcode = test_send_recv();
mbed_official 0:4611f6cf2413 231 }
mbed_official 0:4611f6cf2413 232
mbed_official 26:348eec457e58 233 if (iface->disconnect() != NSAPI_ERROR_OK) {
mbed_official 26:348eec457e58 234 print_function("\n\n disconnect failed.\n\n");
mbed_official 26:348eec457e58 235 }
mbed_official 26:348eec457e58 236
mbed_official 6:5678c0b6f74e 237 if (retcode == NSAPI_ERROR_OK) {
mbed_official 6:5678c0b6f74e 238 print_function("\n\nSuccess. Exiting \n\n");
mbed_official 6:5678c0b6f74e 239 } else {
mbed_official 6:5678c0b6f74e 240 print_function("\n\nFailure. Exiting \n\n");
mbed_official 6:5678c0b6f74e 241 }
mbed_official 26:348eec457e58 242
mbed_official 6:5678c0b6f74e 243 #if MBED_CONF_MBED_TRACE_ENABLE
mbed_official 6:5678c0b6f74e 244 trace_close();
mbed_official 26:348eec457e58 245 #else
mbed_official 26:348eec457e58 246 dot_thread.terminate();
mbed_official 6:5678c0b6f74e 247 #endif // #if MBED_CONF_MBED_TRACE_ENABLE
mbed_official 6:5678c0b6f74e 248
mbed_official 6:5678c0b6f74e 249 return 0;
mbed_official 0:4611f6cf2413 250 }
mbed_official 0:4611f6cf2413 251 // EOF