Cellular example for CodeZoo Type1SC Shield

Committer:
pimco01
Date:
Tue Jul 27 05:42:30 2021 +0000
Revision:
0:04fa3499a11e
CodeZoo Type1SC Shield Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pimco01 0:04fa3499a11e 1 /*
pimco01 0:04fa3499a11e 2 * Copyright (c) 2017 ARM Limited. All rights reserved.
pimco01 0:04fa3499a11e 3 * SPDX-License-Identifier: Apache-2.0
pimco01 0:04fa3499a11e 4 * Licensed under the Apache License, Version 2.0 (the License); you may
pimco01 0:04fa3499a11e 5 * not use this file except in compliance with the License.
pimco01 0:04fa3499a11e 6 * You may obtain a copy of the License at
pimco01 0:04fa3499a11e 7 *
pimco01 0:04fa3499a11e 8 * http://www.apache.org/licenses/LICENSE-2.0
pimco01 0:04fa3499a11e 9 *
pimco01 0:04fa3499a11e 10 * Unless required by applicable law or agreed to in writing, software
pimco01 0:04fa3499a11e 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
pimco01 0:04fa3499a11e 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
pimco01 0:04fa3499a11e 13 * See the License for the specific language governing permissions and
pimco01 0:04fa3499a11e 14 * limitations under the License.
pimco01 0:04fa3499a11e 15 */
pimco01 0:04fa3499a11e 16
pimco01 0:04fa3499a11e 17 #include "mbed.h"
pimco01 0:04fa3499a11e 18 #include "CellularNonIPSocket.h"
pimco01 0:04fa3499a11e 19 #include "UDPSocket.h"
pimco01 0:04fa3499a11e 20 #include "TCPSocket.h"
pimco01 0:04fa3499a11e 21 #include "cellular_demo_tracing.h"
pimco01 0:04fa3499a11e 22
pimco01 0:04fa3499a11e 23 /* configuration choices in mbed_app.json */
pimco01 0:04fa3499a11e 24 #define UDP 0
pimco01 0:04fa3499a11e 25 #define TCP 1
pimco01 0:04fa3499a11e 26 #define NONIP 2
pimco01 0:04fa3499a11e 27
pimco01 0:04fa3499a11e 28 #if MBED_CONF_APP_SOCK_TYPE == TCP
pimco01 0:04fa3499a11e 29 static constexpr char SOCKET_TYPE[] = "TCP";
pimco01 0:04fa3499a11e 30 #elif MBED_CONF_APP_SOCK_TYPE == UDP
pimco01 0:04fa3499a11e 31 static constexpr char SOCKET_TYPE[] = "UDP";
pimco01 0:04fa3499a11e 32 #elif MBED_CONF_APP_SOCK_TYPE == NONIP
pimco01 0:04fa3499a11e 33 static constexpr char SOCKET_TYPE[] = "CellularNonIP";
pimco01 0:04fa3499a11e 34 #endif
pimco01 0:04fa3499a11e 35 static const char ECHO_HOSTNAME[] = MBED_CONF_APP_ECHO_SERVER_HOSTNAME;
pimco01 0:04fa3499a11e 36
pimco01 0:04fa3499a11e 37
pimco01 0:04fa3499a11e 38 class CellularDemo {
pimco01 0:04fa3499a11e 39 static constexpr uint8_t RETRY_COUNT = 3;
pimco01 0:04fa3499a11e 40
pimco01 0:04fa3499a11e 41 public:
pimco01 0:04fa3499a11e 42 CellularDemo(NetworkInterface &network)
pimco01 0:04fa3499a11e 43 : _net(network)
pimco01 0:04fa3499a11e 44 { }
pimco01 0:04fa3499a11e 45
pimco01 0:04fa3499a11e 46 ~CellularDemo() { }
pimco01 0:04fa3499a11e 47
pimco01 0:04fa3499a11e 48 /** Run the cellular demo. */
pimco01 0:04fa3499a11e 49 void run()
pimco01 0:04fa3499a11e 50 {
pimco01 0:04fa3499a11e 51 /* sim pin, apn, credentials and possible plmn are taken automatically from json
pimco01 0:04fa3499a11e 52 * when using NetworkInterface::set_default_parameters() */
pimco01 0:04fa3499a11e 53 _net.set_default_parameters();
pimco01 0:04fa3499a11e 54
pimco01 0:04fa3499a11e 55 nsapi_size_or_error_t ret = NSAPI_ERROR_NO_CONNECTION;
pimco01 0:04fa3499a11e 56
pimco01 0:04fa3499a11e 57 if (connect_cellular()) {
pimco01 0:04fa3499a11e 58 /* ping echo server */
pimco01 0:04fa3499a11e 59 if (!test_send_and_receive()) {
pimco01 0:04fa3499a11e 60 printf("Sending and received data failed.\n");
pimco01 0:04fa3499a11e 61 }
pimco01 0:04fa3499a11e 62
pimco01 0:04fa3499a11e 63 ret = _net.disconnect();
pimco01 0:04fa3499a11e 64
pimco01 0:04fa3499a11e 65 if (ret != NSAPI_ERROR_OK) {
pimco01 0:04fa3499a11e 66 printf("Disconnect failed (error: %d).\n", ret);
pimco01 0:04fa3499a11e 67 }
pimco01 0:04fa3499a11e 68 }
pimco01 0:04fa3499a11e 69
pimco01 0:04fa3499a11e 70 if (ret == NSAPI_ERROR_OK) {
pimco01 0:04fa3499a11e 71 printf("Success. Exiting\n");
pimco01 0:04fa3499a11e 72 } else {
pimco01 0:04fa3499a11e 73 printf("Failure. Exiting\n");
pimco01 0:04fa3499a11e 74 }
pimco01 0:04fa3499a11e 75 }
pimco01 0:04fa3499a11e 76
pimco01 0:04fa3499a11e 77 private:
pimco01 0:04fa3499a11e 78 /**
pimco01 0:04fa3499a11e 79 * For UDP or TCP it opens a socket with the given echo server and performs an echo transaction.
pimco01 0:04fa3499a11e 80 * For Cellular Non-IP it opens a socket for which the data delivery path is decided
pimco01 0:04fa3499a11e 81 * by network's control plane CIoT optimisation setup, for the given APN.
pimco01 0:04fa3499a11e 82 */
pimco01 0:04fa3499a11e 83 bool test_send_and_receive()
pimco01 0:04fa3499a11e 84 {
pimco01 0:04fa3499a11e 85 nsapi_size_or_error_t ret;
pimco01 0:04fa3499a11e 86
pimco01 0:04fa3499a11e 87 ret = _socket.open(&_net);
pimco01 0:04fa3499a11e 88
pimco01 0:04fa3499a11e 89 if (ret != NSAPI_ERROR_OK) {
pimco01 0:04fa3499a11e 90 printf("%sSocket.open() fails, code: %d\n", SOCKET_TYPE, ret);
pimco01 0:04fa3499a11e 91 return false;
pimco01 0:04fa3499a11e 92 }
pimco01 0:04fa3499a11e 93
pimco01 0:04fa3499a11e 94 _socket.set_timeout(15000);
pimco01 0:04fa3499a11e 95
pimco01 0:04fa3499a11e 96 if (!resolve_hostname()) {
pimco01 0:04fa3499a11e 97 return false;
pimco01 0:04fa3499a11e 98 }
pimco01 0:04fa3499a11e 99
pimco01 0:04fa3499a11e 100 if (!connect_socket()) {
pimco01 0:04fa3499a11e 101 return false;
pimco01 0:04fa3499a11e 102 }
pimco01 0:04fa3499a11e 103
pimco01 0:04fa3499a11e 104 ret = send_test_data();
pimco01 0:04fa3499a11e 105
pimco01 0:04fa3499a11e 106 if (ret < 0) {
pimco01 0:04fa3499a11e 107 printf("%sSocket.send() fails, code: %d\n", SOCKET_TYPE, ret);
pimco01 0:04fa3499a11e 108 return false;
pimco01 0:04fa3499a11e 109 } else {
pimco01 0:04fa3499a11e 110 printf("%s: Sent %d Bytes to %s\n", SOCKET_TYPE, ret, ECHO_HOSTNAME);
pimco01 0:04fa3499a11e 111 }
pimco01 0:04fa3499a11e 112
pimco01 0:04fa3499a11e 113 ret = receive_test_data();
pimco01 0:04fa3499a11e 114
pimco01 0:04fa3499a11e 115 if (ret < 0) {
pimco01 0:04fa3499a11e 116 printf("%sSocket.recv() fails, code: %d\n", SOCKET_TYPE, ret);
pimco01 0:04fa3499a11e 117 return false;
pimco01 0:04fa3499a11e 118 } else {
pimco01 0:04fa3499a11e 119 printf("Received from echo server %d Bytes\n", ret);
pimco01 0:04fa3499a11e 120 }
pimco01 0:04fa3499a11e 121
pimco01 0:04fa3499a11e 122 ret = _socket.close();
pimco01 0:04fa3499a11e 123
pimco01 0:04fa3499a11e 124 if (ret != NSAPI_ERROR_OK) {
pimco01 0:04fa3499a11e 125 printf("%sSocket.close() fails, code: %d\n", SOCKET_TYPE, ret);
pimco01 0:04fa3499a11e 126 return false;
pimco01 0:04fa3499a11e 127 }
pimco01 0:04fa3499a11e 128
pimco01 0:04fa3499a11e 129 return true;
pimco01 0:04fa3499a11e 130 }
pimco01 0:04fa3499a11e 131
pimco01 0:04fa3499a11e 132 /** Connects to the Cellular Network */
pimco01 0:04fa3499a11e 133 bool connect_cellular()
pimco01 0:04fa3499a11e 134 {
pimco01 0:04fa3499a11e 135 printf("Establishing connection\n");
pimco01 0:04fa3499a11e 136
pimco01 0:04fa3499a11e 137 /* check if we're already connected */
pimco01 0:04fa3499a11e 138 if (_net.get_connection_status() == NSAPI_STATUS_GLOBAL_UP) {
pimco01 0:04fa3499a11e 139 return true;
pimco01 0:04fa3499a11e 140 }
pimco01 0:04fa3499a11e 141
pimco01 0:04fa3499a11e 142 nsapi_error_t ret;
pimco01 0:04fa3499a11e 143
pimco01 0:04fa3499a11e 144 for (uint8_t retry = 0; retry <= RETRY_COUNT; retry++) {
pimco01 0:04fa3499a11e 145 ret = _net.connect();
pimco01 0:04fa3499a11e 146
pimco01 0:04fa3499a11e 147 if (ret == NSAPI_ERROR_OK) {
pimco01 0:04fa3499a11e 148 printf("Connection Established.\n");
pimco01 0:04fa3499a11e 149 return true;
pimco01 0:04fa3499a11e 150 } else if (ret == NSAPI_ERROR_AUTH_FAILURE) {
pimco01 0:04fa3499a11e 151 printf("Authentication Failure.\n");
pimco01 0:04fa3499a11e 152 return false;
pimco01 0:04fa3499a11e 153 } else {
pimco01 0:04fa3499a11e 154 printf("Couldn't connect: %d, will retry\n", ret);
pimco01 0:04fa3499a11e 155 }
pimco01 0:04fa3499a11e 156 }
pimco01 0:04fa3499a11e 157
pimco01 0:04fa3499a11e 158 printf("Fatal connection failure: %d\n", ret);
pimco01 0:04fa3499a11e 159
pimco01 0:04fa3499a11e 160 return false;
pimco01 0:04fa3499a11e 161 }
pimco01 0:04fa3499a11e 162
pimco01 0:04fa3499a11e 163 /** Connects to the Cellular Network */
pimco01 0:04fa3499a11e 164 bool resolve_hostname()
pimco01 0:04fa3499a11e 165 {
pimco01 0:04fa3499a11e 166 #if MBED_CONF_APP_SOCK_TYPE != NONIP
pimco01 0:04fa3499a11e 167 nsapi_error_t ret = _net.gethostbyname(ECHO_HOSTNAME, &_socket_address);
pimco01 0:04fa3499a11e 168
pimco01 0:04fa3499a11e 169 if (ret != NSAPI_ERROR_OK) {
pimco01 0:04fa3499a11e 170 printf("Couldn't resolve remote host: %s, code: %d\n", ECHO_HOSTNAME, ret);
pimco01 0:04fa3499a11e 171 return false;
pimco01 0:04fa3499a11e 172 }
pimco01 0:04fa3499a11e 173
pimco01 0:04fa3499a11e 174 _socket_address.set_port(MBED_CONF_APP_ECHO_SERVER_PORT);
pimco01 0:04fa3499a11e 175 #endif
pimco01 0:04fa3499a11e 176 return true;
pimco01 0:04fa3499a11e 177 }
pimco01 0:04fa3499a11e 178
pimco01 0:04fa3499a11e 179 bool connect_socket()
pimco01 0:04fa3499a11e 180 {
pimco01 0:04fa3499a11e 181 #if MBED_CONF_APP_SOCK_TYPE == TCP
pimco01 0:04fa3499a11e 182 nsapi_error_t ret = _socket.connect(_socket_address);
pimco01 0:04fa3499a11e 183 if (ret < 0) {
pimco01 0:04fa3499a11e 184 printf("TCPSocket.connect() fails, code: %d\n", ret);
pimco01 0:04fa3499a11e 185 return false;
pimco01 0:04fa3499a11e 186 } else {
pimco01 0:04fa3499a11e 187 printf("TCP: connected with %s server\n", ECHO_HOSTNAME);
pimco01 0:04fa3499a11e 188 }
pimco01 0:04fa3499a11e 189 #endif
pimco01 0:04fa3499a11e 190 return true;
pimco01 0:04fa3499a11e 191 }
pimco01 0:04fa3499a11e 192
pimco01 0:04fa3499a11e 193 nsapi_error_t send_test_data()
pimco01 0:04fa3499a11e 194 {
pimco01 0:04fa3499a11e 195 const char *echo_string = "Hello CodeZoo!!!";
pimco01 0:04fa3499a11e 196 #if MBED_CONF_APP_SOCK_TYPE == UDP
pimco01 0:04fa3499a11e 197 return _socket.sendto(_socket_address, (void*)echo_string, strlen(echo_string));
pimco01 0:04fa3499a11e 198 #else
pimco01 0:04fa3499a11e 199 return _socket.send((void*)echo_string, strlen(echo_string));
pimco01 0:04fa3499a11e 200 #endif
pimco01 0:04fa3499a11e 201 }
pimco01 0:04fa3499a11e 202
pimco01 0:04fa3499a11e 203 nsapi_error_t receive_test_data()
pimco01 0:04fa3499a11e 204 {
pimco01 0:04fa3499a11e 205 int len=0;
pimco01 0:04fa3499a11e 206 char receive_buffer[18]={0};
pimco01 0:04fa3499a11e 207 #if MBED_CONF_APP_SOCK_TYPE == UDP
pimco01 0:04fa3499a11e 208 len = _socket.recvfrom(&_socket_address, (void*)receive_buffer, sizeof(receive_buffer));
pimco01 0:04fa3499a11e 209 printf("recvfrom : %s \n",receive_buffer);
pimco01 0:04fa3499a11e 210 #else
pimco01 0:04fa3499a11e 211 len = _socket.recv((void*)receive_buffer, sizeof(receive_buffer));
pimco01 0:04fa3499a11e 212 printf("recv : %s \n",receive_buffer);
pimco01 0:04fa3499a11e 213 #endif
pimco01 0:04fa3499a11e 214 return len;
pimco01 0:04fa3499a11e 215 }
pimco01 0:04fa3499a11e 216
pimco01 0:04fa3499a11e 217 private:
pimco01 0:04fa3499a11e 218 NetworkInterface &_net;
pimco01 0:04fa3499a11e 219
pimco01 0:04fa3499a11e 220 #if MBED_CONF_APP_SOCK_TYPE == TCP
pimco01 0:04fa3499a11e 221 TCPSocket _socket;
pimco01 0:04fa3499a11e 222 SocketAddress _socket_address;
pimco01 0:04fa3499a11e 223 #elif MBED_CONF_APP_SOCK_TYPE == UDP
pimco01 0:04fa3499a11e 224 UDPSocket _socket;
pimco01 0:04fa3499a11e 225 SocketAddress _socket_address;
pimco01 0:04fa3499a11e 226 #elif MBED_CONF_APP_SOCK_TYPE == NONIP
pimco01 0:04fa3499a11e 227 CellularNonIPSocket _socket;
pimco01 0:04fa3499a11e 228 #endif
pimco01 0:04fa3499a11e 229 };
pimco01 0:04fa3499a11e 230
pimco01 0:04fa3499a11e 231 int main() {
pimco01 0:04fa3499a11e 232 printf("\nmbed-os-example-cellular\n");
pimco01 0:04fa3499a11e 233
pimco01 0:04fa3499a11e 234 trace_open();
pimco01 0:04fa3499a11e 235
pimco01 0:04fa3499a11e 236 #if MBED_CONF_APP_SOCK_TYPE == NONIP
pimco01 0:04fa3499a11e 237 NetworkInterface *net = CellularContext::get_default_nonip_instance();
pimco01 0:04fa3499a11e 238 #else
pimco01 0:04fa3499a11e 239 NetworkInterface *net = CellularContext::get_default_instance();
pimco01 0:04fa3499a11e 240 #endif
pimco01 0:04fa3499a11e 241
pimco01 0:04fa3499a11e 242 if (net) {
pimco01 0:04fa3499a11e 243 CellularDemo example(*net);
pimco01 0:04fa3499a11e 244 example.run();
pimco01 0:04fa3499a11e 245 } else {
pimco01 0:04fa3499a11e 246 printf("Failed to get_default_instance()\n");
pimco01 0:04fa3499a11e 247 }
pimco01 0:04fa3499a11e 248
pimco01 0:04fa3499a11e 249 trace_close();
pimco01 0:04fa3499a11e 250
pimco01 0:04fa3499a11e 251 return 0;
pimco01 0:04fa3499a11e 252 }