This class adds HTTP, FTP and CellLocate client support for u-blox modules for the C027 and C030 boards (excepting the C030 N2xx flavour) from mbed 5.5 onwards. The HTTP, FTP and CellLocate operations are all hosted on the module, minimizing RAM consumption in the mbed MCU. It also sub-classes ublox-cellular-driver-gen to bring in SMS, USSD and modem file system support if you need to use these functions at the same time as the cellular interface.

Dependencies:   ublox-at-cellular-interface

Dependents:   example-ublox-at-cellular-interface-ext HelloMQTT ublox_new_driver_test example-ublox-at-cellular-interface-ext ... more

Committer:
rob.meades@u-blox.com
Date:
Fri Jun 16 00:55:19 2017 +0100
Revision:
11:3631f62bb359
Parent:
5:9fd89567f769
Child:
35:6a6ee1adff84
Remove return code from ftpResetPar() since not all modules support all parameters and hence it's not possible to be certain which are errors and which are normal.  Change order of parameters in ftpCommand() as offset is truly optional (it is not supported by Sara-G350).  Make switching on of +ULOCIND URC optional (it is only informative and is not supported by Sara-G350).  Update UbloxAtCellularInterface library version.  Update mbed_app.json templates.  Don't run the HTTP TLS test on C027 as Sara-G350 doesn't support it.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RobMeades 0:0b75e22c9231 1 #include "mbed.h"
RobMeades 0:0b75e22c9231 2 #include "greentea-client/test_env.h"
RobMeades 0:0b75e22c9231 3 #include "unity.h"
RobMeades 0:0b75e22c9231 4 #include "utest.h"
RobMeades 0:0b75e22c9231 5 #include "UbloxATCellularInterfaceExt.h"
RobMeades 0:0b75e22c9231 6 #include "UDPSocket.h"
rob.meades@u-blox.com 5:9fd89567f769 7 #ifdef FEATURE_COMMON_PAL
RobMeades 0:0b75e22c9231 8 #include "mbed_trace.h"
RobMeades 0:0b75e22c9231 9 #define TRACE_GROUP "TEST"
rob.meades@u-blox.com 5:9fd89567f769 10 #else
rob.meades@u-blox.com 5:9fd89567f769 11 #define tr_debug(format, ...) debug(format "\n", ## __VA_ARGS__)
rob.meades@u-blox.com 5:9fd89567f769 12 #define tr_info(format, ...) debug(format "\n", ## __VA_ARGS__)
rob.meades@u-blox.com 5:9fd89567f769 13 #define tr_warn(format, ...) debug(format "\n", ## __VA_ARGS__)
rob.meades@u-blox.com 5:9fd89567f769 14 #define tr_error(format, ...) debug(format "\n", ## __VA_ARGS__)
rob.meades@u-blox.com 5:9fd89567f769 15 #endif
RobMeades 0:0b75e22c9231 16
RobMeades 0:0b75e22c9231 17 using namespace utest::v1;
RobMeades 0:0b75e22c9231 18
RobMeades 0:0b75e22c9231 19 // ----------------------------------------------------------------
RobMeades 0:0b75e22c9231 20 // COMPILE-TIME MACROS
RobMeades 0:0b75e22c9231 21 // ----------------------------------------------------------------
RobMeades 0:0b75e22c9231 22
RobMeades 0:0b75e22c9231 23 // These macros can be overridden with an mbed_app.json file and
RobMeades 0:0b75e22c9231 24 // contents of the following form:
RobMeades 0:0b75e22c9231 25 //
RobMeades 0:0b75e22c9231 26 //{
RobMeades 0:0b75e22c9231 27 // "config": {
RobMeades 0:0b75e22c9231 28 // "apn": {
RobMeades 0:0b75e22c9231 29 // "value": "\"my_apn\""
RobMeades 0:0b75e22c9231 30 // },
RobMeades 0:0b75e22c9231 31 // "run-tcp-server-test": {
RobMeades 0:0b75e22c9231 32 // "value": 1
RobMeades 0:0b75e22c9231 33 // },
RobMeades 0:0b75e22c9231 34 // "mga-token": {
RobMeades 0:0b75e22c9231 35 // "value": "\"my_token\""
RobMeades 0:0b75e22c9231 36 // }
RobMeades 0:0b75e22c9231 37 //}
RobMeades 0:0b75e22c9231 38
rob.meades@u-blox.com 11:3631f62bb359 39 // Whether debug trace is on
rob.meades@u-blox.com 11:3631f62bb359 40 #ifndef MBED_CONF_APP_DEBUG_ON
rob.meades@u-blox.com 11:3631f62bb359 41 # define MBED_CONF_APP_DEBUG_ON false
rob.meades@u-blox.com 11:3631f62bb359 42 #endif
rob.meades@u-blox.com 11:3631f62bb359 43
RobMeades 0:0b75e22c9231 44 // The credentials of the SIM in the board.
RobMeades 0:0b75e22c9231 45 #ifndef MBED_CONF_APP_DEFAULT_PIN
rob.meades@u-blox.com 11:3631f62bb359 46 // Note: if PIN is enabled on your SIM, you must define the PIN
rob.meades@u-blox.com 11:3631f62bb359 47 // for your SIM jere (e.g. using mbed_app.json to do so).
rob.meades@u-blox.com 11:3631f62bb359 48 # define MBED_CONF_APP_DEFAULT_PIN "0000"
RobMeades 0:0b75e22c9231 49 #endif
RobMeades 0:0b75e22c9231 50
RobMeades 0:0b75e22c9231 51 // Network credentials.
RobMeades 0:0b75e22c9231 52 #ifndef MBED_CONF_APP_APN
RobMeades 0:0b75e22c9231 53 # define MBED_CONF_APP_APN NULL
RobMeades 0:0b75e22c9231 54 #endif
RobMeades 0:0b75e22c9231 55 #ifndef MBED_CONF_APP_USERNAME
RobMeades 0:0b75e22c9231 56 # define MBED_CONF_APP_USERNAME NULL
RobMeades 0:0b75e22c9231 57 #endif
RobMeades 0:0b75e22c9231 58 #ifndef MBED_CONF_APP_PASSWORD
RobMeades 0:0b75e22c9231 59 # define MBED_CONF_APP_PASSWORD NULL
RobMeades 0:0b75e22c9231 60 #endif
RobMeades 0:0b75e22c9231 61
RobMeades 0:0b75e22c9231 62 #ifndef MBED_CONF_APP_RUN_CELL_LOCATE_TCP_SERVER_TEST
RobMeades 0:0b75e22c9231 63 # define MBED_CONF_APP_RUN_CELL_LOCATE_TCP_SERVER_TEST 0
RobMeades 0:0b75e22c9231 64 #endif
RobMeades 0:0b75e22c9231 65
RobMeades 0:0b75e22c9231 66 // The authentication token for TCP access to the MGA server.
RobMeades 0:0b75e22c9231 67 #if MBED_CONF_APP_RUN_CELL_LOCATE_TCP_SERVER_TEST
RobMeades 0:0b75e22c9231 68 # ifndef MBED_CONF_APP_CELL_LOCATE_MGA_TOKEN
RobMeades 0:0b75e22c9231 69 # error "You must have a token for MGA server access to run Cell Locate with a TCP server"
RobMeades 0:0b75e22c9231 70 # endif
RobMeades 0:0b75e22c9231 71 #endif
RobMeades 0:0b75e22c9231 72
RobMeades 0:0b75e22c9231 73 // The type of response requested
RobMeades 0:0b75e22c9231 74 #ifndef MBED_CONF_APP_RESP_TYPE
RobMeades 0:0b75e22c9231 75 # define MBED_CONF_APP_RESP_TYPE 1 // CELL_DETAILED
RobMeades 0:0b75e22c9231 76 #endif
RobMeades 0:0b75e22c9231 77
RobMeades 0:0b75e22c9231 78 // The maximum number of hypotheses requested
RobMeades 0:0b75e22c9231 79 #ifndef MBED_CONF_APP_CELL_LOCATE_MAX_NUM_HYPOTHESIS
RobMeades 0:0b75e22c9231 80 # if MBED_CONF_APP_RESP_TYPE == 2 // CELL_MULTIHYP
RobMeades 0:0b75e22c9231 81 # define MBED_CONF_APP_CELL_LOCATE_MAX_NUM_HYPOTHESIS 16
RobMeades 0:0b75e22c9231 82 # else
RobMeades 0:0b75e22c9231 83 # define MBED_CONF_APP_CELL_LOCATE_MAX_NUM_HYPOTHESIS 1
RobMeades 0:0b75e22c9231 84 # endif
RobMeades 0:0b75e22c9231 85 #endif
RobMeades 0:0b75e22c9231 86
RobMeades 0:0b75e22c9231 87 #ifndef MBED_CONF_APP_CELL_LOCATE_MGA_TOKEN
RobMeades 0:0b75e22c9231 88 # define MBED_CONF_APP_CELL_LOCATE_MGA_TOKEN "0"
RobMeades 0:0b75e22c9231 89 #endif
RobMeades 0:0b75e22c9231 90
RobMeades 0:0b75e22c9231 91 // ----------------------------------------------------------------
RobMeades 0:0b75e22c9231 92 // PRIVATE VARIABLES
RobMeades 0:0b75e22c9231 93 // ----------------------------------------------------------------
RobMeades 0:0b75e22c9231 94
rob.meades@u-blox.com 5:9fd89567f769 95 #ifdef FEATURE_COMMON_PAL
RobMeades 0:0b75e22c9231 96 // Lock for debug prints
RobMeades 0:0b75e22c9231 97 static Mutex mtx;
rob.meades@u-blox.com 5:9fd89567f769 98 #endif
RobMeades 0:0b75e22c9231 99
rob.meades@u-blox.com 1:26a67ab07275 100 // Power up GNSS
rob.meades@u-blox.com 1:26a67ab07275 101 #ifdef TARGET_UBLOX_C030
rob.meades@u-blox.com 1:26a67ab07275 102 static DigitalInOut gnssEnable(GNSSEN, PIN_OUTPUT, PushPullNoPull, 1);
rob.meades@u-blox.com 1:26a67ab07275 103 #elif TARGET_UBLOX_C027
rob.meades@u-blox.com 11:3631f62bb359 104 static DigitalOut gnssEnable(GPSEN, 1);
rob.meades@u-blox.com 1:26a67ab07275 105 #endif
rob.meades@u-blox.com 1:26a67ab07275 106
RobMeades 0:0b75e22c9231 107 // An instance of the cellular interface
RobMeades 0:0b75e22c9231 108 static UbloxATCellularInterfaceExt *pDriver =
RobMeades 0:0b75e22c9231 109 new UbloxATCellularInterfaceExt(MDMTXD, MDMRXD,
RobMeades 0:0b75e22c9231 110 MBED_CONF_UBLOX_CELL_BAUD_RATE,
rob.meades@u-blox.com 11:3631f62bb359 111 MBED_CONF_APP_DEBUG_ON);
RobMeades 0:0b75e22c9231 112
RobMeades 0:0b75e22c9231 113 // ----------------------------------------------------------------
RobMeades 0:0b75e22c9231 114 // PRIVATE FUNCTIONS
RobMeades 0:0b75e22c9231 115 // ----------------------------------------------------------------
RobMeades 0:0b75e22c9231 116
rob.meades@u-blox.com 5:9fd89567f769 117 #ifdef FEATURE_COMMON_PAL
RobMeades 0:0b75e22c9231 118 // Locks for debug prints
RobMeades 0:0b75e22c9231 119 static void lock()
RobMeades 0:0b75e22c9231 120 {
RobMeades 0:0b75e22c9231 121 mtx.lock();
RobMeades 0:0b75e22c9231 122 }
RobMeades 0:0b75e22c9231 123
RobMeades 0:0b75e22c9231 124 static void unlock()
RobMeades 0:0b75e22c9231 125 {
RobMeades 0:0b75e22c9231 126 mtx.unlock();
RobMeades 0:0b75e22c9231 127 }
rob.meades@u-blox.com 5:9fd89567f769 128 #endif
RobMeades 0:0b75e22c9231 129
RobMeades 0:0b75e22c9231 130 static void printCellLocateData(UbloxATCellularInterfaceExt::CellLocData *pData)
RobMeades 0:0b75e22c9231 131 {
RobMeades 0:0b75e22c9231 132 char timeString[25];
RobMeades 0:0b75e22c9231 133
RobMeades 0:0b75e22c9231 134 tr_debug("Cell Locate data:");
rob.meades@u-blox.com 1:26a67ab07275 135 if (strftime(timeString, sizeof(timeString), "%F %T", (const tm *) &(pData->time)) > 0) {
RobMeades 0:0b75e22c9231 136 tr_debug(" time: %s", timeString);
RobMeades 0:0b75e22c9231 137 }
RobMeades 0:0b75e22c9231 138 tr_debug(" longitude: %.6f", pData->longitude);
RobMeades 0:0b75e22c9231 139 tr_debug(" latitude: %.6f", pData->latitude);
rob.meades@u-blox.com 1:26a67ab07275 140 tr_debug(" altitude: %d metre(s)", pData->altitude);
RobMeades 0:0b75e22c9231 141 switch (pData->sensor) {
RobMeades 0:0b75e22c9231 142 case UbloxATCellularInterfaceExt::CELL_LAST:
RobMeades 0:0b75e22c9231 143 tr_debug(" sensor type: last");
RobMeades 0:0b75e22c9231 144 break;
RobMeades 0:0b75e22c9231 145 case UbloxATCellularInterfaceExt::CELL_GNSS:
RobMeades 0:0b75e22c9231 146 tr_debug(" sensor type: GNSS");
RobMeades 0:0b75e22c9231 147 break;
RobMeades 0:0b75e22c9231 148 case UbloxATCellularInterfaceExt::CELL_LOCATE:
RobMeades 0:0b75e22c9231 149 tr_debug(" sensor type: Cell Locate");
RobMeades 0:0b75e22c9231 150 break;
RobMeades 0:0b75e22c9231 151 case UbloxATCellularInterfaceExt::CELL_HYBRID:
RobMeades 0:0b75e22c9231 152 tr_debug(" sensor type: hybrid");
RobMeades 0:0b75e22c9231 153 break;
RobMeades 0:0b75e22c9231 154 default:
RobMeades 0:0b75e22c9231 155 tr_debug(" sensor type: unknown");
RobMeades 0:0b75e22c9231 156 break;
RobMeades 0:0b75e22c9231 157 }
rob.meades@u-blox.com 1:26a67ab07275 158 tr_debug(" uncertainty: %d metre(s)", pData->uncertainty);
rob.meades@u-blox.com 1:26a67ab07275 159 tr_debug(" speed: %d metre(s)/second", pData->speed);
rob.meades@u-blox.com 1:26a67ab07275 160 tr_debug(" direction: %d degree(s)", pData->direction);
rob.meades@u-blox.com 1:26a67ab07275 161 tr_debug(" vertical accuracy: %d metre(s)/second", pData->speed);
rob.meades@u-blox.com 1:26a67ab07275 162 tr_debug(" satellite(s) used: %d", pData->svUsed);
rob.meades@u-blox.com 1:26a67ab07275 163 tr_debug("I am here: "
rob.meades@u-blox.com 1:26a67ab07275 164 "https://maps.google.com/?q=%.5f,%.5f", pData->latitude, pData->longitude);
RobMeades 0:0b75e22c9231 165 }
RobMeades 0:0b75e22c9231 166
RobMeades 0:0b75e22c9231 167 // ----------------------------------------------------------------
RobMeades 0:0b75e22c9231 168 // TESTS
RobMeades 0:0b75e22c9231 169 // ----------------------------------------------------------------
RobMeades 0:0b75e22c9231 170
RobMeades 0:0b75e22c9231 171 // Test Cell Locate talking to a UDP server
RobMeades 0:0b75e22c9231 172 void test_udp_server() {
RobMeades 0:0b75e22c9231 173 int numRes = 0;
RobMeades 0:0b75e22c9231 174 UbloxATCellularInterfaceExt::CellLocData data;
RobMeades 0:0b75e22c9231 175
RobMeades 0:0b75e22c9231 176 memset(&data, 0, sizeof(data));
RobMeades 0:0b75e22c9231 177 TEST_ASSERT(pDriver->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
RobMeades 0:0b75e22c9231 178 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:0b75e22c9231 179
RobMeades 0:0b75e22c9231 180 TEST_ASSERT(pDriver->cellLocSrvUdp());
RobMeades 0:0b75e22c9231 181 TEST_ASSERT(pDriver->cellLocConfig(1));
RobMeades 0:0b75e22c9231 182 TEST_ASSERT(pDriver->cellLocRequest(UbloxATCellularInterfaceExt::CELL_HYBRID, 10, 100,
RobMeades 0:0b75e22c9231 183 (UbloxATCellularInterfaceExt::CellRespType) MBED_CONF_APP_RESP_TYPE,
RobMeades 0:0b75e22c9231 184 MBED_CONF_APP_CELL_LOCATE_MAX_NUM_HYPOTHESIS));
RobMeades 0:0b75e22c9231 185
RobMeades 0:0b75e22c9231 186 for (int x = 0; (numRes == 0) && (x < 10); x++) {
RobMeades 0:0b75e22c9231 187 numRes = pDriver->cellLocGetRes();
RobMeades 0:0b75e22c9231 188 }
RobMeades 0:0b75e22c9231 189
RobMeades 0:0b75e22c9231 190 TEST_ASSERT(numRes > 0);
RobMeades 0:0b75e22c9231 191 TEST_ASSERT(pDriver->cellLocGetData(&data));
RobMeades 0:0b75e22c9231 192
RobMeades 0:0b75e22c9231 193 TEST_ASSERT(data.validData);
RobMeades 0:0b75e22c9231 194
RobMeades 0:0b75e22c9231 195 printCellLocateData(&data);
RobMeades 0:0b75e22c9231 196
RobMeades 0:0b75e22c9231 197 TEST_ASSERT(pDriver->disconnect() == 0);
RobMeades 0:0b75e22c9231 198 // Wait for printfs to leave the building or the test result string gets messed up
RobMeades 0:0b75e22c9231 199 wait_ms(500);
RobMeades 0:0b75e22c9231 200 }
RobMeades 0:0b75e22c9231 201
RobMeades 0:0b75e22c9231 202 // Test Cell Locate talking to a TCP server
RobMeades 0:0b75e22c9231 203 void test_tcp_server() {
RobMeades 0:0b75e22c9231 204 int numRes = 0;
RobMeades 0:0b75e22c9231 205 UbloxATCellularInterfaceExt::CellLocData data;
RobMeades 0:0b75e22c9231 206
RobMeades 0:0b75e22c9231 207 memset(&data, 0, sizeof(data));
RobMeades 0:0b75e22c9231 208 TEST_ASSERT(pDriver->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
RobMeades 0:0b75e22c9231 209 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:0b75e22c9231 210
RobMeades 0:0b75e22c9231 211 TEST_ASSERT(pDriver->cellLocSrvTcp(MBED_CONF_APP_CELL_LOCATE_MGA_TOKEN));
RobMeades 0:0b75e22c9231 212 TEST_ASSERT(pDriver->cellLocConfig(1));
RobMeades 0:0b75e22c9231 213 TEST_ASSERT(pDriver->cellLocRequest(UbloxATCellularInterfaceExt::CELL_HYBRID, 10, 100,
RobMeades 0:0b75e22c9231 214 (UbloxATCellularInterfaceExt::CellRespType) MBED_CONF_APP_RESP_TYPE,
RobMeades 0:0b75e22c9231 215 MBED_CONF_APP_CELL_LOCATE_MAX_NUM_HYPOTHESIS));
RobMeades 0:0b75e22c9231 216
RobMeades 0:0b75e22c9231 217 for (int x = 0; (numRes == 0) && (x < 10); x++) {
RobMeades 0:0b75e22c9231 218 numRes = pDriver->cellLocGetRes();
RobMeades 0:0b75e22c9231 219 }
RobMeades 0:0b75e22c9231 220
RobMeades 0:0b75e22c9231 221 TEST_ASSERT(numRes > 0);
RobMeades 0:0b75e22c9231 222 TEST_ASSERT(pDriver->cellLocGetData(&data));
RobMeades 0:0b75e22c9231 223
RobMeades 0:0b75e22c9231 224 TEST_ASSERT(data.validData);
RobMeades 0:0b75e22c9231 225
RobMeades 0:0b75e22c9231 226 printCellLocateData(&data);
RobMeades 0:0b75e22c9231 227
RobMeades 0:0b75e22c9231 228 TEST_ASSERT(pDriver->disconnect() == 0);
RobMeades 0:0b75e22c9231 229 // Wait for printfs to leave the building or the test result string gets messed up
RobMeades 0:0b75e22c9231 230 wait_ms(500);
RobMeades 0:0b75e22c9231 231 }
RobMeades 0:0b75e22c9231 232
RobMeades 0:0b75e22c9231 233 // Tidy up after testing so as not to screw with the test output strings
RobMeades 0:0b75e22c9231 234 void test_tidy_up() {
RobMeades 0:0b75e22c9231 235 pDriver->deinit();
RobMeades 0:0b75e22c9231 236 }
RobMeades 0:0b75e22c9231 237
RobMeades 0:0b75e22c9231 238 // ----------------------------------------------------------------
RobMeades 0:0b75e22c9231 239 // TEST ENVIRONMENT
RobMeades 0:0b75e22c9231 240 // ----------------------------------------------------------------
RobMeades 0:0b75e22c9231 241
RobMeades 0:0b75e22c9231 242 // Setup the test environment
RobMeades 0:0b75e22c9231 243 utest::v1::status_t test_setup(const size_t number_of_cases) {
RobMeades 0:0b75e22c9231 244 // Setup Greentea with a timeout
RobMeades 0:0b75e22c9231 245 GREENTEA_SETUP(540, "default_auto");
RobMeades 0:0b75e22c9231 246 return verbose_test_setup_handler(number_of_cases);
RobMeades 0:0b75e22c9231 247 }
RobMeades 0:0b75e22c9231 248
RobMeades 0:0b75e22c9231 249 // Test cases
RobMeades 0:0b75e22c9231 250 Case cases[] = {
RobMeades 0:0b75e22c9231 251 Case("Cell Locate with UDP server", test_udp_server),
RobMeades 0:0b75e22c9231 252 #if MBED_CONF_APP_RUN_CELL_LOCATE_TCP_SERVER_TEST
RobMeades 0:0b75e22c9231 253 Case("Cell Locate with TCP server", test_tcp_server),
RobMeades 0:0b75e22c9231 254 #endif
RobMeades 0:0b75e22c9231 255 Case("Tidy up", test_tidy_up)
RobMeades 0:0b75e22c9231 256 };
RobMeades 0:0b75e22c9231 257
RobMeades 0:0b75e22c9231 258 Specification specification(test_setup, cases);
RobMeades 0:0b75e22c9231 259
RobMeades 0:0b75e22c9231 260 // ----------------------------------------------------------------
RobMeades 0:0b75e22c9231 261 // MAIN
RobMeades 0:0b75e22c9231 262 // ----------------------------------------------------------------
RobMeades 0:0b75e22c9231 263
RobMeades 0:0b75e22c9231 264 int main() {
rob.meades@u-blox.com 5:9fd89567f769 265
rob.meades@u-blox.com 5:9fd89567f769 266 #ifdef FEATURE_COMMON_PAL
RobMeades 0:0b75e22c9231 267 mbed_trace_init();
RobMeades 0:0b75e22c9231 268
RobMeades 0:0b75e22c9231 269 mbed_trace_mutex_wait_function_set(lock);
RobMeades 0:0b75e22c9231 270 mbed_trace_mutex_release_function_set(unlock);
rob.meades@u-blox.com 5:9fd89567f769 271 #endif
RobMeades 0:0b75e22c9231 272
RobMeades 0:0b75e22c9231 273 // Run tests
RobMeades 0:0b75e22c9231 274 return !Harness::run(specification);
RobMeades 0:0b75e22c9231 275 }
RobMeades 0:0b75e22c9231 276
RobMeades 0:0b75e22c9231 277 // End Of File
RobMeades 0:0b75e22c9231 278