/* Arduino library for the u-blox SARA-R5 LTE-M / NB-IoT modules with secure cloud, as used on the SparkFun MicroMod Asset Tracker By: Paul Clark October 19th 2020 Based extensively on the: Arduino Library for the SparkFun LTE CAT M1/NB-IoT Shield - SARA-R4 Written by Jim Lindblom @ SparkFun Electronics, September 5, 2018 This Arduino library provides mechanisms to initialize and use the SARA-R5 module over either a SoftwareSerial or hardware serial port. Please see LICENSE.md for the license information */ #ifndef SPARKFUN_SARA_R5_ARDUINO_LIBRARY_H #define SPARKFUN_SARA_R5_ARDUINO_LIBRARY_H #if (ARDUINO >= 100) #include "Arduino.h" #else #include "WProgram.h" #endif #ifdef ARDUINO_ARCH_AVR // Arduino AVR boards (Uno, Pro Micro, etc.) #define SARA_R5_SOFTWARE_SERIAL_ENABLED // Enable software serial #endif #ifdef ARDUINO_ARCH_SAMD // Arduino SAMD boards (SAMD21, etc.) #define SARA_R5_SOFTWARE_SERIAL_ENABLEDx // Disable software serial #endif #ifdef ARDUINO_ARCH_APOLLO3 // Arduino Apollo boards (Artemis module, RedBoard Artemis, etc) #define SARA_R5_SOFTWARE_SERIAL_ENABLEDx // Disable software serial (no longer supported with v2 of Apollo3) // Note: paulvha has provided software serial support for v2 of the Apollo3 / Artemis core. // Further details are available at: // https://github.com/paulvha/apollo3/tree/master/SoftwareSerial #endif #ifdef ARDUINO_ARCH_STM32 // STM32 based boards (Disco, Nucleo, etc) #define SARA_R5_SOFTWARE_SERIAL_ENABLED // Enable software serial #endif #ifdef ARDUINO_ARCH_ESP32 // ESP32 based boards // Check to see if ESP Software Serial has been included // Note: you need to #include at the very start of your script, // _before_ the #include , for this to work. // See SARA-R5_Example2_Identification_ESPSoftwareSerial for more details. #if __has_include( ) #define SARA_R5_SOFTWARE_SERIAL_ENABLED // Enable software serial #else #define SARA_R5_SOFTWARE_SERIAL_ENABLEDx // Disable software serial #endif #endif #ifdef ARDUINO_ARCH_ESP8266 // ESP8266 based boards // Check to see if ESP Software Serial has been included // Note: you need to #include at the very start of your script, // _before_ the #include , for this to work. // See SARA-R5_Example2_Identification_ESPSoftwareSerial for more details. #if __has_include( ) #define SARA_R5_SOFTWARE_SERIAL_ENABLED // Enable software serial #else #define SARA_R5_SOFTWARE_SERIAL_ENABLEDx // Disable software serial #endif #endif #ifdef SARA_R5_SOFTWARE_SERIAL_ENABLED #include // SoftwareSerial.h is guarded. It is OK to include it twice. #endif #include #define SARA_R5_POWER_PIN -1 // Default to no pin #define SARA_R5_RESET_PIN -1 // Timing #define SARA_R5_STANDARD_RESPONSE_TIMEOUT 1000 #define SARA_R5_10_SEC_TIMEOUT 10000 #define SARA_R5_55_SECS_TIMEOUT 55000 #define SARA_R5_2_MIN_TIMEOUT 120000 #define SARA_R5_3_MIN_TIMEOUT 180000 #define SARA_R5_SET_BAUD_TIMEOUT 500 #define SARA_R5_POWER_OFF_PULSE_PERIOD 3200 // Hold PWR_ON low for this long to power the module off #define SARA_R5_POWER_ON_PULSE_PERIOD 100 // Hold PWR_ON low for this long to power the module on (SARA-R510M8S) #define SARA_R5_RESET_PULSE_PERIOD 23000 // Used to perform an abrupt emergency hardware shutdown. 23 seconds... (Yes, really!) #define SARA_R5_POWER_OFF_TIMEOUT 40000 // Datasheet says 40 seconds... #define SARA_R5_IP_CONNECT_TIMEOUT 130000 #define SARA_R5_POLL_DELAY 1 #define SARA_R5_SOCKET_WRITE_TIMEOUT 10000 // ## Suported AT Commands // ### General const char SARA_R5_COMMAND_AT[] = "AT"; // AT "Test" const char SARA_R5_COMMAND_ECHO[] = "E"; // Local Echo const char SARA_R5_COMMAND_MANU_ID[] = "+CGMI"; // Manufacturer identification const char SARA_R5_COMMAND_MODEL_ID[] = "+CGMM"; // Model identification const char SARA_R5_COMMAND_FW_VER_ID[] = "+CGMR"; // Firmware version identification const char SARA_R5_COMMAND_SERIAL_NO[] = "+CGSN"; // Product serial number const char SARA_R5_COMMAND_IMEI[] = "+CSN"; // IMEI identification const char SARA_R5_COMMAND_IMSI[] = "+CIMI"; // IMSI identification const char SARA_R5_COMMAND_CCID[] = "+CCID"; // SIM CCID const char SARA_R5_COMMAND_REQ_CAP[] = "+GCAP"; // Request capabilities list // ### Control and status const char SARA_R5_COMMAND_POWER_OFF[] = "+CPWROFF"; // Module switch off const char SARA_R5_COMMAND_FUNC[] = "+CFUN"; // Functionality (reset, etc.) const char SARA_R5_COMMAND_CLOCK[] = "+CCLK"; // Real-time clock const char SARA_R5_COMMAND_AUTO_TZ[] = "+CTZU"; // Automatic time zone update const char SARA_R5_COMMAND_TZ_REPORT[] = "+CTZR"; // Time zone reporting // ### Network service const char SARA_R5_COMMAND_CNUM[] = "+CNUM"; // Subscriber number const char SARA_R5_SIGNAL_QUALITY[] = "+CSQ"; const char SARA_R5_OPERATOR_SELECTION[] = "+COPS"; const char SARA_R5_REGISTRATION_STATUS[] = "+CREG"; const char SARA_R5_EPSREGISTRATION_STATUS[] = "+CEREG"; const char SARA_R5_READ_OPERATOR_NAMES[] = "+COPN"; const char SARA_R5_COMMAND_MNO[] = "+UMNOPROF"; // MNO (mobile network operator) Profile // ### SIM const char SARA_R5_SIM_STATE[] = "+USIMSTAT"; const char SARA_R5_COMMAND_SIMPIN[] = "+CPIN"; // SIM PIN // ### SMS const char SARA_R5_MESSAGE_FORMAT[] = "+CMGF"; // Set SMS message format const char SARA_R5_SEND_TEXT[] = "+CMGS"; // Send SMS message const char SARA_R5_NEW_MESSAGE_IND[] = "+CNMI"; // New [SMS] message indication const char SARA_R5_PREF_MESSAGE_STORE[] = "+CPMS"; // Preferred message storage const char SARA_R5_READ_TEXT_MESSAGE[] = "+CMGR"; // Read message const char SARA_R5_DELETE_MESSAGE[] = "+CMGD"; // Delete message // V24 control and V25ter (UART interface) const char SARA_R5_FLOW_CONTROL[] = "&K"; // Flow control const char SARA_R5_COMMAND_BAUD[] = "+IPR"; // Baud rate // ### Packet switched data services const char SARA_R5_MESSAGE_PDP_DEF[] = "+CGDCONT"; // Packet switched Data Profile context definition const char SARA_R5_MESSAGE_PDP_CONFIG[] = "+UPSD"; // Packet switched Data Profile configuration const char SARA_R5_MESSAGE_PDP_ACTION[] = "+UPSDA"; // Perform the action for the specified PSD profile const char SARA_R5_MESSAGE_PDP_CONTEXT_ACTIVATE[] = "+CGACT"; // Activates or deactivates the specified PDP context const char SARA_R5_MESSAGE_ENTER_PPP[] = "D"; const char SARA_R5_NETWORK_ASSIGNED_DATA[] = "+UPSND"; // Packet switched network-assigned data // ### GPIO const char SARA_R5_COMMAND_GPIO[] = "+UGPIOC"; // GPIO Configuration // ### IP const char SARA_R5_CREATE_SOCKET[] = "+USOCR"; // Create a new socket const char SARA_R5_CLOSE_SOCKET[] = "+USOCL"; // Close a socket const char SARA_R5_CONNECT_SOCKET[] = "+USOCO"; // Connect to server on socket const char SARA_R5_WRITE_SOCKET[] = "+USOWR"; // Write data to a socket const char SARA_R5_WRITE_UDP_SOCKET[] = "+USOST"; // Write data to a UDP socket const char SARA_R5_READ_SOCKET[] = "+USORD"; // Read from a socket const char SARA_R5_READ_UDP_SOCKET[] = "+USORF"; // Read UDP data from a socket const char SARA_R5_LISTEN_SOCKET[] = "+USOLI"; // Listen for connection on socket const char SARA_R5_GET_ERROR[] = "+USOER"; // Get last socket error. const char SARA_R5_SOCKET_DIRECT_LINK[] = "+USODL"; // Set socket in Direct Link mode const char SARA_R5_SOCKET_CONTROL[] = "+USOCTL"; // Query the socket parameters const char SARA_R5_UD_CONFIGURATION[] = "+UDCONF"; // User Datagram Configuration // ### Ping const char SARA_R5_PING_COMMAND[] = "+UPING"; // Ping // ### HTTP const char SARA_R5_HTTP_PROFILE[] = "+UHTTP"; // Configure the HTTP profile. Up to 4 different profiles can be defined const char SARA_R5_HTTP_COMMAND[] = "+UHTTPC"; // Trigger the specified HTTP command const char SARA_R5_HTTP_PROTOCOL_ERROR[] = "+UHTTPER"; // Retrieves the error class and code of the latest HTTP operation on the specified HTTP profile. const char SARA_R5_MQTT_NVM[] = "+UMQTTNV"; const char SARA_R5_MQTT_PROFILE[] = "+UMQTT"; const char SARA_R5_MQTT_COMMAND[] = "+UMQTTC"; const char SARA_R5_MQTT_PROTOCOL_ERROR[] = "+UMQTTER"; // ### GNSS const char SARA_R5_GNSS_POWER[] = "+UGPS"; // GNSS power management configuration const char SARA_R5_GNSS_ASSISTED_IND[] = "+UGIND"; // Assisted GNSS unsolicited indication const char SARA_R5_GNSS_REQUEST_LOCATION[] = "+ULOC"; // Ask for localization information const char SARA_R5_GNSS_GPRMC[] = "+UGRMC"; // Ask for localization information const char SARA_R5_GNSS_REQUEST_TIME[] = "+UTIME"; // Ask for time information from cellular modem (CellTime) const char SARA_R5_GNSS_TIME_INDICATION[] = "+UTIMEIND"; // Time information request status unsolicited indication const char SARA_R5_GNSS_TIME_CONFIGURATION[] = "+UTIMECFG"; // Sets time configuration const char SARA_R5_GNSS_CONFIGURE_SENSOR[] = "+ULOCGNSS"; // Configure GNSS sensor const char SARA_R5_GNSS_CONFIGURE_LOCATION[] = "+ULOCCELL"; // Configure cellular location sensor (CellLocate®) const char SARA_R5_AIDING_SERVER_CONFIGURATION[] = "+UGSRV"; // Configure aiding server (CellLocate®) // ### File System // TO DO: Add support for file tags. Default tag to USER const char SARA_R5_FILE_SYSTEM_READ_FILE[] = "+URDFILE"; // Read a file const char SARA_R5_FILE_SYSTEM_DOWNLOAD_FILE[] = "+UDWNFILE"; // Download a file into the module const char SARA_R5_FILE_SYSTEM_LIST_FILES[] = "+ULSTFILE"; // List of files, size of file, etc. const char SARA_R5_FILE_SYSTEM_DELETE_FILE[] = "+UDELFILE"; // Delete a file // ### File System // TO DO: Add support for file tags. Default tag to USER const char SARA_R5_SEC_PROFILE[] = "+USECPRF"; const char SARA_R5_SEC_MANAGER[] = "+USECMNG"; // ### Response const char SARA_R5_RESPONSE_OK[] = "\nOK\r\n"; const char SARA_R5_RESPONSE_ERROR[] = "\nERROR\r\n"; const char SARA_R5_RESPONSE_CONNECT[] = "\r\nCONNECT\r\n"; #define SARA_R5_RESPONSE_OK_OR_ERROR NULL // CTRL+Z and ESC ASCII codes for SMS message sends const char ASCII_CTRL_Z = 0x1A; const char ASCII_ESC = 0x1B; // NMEA data size - used by parseGPRMCString #define TEMP_NMEA_DATA_SIZE 16 #define NOT_AT_COMMAND false #define AT_COMMAND true // The minimum memory allocation for responses from sendCommandWithResponse // This needs to be large enough to hold the response you're expecting plus and URC's that may arrive during the timeout #define minimumResponseAllocation 128 #define SARA_R5_NUM_SOCKETS 6 #define NUM_SUPPORTED_BAUD 9 const unsigned long SARA_R5_SUPPORTED_BAUD[NUM_SUPPORTED_BAUD] = { 115200, 9600, 19200, 38400, 57600, 230400, 460800, 921600, 3000000}; #define SARA_R5_DEFAULT_BAUD_RATE 115200 // Flow control definitions for AT&K // Note: SW (XON/XOFF) flow control is not supported on the SARA_R5 typedef enum { SARA_R5_DISABLE_FLOW_CONTROL = 0, SARA_R5_ENABLE_FLOW_CONTROL = 3 } SARA_R5_flow_control_t; // The standard Europe profile should be used as the basis for all other MNOs in Europe outside of Vodafone // and Deutsche Telekom. However, there may be changes that need to be applied to the module for proper // operation with any given European MNO such as attach type, RAT preference, band selection, etc. Please // consult with the preferred network provider. typedef enum { MNO_INVALID = -1, MNO_SW_DEFAULT = 0, // Undefined / regulatory MNO_SIM_ICCID = 1, MNO_ATT = 2, // AT&T MNO_VERIZON = 3, MNO_TELSTRA = 4, MNO_TMO = 5, // T-Mobile US MNO_CT = 6, // China Telecom MNO_SPRINT = 8, MNO_VODAFONE = 19, MNO_NTT_DOCOMO = 20, MNO_TELUS = 21, MNO_SOFTBANK = 28, MNO_DT = 31, // Deutsche Telekom MNO_US_CELLULAR = 32, MNO_SKT = 39, MNO_GLOBAL = 90, MNO_STD_EUROPE = 100, MNO_STD_EU_NOEPCO = 101 } mobile_network_operator_t; typedef enum { SARA_R5_ERROR_INVALID = -1, // -1 SARA_R5_ERROR_SUCCESS = 0, // 0 SARA_R5_ERROR_OUT_OF_MEMORY, // 1 SARA_R5_ERROR_TIMEOUT, // 2 SARA_R5_ERROR_UNEXPECTED_PARAM, // 3 SARA_R5_ERROR_UNEXPECTED_RESPONSE, // 4 SARA_R5_ERROR_NO_RESPONSE, // 5 SARA_R5_ERROR_DEREGISTERED, // 6 SARA_R5_ERROR_ZERO_READ_LENGTH, // 7 SARA_R5_ERROR_ERROR // 8 } SARA_R5_error_t; #define SARA_R5_SUCCESS SARA_R5_ERROR_SUCCESS typedef enum { SARA_R5_REGISTRATION_INVALID = -1, SARA_R5_REGISTRATION_NOT_REGISTERED = 0, SARA_R5_REGISTRATION_HOME = 1, SARA_R5_REGISTRATION_SEARCHING = 2, SARA_R5_REGISTRATION_DENIED = 3, SARA_R5_REGISTRATION_UNKNOWN = 4, SARA_R5_REGISTRATION_ROAMING = 5, SARA_R5_REGISTRATION_HOME_SMS_ONLY = 6, SARA_R5_REGISTRATION_ROAMING_SMS_ONLY = 7, SARA_R5_REGISTRATION_EMERGENCY_SERV_ONLY = 8, SARA_R5_REGISTRATION_HOME_CSFB_NOT_PREFERRED = 9, SARA_R5_REGISTRATION_ROAMING_CSFB_NOT_PREFERRED = 10 } SARA_R5_registration_status_t; struct DateData { uint8_t day; uint8_t month; unsigned int year; }; struct TimeData { uint8_t hour; uint8_t minute; uint8_t second; unsigned int ms; uint8_t tzh; uint8_t tzm; }; struct ClockData { struct DateData date; struct TimeData time; }; struct PositionData { float utc; float lat; // Degrees: +/- 90 float lon; // Degrees: +/- 180 float alt; char mode; char status; }; struct SpeedData { float speed; // m/s float cog; // Degrees float magVar; // Degrees }; struct operator_stats { uint8_t stat; String shortOp; String longOp; unsigned long numOp; uint8_t act; }; typedef enum { SARA_R5_TCP = 6, SARA_R5_UDP = 17 } SARA_R5_socket_protocol_t; typedef enum { SARA_R5_TCP_SOCKET_STATUS_INACTIVE, SARA_R5_TCP_SOCKET_STATUS_LISTEN, SARA_R5_TCP_SOCKET_STATUS_SYN_SENT, SARA_R5_TCP_SOCKET_STATUS_SYN_RCVD, SARA_R5_TCP_SOCKET_STATUS_ESTABLISHED, SARA_R5_TCP_SOCKET_STATUS_FIN_WAIT_1, SARA_R5_TCP_SOCKET_STATUS_FIN_WAIT_2, SARA_R5_TCP_SOCKET_STATUS_CLOSE_WAIT, SARA_R5_TCP_SOCKET_STATUS_CLOSING, SARA_R5_TCP_SOCKET_STATUS_LAST_ACK, SARA_R5_TCP_SOCKET_STATUS_TIME_WAIT } SARA_R5_tcp_socket_status_t; typedef enum { SARA_R5_MESSAGE_FORMAT_PDU = 0, SARA_R5_MESSAGE_FORMAT_TEXT = 1 } SARA_R5_message_format_t; typedef enum { SARA_R5_UTIME_MODE_STOP = 0, SARA_R5_UTIME_MODE_PPS, SARA_R5_UTIME_MODE_ONE_SHOT, SARA_R5_UTIME_MODE_EXT_INT } SARA_R5_utime_mode_t; typedef enum { SARA_R5_UTIME_SENSOR_NONE = 0, SARA_R5_UTIME_SENSOR_GNSS_LTE = 1, SARA_R5_UTIME_SENSOR_LTE } SARA_R5_utime_sensor_t; typedef enum { SARA_R5_UTIME_URC_CONFIGURATION_DISABLED = 0, SARA_R5_UTIME_URC_CONFIGURATION_ENABLED } SARA_R5_utime_urc_configuration_t; typedef enum { SARA_R5_SIM_NOT_PRESENT = 0, SARA_R5_SIM_PIN_NEEDED, SARA_R5_SIM_PIN_BLOCKED, SARA_R5_SIM_PUK_BLOCKED, SARA_R5_SIM_NOT_OPERATIONAL, SARA_R5_SIM_RESTRICTED, SARA_R5_SIM_OPERATIONAL //SARA_R5_SIM_PHONEBOOK_READY, // Not reported by SARA-R5 //SARA_R5_SIM_USIM_PHONEBOOK_READY, // Not reported by SARA-R5 //SARA_R5_SIM_TOOLKIT_REFRESH_SUCCESSFUL, // Not reported by SARA-R5 //SARA_R5_SIM_TOOLKIT_REFRESH_UNSUCCESSFUL, // Not reported by SARA-R5 //SARA_R5_SIM_PPP_CONNECTION_ACTIVE, // Not reported by SARA-R5 //SARA_R5_SIM_VOICE_CALL_ACTIVE, // Not reported by SARA-R5 //SARA_R5_SIM_CSD_CALL_ACTIVE // Not reported by SARA-R5 } SARA_R5_sim_states_t; #define SARA_R5_NUM_PSD_PROFILES 6 // Number of supported PSD profiles #define SARA_R5_NUM_PDP_CONTEXT_IDENTIFIERS 11 // Number of supported PDP context identifiers #define SARA_R5_NUM_HTTP_PROFILES 4 // Number of supported HTTP profiles typedef enum { SARA_R5_HTTP_OP_CODE_SERVER_IP = 0, SARA_R5_HTTP_OP_CODE_SERVER_NAME, SARA_R5_HTTP_OP_CODE_USERNAME, SARA_R5_HTTP_OP_CODE_PASSWORD, SARA_R5_HTTP_OP_CODE_AUTHENTICATION, SARA_R5_HTTP_OP_CODE_SERVER_PORT, SARA_R5_HTTP_OP_CODE_SECURE, SARA_R5_HTTP_OP_CODE_REQUEST_TIMEOUT, SARA_R5_HTTP_OP_CODE_ADD_CUSTOM_HEADERS = 9 } SARA_R5_http_op_codes_t; typedef enum { SARA_R5_HTTP_COMMAND_HEAD = 0, SARA_R5_HTTP_COMMAND_GET, SARA_R5_HTTP_COMMAND_DELETE, SARA_R5_HTTP_COMMAND_PUT, SARA_R5_HTTP_COMMAND_POST_FILE, SARA_R5_HTTP_COMMAND_POST_DATA, SARA_R5_HTTP_COMMAND_GET_FOTA = 100 } SARA_R5_http_commands_t; typedef enum { SARA_R5_HTTP_CONTENT_APPLICATION_X_WWW = 0, SARA_R5_HTTP_CONTENT_TEXT_PLAIN, SARA_R5_HTTP_CONTENT_APPLICATION_OCTET, SARA_R5_HTTP_CONTENT_MULTIPART_FORM, SARA_R5_HTTP_CONTENT_APPLICATION_JSON, SARA_R5_HTTP_CONTENT_APPLICATION_XML, SARA_R5_HTTP_CONTENT_USER_DEFINED } SARA_R5_http_content_types_t; typedef enum { SARA_R5_MQTT_NV_RESTORE = 0, SARA_R5_MQTT_NV_SET, SARA_R5_MQTT_NV_STORE, } SARA_R5_mqtt_nv_parameter_t; typedef enum { SARA_R5_MQTT_PROFILE_CLIENT_ID = 0, SARA_R5_MQTT_PROFILE_SERVERNAME = 2, SARA_R5_MQTT_PROFILE_IPADDRESS, SARA_R5_MQTT_PROFILE_USERNAMEPWD, SARA_R5_MQTT_PROFILE_QOS = 6, SARA_R5_MQTT_PROFILE_RETAIN, SARA_R5_MQTT_PROFILE_TOPIC, SARA_R5_MQTT_PROFILE_MESSAGE, SARA_R5_MQTT_PROFILE_INACTIVITYTIMEOUT, SARA_R5_MQTT_PROFILE_SECURE, } SARA_R5_mqtt_profile_opcode_t; typedef enum { SARA_R5_MQTT_COMMAND_LOGOUT = 0, SARA_R5_MQTT_COMMAND_LOGIN, SARA_R5_MQTT_COMMAND_PUBLISH, SARA_R5_MQTT_COMMAND_PUBLISHFILE, SARA_R5_MQTT_COMMAND_SUBSCRIBE, SARA_R5_MQTT_COMMAND_UNSUBSCRIBE, SARA_R5_MQTT_COMMAND_READ, SARA_R5_MQTT_COMMAND_PING, SARA_R5_MQTT_COMMAND_PUBLISHBINARY, } SARA_R5_mqtt_command_opcode_t; typedef enum { SARA_R5_PSD_CONFIG_PARAM_PROTOCOL = 0, SARA_R5_PSD_CONFIG_PARAM_APN, //SARA_R5_PSD_CONFIG_PARAM_USERNAME, // Not allowed on SARA-R5 //SARA_R5_PSD_CONFIG_PARAM_PASSWORD, // Not allowed on SARA-R5 SARA_R5_PSD_CONFIG_PARAM_DNS1 = 4, SARA_R5_PSD_CONFIG_PARAM_DNS2, //SARA_R5_PSD_CONFIG_PARAM_AUTHENTICATION, // Not allowed on SARA-R5 //SARA_R5_PSD_CONFIG_PARAM_IP_ADDRESS, // Not allowed on SARA-R5 //SARA_R5_PSD_CONFIG_PARAM_DATA_COMPRESSION, // Not allowed on SARA-R5 //SARA_R5_PSD_CONFIG_PARAM_HEADER_COMPRESSION, // Not allowed on SARA-R5 SARA_R5_PSD_CONFIG_PARAM_MAP_TO_CID = 100 } SARA_R5_pdp_configuration_parameter_t; typedef enum { SARA_R5_PSD_PROTOCOL_IPV4 = 0, SARA_R5_PSD_PROTOCOL_IPV6, SARA_R5_PSD_PROTOCOL_IPV4V6_V4_PREF, SARA_R5_PSD_PROTOCOL_IPV4V6_V6_PREF } SARA_R5_pdp_protocol_type_t; typedef enum { SARA_R5_PSD_ACTION_RESET = 0, SARA_R5_PSD_ACTION_STORE, SARA_R5_PSD_ACTION_LOAD, SARA_R5_PSD_ACTION_ACTIVATE, SARA_R5_PSD_ACTION_DEACTIVATE } SARA_R5_pdp_actions_t; typedef enum { SARA_R5_SEC_PROFILE_PARAM_CERT_VAL_LEVEL = 0, SARA_R5_SEC_PROFILE_PARAM_TLS_VER, SARA_R5_SEC_PROFILE_PARAM_CYPHER_SUITE, SARA_R5_SEC_PROFILE_PARAM_ROOT_CA, SARA_R5_SEC_PROFILE_PARAM_HOSTNAME, SARA_R5_SEC_PROFILE_PARAM_CLIENT_CERT, SARA_R5_SEC_PROFILE_PARAM_CLIENT_KEY, SARA_R5_SEC_PROFILE_PARAM_CLIENT_KEY_PWD, SARA_R5_SEC_PROFILE_PARAM_PSK, SARA_R5_SEC_PROFILE_PARAM_PSK_IDENT, SARA_R5_SEC_PROFILE_PARAM_SNI, } SARA_R5_sec_profile_parameter_t; typedef enum { SARA_R5_SEC_PROFILE_CERTVAL_OPCODE_NO = 0, SARA_R5_SEC_PROFILE_CERTVAL_OPCODE_YESNOURL, SARA_R5_SEC_PROFILE_CERVTAL_OPCODE_YESURL, SARA_R5_SEC_PROFILE_CERTVAL_OPCODE_YESURLDATE, } SARA_R5_sec_profile_certval_op_code_t; typedef enum { SARA_R5_SEC_PROFILE_TLS_OPCODE_ANYVER = 0, SARA_R5_SEC_PROFILE_TLS_OPCODE_VER1_0, SARA_R5_SEC_PROFILE_TLS_OPCODE_VER1_1, SARA_R5_SEC_PROFILE_TLS_OPCODE_VER1_2, SARA_R5_SEC_PROFILE_TLS_OPCODE_VER1_3, } SARA_R5_sec_profile_tls_op_code_t; typedef enum { SARA_R5_SEC_PROFILE_SUITE_OPCODE_PROPOSEDDEFAULT = 0, } SARA_R5_sec_profile_suite_op_code_t; typedef enum { SARA_R5_SEC_MANAGER_OPCODE_IMPORT = 0, } SARA_R5_sec_manager_opcode_t; typedef enum { SARA_R5_SEC_MANAGER_ROOTCA = 0, SARA_R5_SEC_MANAGER_CLIENT_CERT, SARA_R5_SEC_MANAGER_CLIENT_KEY, SARA_R5_SEC_MANAGER_SERVER_CERT } SARA_R5_sec_manager_parameter_t; typedef enum { MINIMUM_FUNCTIONALITY = 0, // (disable both transmit and receive RF circuits by deactivating both CS and PS services) FULL_FUNCTIONALITY = 1, AIRPLANE_MODE = 4, SIM_TOOLKIT_ENABLE_DEDICATED = 6, SIM_TOOLKIT_DISABLE_DEDICATED = 7, SIM_TOOLKIT_ENABLE_RAW = 9, FAST_SAFE_POWER_OFF = 10, //SILENT_RESET_WITHOUT_SIM = 15, // Not supported on SARA-R5 SILENT_RESET_WITH_SIM = 16 //MINIMUM_FUNCTIONALITY = 19, // Not supported on SARA-R5 //DEEP_LOW_POWER_STATE = 127 // Not supported on SARA-R5 } SARA_R5_functionality_t; class SARA_R5 : public Print { public: // Constructor // The library will use the powerPin and resetPin (if provided) to power the module off/on and perform an emergency reset // maxInitTries sets the maximum number of initialization attempts. .init is called by .begin. SARA_R5(int powerPin = SARA_R5_POWER_PIN, int resetPin = SARA_R5_RESET_PIN, uint8_t maxInitTries = 9); ~SARA_R5(); // Begin -- initialize module and ensure it's connected #ifdef SARA_R5_SOFTWARE_SERIAL_ENABLED bool begin(SoftwareSerial &softSerial, unsigned long baud = 9600); #endif bool begin(HardwareSerial &hardSerial, unsigned long baud = 9600, bool doBegin = true); // Debug prints void enableDebugging(Print &debugPort = Serial); //Turn on debug printing. If user doesn't specify then Serial will be used. void enableAtDebugging(Print &debugPort = Serial); //Turn on AT debug printing. If user doesn't specify then Serial will be used. // Invert the polarity of the power pin - if required // Normally the SARA's power pin is pulled low and released to toggle the power // But the Asset Tracker needs this to be pulled high and released instead void invertPowerPin(bool invert = false); SARA_R5_error_t modulePowerOff(void); // Graceful disconnect and shutdown using +CPWROFF. void modulePowerOn(void); // Requires access to the PWR_ON pin // Loop polling and polling setup - process URC's etc. from the module // This function was originally written by Matthew Menze for the LTE Shield (SARA-R4) library // See: https://github.com/sparkfun/SparkFun_LTE_Shield_Arduino_Library/pull/8 // It does the same job as ::poll but also processes any 'old' data stored in the backlog first // It also has a built-in timeout - which ::poll does not // Use this - it is way better than ::poll. Thank you Matthew! bool bufferedPoll(void); // This is the original poll function. // It is 'blocking' - it does not return when serial data is available until it receives a `\n`. // ::bufferedPoll is the new improved version. It processes any data in the backlog and includes a timeout. // Retained for backward-compatibility and just in case you do want to (temporarily) ignore any data in the backlog bool poll(void); // Callbacks (called during polling) void setSocketListenCallback(void (*socketListenCallback)(int, IPAddress, unsigned int, int, IPAddress, unsigned int)); // listen Socket, local IP Address, listen Port, socket, remote IP Address, port // This is the original read socket callback - called when a +UUSORD or +UUSORF URC is received // It works - and handles binary data correctly - but the remote IP Address and Port are lost for UDP connections // setSocketReadCallbackPlus is preferred! void setSocketReadCallback(void (*socketReadCallback)(int, String)); // socket, read data void setSocketReadCallbackPlus(void (*socketReadCallbackPlus)(int, const char *, int, IPAddress, int)); // socket, read data, length, remoteAddress, remotePort void setSocketCloseCallback(void (*socketCloseCallback)(int)); // socket void setGpsReadCallback(void (*gpsRequestCallback)(ClockData time, PositionData gps, SpeedData spd, unsigned long uncertainty)); void setSIMstateReportCallback(void (*simStateRequestCallback)(SARA_R5_sim_states_t state)); void setPSDActionCallback(void (*psdActionRequestCallback)(int result, IPAddress ip)); void setPingCallback(void (*pingRequestCallback)(int retry, int p_size, String remote_hostname, IPAddress ip, int ttl, long rtt)); void setHTTPCommandCallback(void (*httpCommandRequestCallback)(int profile, int command, int result)); void setMQTTCommandCallback(void (*mqttCommandRequestCallback)(int command, int result)); SARA_R5_error_t setRegistrationCallback(void (*registrationCallback)(SARA_R5_registration_status_t status, unsigned int lac, unsigned int ci, int Act)); SARA_R5_error_t setEpsRegistrationCallback(void (*epsRegistrationCallback)(SARA_R5_registration_status_t status, unsigned int tac, unsigned int ci, int Act)); // Direct write/print to cell serial port virtual size_t write(uint8_t c); virtual size_t write(const char *str); virtual size_t write(const char *buffer, size_t size); // General AT Commands SARA_R5_error_t at(void); SARA_R5_error_t enableEcho(bool enable = true); String getManufacturerID(void); String getModelID(void); String getFirmwareVersion(void); String getSerialNo(void); String getIMEI(void); String getIMSI(void); String getCCID(void); String getSubscriberNo(void); String getCapabilities(void); // Control and status AT commands SARA_R5_error_t reset(void); String clock(void); // TODO: Return a clock struct SARA_R5_error_t clock(uint8_t *y, uint8_t *mo, uint8_t *d, uint8_t *h, uint8_t *min, uint8_t *s, int8_t *tz); // TZ can be +/- and is in increments of 15 minutes. -28 == 7 hours behind UTC/GMT SARA_R5_error_t setClock(String theTime); SARA_R5_error_t setClock(uint8_t y, uint8_t mo, uint8_t d, uint8_t h, uint8_t min, uint8_t s, int8_t tz); // TZ can be +/- and is in increments of 15 minutes. -28 == 7 hours behind UTC/GMT void autoTimeZoneForBegin(bool enable = true); // Call autoTimeZoneForBegin(false) _before_ .begin if you want to disable the automatic time zone SARA_R5_error_t autoTimeZone(bool enable); // Enable/disable automatic time zone adjustment SARA_R5_error_t setUtimeMode(SARA_R5_utime_mode_t mode = SARA_R5_UTIME_MODE_PPS, SARA_R5_utime_sensor_t sensor = SARA_R5_UTIME_SENSOR_GNSS_LTE); // Time mode, source etc. (+UTIME) SARA_R5_error_t getUtimeMode(SARA_R5_utime_mode_t *mode, SARA_R5_utime_sensor_t *sensor); SARA_R5_error_t setUtimeIndication(SARA_R5_utime_urc_configuration_t config = SARA_R5_UTIME_URC_CONFIGURATION_ENABLED); // +UTIMEIND SARA_R5_error_t getUtimeIndication(SARA_R5_utime_urc_configuration_t *config); SARA_R5_error_t setUtimeConfiguration(int32_t offsetNanoseconds = 0, int32_t offsetSeconds = 0); // +UTIMECFG SARA_R5_error_t getUtimeConfiguration(int32_t *offsetNanoseconds, int32_t *offsetSeconds); // Network service AT commands int8_t rssi(void); // Receive signal strength SARA_R5_registration_status_t registration(bool eps = true); bool setNetworkProfile(mobile_network_operator_t mno, bool autoReset = false, bool urcNotification = false); mobile_network_operator_t getNetworkProfile(void); typedef enum { PDP_TYPE_INVALID = -1, PDP_TYPE_IP = 0, PDP_TYPE_NONIP = 1, PDP_TYPE_IPV4V6 = 2, PDP_TYPE_IPV6 = 3 } SARA_R5_pdp_type; SARA_R5_error_t setAPN(String apn, uint8_t cid = 1, SARA_R5_pdp_type pdpType = PDP_TYPE_IP); // Set the Access Point Name SARA_R5_error_t getAPN(int cid, String *apn, IPAddress *ip, SARA_R5_pdp_type* pdpType = NULL); // Return the apn and IP address for the chosen context identifier SARA_R5_error_t getSimStatus(String* code); SARA_R5_error_t setSimPin(String pin); // SIM // Status report Mode: // Bit States reported // 0 Reports the (U)SIM initialization status ('s from 0 to 6 may be reported) // 1 Reports the (U)SIM phonebook initialization status ('s from 7 to 8 may be reported) // 2 Reports the (U)SIM toolkit REFRESH proactive command execution result ('s from 9 to 13 may be reported) // Note: For the SARA-R5: =7, 8, 9, 10, 11, 12 and 13 are not reported. SARA_R5_error_t setSIMstateReportingMode(int mode); SARA_R5_error_t getSIMstateReportingMode(int *mode); typedef enum { L2P_DEFAULT, L2P_PPP, L2P_M_HEX, L2P_M_RAW_IP, L2P_M_OPT_PPP } SARA_R5_l2p_t; SARA_R5_error_t enterPPP(uint8_t cid = 1, char dialing_type_char = 0, unsigned long dialNumber = 99, SARA_R5_l2p_t l2p = L2P_DEFAULT); uint8_t getOperators(struct operator_stats *op, int maxOps = 3); SARA_R5_error_t registerOperator(struct operator_stats oper); SARA_R5_error_t automaticOperatorSelection(); SARA_R5_error_t getOperator(String *oper); SARA_R5_error_t deregisterOperator(void); // SMS -- Short Messages Service SARA_R5_error_t setSMSMessageFormat(SARA_R5_message_format_t textMode = SARA_R5_MESSAGE_FORMAT_TEXT); SARA_R5_error_t sendSMS(String number, String message); SARA_R5_error_t getPreferredMessageStorage(int *used, int *total, String memory = "ME"); SARA_R5_error_t readSMSmessage(int location, String *unread, String *from, String *dateTime, String *message); SARA_R5_error_t deleteSMSmessage(int location, int deleteFlag = 0); // Default to deleting the single message at the specified location SARA_R5_error_t deleteReadSMSmessages(void) { return (deleteSMSmessage( 1, 1 )); }; // Delete all the read messages from preferred storage SARA_R5_error_t deleteReadSentSMSmessages(void) { return (deleteSMSmessage( 1, 2 )); }; // Delete the read and sent messages from preferred storage SARA_R5_error_t deleteReadSentUnsentSMSmessages(void) { return (deleteSMSmessage( 1, 3 )); }; // Delete the read, sent and unsent messages from preferred storage SARA_R5_error_t deleteAllSMSmessages(void) { return (deleteSMSmessage( 1, 4 )); }; // Delete the read, sent, unsent and unread messages from preferred storage // V24 Control and V25ter (UART interface) AT commands SARA_R5_error_t setBaud(unsigned long baud); SARA_R5_error_t setFlowControl(SARA_R5_flow_control_t value = SARA_R5_ENABLE_FLOW_CONTROL); // GPIO // GPIO pin map typedef enum { GPIO1 = 16, GPIO2 = 23, GPIO3 = 24, GPIO4 = 25, GPIO5 = 42, GPIO6 = 19 } SARA_R5_gpio_t; // GPIO pin modes typedef enum { GPIO_MODE_INVALID = -1, GPIO_OUTPUT = 0, GPIO_INPUT, NETWORK_STATUS, GNSS_SUPPLY_ENABLE, GNSS_DATA_READY, GNSS_RTC_SHARING, JAMMING_DETECTION, SIM_CARD_DETECTION, HEADSET_DETECTION, GSM_TX_BURST_INDICATION, MODULE_STATUS_INDICATION, MODULE_OPERATING_MODE_INDICATION, I2S_DIGITAL_AUDIO_INTERFACE, SPI_SERIAL_INTERFACE, MASTER_CLOCK_GENRATION, UART_INTERFACE, WIFI_ENABLE, RING_INDICATION = 18, LAST_GASP_ENABLE, EXTERNAL_GNSS_ANTENNA, TIME_PULSE_GNSS, TIME_PULSE_OUTPUT, TIMESTAMP, FAST_POWER_OFF, LWM2M_PULSE, HARDWARE_FLOW_CONTROL, ANTENNA_TUNING, EXT_GNSS_TIME_PULSE, EXT_GNSS_TIMESTAMP, DTR_MODE, KHZ_32768_OUT = 32, PAD_DISABLED = 255 } SARA_R5_gpio_mode_t; SARA_R5_error_t setGpioMode(SARA_R5_gpio_t gpio, SARA_R5_gpio_mode_t mode, int value = 0); SARA_R5_gpio_mode_t getGpioMode(SARA_R5_gpio_t gpio); // IP Transport Layer int socketOpen(SARA_R5_socket_protocol_t protocol, unsigned int localPort = 0); // Open a socket. Returns the socket number. SARA_R5_error_t socketClose(int socket, unsigned long timeout = SARA_R5_2_MIN_TIMEOUT); // Close the socket SARA_R5_error_t socketConnect(int socket, const char *address, unsigned int port); // TCP - connect to a remote IP Address using the specified port. Not required for UDP sockets. SARA_R5_error_t socketConnect(int socket, IPAddress address, unsigned int port); // Write data to the specified socket. Works with binary data - but you must specify the data length when using the const char * version // Works with both TCP and UDP sockets - but socketWriteUDP is preferred for UDP and doesn't require socketOpen to be called first SARA_R5_error_t socketWrite(int socket, const char *str, int len = -1); SARA_R5_error_t socketWrite(int socket, String str); // OK for binary data // Write UDP data to the specified IP Address and port. // Works with binary data - but you must specify the data length when using the const char * versions // If you let len default to -1, strlen is used to calculate the data length - and will be incorrect for binary data SARA_R5_error_t socketWriteUDP(int socket, const char *address, int port, const char *str, int len = -1); SARA_R5_error_t socketWriteUDP(int socket, IPAddress address, int port, const char *str, int len = -1); SARA_R5_error_t socketWriteUDP(int socket, String address, int port, String str); // Read data from the specified socket // Call socketReadAvailable first to determine how much data is available - or use the callbacks (triggered by URC's) // Works for both TCP and UDP - but socketReadUDP is preferred for UDP as it records the remote IP Address and port // bytesRead - if provided - will be updated with the number of bytes actually read. This could be less than length! SARA_R5_error_t socketRead(int socket, int length, char *readDest, int *bytesRead = NULL); // Return the number of bytes available (waiting to be read) on the chosen socket // Uses +USORD. Valid for both TCP and UDP sockets - but socketReadAvailableUDP is preferred for UDP SARA_R5_error_t socketReadAvailable(int socket, int *length); // Read data from the specified UDP port // Call socketReadAvailableUDP first to determine how much data is available - or use the callbacks (triggered by URC's) // The remote IP Address and port are returned via *remoteIPAddress and *remotePort (if not NULL) // bytesRead - if provided - will be updated with the number of bytes actually read. This could be less than length! SARA_R5_error_t socketReadUDP(int socket, int length, char *readDest, IPAddress *remoteIPAddress = NULL, int *remotePort = NULL, int *bytesRead = NULL); // Return the number of bytes available (waiting to be read) on the chosen UDP socket SARA_R5_error_t socketReadAvailableUDP(int socket, int *length); // Start listening for a connection on the specified port. The connection is reported via the socket listen callback SARA_R5_error_t socketListen(int socket, unsigned int port); // Place the socket into direct link mode - making it easy to transfer binary data. Wait two seconds and then send +++ to exit the link. SARA_R5_error_t socketDirectLinkMode(int socket); // Configure when direct link data is sent SARA_R5_error_t socketDirectLinkTimeTrigger(int socket, unsigned long timerTrigger); SARA_R5_error_t socketDirectLinkDataLengthTrigger(int socket, int dataLengthTrigger); SARA_R5_error_t socketDirectLinkCharacterTrigger(int socket, int characterTrigger); SARA_R5_error_t socketDirectLinkCongestionTimer(int socket, unsigned long congestionTimer); // Use +USOCTL (Socket control) to query the socket parameters SARA_R5_error_t querySocketType(int socket, SARA_R5_socket_protocol_t *protocol); SARA_R5_error_t querySocketLastError(int socket, int *error); SARA_R5_error_t querySocketTotalBytesSent(int socket, uint32_t *total); SARA_R5_error_t querySocketTotalBytesReceived(int socket, uint32_t *total); SARA_R5_error_t querySocketRemoteIPAddress(int socket, IPAddress *address, int *port); SARA_R5_error_t querySocketStatusTCP(int socket, SARA_R5_tcp_socket_status_t *status); SARA_R5_error_t querySocketOutUnackData(int socket, uint32_t *total); // Return the most recent socket error int socketGetLastError(); // Return the remote IP Address from the most recent socket listen indication (socket connection) // Use the socket listen callback to get the full address and port information IPAddress lastRemoteIP(void); // Ping SARA_R5_error_t ping(String remote_host, int retry = 4, int p_size = 32, unsigned long timeout = 5000, int ttl = 32); // HTTP SARA_R5_error_t resetHTTPprofile(int profile); // Reset the HTTP profile. Note: The configured HTTP profile parameters are not saved in the non volatile memory. SARA_R5_error_t setHTTPserverIPaddress(int profile, IPAddress address); // Default: empty string SARA_R5_error_t setHTTPserverName(int profile, String server); // Default: empty string SARA_R5_error_t setHTTPusername(int profile, String username); // Default: empty string SARA_R5_error_t setHTTPpassword(int profile, String password); // Default: empty string SARA_R5_error_t setHTTPauthentication(int profile, bool authenticate); // Default: no authentication SARA_R5_error_t setHTTPserverPort(int profile, int port); // Default: 80 SARA_R5_error_t setHTTPcustomHeader(int profile, String header); // Default: format 0:Content-Type:application/json" SARA_R5_error_t setHTTPsecure(int profile, bool secure, int secprofile = -1); // Default: disabled (HTTP on port 80). Set to true for HTTPS on port 443 // TO DO: Add custom request headers SARA_R5_error_t getHTTPprotocolError(int profile, int *error_class, int *error_code); // Read the most recent HTTP protocol error for this profile SARA_R5_error_t sendHTTPGET(int profile, String path, String responseFilename); SARA_R5_error_t sendHTTPPOSTdata(int profile, String path, String responseFilename, String data, SARA_R5_http_content_types_t httpContentType); SARA_R5_error_t sendHTTPPOSTfile(int profile, String path, String responseFilename, String requestFile, SARA_R5_http_content_types_t httpContentType); SARA_R5_error_t nvMQTT(SARA_R5_mqtt_nv_parameter_t parameter); SARA_R5_error_t setMQTTclientId(String clientId); SARA_R5_error_t setMQTTserver(String serverName, int port); SARA_R5_error_t setMQTTsecure(bool secure, int secprofile = -1); SARA_R5_error_t connectMQTT(void); SARA_R5_error_t disconnectMQTT(void); SARA_R5_error_t subscribeMQTTtopic(int max_Qos, String topic); SARA_R5_error_t unsubscribeMQTTtopic(String topic); SARA_R5_error_t readMQTT(int* pQos, String* pTopic, uint8_t *readDest, int readLength, int *bytesRead); SARA_R5_error_t getMQTTprotocolError(int *error_code, int *error_code2); // Configure security profiles SARA_R5_error_t resetSecurityProfile(int secprofile); SARA_R5_error_t configSecurityProfileString(int secprofile, SARA_R5_sec_profile_parameter_t parameter, String value); SARA_R5_error_t configSecurityProfile(int secprofile, SARA_R5_sec_profile_parameter_t parameter, int value); SARA_R5_error_t setSecurityManager(SARA_R5_sec_manager_opcode_t opcode, SARA_R5_sec_manager_parameter_t parameter, String name, String data); // Packet Switched Data // Configure the PDP using +UPSD. See SARA_R5_pdp_configuration_parameter_t for the list of parameters: protocol, APN, username, DNS, etc. SARA_R5_error_t setPDPconfiguration(int profile, SARA_R5_pdp_configuration_parameter_t parameter, int value); // Set parameters in the chosen PSD profile SARA_R5_error_t setPDPconfiguration(int profile, SARA_R5_pdp_configuration_parameter_t parameter, SARA_R5_pdp_protocol_type_t value); // Set parameters in the chosen PSD profile SARA_R5_error_t setPDPconfiguration(int profile, SARA_R5_pdp_configuration_parameter_t parameter, String value); // Set parameters in the chosen PSD profile SARA_R5_error_t setPDPconfiguration(int profile, SARA_R5_pdp_configuration_parameter_t parameter, IPAddress value); // Set parameters in the chosen PSD profile SARA_R5_error_t performPDPaction(int profile, SARA_R5_pdp_actions_t action); // Performs the requested action for the specified PSD profile: reset, store, load, activate, deactivate SARA_R5_error_t activatePDPcontext(bool status, int cid = -1); // Activates or deactivates the specified PDP context. Default to all (cid = -1) SARA_R5_error_t getNetworkAssignedIPAddress(int profile, IPAddress *address); // Get the dynamic IP address assigned during PDP context activation // GPS typedef enum { GNSS_SYSTEM_GPS = 1, GNSS_SYSTEM_SBAS = 2, GNSS_SYSTEM_GALILEO = 4, GNSS_SYSTEM_BEIDOU = 8, GNSS_SYSTEM_IMES = 16, GNSS_SYSTEM_QZSS = 32, GNSS_SYSTEM_GLONASS = 64 } gnss_system_t; typedef enum { GNSS_AIDING_MODE_NONE = 0, GNSS_AIDING_MODE_AUTOMATIC = 1, GNSS_AIDING_MODE_ASSISTNOW_OFFLINE = 2, GNSS_AIDING_MODE_ASSISTNOW_ONLINE = 4, GNSS_AIDING_MODE_ASSISTNOW_AUTONOMOUS = 8 } gnss_aiding_mode_t; bool isGPSon(void); SARA_R5_error_t gpsPower(bool enable = true, gnss_system_t gnss_sys = GNSS_SYSTEM_GPS, gnss_aiding_mode_t gnss_aiding = GNSS_AIDING_MODE_AUTOMATIC); //SARA_R5_error_t gpsEnableClock(bool enable = true); //SARA_R5_error_t gpsGetClock(struct ClockData *clock); //SARA_R5_error_t gpsEnableFix(bool enable = true); //SARA_R5_error_t gpsGetFix(float *lat, float *lon, unsigned int *alt, uint8_t *quality, uint8_t *sat); //SARA_R5_error_t gpsGetFix(struct PositionData *pos); //SARA_R5_error_t gpsEnablePos(bool enable = true); //SARA_R5_error_t gpsGetPos(struct PositionData *pos); //SARA_R5_error_t gpsEnableSat(bool enable = true); //SARA_R5_error_t gpsGetSat(uint8_t *sats); SARA_R5_error_t gpsEnableRmc(bool enable = true); // Enable GPRMC messages SARA_R5_error_t gpsGetRmc(struct PositionData *pos, struct SpeedData *speed, struct ClockData *clk, bool *valid); //Parse a GPRMC message //SARA_R5_error_t gpsEnableSpeed(bool enable = true); //SARA_R5_error_t gpsGetSpeed(struct SpeedData *speed); SARA_R5_error_t gpsRequest(unsigned int timeout, uint32_t accuracy, bool detailed = true, unsigned int sensor = 3); //CellLocate SARA_R5_error_t gpsAidingServerConf(const char *primaryServer, const char *secondaryServer, const char *authToken, unsigned int days = 14, unsigned int period = 4, unsigned int resolution = 1, unsigned int gnssTypes = 65, unsigned int mode = 0, unsigned int dataType = 15); // File system // TO DO: add full support for file tags. Default tag to USER SARA_R5_error_t getFileContents(String filename, String *contents); // OK for text files. But will fail with binary files (containing \0) on some platforms. SARA_R5_error_t getFileContents(String filename, char *contents); // OK for binary files. Make sure contents can hold the entire file. Get the size first with getFileSize. // Append data to a file, delete file first to not appends the data. SARA_R5_error_t appendFileContents(String filename, String str); SARA_R5_error_t appendFileContents(String filename, const char *str, int len); SARA_R5_error_t getFileSize(String filename, int *size); SARA_R5_error_t deleteFile(String filename); // Functionality SARA_R5_error_t functionality(SARA_R5_functionality_t function = FULL_FUNCTIONALITY); // Send a custom command with an expected (potentially partial) response, store entire response SARA_R5_error_t sendCustomCommandWithResponse(const char *command, const char *expectedResponse, char *responseDest, unsigned long commandTimeout = SARA_R5_STANDARD_RESPONSE_TIMEOUT, bool at = true); private: HardwareSerial *_hardSerial; #ifdef SARA_R5_SOFTWARE_SERIAL_ENABLED SoftwareSerial *_softSerial; #endif Print *_debugPort; //The stream to send debug messages to if enabled. Usually Serial. bool _printDebug = false; //Flag to print debugging variables Print *_debugAtPort; //The stream to send debug messages to if enabled. Usually Serial. bool _printAtDebug = false; //Flag to print debugging variables int _powerPin; int _resetPin; bool _invertPowerPin = false; unsigned long _baud; IPAddress _lastRemoteIP; IPAddress _lastLocalIP; uint8_t _maxInitTries; bool _autoTimeZoneForBegin = true; bool _bufferedPollReentrant = false; // Prevent reentry of bufferedPoll - just in case it gets called from a callback bool _pollReentrant = false; // Prevent reentry of poll - just in case it gets called from a callback #define _RXBuffSize 2056 const unsigned long _rxWindowMillis = 2; // 1ms is not quite long enough for a single char at 9600 baud. millis roll over much less often than micros. See notes in .cpp re. ESP32! char *_saraRXBuffer; // Allocated in SARA_R5::begin char *_pruneBuffer; char *_saraResponseBacklog; int _saraResponseBacklogLength = 0; // The backlog could contain binary data so we can't use strlen to find its length void (*_socketListenCallback)(int, IPAddress, unsigned int, int, IPAddress, unsigned int); void (*_socketReadCallback)(int, String); void (*_socketReadCallbackPlus)(int, const char *, int, IPAddress, int); // socket, data, length, remoteAddress, remotePort void (*_socketCloseCallback)(int); void (*_gpsRequestCallback)(ClockData, PositionData, SpeedData, unsigned long); void (*_simStateReportCallback)(SARA_R5_sim_states_t); void (*_psdActionRequestCallback)(int, IPAddress); void (*_pingRequestCallback)(int, int, String, IPAddress, int, long); void (*_httpCommandRequestCallback)(int, int, int); void (*_mqttCommandRequestCallback)(int, int); void (*_registrationCallback)(SARA_R5_registration_status_t status, unsigned int lac, unsigned int ci, int Act); void (*_epsRegistrationCallback)(SARA_R5_registration_status_t status, unsigned int tac, unsigned int ci, int Act); int _lastSocketProtocol[SARA_R5_NUM_SOCKETS]; // Record the protocol for each socket to avoid having to call querySocketType in parseSocketReadIndication typedef enum { SARA_R5_INIT_STANDARD, SARA_R5_INIT_AUTOBAUD, SARA_R5_INIT_RESET } SARA_R5_init_type_t; SARA_R5_error_t init(unsigned long baud, SARA_R5_init_type_t initType = SARA_R5_INIT_STANDARD); void powerOn(void); // Brief pulse on PWR_ON to turn module back on void powerOff(void); // Long pulse on PWR_ON to do a graceful shutdown. Note modulePowerOff (+CPWROFF) is preferred. void hwReset(void); SARA_R5_error_t setMNOprofile(mobile_network_operator_t mno, bool autoReset = false, bool urcNotification = false); SARA_R5_error_t getMNOprofile(mobile_network_operator_t *mno); // Wait for an expected response (don't send a command) SARA_R5_error_t waitForResponse(const char *expectedResponse, const char *expectedError, uint16_t timeout); // Send command with an expected (potentially partial) response, store entire response SARA_R5_error_t sendCommandWithResponse(const char *command, const char *expectedResponse, char *responseDest, unsigned long commandTimeout, int destSize = minimumResponseAllocation, bool at = true); // Send a command -- prepend AT if at is true void sendCommand(const char *command, bool at); const int _saraR5maxSocketRead = 1024; // The limit on bytes that can be read in a single read SARA_R5_error_t parseSocketReadIndication(int socket, int length); SARA_R5_error_t parseSocketReadIndicationUDP(int socket, int length); SARA_R5_error_t parseSocketListenIndication(int listeningSocket, IPAddress localIP, unsigned int listeningPort, int socket, IPAddress remoteIP, unsigned int port); SARA_R5_error_t parseSocketCloseIndication(String *closeIndication); // UART Functions size_t hwPrint(const char *s); size_t hwWriteData(const char *buff, int len); size_t hwWrite(const char c); int readAvailable(char *inString); char readChar(void); int hwAvailable(void); void beginSerial(unsigned long baud); void setTimeout(unsigned long timeout); bool find(char *target); SARA_R5_error_t autobaud(unsigned long desiredBaud); char *sara_r5_calloc_char(size_t num); bool processURCEvent(const char *event); void pruneBacklog(void); // GPS Helper functions char *readDataUntil(char *destination, unsigned int destSize, char *source, char delimiter); bool parseGPRMCString(char *rmcString, PositionData *pos, ClockData *clk, SpeedData *spd); }; #endif //SPARKFUN_SARA_R5_ARDUINO_LIBRARY_H