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

Committer:
pimco01
Date:
Fri Feb 21 12:27:35 2020 +0000
Revision:
53:52be2af62919
Parent:
52:46406cd9c64a
Cellular Power Off function add

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"
pimco01 52:46406cd9c64a 18 #include "rtos.h"
mbed_official 0:4611f6cf2413 19 #include "common_functions.h"
mbed_official 40:c46ee5b71843 20 #include "CellularNonIPSocket.h"
mbed_official 40:c46ee5b71843 21 #include "CellularDevice.h"
mbed_official 0:4611f6cf2413 22 #include "UDPSocket.h"
mbed_official 6:5678c0b6f74e 23 #include "CellularLog.h"
mbed_official 0:4611f6cf2413 24
mbed_official 0:4611f6cf2413 25 #define UDP 0
mbed_official 0:4611f6cf2413 26 #define TCP 1
mbed_official 40:c46ee5b71843 27 #define NONIP 2
mbed_official 0:4611f6cf2413 28
mbed_official 0:4611f6cf2413 29 // Number of retries /
mbed_official 0:4611f6cf2413 30 #define RETRY_COUNT 3
mbed_official 0:4611f6cf2413 31
pimco01 52:46406cd9c64a 32 void BG96_Modem_PowerON(void)
pimco01 52:46406cd9c64a 33 {
pimco01 52:46406cd9c64a 34 DigitalIn BG96_STATUS(D2);
pimco01 52:46406cd9c64a 35 DigitalOut BG96_PWRKEY(D3);
pimco01 52:46406cd9c64a 36
pimco01 52:46406cd9c64a 37 ThisThread::sleep_for(50);
pimco01 52:46406cd9c64a 38 BG96_PWRKEY = 1;
pimco01 52:46406cd9c64a 39 ThisThread::sleep_for(600);
pimco01 52:46406cd9c64a 40 BG96_PWRKEY = 0;
pimco01 52:46406cd9c64a 41 ThisThread::sleep_for(5000);
pimco01 52:46406cd9c64a 42
pimco01 52:46406cd9c64a 43 if(BG96_STATUS)
pimco01 53:52be2af62919 44 printf("Module Power On\r\n");
pimco01 53:52be2af62919 45 else
pimco01 53:52be2af62919 46 printf("Check Module Power Line!!\r\n");
pimco01 53:52be2af62919 47 }
pimco01 53:52be2af62919 48
pimco01 53:52be2af62919 49 void BG96_Modem_PowerOFF(void)
pimco01 53:52be2af62919 50 {
pimco01 53:52be2af62919 51 DigitalIn BG96_STATUS(D2);
pimco01 53:52be2af62919 52 DigitalOut BG96_PWRKEY(D3);
pimco01 53:52be2af62919 53
pimco01 53:52be2af62919 54 ThisThread::sleep_for(50);
pimco01 53:52be2af62919 55 BG96_PWRKEY = 1;
pimco01 53:52be2af62919 56 ThisThread::sleep_for(800);
pimco01 53:52be2af62919 57 BG96_PWRKEY = 0;
pimco01 53:52be2af62919 58 ThisThread::sleep_for(3000);
pimco01 53:52be2af62919 59
pimco01 53:52be2af62919 60 if(BG96_STATUS == 0)
pimco01 53:52be2af62919 61 printf("Module Power Off\r\n");
pimco01 52:46406cd9c64a 62 else
pimco01 52:46406cd9c64a 63 printf("Check Module Power Line!!\r\n");
pimco01 52:46406cd9c64a 64 }
pimco01 52:46406cd9c64a 65
mbed_official 28:232da3ce8a88 66 NetworkInterface *iface;
mbed_official 0:4611f6cf2413 67
mbed_official 0:4611f6cf2413 68 // Echo server hostname
mbed_official 11:23ea0907186e 69 const char *host_name = MBED_CONF_APP_ECHO_SERVER_HOSTNAME;
mbed_official 0:4611f6cf2413 70
mbed_official 0:4611f6cf2413 71 // Echo server port (same for TCP and UDP)
mbed_official 11:23ea0907186e 72 const int port = MBED_CONF_APP_ECHO_SERVER_PORT;
mbed_official 0:4611f6cf2413 73
mbed_official 6:5678c0b6f74e 74 static rtos::Mutex trace_mutex;
mbed_official 6:5678c0b6f74e 75
mbed_official 6:5678c0b6f74e 76 #if MBED_CONF_MBED_TRACE_ENABLE
mbed_official 6:5678c0b6f74e 77 static void trace_wait()
mbed_official 6:5678c0b6f74e 78 {
mbed_official 6:5678c0b6f74e 79 trace_mutex.lock();
mbed_official 6:5678c0b6f74e 80 }
mbed_official 6:5678c0b6f74e 81
mbed_official 6:5678c0b6f74e 82 static void trace_release()
mbed_official 6:5678c0b6f74e 83 {
mbed_official 6:5678c0b6f74e 84 trace_mutex.unlock();
mbed_official 6:5678c0b6f74e 85 }
mbed_official 6:5678c0b6f74e 86
mbed_official 6:5678c0b6f74e 87 static char time_st[50];
mbed_official 6:5678c0b6f74e 88
mbed_official 6:5678c0b6f74e 89 static char* trace_time(size_t ss)
mbed_official 6:5678c0b6f74e 90 {
mbed_official 6:5678c0b6f74e 91 snprintf(time_st, 49, "[%08llums]", Kernel::get_ms_count());
mbed_official 6:5678c0b6f74e 92 return time_st;
mbed_official 6:5678c0b6f74e 93 }
mbed_official 6:5678c0b6f74e 94
mbed_official 6:5678c0b6f74e 95 static void trace_open()
mbed_official 6:5678c0b6f74e 96 {
mbed_official 6:5678c0b6f74e 97 mbed_trace_init();
mbed_official 6:5678c0b6f74e 98 mbed_trace_prefix_function_set( &trace_time );
mbed_official 6:5678c0b6f74e 99
mbed_official 6:5678c0b6f74e 100 mbed_trace_mutex_wait_function_set(trace_wait);
mbed_official 6:5678c0b6f74e 101 mbed_trace_mutex_release_function_set(trace_release);
mbed_official 11:23ea0907186e 102
mbed_official 11:23ea0907186e 103 mbed_cellular_trace::mutex_wait_function_set(trace_wait);
mbed_official 11:23ea0907186e 104 mbed_cellular_trace::mutex_release_function_set(trace_release);
mbed_official 6:5678c0b6f74e 105 }
mbed_official 6:5678c0b6f74e 106
mbed_official 6:5678c0b6f74e 107 static void trace_close()
mbed_official 6:5678c0b6f74e 108 {
mbed_official 11:23ea0907186e 109 mbed_cellular_trace::mutex_wait_function_set(NULL);
mbed_official 11:23ea0907186e 110 mbed_cellular_trace::mutex_release_function_set(NULL);
mbed_official 11:23ea0907186e 111
mbed_official 6:5678c0b6f74e 112 mbed_trace_free();
mbed_official 6:5678c0b6f74e 113 }
mbed_official 6:5678c0b6f74e 114 #endif // #if MBED_CONF_MBED_TRACE_ENABLE
mbed_official 6:5678c0b6f74e 115
mbed_official 2:0f644d6045cf 116 Thread dot_thread(osPriorityNormal, 512);
mbed_official 0:4611f6cf2413 117
mbed_official 6:5678c0b6f74e 118 void print_function(const char *format, ...)
mbed_official 0:4611f6cf2413 119 {
mbed_official 6:5678c0b6f74e 120 trace_mutex.lock();
mbed_official 6:5678c0b6f74e 121 va_list arglist;
mbed_official 6:5678c0b6f74e 122 va_start( arglist, format );
mbed_official 6:5678c0b6f74e 123 vprintf(format, arglist);
mbed_official 6:5678c0b6f74e 124 va_end( arglist );
mbed_official 6:5678c0b6f74e 125 trace_mutex.unlock();
mbed_official 0:4611f6cf2413 126 }
mbed_official 0:4611f6cf2413 127
mbed_official 0:4611f6cf2413 128 void dot_event()
mbed_official 0:4611f6cf2413 129 {
mbed_official 0:4611f6cf2413 130 while (true) {
mbed_official 26:348eec457e58 131 ThisThread::sleep_for(4000);
mbed_official 28:232da3ce8a88 132 if (iface && iface->get_connection_status() == NSAPI_STATUS_GLOBAL_UP) {
mbed_official 13:4bea5334b419 133 break;
mbed_official 13:4bea5334b419 134 } else {
mbed_official 6:5678c0b6f74e 135 trace_mutex.lock();
mbed_official 6:5678c0b6f74e 136 printf(".");
mbed_official 6:5678c0b6f74e 137 fflush(stdout);
mbed_official 6:5678c0b6f74e 138 trace_mutex.unlock();
mbed_official 0:4611f6cf2413 139 }
mbed_official 0:4611f6cf2413 140 }
mbed_official 0:4611f6cf2413 141 }
mbed_official 0:4611f6cf2413 142
mbed_official 0:4611f6cf2413 143 /**
mbed_official 0:4611f6cf2413 144 * Connects to the Cellular Network
mbed_official 0:4611f6cf2413 145 */
mbed_official 0:4611f6cf2413 146 nsapi_error_t do_connect()
mbed_official 0:4611f6cf2413 147 {
mbed_official 6:5678c0b6f74e 148 nsapi_error_t retcode = NSAPI_ERROR_OK;
mbed_official 0:4611f6cf2413 149 uint8_t retry_counter = 0;
mbed_official 0:4611f6cf2413 150
mbed_official 28:232da3ce8a88 151 while (iface->get_connection_status() != NSAPI_STATUS_GLOBAL_UP) {
mbed_official 11:23ea0907186e 152 retcode = iface->connect();
mbed_official 0:4611f6cf2413 153 if (retcode == NSAPI_ERROR_AUTH_FAILURE) {
mbed_official 0:4611f6cf2413 154 print_function("\n\nAuthentication Failure. Exiting application\n");
mbed_official 6:5678c0b6f74e 155 } else if (retcode == NSAPI_ERROR_OK) {
mbed_official 6:5678c0b6f74e 156 print_function("\n\nConnection Established.\n");
mbed_official 6:5678c0b6f74e 157 } else if (retry_counter > RETRY_COUNT) {
mbed_official 6:5678c0b6f74e 158 print_function("\n\nFatal connection failure: %d\n", retcode);
mbed_official 6:5678c0b6f74e 159 } else {
mbed_official 6:5678c0b6f74e 160 print_function("\n\nCouldn't connect: %d, will retry\n", retcode);
mbed_official 0:4611f6cf2413 161 retry_counter++;
mbed_official 0:4611f6cf2413 162 continue;
mbed_official 0:4611f6cf2413 163 }
mbed_official 0:4611f6cf2413 164 break;
mbed_official 0:4611f6cf2413 165 }
mbed_official 6:5678c0b6f74e 166 return retcode;
mbed_official 0:4611f6cf2413 167 }
mbed_official 0:4611f6cf2413 168
mbed_official 0:4611f6cf2413 169 /**
mbed_official 40:c46ee5b71843 170 * Opens:
mbed_official 40:c46ee5b71843 171 * - UDP or TCP socket with the given echo server and performs an echo
mbed_official 40:c46ee5b71843 172 * transaction retrieving current.
mbed_official 40:c46ee5b71843 173 * - Cellular Non-IP socket for which the data delivery path is decided
mbed_official 40:c46ee5b71843 174 * by network's control plane CIoT optimisation setup, for the given APN.
mbed_official 0:4611f6cf2413 175 */
mbed_official 0:4611f6cf2413 176 nsapi_error_t test_send_recv()
mbed_official 0:4611f6cf2413 177 {
mbed_official 0:4611f6cf2413 178 nsapi_size_or_error_t retcode;
mbed_official 0:4611f6cf2413 179 #if MBED_CONF_APP_SOCK_TYPE == TCP
mbed_official 0:4611f6cf2413 180 TCPSocket sock;
mbed_official 40:c46ee5b71843 181 #elif MBED_CONF_APP_SOCK_TYPE == UDP
mbed_official 0:4611f6cf2413 182 UDPSocket sock;
mbed_official 40:c46ee5b71843 183 #elif MBED_CONF_APP_SOCK_TYPE == NONIP
mbed_official 40:c46ee5b71843 184 CellularNonIPSocket sock;
mbed_official 0:4611f6cf2413 185 #endif
mbed_official 0:4611f6cf2413 186
mbed_official 40:c46ee5b71843 187 #if MBED_CONF_APP_SOCK_TYPE == NONIP
mbed_official 40:c46ee5b71843 188 retcode = sock.open((CellularContext*)iface);
mbed_official 40:c46ee5b71843 189 #else
mbed_official 11:23ea0907186e 190 retcode = sock.open(iface);
mbed_official 40:c46ee5b71843 191 #endif
mbed_official 40:c46ee5b71843 192
mbed_official 0:4611f6cf2413 193 if (retcode != NSAPI_ERROR_OK) {
mbed_official 21:e356e039f917 194 #if MBED_CONF_APP_SOCK_TYPE == TCP
mbed_official 21:e356e039f917 195 print_function("TCPSocket.open() fails, code: %d\n", retcode);
mbed_official 40:c46ee5b71843 196 #elif MBED_CONF_APP_SOCK_TYPE == UDP
mbed_official 6:5678c0b6f74e 197 print_function("UDPSocket.open() fails, code: %d\n", retcode);
mbed_official 40:c46ee5b71843 198 #elif MBED_CONF_APP_SOCK_TYPE == NONIP
mbed_official 40:c46ee5b71843 199 print_function("CellularNonIPSocket.open() fails, code: %d\n", retcode);
mbed_official 21:e356e039f917 200 #endif
mbed_official 0:4611f6cf2413 201 return -1;
mbed_official 0:4611f6cf2413 202 }
mbed_official 0:4611f6cf2413 203
mbed_official 40:c46ee5b71843 204 int n = 0;
mbed_official 40:c46ee5b71843 205 const char *echo_string = "TEST";
mbed_official 40:c46ee5b71843 206 char recv_buf[4];
mbed_official 40:c46ee5b71843 207
mbed_official 40:c46ee5b71843 208 sock.set_timeout(15000);
mbed_official 40:c46ee5b71843 209
mbed_official 40:c46ee5b71843 210 #if MBED_CONF_APP_SOCK_TYPE == NONIP
mbed_official 42:cab443dff75e 211 retcode = sock.send((void*) echo_string, strlen(echo_string));
mbed_official 40:c46ee5b71843 212 if (retcode < 0) {
mbed_official 40:c46ee5b71843 213 print_function("CellularNonIPSocket.send() fails, code: %d\n", retcode);
mbed_official 40:c46ee5b71843 214 return -1;
mbed_official 40:c46ee5b71843 215 } else {
mbed_official 40:c46ee5b71843 216 print_function("CellularNonIPSocket: Sent %d Bytes\n", retcode);
mbed_official 40:c46ee5b71843 217 }
mbed_official 40:c46ee5b71843 218
mbed_official 40:c46ee5b71843 219 n = sock.recv((void*) recv_buf, sizeof(recv_buf));
mbed_official 40:c46ee5b71843 220
mbed_official 40:c46ee5b71843 221 #else
mbed_official 40:c46ee5b71843 222
mbed_official 0:4611f6cf2413 223 SocketAddress sock_addr;
mbed_official 11:23ea0907186e 224 retcode = iface->gethostbyname(host_name, &sock_addr);
mbed_official 0:4611f6cf2413 225 if (retcode != NSAPI_ERROR_OK) {
mbed_official 6:5678c0b6f74e 226 print_function("Couldn't resolve remote host: %s, code: %d\n", host_name, retcode);
mbed_official 0:4611f6cf2413 227 return -1;
mbed_official 0:4611f6cf2413 228 }
mbed_official 0:4611f6cf2413 229
mbed_official 0:4611f6cf2413 230 sock_addr.set_port(port);
mbed_official 0:4611f6cf2413 231
mbed_official 0:4611f6cf2413 232 #if MBED_CONF_APP_SOCK_TYPE == TCP
mbed_official 0:4611f6cf2413 233 retcode = sock.connect(sock_addr);
mbed_official 0:4611f6cf2413 234 if (retcode < 0) {
mbed_official 6:5678c0b6f74e 235 print_function("TCPSocket.connect() fails, code: %d\n", retcode);
mbed_official 0:4611f6cf2413 236 return -1;
mbed_official 0:4611f6cf2413 237 } else {
mbed_official 6:5678c0b6f74e 238 print_function("TCP: connected with %s server\n", host_name);
mbed_official 0:4611f6cf2413 239 }
mbed_official 42:cab443dff75e 240 retcode = sock.send((void*) echo_string, strlen(echo_string));
mbed_official 0:4611f6cf2413 241 if (retcode < 0) {
mbed_official 6:5678c0b6f74e 242 print_function("TCPSocket.send() fails, code: %d\n", retcode);
mbed_official 0:4611f6cf2413 243 return -1;
mbed_official 0:4611f6cf2413 244 } else {
mbed_official 6:5678c0b6f74e 245 print_function("TCP: Sent %d Bytes to %s\n", retcode, host_name);
mbed_official 0:4611f6cf2413 246 }
mbed_official 0:4611f6cf2413 247
mbed_official 0:4611f6cf2413 248 n = sock.recv((void*) recv_buf, sizeof(recv_buf));
mbed_official 0:4611f6cf2413 249 #else
mbed_official 0:4611f6cf2413 250
mbed_official 42:cab443dff75e 251 retcode = sock.sendto(sock_addr, (void*) echo_string, strlen(echo_string));
mbed_official 0:4611f6cf2413 252 if (retcode < 0) {
mbed_official 6:5678c0b6f74e 253 print_function("UDPSocket.sendto() fails, code: %d\n", retcode);
mbed_official 0:4611f6cf2413 254 return -1;
mbed_official 0:4611f6cf2413 255 } else {
mbed_official 6:5678c0b6f74e 256 print_function("UDP: Sent %d Bytes to %s\n", retcode, host_name);
mbed_official 0:4611f6cf2413 257 }
mbed_official 0:4611f6cf2413 258
mbed_official 0:4611f6cf2413 259 n = sock.recvfrom(&sock_addr, (void*) recv_buf, sizeof(recv_buf));
mbed_official 0:4611f6cf2413 260 #endif
mbed_official 40:c46ee5b71843 261 #endif
mbed_official 0:4611f6cf2413 262
mbed_official 0:4611f6cf2413 263 sock.close();
mbed_official 0:4611f6cf2413 264
mbed_official 0:4611f6cf2413 265 if (n > 0) {
mbed_official 6:5678c0b6f74e 266 print_function("Received from echo server %d Bytes\n", n);
mbed_official 0:4611f6cf2413 267 return 0;
mbed_official 0:4611f6cf2413 268 }
mbed_official 0:4611f6cf2413 269
mbed_official 0:4611f6cf2413 270 return -1;
mbed_official 0:4611f6cf2413 271 }
mbed_official 0:4611f6cf2413 272
mbed_official 0:4611f6cf2413 273 int main()
mbed_official 0:4611f6cf2413 274 {
mbed_official 6:5678c0b6f74e 275 print_function("\n\nmbed-os-example-cellular\n");
mbed_official 34:6f85d44597ac 276 print_function("\n\nBuilt: %s, %s\n", __DATE__, __TIME__);
mbed_official 34:6f85d44597ac 277 #ifdef MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN
mbed_official 36:6294a71c9e9e 278 print_function("\n\n[MAIN], plmn: %s\n", (MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN ? MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN : "NULL"));
mbed_official 34:6f85d44597ac 279 #endif
mbed_official 34:6f85d44597ac 280
mbed_official 6:5678c0b6f74e 281 print_function("Establishing connection\n");
pimco01 52:46406cd9c64a 282
pimco01 52:46406cd9c64a 283 BG96_Modem_PowerON();
pimco01 52:46406cd9c64a 284
mbed_official 6:5678c0b6f74e 285 #if MBED_CONF_MBED_TRACE_ENABLE
mbed_official 6:5678c0b6f74e 286 trace_open();
mbed_official 6:5678c0b6f74e 287 #else
mbed_official 6:5678c0b6f74e 288 dot_thread.start(dot_event);
mbed_official 6:5678c0b6f74e 289 #endif // #if MBED_CONF_MBED_TRACE_ENABLE
mbed_official 27:97054be1a741 290
mbed_official 40:c46ee5b71843 291 #if MBED_CONF_APP_SOCK_TYPE == NONIP
mbed_official 40:c46ee5b71843 292 iface = CellularContext::get_default_nonip_instance();
mbed_official 40:c46ee5b71843 293 #else
mbed_official 40:c46ee5b71843 294 iface = CellularContext::get_default_instance();
mbed_official 40:c46ee5b71843 295 #endif
mbed_official 40:c46ee5b71843 296
mbed_official 11:23ea0907186e 297 MBED_ASSERT(iface);
mbed_official 11:23ea0907186e 298
mbed_official 40:c46ee5b71843 299 // sim pin, apn, credentials and possible plmn are taken automatically from json when using NetworkInterface::set_default_parameters()
mbed_official 40:c46ee5b71843 300 iface->set_default_parameters();
mbed_official 40:c46ee5b71843 301
mbed_official 6:5678c0b6f74e 302 nsapi_error_t retcode = NSAPI_ERROR_NO_CONNECTION;
mbed_official 0:4611f6cf2413 303
mbed_official 0:4611f6cf2413 304 /* Attempt to connect to a cellular network */
mbed_official 0:4611f6cf2413 305 if (do_connect() == NSAPI_ERROR_OK) {
mbed_official 6:5678c0b6f74e 306 retcode = test_send_recv();
mbed_official 0:4611f6cf2413 307 }
mbed_official 0:4611f6cf2413 308
mbed_official 26:348eec457e58 309 if (iface->disconnect() != NSAPI_ERROR_OK) {
mbed_official 26:348eec457e58 310 print_function("\n\n disconnect failed.\n\n");
mbed_official 26:348eec457e58 311 }
mbed_official 26:348eec457e58 312
mbed_official 6:5678c0b6f74e 313 if (retcode == NSAPI_ERROR_OK) {
mbed_official 6:5678c0b6f74e 314 print_function("\n\nSuccess. Exiting \n\n");
mbed_official 6:5678c0b6f74e 315 } else {
mbed_official 6:5678c0b6f74e 316 print_function("\n\nFailure. Exiting \n\n");
mbed_official 6:5678c0b6f74e 317 }
mbed_official 26:348eec457e58 318
mbed_official 6:5678c0b6f74e 319 #if MBED_CONF_MBED_TRACE_ENABLE
mbed_official 6:5678c0b6f74e 320 trace_close();
mbed_official 26:348eec457e58 321 #else
mbed_official 26:348eec457e58 322 dot_thread.terminate();
mbed_official 6:5678c0b6f74e 323 #endif // #if MBED_CONF_MBED_TRACE_ENABLE
mbed_official 6:5678c0b6f74e 324
mbed_official 6:5678c0b6f74e 325 return 0;
mbed_official 0:4611f6cf2413 326 }
mbed_official 0:4611f6cf2413 327 // EOF