Cellular example code for Seeed Wio 3G

Fork of Wio_3G-example-cellular by Toyomasa Watarai

Committer:
MACRUM
Date:
Wed Aug 08 10:16:49 2018 +0000
Revision:
17:a0330a2e9948
Parent:
13:4bea5334b419
Add APN setting

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