CodeZoo co., ltd
/
mbed-os-example-cellular-Type1SC
Cellular example for CodeZoo Type1SC Shield
source/main.cpp@0:04fa3499a11e, 2021-07-27 (annotated)
- 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?
User | Revision | Line number | New 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 | } |