This example use mbed-os default network interface through Cellular PDP context class . It use UDP or TCP socket with the given echo server and performs an echo transaction. This program can be used on the C027, C030-U201 and C030-R412M boards.

Committer:
fahimalavi
Date:
Fri Sep 20 11:53:43 2019 +0500
Revision:
0:b0d61d94aba5
Basic cellular example program using Cellular PDP Context class

Who changed what in which revision?

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