Test code that Cat.M1 of BG96 for SK Telecom in Korea

This example showing how to use Cat.M1(BG96 module) of SK telecom network in Korea. You need a WIZnet BG96 board or can connect directly to M2Mnet BG96 module and development board.

  • If you are using Mbed OS 5.11.5 version, please see here!
  • Pelion ready example code is here!

board board

Or

/media/uploads/Daniel_Lee/small_pic.jpg

/media/uploads/Daniel_Lee/screen_shot_2019-11-14_at_1.38.16_pm.png

  • BG96 RESET = D7
  • BG96 PWRKEY = D9
  • BG96 RX = D0(or D2)
  • BG96 TX = D1(or D8)
  • BG96 VCC = VCC(5V)
  • BG96 GND = GND

Tested with

  • NUCLEO_F429ZI
  • DISCO_L475VG_IOT01A
  • K66F
  • K64F

Below boards are Need to connect board's D2 and D8 to BG96's TX and RX on mbed_app.json

  • NUCLEO_L152RE
  • NUCLEO_F401RE

 "QUECTEL_BG96.tx": "D8",
 "QUECTEL_BG96.rx": "D2",

1. Import the application into your desktop:

 mbed import https://os.mbed.com/users/Daniel_Lee/code/mbed-os-example-cellular-BG96/

 cd mbed-os-example-cellular-BG96

2. Compile and program:

mbed compile -t <toolchain> -m <TARGET_BOARD>

(supported toolchains : GCC_ARM / ARM / IAR)

3. Download binary to a target board

4. Result

mbed-os-example-cellular


Built: Jul 24 2019, 14:55:22


[MAIN], plmn: NULL
Establishing connection
M2Mnet(BG96) Power ON
[00005501ms][INFO][CELL]: New CellularContext  (20004120)
[00005501ms][INFO][CELL]: CellularContext plmn NULL
[00005502ms][INFO][CELL]: CellularContext connect
[00006503ms][INFO][CELL]: Start connecting (timeout 1000 ms)
[00006512ms][INFO][CELL]: RSSI unknown
[00006520ms][INFO][CELL]: Modem ready
[00006524ms][INFO][CELL]: RSSI unknown
[00006524ms][INFO][CELL]: Setup SIM (timeout 1000 ms)
[00006529ms][INFO][CELL]: SIM is ready
[00006558ms][INFO][CELL]: RSSI unknown
[00006566ms][INFO][CELL]: Network registration (timeout 1000 ms)
[00006570ms][INFO][CELL]: Continue after 1 seconds
[00006964ms][ERR ][CELL]: AT overflow
[00007576ms][INFO][CELL]: RSSI unknown
[00007582ms][INFO][CELL]: Registering network => Attaching network
[00007586ms][INFO][CELL]: RSSI unknown
[00007586ms][INFO][CELL]: Attaching network (timeout 1000 ms)
[00007660ms][INFO][CELL]: Found PDP context 7
[00007663ms][INFO][CELL]: Activate PDP context 7
[00009733ms][INFO][CELL]: Found PDP context 7

Connection Established.
[00009742ms][INFO][CELL]: Socket 0 open
[00009752ms][INFO][CELL]: Socket 1 open
[00009786ms][INFO][CELL]: Socket 1 sent 43 bytes to 8.8.8.8 port 53
[00009967ms][INFO][CELL]: Socket 1 recv 71 bytes from 64:ff9b::808:808 port 53
[00009972ms][INFO][CELL]: Socket 1 closed
TCP: connected with echo.mbedcloudtesting.com server
[00010384ms][INFO][CELL]: Socket 0 sent 4 bytes to 2a05:d018:21f:3800:3164:2a5c7
TCP: Sent 4 Bytes to echo.mbedcloudtesting.com
[00011257ms][INFO][CELL]: Socket 0 recv 4 bytes
[00021263ms][INFO][CELL]: Socket 0 closed
Received from echo server 4 Bytes
[00021263ms][INFO][CELL]: CellularContext disconnect()
[00021264ms][INFO][CELL]: cb: CellularContext disconnected


Success. Exiting

5. Patched code

If need more information such as how to test, please look at https://os.mbed.com/teams/mbed-os-examples/code/mbed-os-example-cellular/.

Committer:
Daniel_Lee
Date:
Wed Jul 24 15:27:53 2019 +0000
Revision:
44:e621506d052d
Parent:
43:91f11760b50f
Update latest commit

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