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:
Fri Jun 09 14:36:07 2017 +0000
Revision:
3:7ca70581ef20
Parent:
2:dbf7dd3da592
Child:
4:3e2b789c3adc
Switch to using set_credentials(), simpler that way.

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();
rob.meades@u-blox.com 1:581335dbdd60 115 TCPSocket sockTcp;
rob.meades@u-blox.com 1:581335dbdd60 116 UDPSocket sockUdp;
rob.meades@u-blox.com 1:581335dbdd60 117 SocketAddress udpServer;
rob.meades@u-blox.com 1:581335dbdd60 118 SocketAddress udpSenderAddress;
rob.meades@u-blox.com 1:581335dbdd60 119 SocketAddress tcpServer;
rob.meades@u-blox.com 1:581335dbdd60 120 char buf[1024];
rob.meades@u-blox.com 1:581335dbdd60 121 int x;
rob.meades@u-blox.com 1:581335dbdd60 122 InterruptIn userButton(SW0);
rob.meades@u-blox.com 1:581335dbdd60 123
rob.meades@u-blox.com 1:581335dbdd60 124 // Attach a function to the user button
rob.meades@u-blox.com 1:581335dbdd60 125 userButton.rise(&cbButton);
rob.meades@u-blox.com 1:581335dbdd60 126
rob.meades@u-blox.com 1:581335dbdd60 127 good();
rob.meades@u-blox.com 1:581335dbdd60 128 printf("Starting up, please wait up to 180 seconds for network registration to complete...\n");
rob.meades@u-blox.com 1:581335dbdd60 129 if (interface->init(PIN)) {
rob.meades@u-blox.com 1:581335dbdd60 130 pulseEvent();
RobMeades 3:7ca70581ef20 131 interface->set_credentials(APN, USERNAME, PASSWORD);
rob.meades@u-blox.com 1:581335dbdd60 132 printf("Registered, connecting to the packet network...\n");
RobMeades 3:7ca70581ef20 133 for (x = 0; interface->connect() != 0; x++) {
rob.meades@u-blox.com 1:581335dbdd60 134 if (x > 0) {
rob.meades@u-blox.com 1:581335dbdd60 135 bad();
rob.meades@u-blox.com 1:581335dbdd60 136 printf("Retrying (have you checked that an antenna is plugged in and your APN is correct?)...\n");
rob.meades@u-blox.com 1:581335dbdd60 137 }
rob.meades@u-blox.com 1:581335dbdd60 138 }
rob.meades@u-blox.com 1:581335dbdd60 139 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 140
rob.meades@u-blox.com 1:581335dbdd60 141 printf("Getting the IP address of \"developer.mbed.org\" and \"2.pool.ntp.org\"...\n");
rob.meades@u-blox.com 1:581335dbdd60 142 if ((interface->gethostbyname("2.pool.ntp.org", &udpServer) == 0) &&
rob.meades@u-blox.com 1:581335dbdd60 143 (interface->gethostbyname("developer.mbed.org", &tcpServer) == 0)) {
rob.meades@u-blox.com 1:581335dbdd60 144 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 145 udpServer.set_port(123);
rob.meades@u-blox.com 1:581335dbdd60 146 tcpServer.set_port(80);
rob.meades@u-blox.com 1:581335dbdd60 147 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 148 printf("\"developer.mbed.org\" address: %s on port %d.\n", tcpServer.get_ip_address(), tcpServer.get_port());
rob.meades@u-blox.com 1:581335dbdd60 149
rob.meades@u-blox.com 1:581335dbdd60 150 printf("Performing socket operations in a loop until the user button is pressed...\n");
rob.meades@u-blox.com 1:581335dbdd60 151 while (!buttonPressed) {
rob.meades@u-blox.com 1:581335dbdd60 152 // UDP Sockets
rob.meades@u-blox.com 1:581335dbdd60 153 printf("=== UDP ===\n");
rob.meades@u-blox.com 1:581335dbdd60 154 printf("Opening a UDP socket...\n");
rob.meades@u-blox.com 1:581335dbdd60 155 if (sockUdp.open(interface) == 0) {
rob.meades@u-blox.com 1:581335dbdd60 156 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 157 printf("UDP socket open.\n");
rob.meades@u-blox.com 1:581335dbdd60 158 sockUdp.set_timeout(10000);
rob.meades@u-blox.com 1:581335dbdd60 159 printf("Sending time request to \"2.pool.ntp.org\" over UDP socket...\n");
rob.meades@u-blox.com 1:581335dbdd60 160 memset (buf, 0, sizeof(buf));
rob.meades@u-blox.com 1:581335dbdd60 161 *buf = '\x1b';
rob.meades@u-blox.com 1:581335dbdd60 162 if (sockUdp.sendto(udpServer, (void *) buf, 48) == 48) {
rob.meades@u-blox.com 1:581335dbdd60 163 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 164 printf("Socket send completed, waiting for UDP response...\n");
rob.meades@u-blox.com 1:581335dbdd60 165 x = sockUdp.recvfrom(&udpSenderAddress, buf, sizeof (buf));
rob.meades@u-blox.com 1:581335dbdd60 166 if (x > 0) {
rob.meades@u-blox.com 1:581335dbdd60 167 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 168 printf("Received %d byte response from server %s on UDP socket:\n"
rob.meades@u-blox.com 1:581335dbdd60 169 "-------------------------------------------------------\n",
rob.meades@u-blox.com 1:581335dbdd60 170 x, udpSenderAddress.get_ip_address());
rob.meades@u-blox.com 1:581335dbdd60 171 printNtpTime(buf, x);
rob.meades@u-blox.com 1:581335dbdd60 172 printf("-------------------------------------------------------\n");
rob.meades@u-blox.com 1:581335dbdd60 173 }
rob.meades@u-blox.com 1:581335dbdd60 174 }
rob.meades@u-blox.com 1:581335dbdd60 175 printf("Closing socket...\n");
rob.meades@u-blox.com 1:581335dbdd60 176 sockUdp.close();
rob.meades@u-blox.com 1:581335dbdd60 177 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 178 printf("Socket closed.\n");
rob.meades@u-blox.com 1:581335dbdd60 179 }
rob.meades@u-blox.com 1:581335dbdd60 180
rob.meades@u-blox.com 1:581335dbdd60 181 // TCP Sockets
rob.meades@u-blox.com 1:581335dbdd60 182 printf("=== TCP ===\n");
rob.meades@u-blox.com 1:581335dbdd60 183 printf("Opening a TCP socket...\n");
rob.meades@u-blox.com 1:581335dbdd60 184 if (sockTcp.open(interface) == 0) {
rob.meades@u-blox.com 1:581335dbdd60 185 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 186 printf("TCP socket open.\n");
rob.meades@u-blox.com 1:581335dbdd60 187 sockTcp.set_timeout(10000);
rob.meades@u-blox.com 1:581335dbdd60 188 printf("Connecting socket to %s on port %d...\n", tcpServer.get_ip_address(), tcpServer.get_port());
rob.meades@u-blox.com 1:581335dbdd60 189 if (sockTcp.connect(tcpServer) == 0) {
RobMeades 2:dbf7dd3da592 190 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 191 printf("Connected, sending HTTP GET request to \"developer.mbed.org\" over socket...\n");
rob.meades@u-blox.com 1:581335dbdd60 192 strcpy (buf, "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\r\n\r\n");
rob.meades@u-blox.com 1:581335dbdd60 193 // Note: since this is a short string we can send it in one go as it will
rob.meades@u-blox.com 1:581335dbdd60 194 // fit within the default buffer sizes. Normally you should call sock.send()
rob.meades@u-blox.com 1:581335dbdd60 195 // in a loop until your entire buffer has been sent.
rob.meades@u-blox.com 1:581335dbdd60 196 if (sockTcp.send((void *) buf, strlen(buf)) == (int) strlen(buf)) {
rob.meades@u-blox.com 1:581335dbdd60 197 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 198 printf("Socket send completed, waiting for response...\n");
rob.meades@u-blox.com 1:581335dbdd60 199 x = sockTcp.recv(buf, sizeof (buf));
rob.meades@u-blox.com 1:581335dbdd60 200 if (x > 0) {
rob.meades@u-blox.com 1:581335dbdd60 201 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 202 printf("Received %d byte response from server on TCP socket:\n"
rob.meades@u-blox.com 1:581335dbdd60 203 "----------------------------------------------------\n%.*s"
rob.meades@u-blox.com 1:581335dbdd60 204 "----------------------------------------------------\n",
rob.meades@u-blox.com 1:581335dbdd60 205 x, x, buf);
rob.meades@u-blox.com 1:581335dbdd60 206 }
rob.meades@u-blox.com 1:581335dbdd60 207 }
rob.meades@u-blox.com 1:581335dbdd60 208 }
rob.meades@u-blox.com 1:581335dbdd60 209 printf("Closing socket...\n");
rob.meades@u-blox.com 1:581335dbdd60 210 sockTcp.close();
rob.meades@u-blox.com 1:581335dbdd60 211 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 212 printf("Socket closed.\n");
rob.meades@u-blox.com 1:581335dbdd60 213 }
rob.meades@u-blox.com 1:581335dbdd60 214 wait_ms(5000);
RobMeades 3:7ca70581ef20 215 printf("[Checking if user button has been pressed]\n");
rob.meades@u-blox.com 1:581335dbdd60 216 }
rob.meades@u-blox.com 1:581335dbdd60 217
rob.meades@u-blox.com 1:581335dbdd60 218 pulseEvent();
rob.meades@u-blox.com 1:581335dbdd60 219 printf("User button was pressed, stopping...\n");
rob.meades@u-blox.com 1:581335dbdd60 220 interface->disconnect();
rob.meades@u-blox.com 1:581335dbdd60 221 interface->deinit();
rob.meades@u-blox.com 1:581335dbdd60 222 ledOff();
rob.meades@u-blox.com 1:581335dbdd60 223 printf("Stopped.\n");
rob.meades@u-blox.com 1:581335dbdd60 224 } else {
rob.meades@u-blox.com 1:581335dbdd60 225 bad();
RobMeades 2:dbf7dd3da592 226 printf("Unable to get IP address of \"developer.mbed.org\" or \"2.pool.ntp.org\".\n");
rob.meades@u-blox.com 1:581335dbdd60 227 }
rob.meades@u-blox.com 1:581335dbdd60 228 } else {
rob.meades@u-blox.com 1:581335dbdd60 229 bad();
rob.meades@u-blox.com 1:581335dbdd60 230 printf("Unable to initialise the interface.\n");
rob.meades@u-blox.com 1:581335dbdd60 231 }
rob.meades@u-blox.com 1:581335dbdd60 232 }
rob.meades@u-blox.com 1:581335dbdd60 233
rob.meades@u-blox.com 1:581335dbdd60 234 // End Of File