Example program that uses the mbed UbloxATCellularInterface or OnboardCellularInterface classes to perform simple sockets operations. This program can be used on the C027 and C030 boards, including the C030 N2xx version with a little editing.

Dependencies:   ublox-at-cellular-interface ublox-cellular-base ublox-cellular-base-n2xx ublox-at-cellular-interface-n2xx

Committer:
RobMeades
Date:
Mon Jun 12 09:09:13 2017 +0000
Revision:
4:3e2b789c3adc
Parent:
3:7ca70581ef20
Child:
5:bf352de1d3e5
Make example work for C027.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rob.meades@u-blox.com 1:581335dbdd60 1 /* mbed Microcontroller Library
rob.meades@u-blox.com 1:581335dbdd60 2 * Copyright (c) 2017 u-blox
rob.meades@u-blox.com 1:581335dbdd60 3 *
rob.meades@u-blox.com 1:581335dbdd60 4 * Licensed under the Apache License, Version 2.0 (the "License");
rob.meades@u-blox.com 1:581335dbdd60 5 * you may not use this file except in compliance with the License.
rob.meades@u-blox.com 1:581335dbdd60 6 * You may obtain a copy of the License at
rob.meades@u-blox.com 1:581335dbdd60 7 *
rob.meades@u-blox.com 1:581335dbdd60 8 * http://www.apache.org/licenses/LICENSE-2.0
rob.meades@u-blox.com 1:581335dbdd60 9 *
rob.meades@u-blox.com 1:581335dbdd60 10 * Unless required by applicable law or agreed to in writing, software
rob.meades@u-blox.com 1:581335dbdd60 11 * distributed under the License is distributed on an "AS IS" BASIS,
rob.meades@u-blox.com 1:581335dbdd60 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rob.meades@u-blox.com 1:581335dbdd60 13 * See the License for the specific language governing permissions and
rob.meades@u-blox.com 1:581335dbdd60 14 * limitations under the License.
rob.meades@u-blox.com 1:581335dbdd60 15 */
rob.meades@u-blox.com 1:581335dbdd60 16
rob.meades@u-blox.com 1:581335dbdd60 17 #include "mbed.h"
rob.meades@u-blox.com 1:581335dbdd60 18 #include "UbloxATCellularInterface.h"
rob.meades@u-blox.com 1:581335dbdd60 19
rob.meades@u-blox.com 1:581335dbdd60 20 // The credentials of the SIM in the board. If PIN checking is enabled
rob.meades@u-blox.com 1:581335dbdd60 21 // for your SIM card you must set this to the required PIN.
rob.meades@u-blox.com 1:581335dbdd60 22 #define PIN "0000"
rob.meades@u-blox.com 1:581335dbdd60 23
rob.meades@u-blox.com 1:581335dbdd60 24 // Network credentials. You should set this according to your
rob.meades@u-blox.com 1:581335dbdd60 25 // network/SIM card. For C030 boards, leave the parameters as NULL
rob.meades@u-blox.com 1:581335dbdd60 26 // otherwise, if you do not know the APN for your network, you may
rob.meades@u-blox.com 1:581335dbdd60 27 // either try the fairly common "internet" for the APN (and leave the
rob.meades@u-blox.com 1:581335dbdd60 28 // username and password NULL), or you may leave all three as NULL and then
rob.meades@u-blox.com 1:581335dbdd60 29 // a lookup will be attempted for a small number of known networks
rob.meades@u-blox.com 1:581335dbdd60 30 // (see APN_db.h in mbed-os/features/netsocket/cellular/utils).
rob.meades@u-blox.com 1:581335dbdd60 31 #define APN NULL
rob.meades@u-blox.com 1:581335dbdd60 32 #define USERNAME NULL
rob.meades@u-blox.com 1:581335dbdd60 33 #define PASSWORD NULL
rob.meades@u-blox.com 1:581335dbdd60 34
rob.meades@u-blox.com 1:581335dbdd60 35 // LEDs
rob.meades@u-blox.com 1:581335dbdd60 36 DigitalOut ledRed(LED1, 1);
rob.meades@u-blox.com 1:581335dbdd60 37 DigitalOut ledGreen(LED2, 1);
rob.meades@u-blox.com 1:581335dbdd60 38 DigitalOut ledBlue(LED3, 1);
rob.meades@u-blox.com 1:581335dbdd60 39
rob.meades@u-blox.com 1:581335dbdd60 40 // The user button
rob.meades@u-blox.com 1:581335dbdd60 41 volatile bool buttonPressed = false;
rob.meades@u-blox.com 1:581335dbdd60 42
rob.meades@u-blox.com 1:581335dbdd60 43 static void good() {
rob.meades@u-blox.com 1:581335dbdd60 44 ledGreen = 0;
rob.meades@u-blox.com 1:581335dbdd60 45 ledBlue = 1;
rob.meades@u-blox.com 1:581335dbdd60 46 ledRed = 1;
rob.meades@u-blox.com 1:581335dbdd60 47 }
rob.meades@u-blox.com 1:581335dbdd60 48
rob.meades@u-blox.com 1:581335dbdd60 49 static void bad() {
rob.meades@u-blox.com 1:581335dbdd60 50 ledRed = 0;
rob.meades@u-blox.com 1:581335dbdd60 51 ledGreen = 1;
rob.meades@u-blox.com 1:581335dbdd60 52 ledBlue = 1;
rob.meades@u-blox.com 1:581335dbdd60 53 }
rob.meades@u-blox.com 1:581335dbdd60 54
rob.meades@u-blox.com 1:581335dbdd60 55 static void event() {
rob.meades@u-blox.com 1:581335dbdd60 56 ledBlue = 0;
rob.meades@u-blox.com 1:581335dbdd60 57 ledRed = 1;
rob.meades@u-blox.com 1:581335dbdd60 58 ledGreen = 1;
rob.meades@u-blox.com 1:581335dbdd60 59 }
rob.meades@u-blox.com 1:581335dbdd60 60
rob.meades@u-blox.com 1:581335dbdd60 61 static void pulseEvent() {
rob.meades@u-blox.com 1:581335dbdd60 62 event();
rob.meades@u-blox.com 1:581335dbdd60 63 wait_ms(500);
rob.meades@u-blox.com 1:581335dbdd60 64 good();
rob.meades@u-blox.com 1:581335dbdd60 65 }
rob.meades@u-blox.com 1:581335dbdd60 66
rob.meades@u-blox.com 1:581335dbdd60 67 static void ledOff() {
rob.meades@u-blox.com 1:581335dbdd60 68 ledBlue = 1;
rob.meades@u-blox.com 1:581335dbdd60 69 ledRed = 1;
rob.meades@u-blox.com 1:581335dbdd60 70 ledGreen = 1;
rob.meades@u-blox.com 1:581335dbdd60 71 }
rob.meades@u-blox.com 1:581335dbdd60 72
rob.meades@u-blox.com 1:581335dbdd60 73 static void printNtpTime(char * buf, int len)
rob.meades@u-blox.com 1:581335dbdd60 74 {
rob.meades@u-blox.com 1:581335dbdd60 75 time_t timestamp = 0;
rob.meades@u-blox.com 1:581335dbdd60 76 struct tm *localTime;
rob.meades@u-blox.com 1:581335dbdd60 77 char timeString[25];
rob.meades@u-blox.com 1:581335dbdd60 78 time_t TIME1970 = 2208988800U;
rob.meades@u-blox.com 1:581335dbdd60 79
rob.meades@u-blox.com 1:581335dbdd60 80 if (len >= 43) {
rob.meades@u-blox.com 1:581335dbdd60 81 timestamp |= ((int) *(buf + 40)) << 24;
rob.meades@u-blox.com 1:581335dbdd60 82 timestamp |= ((int) *(buf + 41)) << 16;
rob.meades@u-blox.com 1:581335dbdd60 83 timestamp |= ((int) *(buf + 42)) << 8;
rob.meades@u-blox.com 1:581335dbdd60 84 timestamp |= ((int) *(buf + 43));
rob.meades@u-blox.com 1:581335dbdd60 85 timestamp -= TIME1970;
rob.meades@u-blox.com 1:581335dbdd60 86 localTime = localtime(&timestamp);
rob.meades@u-blox.com 1:581335dbdd60 87 if (localTime) {
rob.meades@u-blox.com 1:581335dbdd60 88 if (strftime(timeString, sizeof(timeString), "%a %b %d %H:%M:%S %Y", localTime) > 0) {
rob.meades@u-blox.com 1:581335dbdd60 89 printf("NTP timestamp is %s.\n", timeString);
rob.meades@u-blox.com 1:581335dbdd60 90 }
rob.meades@u-blox.com 1:581335dbdd60 91 }
rob.meades@u-blox.com 1:581335dbdd60 92 }
rob.meades@u-blox.com 1:581335dbdd60 93 }
rob.meades@u-blox.com 1:581335dbdd60 94
rob.meades@u-blox.com 1:581335dbdd60 95 static void cbButton()
rob.meades@u-blox.com 1:581335dbdd60 96 {
rob.meades@u-blox.com 1:581335dbdd60 97 buttonPressed = true;
rob.meades@u-blox.com 1:581335dbdd60 98 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 99 }
rob.meades@u-blox.com 1:581335dbdd60 100
rob.meades@u-blox.com 1:581335dbdd60 101 /* This example program for the u-blox C030 and C027 boards instantiates
rob.meades@u-blox.com 1:581335dbdd60 102 * the UbloxAtCellularInterface and uses it to make a simple sockets
rob.meades@u-blox.com 1:581335dbdd60 103 * connection to a server, using 2.pool.ntp.org for UDP and developer.mbed.org
rob.meades@u-blox.com 1:581335dbdd60 104 * for TCP. For a more comprehensive example, where higher layer protocols
rob.meades@u-blox.com 1:581335dbdd60 105 * make use of the same sockets interface, see example-ublox-mbed-client.
rob.meades@u-blox.com 1:581335dbdd60 106 * Progress may be monitored with a serial terminal running at 9600 baud.
rob.meades@u-blox.com 1:581335dbdd60 107 * The LED on the C030 board will turn green when this program is
rob.meades@u-blox.com 1:581335dbdd60 108 * operating correctly, pulse blue when a sockets operation is completed
rob.meades@u-blox.com 1:581335dbdd60 109 * and turn red if there is a failure.
rob.meades@u-blox.com 1:581335dbdd60 110 */
rob.meades@u-blox.com 1:581335dbdd60 111
rob.meades@u-blox.com 1:581335dbdd60 112 int main()
rob.meades@u-blox.com 1:581335dbdd60 113 {
rob.meades@u-blox.com 1:581335dbdd60 114 UbloxATCellularInterface *interface = new UbloxATCellularInterface();
RobMeades 4:3e2b789c3adc 115 // If you need to debug the cellular interface, comment out the
RobMeades 4:3e2b789c3adc 116 // instantiation above and uncomment the one below.
RobMeades 4:3e2b789c3adc 117 // UbloxATCellularInterface *interface = new UbloxATCellularInterface(MDMTXD, MDMRXD,
RobMeades 4:3e2b789c3adc 118 // MBED_CONF_UBLOX_CELL_BAUD_RATE,
RobMeades 4:3e2b789c3adc 119 // true);
rob.meades@u-blox.com 1:581335dbdd60 120 TCPSocket sockTcp;
rob.meades@u-blox.com 1:581335dbdd60 121 UDPSocket sockUdp;
rob.meades@u-blox.com 1:581335dbdd60 122 SocketAddress udpServer;
rob.meades@u-blox.com 1:581335dbdd60 123 SocketAddress udpSenderAddress;
rob.meades@u-blox.com 1:581335dbdd60 124 SocketAddress tcpServer;
rob.meades@u-blox.com 1:581335dbdd60 125 char buf[1024];
rob.meades@u-blox.com 1:581335dbdd60 126 int x;
RobMeades 4:3e2b789c3adc 127 #ifdef TARGET_UBLOX_C027
RobMeades 4:3e2b789c3adc 128 // No user button on C027
RobMeades 4:3e2b789c3adc 129 InterruptIn userButton(NC);
RobMeades 4:3e2b789c3adc 130 #else
rob.meades@u-blox.com 1:581335dbdd60 131 InterruptIn userButton(SW0);
RobMeades 4:3e2b789c3adc 132 #endif
rob.meades@u-blox.com 1:581335dbdd60 133
rob.meades@u-blox.com 1:581335dbdd60 134 // Attach a function to the user button
rob.meades@u-blox.com 1:581335dbdd60 135 userButton.rise(&cbButton);
rob.meades@u-blox.com 1:581335dbdd60 136
rob.meades@u-blox.com 1:581335dbdd60 137 good();
rob.meades@u-blox.com 1:581335dbdd60 138 printf("Starting up, please wait up to 180 seconds for network registration to complete...\n");
rob.meades@u-blox.com 1:581335dbdd60 139 if (interface->init(PIN)) {
rob.meades@u-blox.com 1:581335dbdd60 140 pulseEvent();
RobMeades 3:7ca70581ef20 141 interface->set_credentials(APN, USERNAME, PASSWORD);
rob.meades@u-blox.com 1:581335dbdd60 142 printf("Registered, connecting to the packet network...\n");
RobMeades 3:7ca70581ef20 143 for (x = 0; interface->connect() != 0; x++) {
rob.meades@u-blox.com 1:581335dbdd60 144 if (x > 0) {
rob.meades@u-blox.com 1:581335dbdd60 145 bad();
rob.meades@u-blox.com 1:581335dbdd60 146 printf("Retrying (have you checked that an antenna is plugged in and your APN is correct?)...\n");
rob.meades@u-blox.com 1:581335dbdd60 147 }
rob.meades@u-blox.com 1:581335dbdd60 148 }
rob.meades@u-blox.com 1:581335dbdd60 149 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 150
rob.meades@u-blox.com 1:581335dbdd60 151 printf("Getting the IP address of \"developer.mbed.org\" and \"2.pool.ntp.org\"...\n");
rob.meades@u-blox.com 1:581335dbdd60 152 if ((interface->gethostbyname("2.pool.ntp.org", &udpServer) == 0) &&
rob.meades@u-blox.com 1:581335dbdd60 153 (interface->gethostbyname("developer.mbed.org", &tcpServer) == 0)) {
rob.meades@u-blox.com 1:581335dbdd60 154 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 155 udpServer.set_port(123);
rob.meades@u-blox.com 1:581335dbdd60 156 tcpServer.set_port(80);
rob.meades@u-blox.com 1:581335dbdd60 157 printf("\"2.pool.ntp.org\" address: %s on port %d.\n", udpServer.get_ip_address(), udpServer.get_port());
rob.meades@u-blox.com 1:581335dbdd60 158 printf("\"developer.mbed.org\" address: %s on port %d.\n", tcpServer.get_ip_address(), tcpServer.get_port());
rob.meades@u-blox.com 1:581335dbdd60 159
RobMeades 4:3e2b789c3adc 160 printf("Performing socket operations in a loop (until the user button is pressed on C030 or forever on C027)...\n");
rob.meades@u-blox.com 1:581335dbdd60 161 while (!buttonPressed) {
rob.meades@u-blox.com 1:581335dbdd60 162 // UDP Sockets
rob.meades@u-blox.com 1:581335dbdd60 163 printf("=== UDP ===\n");
rob.meades@u-blox.com 1:581335dbdd60 164 printf("Opening a UDP socket...\n");
rob.meades@u-blox.com 1:581335dbdd60 165 if (sockUdp.open(interface) == 0) {
rob.meades@u-blox.com 1:581335dbdd60 166 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 167 printf("UDP socket open.\n");
rob.meades@u-blox.com 1:581335dbdd60 168 sockUdp.set_timeout(10000);
rob.meades@u-blox.com 1:581335dbdd60 169 printf("Sending time request to \"2.pool.ntp.org\" over UDP socket...\n");
rob.meades@u-blox.com 1:581335dbdd60 170 memset (buf, 0, sizeof(buf));
rob.meades@u-blox.com 1:581335dbdd60 171 *buf = '\x1b';
rob.meades@u-blox.com 1:581335dbdd60 172 if (sockUdp.sendto(udpServer, (void *) buf, 48) == 48) {
rob.meades@u-blox.com 1:581335dbdd60 173 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 174 printf("Socket send completed, waiting for UDP response...\n");
rob.meades@u-blox.com 1:581335dbdd60 175 x = sockUdp.recvfrom(&udpSenderAddress, buf, sizeof (buf));
rob.meades@u-blox.com 1:581335dbdd60 176 if (x > 0) {
rob.meades@u-blox.com 1:581335dbdd60 177 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 178 printf("Received %d byte response from server %s on UDP socket:\n"
rob.meades@u-blox.com 1:581335dbdd60 179 "-------------------------------------------------------\n",
rob.meades@u-blox.com 1:581335dbdd60 180 x, udpSenderAddress.get_ip_address());
rob.meades@u-blox.com 1:581335dbdd60 181 printNtpTime(buf, x);
rob.meades@u-blox.com 1:581335dbdd60 182 printf("-------------------------------------------------------\n");
rob.meades@u-blox.com 1:581335dbdd60 183 }
rob.meades@u-blox.com 1:581335dbdd60 184 }
rob.meades@u-blox.com 1:581335dbdd60 185 printf("Closing socket...\n");
rob.meades@u-blox.com 1:581335dbdd60 186 sockUdp.close();
rob.meades@u-blox.com 1:581335dbdd60 187 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 188 printf("Socket closed.\n");
rob.meades@u-blox.com 1:581335dbdd60 189 }
rob.meades@u-blox.com 1:581335dbdd60 190
rob.meades@u-blox.com 1:581335dbdd60 191 // TCP Sockets
rob.meades@u-blox.com 1:581335dbdd60 192 printf("=== TCP ===\n");
rob.meades@u-blox.com 1:581335dbdd60 193 printf("Opening a TCP socket...\n");
rob.meades@u-blox.com 1:581335dbdd60 194 if (sockTcp.open(interface) == 0) {
rob.meades@u-blox.com 1:581335dbdd60 195 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 196 printf("TCP socket open.\n");
rob.meades@u-blox.com 1:581335dbdd60 197 sockTcp.set_timeout(10000);
rob.meades@u-blox.com 1:581335dbdd60 198 printf("Connecting socket to %s on port %d...\n", tcpServer.get_ip_address(), tcpServer.get_port());
rob.meades@u-blox.com 1:581335dbdd60 199 if (sockTcp.connect(tcpServer) == 0) {
RobMeades 2:dbf7dd3da592 200 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 201 printf("Connected, sending HTTP GET request to \"developer.mbed.org\" over socket...\n");
rob.meades@u-blox.com 1:581335dbdd60 202 strcpy (buf, "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\r\n\r\n");
rob.meades@u-blox.com 1:581335dbdd60 203 // Note: since this is a short string we can send it in one go as it will
rob.meades@u-blox.com 1:581335dbdd60 204 // fit within the default buffer sizes. Normally you should call sock.send()
rob.meades@u-blox.com 1:581335dbdd60 205 // in a loop until your entire buffer has been sent.
rob.meades@u-blox.com 1:581335dbdd60 206 if (sockTcp.send((void *) buf, strlen(buf)) == (int) strlen(buf)) {
rob.meades@u-blox.com 1:581335dbdd60 207 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 208 printf("Socket send completed, waiting for response...\n");
rob.meades@u-blox.com 1:581335dbdd60 209 x = sockTcp.recv(buf, sizeof (buf));
rob.meades@u-blox.com 1:581335dbdd60 210 if (x > 0) {
rob.meades@u-blox.com 1:581335dbdd60 211 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 212 printf("Received %d byte response from server on TCP socket:\n"
rob.meades@u-blox.com 1:581335dbdd60 213 "----------------------------------------------------\n%.*s"
rob.meades@u-blox.com 1:581335dbdd60 214 "----------------------------------------------------\n",
rob.meades@u-blox.com 1:581335dbdd60 215 x, x, buf);
rob.meades@u-blox.com 1:581335dbdd60 216 }
rob.meades@u-blox.com 1:581335dbdd60 217 }
rob.meades@u-blox.com 1:581335dbdd60 218 }
rob.meades@u-blox.com 1:581335dbdd60 219 printf("Closing socket...\n");
rob.meades@u-blox.com 1:581335dbdd60 220 sockTcp.close();
rob.meades@u-blox.com 1:581335dbdd60 221 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 222 printf("Socket closed.\n");
rob.meades@u-blox.com 1:581335dbdd60 223 }
rob.meades@u-blox.com 1:581335dbdd60 224 wait_ms(5000);
RobMeades 3:7ca70581ef20 225 printf("[Checking if user button has been pressed]\n");
rob.meades@u-blox.com 1:581335dbdd60 226 }
rob.meades@u-blox.com 1:581335dbdd60 227
rob.meades@u-blox.com 1:581335dbdd60 228 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 229 printf("User button was pressed, stopping...\n");
rob.meades@u-blox.com 1:581335dbdd60 230 interface->disconnect();
rob.meades@u-blox.com 1:581335dbdd60 231 interface->deinit();
rob.meades@u-blox.com 1:581335dbdd60 232 ledOff();
rob.meades@u-blox.com 1:581335dbdd60 233 printf("Stopped.\n");
rob.meades@u-blox.com 1:581335dbdd60 234 } else {
rob.meades@u-blox.com 1:581335dbdd60 235 bad();
RobMeades 2:dbf7dd3da592 236 printf("Unable to get IP address of \"developer.mbed.org\" or \"2.pool.ntp.org\".\n");
rob.meades@u-blox.com 1:581335dbdd60 237 }
rob.meades@u-blox.com 1:581335dbdd60 238 } else {
rob.meades@u-blox.com 1:581335dbdd60 239 bad();
rob.meades@u-blox.com 1:581335dbdd60 240 printf("Unable to initialise the interface.\n");
rob.meades@u-blox.com 1:581335dbdd60 241 }
rob.meades@u-blox.com 1:581335dbdd60 242 }
rob.meades@u-blox.com 1:581335dbdd60 243
rob.meades@u-blox.com 1:581335dbdd60 244 // End Of File