SORACOM Harvest and Grove - Temperature&Humidity Sensor(DHT11) example for Wio cellular targets - Seeed Wio 3G and Wio LTE-M1/NB1(BG96)

Dependencies:   DHT-2

Committer:
asagin
Date:
Wed Jun 05 06:52:22 2019 +0000
Revision:
5:1d355dfee639
Parent:
4:693230744089
Child:
6:deb72cbeb039
This program can send a JSON

Who changed what in which revision?

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