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:
fahimalavi
Date:
Fri Jun 26 11:33:47 2020 +0500
Revision:
37:1874c0d2c70e
Parent:
28:4427f2e6bbab
Reverting wrong commit to branch

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RobMeades 0:0b75e22c9231 1 /* Copyright (c) 2017 ARM Limited
RobMeades 0:0b75e22c9231 2 *
RobMeades 0:0b75e22c9231 3 * Licensed under the Apache License, Version 2.0 (the "License");
RobMeades 0:0b75e22c9231 4 * you may not use this file except in compliance with the License.
RobMeades 0:0b75e22c9231 5 * You may obtain a copy of the License at
RobMeades 0:0b75e22c9231 6 *
RobMeades 0:0b75e22c9231 7 * http://www.apache.org/licenses/LICENSE-2.0
RobMeades 0:0b75e22c9231 8 *
RobMeades 0:0b75e22c9231 9 * Unless required by applicable law or agreed to in writing, software
RobMeades 0:0b75e22c9231 10 * distributed under the License is distributed on an "AS IS" BASIS,
RobMeades 0:0b75e22c9231 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
RobMeades 0:0b75e22c9231 12 * See the License for the specific language governing permissions and
RobMeades 0:0b75e22c9231 13 * limitations under the License.
RobMeades 0:0b75e22c9231 14 */
RobMeades 0:0b75e22c9231 15
RobMeades 0:0b75e22c9231 16 #ifndef _UBLOX_AT_CELLULAR_INTERFACE_EXT_
RobMeades 0:0b75e22c9231 17 #define _UBLOX_AT_CELLULAR_INTERFACE_EXT_
RobMeades 0:0b75e22c9231 18
rob.meades@u-blox.com 5:9fd89567f769 19 #include "UbloxATCellularInterface.h"
RobMeades 0:0b75e22c9231 20 #include "UbloxCellularDriverGen.h"
RobMeades 0:0b75e22c9231 21
RobMeades 0:0b75e22c9231 22 /**UbloxATCellularInterfaceExt class.
RobMeades 0:0b75e22c9231 23 *
RobMeades 0:0b75e22c9231 24 * This interface extends the UbloxATCellularInterface to
RobMeades 0:0b75e22c9231 25 * include other features that use the IP stack on board the
RobMeades 0:0b75e22c9231 26 * cellular modem: HTTP, FTP and Cell Locate.
RobMeades 0:0b75e22c9231 27 *
RobMeades 0:0b75e22c9231 28 * Note: the UbloxCellularGeneric class is required because
RobMeades 0:0b75e22c9231 29 * reading a large HTTP response is performed via a modem
RobMeades 0:0b75e22c9231 30 * file system call and the UbloxCellularGeneric class is
RobMeades 0:0b75e22c9231 31 * where modem file system support is provided.
RobMeades 0:0b75e22c9231 32 */
RobMeades 0:0b75e22c9231 33 class UbloxATCellularInterfaceExt : public UbloxATCellularInterface, public UbloxCellularDriverGen {
RobMeades 0:0b75e22c9231 34
RobMeades 0:0b75e22c9231 35 public:
RobMeades 0:0b75e22c9231 36 /** Constructor.
RobMeades 0:0b75e22c9231 37 *
RobMeades 0:0b75e22c9231 38 * @param tx the UART TX data pin to which the modem is attached.
RobMeades 0:0b75e22c9231 39 * @param rx the UART RX data pin to which the modem is attached.
RobMeades 0:0b75e22c9231 40 * @param baud the UART baud rate.
RobMeades 0:0b75e22c9231 41 * @param debugOn true to switch AT interface debug on, otherwise false.
RobMeades 0:0b75e22c9231 42 */
RobMeades 0:0b75e22c9231 43 UbloxATCellularInterfaceExt(PinName tx = MDMTXD,
RobMeades 0:0b75e22c9231 44 PinName rx = MDMRXD,
RobMeades 0:0b75e22c9231 45 int baud = MBED_CONF_UBLOX_CELL_BAUD_RATE,
amq 15:6f0a1ecc8cec 46 bool debugOn = false,
amq 15:6f0a1ecc8cec 47 osPriority priority = osPriorityNormal);
RobMeades 0:0b75e22c9231 48
RobMeades 0:0b75e22c9231 49 /* Destructor.
RobMeades 0:0b75e22c9231 50 */
RobMeades 0:0b75e22c9231 51 virtual ~UbloxATCellularInterfaceExt();
RobMeades 0:0b75e22c9231 52
RobMeades 0:0b75e22c9231 53 /**********************************************************************
RobMeades 0:0b75e22c9231 54 * PUBLIC: General
RobMeades 0:0b75e22c9231 55 **********************************************************************/
RobMeades 0:0b75e22c9231 56
RobMeades 0:0b75e22c9231 57 /** Infinite timeout.
RobMeades 0:0b75e22c9231 58 */
RobMeades 0:0b75e22c9231 59 #define TIMEOUT_BLOCKING -1
RobMeades 0:0b75e22c9231 60
RobMeades 0:0b75e22c9231 61 /** A struct containing an HTTP or FTP error class and code
RobMeades 0:0b75e22c9231 62 */
RobMeades 0:0b75e22c9231 63 typedef struct {
RobMeades 0:0b75e22c9231 64 int eClass;
RobMeades 0:0b75e22c9231 65 int eCode;
RobMeades 0:0b75e22c9231 66 } Error;
RobMeades 0:0b75e22c9231 67
RobMeades 0:0b75e22c9231 68 /**********************************************************************
RobMeades 0:0b75e22c9231 69 * PUBLIC: HTTP
RobMeades 0:0b75e22c9231 70 **********************************************************************/
RobMeades 0:0b75e22c9231 71
RobMeades 0:0b75e22c9231 72 /** HTTP profile unused marker.
RobMeades 0:0b75e22c9231 73 */
RobMeades 0:0b75e22c9231 74 #define HTTP_PROF_UNUSED -1
RobMeades 0:0b75e22c9231 75
RobMeades 0:0b75e22c9231 76 /** HTTP configuration parameters (reference to HTTP control +UHTTP).
RobMeades 0:0b75e22c9231 77 */
RobMeades 0:0b75e22c9231 78 typedef enum {
RobMeades 0:0b75e22c9231 79 HTTP_IP_ADDRESS = 0,
RobMeades 0:0b75e22c9231 80 HTTP_SERVER_NAME = 1,
RobMeades 0:0b75e22c9231 81 HTTP_USER_NAME = 2,
RobMeades 0:0b75e22c9231 82 HTTP_PASSWORD = 3,
RobMeades 0:0b75e22c9231 83 HTTP_AUTH_TYPE = 4,
RobMeades 0:0b75e22c9231 84 HTTP_SERVER_PORT = 5,
Bilal Qamar 28:4427f2e6bbab 85 HTTP_SECURE = 6,
Bilal Qamar 28:4427f2e6bbab 86 HTTP_REQ_HEADER = 9
RobMeades 0:0b75e22c9231 87 } HttpOpCode;
RobMeades 0:0b75e22c9231 88
RobMeades 0:0b75e22c9231 89 /** Type of HTTP Command.
RobMeades 0:0b75e22c9231 90 */
RobMeades 0:0b75e22c9231 91 typedef enum {
RobMeades 0:0b75e22c9231 92 HTTP_HEAD = 0,
RobMeades 0:0b75e22c9231 93 HTTP_GET = 1,
RobMeades 0:0b75e22c9231 94 HTTP_DELETE = 2,
RobMeades 0:0b75e22c9231 95 HTTP_PUT = 3,
RobMeades 0:0b75e22c9231 96 HTTP_POST_FILE = 4,
RobMeades 0:0b75e22c9231 97 HTTP_POST_DATA = 5
RobMeades 0:0b75e22c9231 98 } HttpCmd;
RobMeades 0:0b75e22c9231 99
RobMeades 0:0b75e22c9231 100 /** HTTP content types.
RobMeades 0:0b75e22c9231 101 */
RobMeades 0:0b75e22c9231 102 typedef enum {
RobMeades 0:0b75e22c9231 103 HTTP_CONTENT_URLENCODED = 0,
RobMeades 0:0b75e22c9231 104 HTTP_CONTENT_TEXT = 1,
RobMeades 0:0b75e22c9231 105 HTTP_CONTENT_OCTET_STREAM = 2,
RobMeades 0:0b75e22c9231 106 HTTP_CONTENT_FORM_DATA = 3,
RobMeades 0:0b75e22c9231 107 HTTP_CONTENT_JSON = 4,
RobMeades 0:0b75e22c9231 108 HTTP_CONTENT_XML = 5,
RobMeades 0:0b75e22c9231 109 HTTP_CONTENT_USER_DEFINED = 6
RobMeades 0:0b75e22c9231 110 } HttpContentType;
RobMeades 0:0b75e22c9231 111
RobMeades 0:0b75e22c9231 112 /** Find a free HTTP profile.
RobMeades 0:0b75e22c9231 113 *
RobMeades 0:0b75e22c9231 114 * A profile will be blocking when first allocated.
RobMeades 0:0b75e22c9231 115 *
RobMeades 0:0b75e22c9231 116 * @return the profile or negative if none are available.
RobMeades 0:0b75e22c9231 117 */
RobMeades 0:0b75e22c9231 118 int httpAllocProfile();
RobMeades 0:0b75e22c9231 119
RobMeades 0:0b75e22c9231 120 /** Free the HTTP profile.
RobMeades 0:0b75e22c9231 121 *
RobMeades 0:0b75e22c9231 122 * @param profile the HTTP profile handle.
RobMeades 0:0b75e22c9231 123 * @return true if successful, otherwise false.
RobMeades 0:0b75e22c9231 124 */
RobMeades 0:0b75e22c9231 125 bool httpFreeProfile(int profile);
RobMeades 0:0b75e22c9231 126
RobMeades 0:0b75e22c9231 127 /** Set the timeout for this profile.
RobMeades 0:0b75e22c9231 128 *
RobMeades 0:0b75e22c9231 129 * @param profile the HTTP profile handle.
RobMeades 0:0b75e22c9231 130 * @param timeout -1 blocking, else non-blocking timeout in milliseconds.
RobMeades 0:0b75e22c9231 131 * @return true if successful, otherwise false.
RobMeades 0:0b75e22c9231 132 */
RobMeades 0:0b75e22c9231 133 bool httpSetTimeout(int profile, int timeout);
RobMeades 0:0b75e22c9231 134
RobMeades 0:0b75e22c9231 135 /** Reset a HTTP profile back to defaults.
RobMeades 0:0b75e22c9231 136 *
RobMeades 0:0b75e22c9231 137 * This may be called if the state of a HTTP profile
RobMeades 0:0b75e22c9231 138 * during parameter setting or exchange of HTTP commands
RobMeades 0:0b75e22c9231 139 * has become confusing/unknown.
RobMeades 0:0b75e22c9231 140 *
RobMeades 0:0b75e22c9231 141 * @param httpProfile the HTTP profile to be reset.
RobMeades 0:0b75e22c9231 142 * @return true if successful, false otherwise.
RobMeades 0:0b75e22c9231 143 */
RobMeades 0:0b75e22c9231 144 bool httpResetProfile(int httpProfile);
RobMeades 0:0b75e22c9231 145
RobMeades 0:0b75e22c9231 146 /** Set HTTP parameters.
RobMeades 0:0b75e22c9231 147 *
RobMeades 0:0b75e22c9231 148 * This should be called as many times as is necessary
RobMeades 0:0b75e22c9231 149 * to set all the possible parameters (HttpOpCode).
RobMeades 0:0b75e22c9231 150 *
RobMeades 0:0b75e22c9231 151 * See section 28.1 of u-blox-ATCommands_Manual(UBX-13002752).pdf
RobMeades 0:0b75e22c9231 152 * for full details. By example:
RobMeades 0:0b75e22c9231 153 *
RobMeades 0:0b75e22c9231 154 * httpOpCode httpInPar
RobMeades 0:0b75e22c9231 155 * HTTP_IP_ADDRESS "145.33.18.10" (the target HTTP server IP address)
RobMeades 0:0b75e22c9231 156 * HTTP_SERVER_NAME "www.myhttpserver.com" (the target HTTP server name)
RobMeades 0:0b75e22c9231 157 * HTTP_USER_NAME "my_username"
RobMeades 0:0b75e22c9231 158 * HTTP_PASSWORD "my_password"
RobMeades 0:0b75e22c9231 159 * HTTP_AUTH_TYPE "0" for no authentication, "1" for username/password
RobMeades 0:0b75e22c9231 160 * authentication (the default is 0)
RobMeades 0:0b75e22c9231 161 * HTTP_SERVER_PORT "81" (default is port 80)
rob.meades@u-blox.com 11:3631f62bb359 162 * HTTP_SECURE "0" for no security, "1" for TLS (the default is 0),
rob.meades@u-blox.com 11:3631f62bb359 163 * not all modems support this parameter
RobMeades 0:0b75e22c9231 164 *
RobMeades 0:0b75e22c9231 165 * @param httpProfile the HTTP profile identifier.
RobMeades 0:0b75e22c9231 166 * @param httpOpCode the HTTP operation code.
RobMeades 0:0b75e22c9231 167 * @param httpInPar the HTTP input parameter.
RobMeades 0:0b75e22c9231 168 * @return true if successful, false otherwise.
RobMeades 0:0b75e22c9231 169 */
RobMeades 0:0b75e22c9231 170 bool httpSetPar(int httpProfile, HttpOpCode httpOpCode, const char * httpInPar);
RobMeades 0:0b75e22c9231 171
RobMeades 0:0b75e22c9231 172 /** Perform a HTTP command.
RobMeades 0:0b75e22c9231 173 *
RobMeades 0:0b75e22c9231 174 * See section 28.3 of u-blox-ATCommands_Manual(UBX-13002752).pdf
RobMeades 0:0b75e22c9231 175 * for full details. By example, it works like this:
RobMeades 0:0b75e22c9231 176 *
RobMeades 0:0b75e22c9231 177 * httpCmd httpPath rspFile sendStr httpContentType httpCustomPar
RobMeades 0:0b75e22c9231 178 * HEAD "path/file.html" NULL NULL 0 NULL
RobMeades 0:0b75e22c9231 179 * GET "path/file.html" NULL NULL 0 NULL
RobMeades 0:0b75e22c9231 180 * DELETE "path/file.html" NULL NULL 0 NULL
RobMeades 0:0b75e22c9231 181 * PUT "path/file.html" NULL "myfile.txt" 0 to 6 Note 1
RobMeades 0:0b75e22c9231 182 * POST_FILE "path/file.html" NULL "myfile.txt" 0 to 6 Note 1
RobMeades 0:0b75e22c9231 183 * POST "path/file.html" NULL "hello there!" 0 to 6 Note 1
RobMeades 0:0b75e22c9231 184 *
RobMeades 0:0b75e22c9231 185 * Note 1: httpCustomPar is only applicable when httpContentType = HTTP_CONTENT_USER_DEFINED.
RobMeades 0:0b75e22c9231 186 *
RobMeades 0:0b75e22c9231 187 * The server to which this command is directed must have previously been
RobMeades 0:0b75e22c9231 188 * set with a call to httpSetPar(). If the server requires TLS (i.e. "HTTPS"),
RobMeades 0:0b75e22c9231 189 * then set that up with httpSetPar() also (HTTP_SECURE).
RobMeades 0:0b75e22c9231 190 *
RobMeades 0:0b75e22c9231 191 * rspFile may be left as NULL as the server response will be returned in buf.
RobMeades 0:0b75e22c9231 192 * Alternatively, a rspFile may be given (e.g. "myresponse.txt") and this can
RobMeades 0:0b75e22c9231 193 * later be read from the modem file system using readFile().
RobMeades 0:0b75e22c9231 194 *
RobMeades 0:0b75e22c9231 195 * @param httpProfile the HTTP profile identifier.
RobMeades 0:0b75e22c9231 196 * @param httpCmd the HTTP command.
RobMeades 0:0b75e22c9231 197 * @param httpPath the path of resource on the HTTP server.
RobMeades 0:0b75e22c9231 198 * @param rspFile the local modem file where the server
RobMeades 0:0b75e22c9231 199 * response will be stored, use NULL for
RobMeades 0:0b75e22c9231 200 * don't care.
RobMeades 0:0b75e22c9231 201 * @param sendStr the filename or string to be sent
RobMeades 0:0b75e22c9231 202 * to the HTTP server with the command request.
RobMeades 0:0b75e22c9231 203 * @param httpContentType the HTTP Content-Type identifier.
RobMeades 0:0b75e22c9231 204 * @param httpCustomPar the parameter for a user defined HTTP Content-Type.
RobMeades 0:0b75e22c9231 205 * @param buf the buffer to read into.
RobMeades 0:0b75e22c9231 206 * @param len the size of the buffer to read into.
fahim.alavi@u-blox.com 17:ac64a6b90925 207 * @param read_size Zero initialized variable address
RobMeades 0:0b75e22c9231 208 * @return NULL if successful, otherwise a pointer to
RobMeades 0:0b75e22c9231 209 * a Error struct containing the error class and error
RobMeades 0:0b75e22c9231 210 * code, see section Appendix A.B of
RobMeades 0:0b75e22c9231 211 * u-blox-ATCommands_Manual(UBX-13002752).pdf for details.
RobMeades 0:0b75e22c9231 212 */
RobMeades 0:0b75e22c9231 213 Error * httpCommand(int httpProfile, HttpCmd httpCmd, const char* httpPath,
RobMeades 0:0b75e22c9231 214 const char* rspFile, const char* sendStr,
RobMeades 0:0b75e22c9231 215 int httpContentType, const char* httpCustomPar,
fahim.alavi@u-blox.com 17:ac64a6b90925 216 char* buf, int len, int *read_size = NULL);
RobMeades 0:0b75e22c9231 217
RobMeades 0:0b75e22c9231 218 /**********************************************************************
RobMeades 0:0b75e22c9231 219 * PUBLIC: FTP
RobMeades 0:0b75e22c9231 220 **********************************************************************/
RobMeades 0:0b75e22c9231 221
RobMeades 0:0b75e22c9231 222 /** FTP configuration parameters (reference to FTP control +UFTP).
RobMeades 0:0b75e22c9231 223 */
RobMeades 0:0b75e22c9231 224 typedef enum {
RobMeades 0:0b75e22c9231 225 FTP_IP_ADDRESS = 0,
RobMeades 0:0b75e22c9231 226 FTP_SERVER_NAME = 1,
RobMeades 0:0b75e22c9231 227 FTP_USER_NAME = 2,
RobMeades 0:0b75e22c9231 228 FTP_PASSWORD = 3,
RobMeades 0:0b75e22c9231 229 FTP_ACCOUNT = 4,
RobMeades 0:0b75e22c9231 230 FTP_INACTIVITY_TIMEOUT = 5,
RobMeades 0:0b75e22c9231 231 FTP_MODE = 6,
RobMeades 0:0b75e22c9231 232 FTP_SERVER_PORT = 7,
RobMeades 0:0b75e22c9231 233 FTP_SECURE = 8,
RobMeades 0:0b75e22c9231 234 NUM_FTP_OP_CODES
RobMeades 0:0b75e22c9231 235 } FtpOpCode;
RobMeades 0:0b75e22c9231 236
RobMeades 0:0b75e22c9231 237 /** Type of FTP Command.
RobMeades 0:0b75e22c9231 238 */
RobMeades 0:0b75e22c9231 239 typedef enum {
RobMeades 0:0b75e22c9231 240 FTP_LOGOUT = 0,
RobMeades 0:0b75e22c9231 241 FTP_LOGIN = 1,
RobMeades 0:0b75e22c9231 242 FTP_DELETE_FILE = 2,
RobMeades 0:0b75e22c9231 243 FTP_RENAME_FILE = 3,
RobMeades 0:0b75e22c9231 244 FTP_GET_FILE = 4,
RobMeades 0:0b75e22c9231 245 FTP_PUT_FILE = 5,
RobMeades 0:0b75e22c9231 246 FTP_GET_DIRECT = 6,
RobMeades 0:0b75e22c9231 247 FTP_PUT_DIRECT = 7,
RobMeades 0:0b75e22c9231 248 FTP_CD = 8,
RobMeades 0:0b75e22c9231 249 FTP_MKDIR = 10,
RobMeades 0:0b75e22c9231 250 FTP_RMDIR = 11,
RobMeades 0:0b75e22c9231 251 FTP_FILE_INFO = 13,
RobMeades 0:0b75e22c9231 252 FTP_LS = 14,
RobMeades 0:0b75e22c9231 253 FTP_FOTA_FILE = 100
RobMeades 0:0b75e22c9231 254 } FtpCmd;
RobMeades 0:0b75e22c9231 255
RobMeades 0:0b75e22c9231 256 /** Set the timeout for FTP operations.
RobMeades 0:0b75e22c9231 257 *
RobMeades 0:0b75e22c9231 258 * @param timeout -1 blocking, else non-blocking timeout in milliseconds.
RobMeades 0:0b75e22c9231 259 * @return true if successful, otherwise false.
RobMeades 0:0b75e22c9231 260 */
RobMeades 0:0b75e22c9231 261 bool ftpSetTimeout(int timeout);
RobMeades 0:0b75e22c9231 262
RobMeades 0:0b75e22c9231 263 /** Reset the FTP configuration back to defaults.
RobMeades 0:0b75e22c9231 264 */
rob.meades@u-blox.com 11:3631f62bb359 265 void ftpResetPar();
RobMeades 0:0b75e22c9231 266
RobMeades 0:0b75e22c9231 267 /** Set FTP parameters.
RobMeades 0:0b75e22c9231 268 *
RobMeades 0:0b75e22c9231 269 * This should be called as many times as is necessary
RobMeades 0:0b75e22c9231 270 * to set all the possible parameters (FtpOpCode).
RobMeades 0:0b75e22c9231 271 *
RobMeades 0:0b75e22c9231 272 * See section 27.1 of u-blox-ATCommands_Manual(UBX-13002752).pdf
RobMeades 0:0b75e22c9231 273 * for full details. By example:
RobMeades 0:0b75e22c9231 274 *
RobMeades 0:0b75e22c9231 275 * ftpOpCode ftpInPar
RobMeades 0:0b75e22c9231 276 * FTP_IP_ADDRESS "145.33.18.10" (the target FTP server IP address)
RobMeades 0:0b75e22c9231 277 * FTP_SERVER_NAME "www.ftpserver.com" (the target FTP server name)
RobMeades 0:0b75e22c9231 278 * FTP_USER_NAME "my_username"
RobMeades 0:0b75e22c9231 279 * FTP_PASSWORD "my_password"
RobMeades 0:0b75e22c9231 280 * FTP_ACCOUNT "my_account" (not required by most FTP servers)
RobMeades 0:0b75e22c9231 281 * FTP_INACTIVITY_TIMEOUT "60" (the default is 0, which means no timeout)
RobMeades 0:0b75e22c9231 282 * FTP_MODE "0" for active, "1" for passive (the default is 0)
RobMeades 0:0b75e22c9231 283 * FTP_SERVER_PORT "25" (default is port 21)
RobMeades 0:0b75e22c9231 284 * FTP_SECURE "0" for no security, "1" for SFTP (the default is 0)
RobMeades 0:0b75e22c9231 285 *
RobMeades 0:0b75e22c9231 286 * @param ftpOpCode the FTP operation code.
RobMeades 0:0b75e22c9231 287 * @param ftpInPar the FTP input parameter.
RobMeades 0:0b75e22c9231 288 * @return true if successful, false otherwise.
RobMeades 0:0b75e22c9231 289 */
RobMeades 0:0b75e22c9231 290 bool ftpSetPar(FtpOpCode ftpOpCode, const char * ftpInPar);
RobMeades 0:0b75e22c9231 291
RobMeades 0:0b75e22c9231 292 /** Perform an FTP command.
RobMeades 0:0b75e22c9231 293 *
RobMeades 0:0b75e22c9231 294 * Connect() must have been called previously to establish a data
RobMeades 0:0b75e22c9231 295 * connection.
RobMeades 0:0b75e22c9231 296 *
RobMeades 0:0b75e22c9231 297 * See section 27.2 of u-blox-ATCommands_Manual(UBX-13002752).pdf
RobMeades 0:0b75e22c9231 298 * for full details. By example, it works like this:
RobMeades 0:0b75e22c9231 299 *
rob.meades@u-blox.com 11:3631f62bb359 300 * ftpCmd file1 file2 buf len offset
rob.meades@u-blox.com 11:3631f62bb359 301 * FTP_LOGOUT N/A N/A N/A N/A N/A
rob.meades@u-blox.com 11:3631f62bb359 302 * FTP_LOGIN N/A N/A N/A N/A N/A
rob.meades@u-blox.com 11:3631f62bb359 303 * FTP_DELETE_FILE "the_file" N/A N/A N/A N/A
rob.meades@u-blox.com 11:3631f62bb359 304 * FTP_RENAME_FILE "old_name" "new_name" N/A N/A N/A
rob.meades@u-blox.com 11:3631f62bb359 305 * FTP_GET_FILE "the_file" Note 1 N/A N/A 0 - 1 (Notes 2 & 3)
rob.meades@u-blox.com 11:3631f62bb359 306 * FTP_PUT_FILE "the_file" Note 1 N/A N/A 0 - 65535 (Notes 2 & 4 & 5)
rob.meades@u-blox.com 11:3631f62bb359 307 * FTP_CD "dir1\dir2" N/A N/A N/A N/A
rob.meades@u-blox.com 11:3631f62bb359 308 * FTP_MKDIR "newdir" N/A N/A N/A N/A
rob.meades@u-blox.com 11:3631f62bb359 309 * FTP_RMDIR "dir" N/A N/A N/A N/A
rob.meades@u-blox.com 11:3631f62bb359 310 * FTP_FILE_INFO "the_path" N/A Note 6 N/A
rob.meades@u-blox.com 11:3631f62bb359 311 * FTP_LS "the_path" N/A Note 6 N/A
rob.meades@u-blox.com 11:3631f62bb359 312 * FTP_FOTA_FILE "the_file" N/A Note 7 N/A
RobMeades 0:0b75e22c9231 313 *
RobMeades 0:0b75e22c9231 314 * Note 1: for this case, file2 is the name that the file should be
RobMeades 0:0b75e22c9231 315 * given when it arrives (in the modem file system for a GET, at the FTP
RobMeades 0:0b75e22c9231 316 * server for a PUT); if set to NULL then file1 is used.
RobMeades 0:0b75e22c9231 317 * Note 2: the file will placed into the modem file system for the
RobMeades 0:0b75e22c9231 318 * GET case (and can be read with readFile()), or must already be in the
RobMeades 0:0b75e22c9231 319 * modem file system, (can be written using writeFile()) for the PUT case.
rob.meades@u-blox.com 11:3631f62bb359 320 * Note 3: if offset is 1 then, where supported, the FTP GET
rob.meades@u-blox.com 11:3631f62bb359 321 * will be continued from the point it previously stopped.
rob.meades@u-blox.com 11:3631f62bb359 322 * Note 4: if the file already exists in the modem file system some
rob.meades@u-blox.com 11:3631f62bb359 323 * modems will return an error. It is up to the caller to ensure that
rob.meades@u-blox.com 11:3631f62bb359 324 * the file does not exist before the FTP PUT operation.
rob.meades@u-blox.com 11:3631f62bb359 325 * Note 5: where supported, offset is the position in the file to continue
rob.meades@u-blox.com 11:3631f62bb359 326 * the FTP PUT from.
rob.meades@u-blox.com 11:3631f62bb359 327 * Note 6: buf should point to the location where the file info
RobMeades 0:0b75e22c9231 328 * or directory listing is to be stored and len should be the maximum
RobMeades 0:0b75e22c9231 329 * length that can be stored.
rob.meades@u-blox.com 11:3631f62bb359 330 * Note 7: a hex string representing the MD5 sum of the FOTA file will be
RobMeades 0:0b75e22c9231 331 * stored at buf; len must be at least 32 as an MD5 sum is 16 bytes.
RobMeades 0:0b75e22c9231 332 * FTP_FOTA_FILE is not supported on SARA-U2.
rob.meades@u-blox.com 11:3631f62bb359 333 * Note 8: FTP_GET_DIRECT and FTP_PUT_DIRECT are not supported by
RobMeades 0:0b75e22c9231 334 * this driver.
RobMeades 0:0b75e22c9231 335 *
RobMeades 0:0b75e22c9231 336 * @param ftpCmd the FTP command.
RobMeades 0:0b75e22c9231 337 * @param file1 the first file name if required (NULL otherwise).
RobMeades 0:0b75e22c9231 338 * @param file2 the second file name if required (NULL otherwise).
RobMeades 0:0b75e22c9231 339 * @param buf pointer to a buffer, required for FTP_DIRECT mode
RobMeades 0:0b75e22c9231 340 * and FTP_LS only.
RobMeades 0:0b75e22c9231 341 * @param len the size of buf.
rob.meades@u-blox.com 11:3631f62bb359 342 * @param continue if true then attempt to continue a download that
rob.meades@u-blox.com 11:3631f62bb359 343 * was previously interrupted.
RobMeades 0:0b75e22c9231 344 * @return NULL if successful, otherwise a pointer to
RobMeades 0:0b75e22c9231 345 * a Error struct containing the error class and error
RobMeades 0:0b75e22c9231 346 * code, see section Appendix A.B of
RobMeades 0:0b75e22c9231 347 * u-blox-ATCommands_Manual(UBX-13002752).pdf for details.
RobMeades 0:0b75e22c9231 348 */
RobMeades 0:0b75e22c9231 349 Error *ftpCommand(FtpCmd ftpCmd, const char* file1 = NULL, const char* file2 = NULL,
rob.meades@u-blox.com 11:3631f62bb359 350 char* buf = NULL, int len = 0, int offset = 0);
RobMeades 0:0b75e22c9231 351
RobMeades 0:0b75e22c9231 352 /**********************************************************************
RobMeades 0:0b75e22c9231 353 * PUBLIC: Cell Locate
RobMeades 0:0b75e22c9231 354 **********************************************************************/
RobMeades 0:0b75e22c9231 355
RobMeades 0:0b75e22c9231 356 /** Which form of Cell Locate sensing to use.
RobMeades 0:0b75e22c9231 357 */
RobMeades 0:0b75e22c9231 358 typedef enum {
RobMeades 0:0b75e22c9231 359 CELL_LAST,
RobMeades 0:0b75e22c9231 360 CELL_GNSS,
RobMeades 0:0b75e22c9231 361 CELL_LOCATE,
RobMeades 0:0b75e22c9231 362 CELL_HYBRID
RobMeades 0:0b75e22c9231 363 } CellSensType;
RobMeades 0:0b75e22c9231 364
RobMeades 0:0b75e22c9231 365 /** Types of Cell Locate response.
RobMeades 0:0b75e22c9231 366 */
RobMeades 0:0b75e22c9231 367 typedef enum {
RobMeades 0:0b75e22c9231 368 CELL_DETAILED = 1,
RobMeades 0:0b75e22c9231 369 CELL_MULTIHYP = 2
RobMeades 0:0b75e22c9231 370 } CellRespType;
RobMeades 0:0b75e22c9231 371
RobMeades 0:0b75e22c9231 372 /** Cell Locate data.
RobMeades 0:0b75e22c9231 373 */
RobMeades 0:0b75e22c9231 374 typedef struct {
RobMeades 0:0b75e22c9231 375 volatile bool validData; //!< Flag for indicating if data is valid.
RobMeades 0:0b75e22c9231 376 volatile struct tm time; //!< GPS Timestamp.
RobMeades 0:0b75e22c9231 377 volatile float longitude; //!< Estimated longitude, in degrees.
RobMeades 0:0b75e22c9231 378 volatile float latitude; //!< Estimated latitude, in degrees.
RobMeades 0:0b75e22c9231 379 volatile int altitude; //!< Estimated altitude, in meters^2.
RobMeades 0:0b75e22c9231 380 volatile int uncertainty; //!< Maximum possible error, in meters.
RobMeades 0:0b75e22c9231 381 volatile int speed; //!< Speed over ground m/s^2.
RobMeades 0:0b75e22c9231 382 volatile int direction; //!< Course over ground in degrees.
RobMeades 0:0b75e22c9231 383 volatile int verticalAcc; //!< Vertical accuracy, in meters^2.
RobMeades 0:0b75e22c9231 384 volatile CellSensType sensor; //!< Sensor used for last calculation.
RobMeades 0:0b75e22c9231 385 volatile int svUsed; //!< number of satellite used.
RobMeades 0:0b75e22c9231 386 } CellLocData;
RobMeades 0:0b75e22c9231 387
RobMeades 0:0b75e22c9231 388 /** Configure the Cell Locate TCP aiding server.
RobMeades 0:0b75e22c9231 389 *
RobMeades 0:0b75e22c9231 390 * Connect() must have been called previously to establish
RobMeades 0:0b75e22c9231 391 * a data connection.
RobMeades 0:0b75e22c9231 392 *
RobMeades 0:0b75e22c9231 393 * @param server_1 host name of the primary MGA server.
RobMeades 0:0b75e22c9231 394 * @param server_2 host name of the secondary MGA server.
RobMeades 0:0b75e22c9231 395 * @param token authentication token for MGA server access.
RobMeades 0:0b75e22c9231 396 * @param days the number of days into the future the off-line
RobMeades 0:0b75e22c9231 397 * data for the u-blox 7.
RobMeades 0:0b75e22c9231 398 * @param period the number of weeks into the future the off-line
RobMeades 0:0b75e22c9231 399 * data for u-blox M8.
RobMeades 0:0b75e22c9231 400 * @param resolution resolution of off-line data for u-blox M8: 1 every
RobMeades 0:0b75e22c9231 401 * day, 0 every other day.
RobMeades 0:0b75e22c9231 402 * @return true if the request is successful, otherwise false.
RobMeades 0:0b75e22c9231 403 */
RobMeades 0:0b75e22c9231 404 bool cellLocSrvTcp(const char* token, const char* server_1 = "cell-live1.services.u-blox.com",
RobMeades 0:0b75e22c9231 405 const char* server_2 = "cell-live2.services.u-blox.com",
RobMeades 0:0b75e22c9231 406 int days = 14, int period = 4, int resolution = 1);
RobMeades 0:0b75e22c9231 407
RobMeades 0:0b75e22c9231 408 /** Configure Cell Locate UDP aiding server.
RobMeades 0:0b75e22c9231 409 *
RobMeades 0:0b75e22c9231 410 * Connect() must have been called previously to establish
RobMeades 0:0b75e22c9231 411 * a data connection.
RobMeades 0:0b75e22c9231 412 *
RobMeades 0:0b75e22c9231 413 * @param server_1 host name of the primary MGA server.
RobMeades 0:0b75e22c9231 414 * @param port server port.
RobMeades 0:0b75e22c9231 415 * @param latency expected network latency in seconds from 0 to 10000 milliseconds.
RobMeades 0:0b75e22c9231 416 * @param mode Assist Now management, mode of operation:
RobMeades 0:0b75e22c9231 417 * 0 data downloaded at GNSS power up,
RobMeades 0:0b75e22c9231 418 * 1 automatically kept alive, manual download.
RobMeades 0:0b75e22c9231 419 * @return true if the request is successful, otherwise false.
RobMeades 0:0b75e22c9231 420 */
RobMeades 0:0b75e22c9231 421 bool cellLocSrvUdp(const char* server_1 = "cell-live1.services.u-blox.com",
RobMeades 0:0b75e22c9231 422 int port = 46434, int latency = 1000, int mode = 0);
RobMeades 0:0b75e22c9231 423
RobMeades 0:0b75e22c9231 424 /** Configure Cell Locate location sensor.
RobMeades 0:0b75e22c9231 425 *
RobMeades 0:0b75e22c9231 426 * @param scanMode network scan mode: 0 normal, 1 deep scan.
RobMeades 0:0b75e22c9231 427 * @return true if the request is successful, otherwise false.
RobMeades 0:0b75e22c9231 428 */
RobMeades 0:0b75e22c9231 429 bool cellLocConfig(int scanMode);
RobMeades 0:0b75e22c9231 430
RobMeades 0:0b75e22c9231 431 /** Request a one-shot Cell Locate.
RobMeades 0:0b75e22c9231 432 *
RobMeades 0:0b75e22c9231 433 * This function is non-blocking, the result is retrieved using cellLocGetxxx.
RobMeades 0:0b75e22c9231 434 *
rob.meades@u-blox.com 1:26a67ab07275 435 * Note: none of the CellLocate methods switch on the GNSS receiver chip.
rob.meades@u-blox.com 1:26a67ab07275 436 * That should be done by instantiating the GnssSerial or GnssI2C classes and
rob.meades@u-blox.com 1:26a67ab07275 437 * calling the init() method.
rob.meades@u-blox.com 1:26a67ab07275 438 *
RobMeades 0:0b75e22c9231 439 * Note: during the location process, unsolicited result codes will be returned
RobMeades 0:0b75e22c9231 440 * by the modem indicating progress and potentially flagging interesting errors.
RobMeades 0:0b75e22c9231 441 * In order to see these errors, instantiate this class with debugOn set to true.
RobMeades 0:0b75e22c9231 442 *
RobMeades 0:0b75e22c9231 443 * @param sensor sensor selection.
RobMeades 0:0b75e22c9231 444 * @param timeout timeout period in seconds (1 - 999).
RobMeades 0:0b75e22c9231 445 * @param accuracy target accuracy in meters (1 - 999999).
RobMeades 0:0b75e22c9231 446 * @param type detailed or multi-hypothesis.
RobMeades 0:0b75e22c9231 447 * @param hypothesis maximum desired number of responses from CellLocate (up to 16),
RobMeades 0:0b75e22c9231 448 * must be 1 if type is CELL_DETAILED.
RobMeades 0:0b75e22c9231 449 * @return true if the request is successful, otherwise false.
RobMeades 0:0b75e22c9231 450 */
RobMeades 0:0b75e22c9231 451 bool cellLocRequest(CellSensType sensor, int timeout, int accuracy,
RobMeades 0:0b75e22c9231 452 CellRespType type = CELL_DETAILED, int hypothesis = 1);
RobMeades 0:0b75e22c9231 453
RobMeades 0:0b75e22c9231 454 /** Get a position record.
RobMeades 0:0b75e22c9231 455 *
RobMeades 0:0b75e22c9231 456 * @param data pointer to a CellLocData structure where the location will be put.
RobMeades 0:0b75e22c9231 457 * @param index of the position to retrieve.
RobMeades 0:0b75e22c9231 458 * @return true if data has been retrieved and copied, false otherwise.
RobMeades 0:0b75e22c9231 459 */
RobMeades 0:0b75e22c9231 460 bool cellLocGetData(CellLocData *data, int index = 0);
RobMeades 0:0b75e22c9231 461
RobMeades 0:0b75e22c9231 462 /** Get the number of position records received.
RobMeades 0:0b75e22c9231 463 *
RobMeades 0:0b75e22c9231 464 * @return number of position records received.
RobMeades 0:0b75e22c9231 465 */
RobMeades 0:0b75e22c9231 466 int cellLocGetRes();
RobMeades 0:0b75e22c9231 467
RobMeades 0:0b75e22c9231 468 /** Get the number of position records expected to be received.
RobMeades 0:0b75e22c9231 469 *
RobMeades 0:0b75e22c9231 470 * @return number of position records expected to be received.
RobMeades 0:0b75e22c9231 471 */
RobMeades 0:0b75e22c9231 472 int cellLocGetExpRes();
RobMeades 0:0b75e22c9231 473
RobMeades 0:0b75e22c9231 474 protected:
RobMeades 0:0b75e22c9231 475
RobMeades 0:0b75e22c9231 476 /**********************************************************************
RobMeades 0:0b75e22c9231 477 * PROTECTED: HTTP
RobMeades 0:0b75e22c9231 478 **********************************************************************/
RobMeades 0:0b75e22c9231 479
RobMeades 0:0b75e22c9231 480 /** Check for timeout.
RobMeades 0:0b75e22c9231 481 */
RobMeades 0:0b75e22c9231 482 #define TIMEOUT(t, ms) ((ms != TIMEOUT_BLOCKING) && (ms < t.read_ms()))
RobMeades 0:0b75e22c9231 483
RobMeades 0:0b75e22c9231 484 /** Check for a valid profile.
RobMeades 0:0b75e22c9231 485 */
RobMeades 0:0b75e22c9231 486 #define IS_PROFILE(p) (((p) >= 0) && (((unsigned int) p) < (sizeof(_httpProfiles)/sizeof(_httpProfiles[0]))) \
RobMeades 0:0b75e22c9231 487 && (_httpProfiles[p].modemHandle != HTTP_PROF_UNUSED))
RobMeades 0:0b75e22c9231 488
RobMeades 0:0b75e22c9231 489 /** Management structure for HTTP profiles.
RobMeades 0:0b75e22c9231 490 *
RobMeades 0:0b75e22c9231 491 * It is possible to have up to 4 different HTTP profiles (LISA-C200, LISA-U200 and SARA-G350) having:
RobMeades 0:0b75e22c9231 492 *
RobMeades 0:0b75e22c9231 493 * @param handle the current HTTP profile is in handling state or not (default value is HTTP_ERROR).
RobMeades 0:0b75e22c9231 494 * @param timeout the timeout for the current HTTP command.
RobMeades 0:0b75e22c9231 495 * @param pending the status for the current HTTP command (in processing state or not).
RobMeades 0:0b75e22c9231 496 * @param cmd the code for the current HTTP command.
RobMeades 0:0b75e22c9231 497 * @param result the result for the current HTTP command once processed.
RobMeades 0:0b75e22c9231 498 */
RobMeades 0:0b75e22c9231 499 typedef struct {
RobMeades 0:0b75e22c9231 500 int modemHandle;
RobMeades 0:0b75e22c9231 501 int timeout;
RobMeades 0:0b75e22c9231 502 volatile bool pending;
RobMeades 0:0b75e22c9231 503 volatile int cmd;
RobMeades 0:0b75e22c9231 504 volatile int result;
RobMeades 0:0b75e22c9231 505 Error httpError;
RobMeades 0:0b75e22c9231 506 } HttpProfCtrl;
RobMeades 0:0b75e22c9231 507
RobMeades 0:0b75e22c9231 508 /** The HTTP profile storage.
RobMeades 0:0b75e22c9231 509 */
RobMeades 0:0b75e22c9231 510 HttpProfCtrl _httpProfiles[4];
RobMeades 0:0b75e22c9231 511
RobMeades 0:0b75e22c9231 512 /** Callback to capture the response to an HTTP command.
RobMeades 0:0b75e22c9231 513 */
RobMeades 0:0b75e22c9231 514 void UUHTTPCR_URC();
RobMeades 0:0b75e22c9231 515
RobMeades 0:0b75e22c9231 516 /** Find a profile with a given handle. If no handle is given, find the next
RobMeades 0:0b75e22c9231 517 * free profile.
RobMeades 0:0b75e22c9231 518 *
RobMeades 0:0b75e22c9231 519 * @param modemHandle the handle of the profile to find.
RobMeades 0:0b75e22c9231 520 * @return the profile handle or negative if not found/created.
RobMeades 0:0b75e22c9231 521 */
RobMeades 0:0b75e22c9231 522 int findProfile(int modemHandle = HTTP_PROF_UNUSED);
RobMeades 0:0b75e22c9231 523
RobMeades 0:0b75e22c9231 524 /** Helper function to get a HTTP command as a text string, useful
RobMeades 0:0b75e22c9231 525 * for debug purposes.
RobMeades 0:0b75e22c9231 526 *
RobMeades 0:0b75e22c9231 527 * @param httpCmdCode the HTTP command.
RobMeades 0:0b75e22c9231 528 * @return HTTP command in string format.
RobMeades 0:0b75e22c9231 529 */
RobMeades 0:0b75e22c9231 530 const char* getHttpCmd(HttpCmd httpCmd);
RobMeades 0:0b75e22c9231 531
RobMeades 0:0b75e22c9231 532 /**********************************************************************
RobMeades 0:0b75e22c9231 533 * PROTECTED: FTP
RobMeades 0:0b75e22c9231 534 **********************************************************************/
RobMeades 0:0b75e22c9231 535
RobMeades 0:0b75e22c9231 536 /** Unused FTP op code marker.
RobMeades 0:0b75e22c9231 537 */
RobMeades 0:0b75e22c9231 538 #define FTP_OP_CODE_UNUSED -1
RobMeades 0:0b75e22c9231 539
RobMeades 0:0b75e22c9231 540 /** The FTP timeout in milliseconds.
RobMeades 0:0b75e22c9231 541 */
RobMeades 0:0b75e22c9231 542 int _ftpTimeout;
RobMeades 0:0b75e22c9231 543
RobMeades 0:0b75e22c9231 544 /** A place to store the FTP op code for the last result.
RobMeades 0:0b75e22c9231 545 */
RobMeades 0:0b75e22c9231 546 volatile int _lastFtpOpCodeResult;
RobMeades 0:0b75e22c9231 547
RobMeades 0:0b75e22c9231 548 /** A place to store the last FTP result.
RobMeades 0:0b75e22c9231 549 */
RobMeades 0:0b75e22c9231 550 volatile int _lastFtpResult;
RobMeades 0:0b75e22c9231 551
RobMeades 0:0b75e22c9231 552 /** A place to store the last FTP op code for data response.
RobMeades 0:0b75e22c9231 553 */
RobMeades 0:0b75e22c9231 554 volatile int _lastFtpOpCodeData;
RobMeades 0:0b75e22c9231 555
RobMeades 0:0b75e22c9231 556 /** A place to store data returns from an FTP operation.
RobMeades 0:0b75e22c9231 557 */
RobMeades 0:0b75e22c9231 558 char * _ftpBuf;
RobMeades 0:0b75e22c9231 559
RobMeades 0:0b75e22c9231 560 /** The length of FTP data that can be stored (at _ftpBuf).
RobMeades 0:0b75e22c9231 561 */
RobMeades 0:0b75e22c9231 562 int _ftpBufLen;
RobMeades 0:0b75e22c9231 563
RobMeades 0:0b75e22c9231 564 /** storage for the last FTP error
RobMeades 0:0b75e22c9231 565 */
RobMeades 0:0b75e22c9231 566 Error _ftpError;
RobMeades 0:0b75e22c9231 567
RobMeades 0:0b75e22c9231 568 /** Callback to capture the result of an FTP command.
RobMeades 0:0b75e22c9231 569 */
RobMeades 0:0b75e22c9231 570 void UUFTPCR_URC();
RobMeades 0:0b75e22c9231 571
RobMeades 0:0b75e22c9231 572 /** Callback to capture data returned from an FTP command.
RobMeades 0:0b75e22c9231 573 */
RobMeades 0:0b75e22c9231 574 void UUFTPCD_URC();
RobMeades 0:0b75e22c9231 575
RobMeades 0:0b75e22c9231 576 /** Helper function to get an FTP command as a text string, useful
RobMeades 0:0b75e22c9231 577 * for debug purposes.
RobMeades 0:0b75e22c9231 578 *
RobMeades 0:0b75e22c9231 579 * @param ftpCmdCode the FTP command.
RobMeades 0:0b75e22c9231 580 * @return FTP command in string format.
RobMeades 0:0b75e22c9231 581 */
RobMeades 0:0b75e22c9231 582 const char * getFtpCmd(FtpCmd ftpCmd);
RobMeades 0:0b75e22c9231 583
RobMeades 0:0b75e22c9231 584 /**********************************************************************
RobMeades 0:0b75e22c9231 585 * PROTECTED: Cell Locate
RobMeades 0:0b75e22c9231 586 **********************************************************************/
RobMeades 0:0b75e22c9231 587
RobMeades 0:0b75e22c9231 588 /** The maximum number of hypotheses
RobMeades 0:0b75e22c9231 589 */
RobMeades 0:0b75e22c9231 590 #define CELL_MAX_HYP (16 + 1)
RobMeades 0:0b75e22c9231 591
RobMeades 0:0b75e22c9231 592 /** Received positions.
RobMeades 0:0b75e22c9231 593 */
RobMeades 0:0b75e22c9231 594 volatile int _locRcvPos;
RobMeades 0:0b75e22c9231 595
RobMeades 0:0b75e22c9231 596 /** Expected positions.
RobMeades 0:0b75e22c9231 597 */
RobMeades 0:0b75e22c9231 598 volatile int _locExpPos;
RobMeades 0:0b75e22c9231 599
RobMeades 0:0b75e22c9231 600 /** The Cell Locate data.
RobMeades 0:0b75e22c9231 601 */
RobMeades 0:0b75e22c9231 602 CellLocData _loc[CELL_MAX_HYP];
RobMeades 0:0b75e22c9231 603
RobMeades 0:0b75e22c9231 604 /** Buffer for the URC to work with
RobMeades 0:0b75e22c9231 605 */
RobMeades 0:0b75e22c9231 606 char urcBuf[128];
RobMeades 0:0b75e22c9231 607
RobMeades 0:0b75e22c9231 608 /** Callback to capture +UULOCIND.
RobMeades 0:0b75e22c9231 609 */
RobMeades 0:0b75e22c9231 610 void UULOCIND_URC();
RobMeades 0:0b75e22c9231 611
RobMeades 0:0b75e22c9231 612 /** Callback to capture +UULOC.
RobMeades 0:0b75e22c9231 613 */
RobMeades 0:0b75e22c9231 614 void UULOC_URC();
RobMeades 0:0b75e22c9231 615 };
RobMeades 0:0b75e22c9231 616
RobMeades 0:0b75e22c9231 617 #endif // _UBLOX_AT_CELLULAR_INTERFACE_EXT_
RobMeades 0:0b75e22c9231 618