Base class for the u-blox N2xx modems. Cannot be used standalone, only inherited by classes that do properly useful stuff. Or, to put it another way, if you are using any of the classes ending with 'n2xx', you will need this class also. Note: requires the N211 module firmware to be at least 06.57 A01.02.

Dependents:   example-ublox-cellular-interface HelloMQTT example-ublox-cellular-interface_r410M example-ublox-mbed-client ... more

Files at this revision

API Documentation at this revision

Comitter:
philware
Date:
Tue Jan 09 14:35:43 2018 +0000
Parent:
9:4368e434de4e
Commit message:
Added new imei() imsi() type functions

Changed in this revision

UbloxCellularBaseN2xx.cpp Show annotated file Show diff for this revision Revisions of this file
UbloxCellularBaseN2xx.h Show annotated file Show diff for this revision Revisions of this file
--- a/UbloxCellularBaseN2xx.cpp	Tue Jan 09 15:25:11 2018 +0500
+++ b/UbloxCellularBaseN2xx.cpp	Tue Jan 09 14:35:43 2018 +0000
@@ -29,6 +29,27 @@
 
 #define ATOK _at->recv("OK")
 
+/* Array to convert the 3G qual number into a median EC_NO_LEV number.
+ */
+                            /* 0   1   2   3   4   5   6  7 */
+const int qualConvert3G[] = {44, 41, 35, 29, 23, 17, 11, 7};
+ 
+/* Array to convert the 3G "rssi" number into a dBm RSCP value rounded up to the
+ * nearest whole number.
+ */
+const int rscpConvert3G[] = {-108, -105, -103, -100,  -98,  -96,  -94,  -93,   /* 0 - 7 */
+                              -91,  -89,  -88,  -85,  -83,  -80,  -78,  -76,   /* 8 - 15 */
+                              -74,  -73,  -70,  -68,  -66,  -64,  -63,  -60,   /* 16 - 23 */
+                              -58,  -56,  -54,  -53,  -51,  -49,  -48,  -46};  /* 24 - 31 */
+ 
+/* Array to convert the LTE rssi number into a dBm value rounded up to the
+ * nearest whole number.
+ */
+const int rssiConvertLte[] = {-118, -115, -113, -110, -108, -105, -103, -100,   /* 0 - 7 */
+                               -98,  -95,  -93,  -90,  -88,  -85,  -83,  -80,   /* 8 - 15 */
+                               -78,  -76,  -74,  -73,  -71,  -69,  -68,  -65,   /* 16 - 23 */
+                               -63,  -61,  -60,  -59,  -58,  -55,  -53,  -48};  /* 24 - 31 */
+
 /**********************************************************************
  * PRIVATE METHODS
  **********************************************************************/
@@ -553,12 +574,19 @@
     if (_at == NULL) {
         if (_debug_trace_on == false) {
             _debug_trace_on = debug_on;
-        }
+        }                
 
         // Set up File Handle for buffered serial comms with cellular module
         // (which will be used by the AT parser)
+        // Note: the UART is initialised to run no faster than 115200 because
+        // the modems cannot reliably auto-baud at faster rates.  The faster
+        // rate is adopted later with a specific AT command and the
+        // UARTSerial rate is adjusted at that time
+        if (baud > 115200) {
+            baud = 115200;
+        }
         _fh = new UARTSerial(tx, rx, baud);
-
+        
         // Set up the AT parser
         _at = new ATCmdParser(_fh, OUTPUT_ENTER_KEY, AT_PARSER_BUFFER_SIZE,
                            _at_timeout, _debug_trace_on);
@@ -884,5 +912,93 @@
 
     return count;
 }
+
+// Get the IMEI of the module.
+const char *UbloxCellularBaseN2xx::imei()
+{
+    return _dev_info.imei;
+}
+ 
+// Get the Mobile Equipment ID (which may be the same as the IMEI).
+const char *UbloxCellularBaseN2xx::meid()
+{
+    return _dev_info.meid;
+}
+ 
+// Get the IMSI of the SIM.
+const char *UbloxCellularBaseN2xx::imsi()
+{
+    // (try) to update the IMSI, just in case the SIM has changed
+    get_imsi();
+    
+    return _dev_info.imsi;
+}
+ 
+// Get the ICCID of the SIM.
+const char *UbloxCellularBaseN2xx::iccid()
+{
+    // (try) to update the ICCID, just in case the SIM has changed
+    get_iccid();
+    
+    return _dev_info.iccid;
+}
+
+// Get the RSSI in dBm.
+int UbloxCellularBaseN2xx::rssi()
+{
+    char buf[7] = {0};
+    int rssi = 0;
+    int qual = 0;
+    int rssiRet = 0;
+    bool success;
+    LOCK();
+ 
+    MBED_ASSERT(_at != NULL);
+ 
+    success = _at->send("AT+CSQ") && _at->recv("+CSQ: %6[^\n]\nOK\n", buf);
+ 
+    if (success) {
+        if (sscanf(buf, "%d,%d", &rssi, &qual) == 2) {
+            // AT+CSQ returns a coded RSSI value and an RxQual value
+            // For 2G an RSSI of 0 corresponds to -113 dBm or less, 
+            // an RSSI of 31 corresponds to -51 dBm or less and hence
+            // each value is a 2 dB step.
+            // For LTE the mapping is defined in the array rssiConvertLte[].
+            // For 3G the mapping to RSCP is defined in the array rscpConvert3G[]
+            // and the RSSI value is then RSCP - the EC_NO_LEV number derived
+            // by putting the qual number through qualConvert3G[].
+            if ((rssi >= 0) && (rssi <= 31)) {
+                switch (_dev_info.rat) {
+                    case UTRAN:
+                    case HSDPA:
+                    case HSUPA:
+                    case HSDPA_HSUPA:
+                        // 3G
+                        if ((qual >= 0) && (qual <= 7)) {
+                            qual = qualConvert3G[qual];
+                        }
+                        rssiRet = rscpConvert3G[rssi];
+                        rssiRet -= qual;
+                        break;
+                    case LTE:
+                        // LTE
+                        rssiRet = rssiConvertLte[rssi];
+                        break;
+                    case GSM:
+                    case COMPACT_GSM:
+                    case EDGE:
+                    default:
+                        // GSM or assumed GSM if the RAT is not known
+                        rssiRet = -(113 - (rssi << 2));
+                        break;
+                }
+            }
+        }
+    }
+ 
+    UNLOCK();
+    return rssiRet;
+}
+
 // End of File
 
--- a/UbloxCellularBaseN2xx.h	Tue Jan 09 15:25:11 2018 +0500
+++ b/UbloxCellularBaseN2xx.h	Tue Jan 09 14:35:43 2018 +0000
@@ -230,7 +230,40 @@
     *
     * @return true if successful, otherwise false.
     */
+    MBED_DEPRECATED("This method is now replaced by const char * imei(), please use that instead")
     bool get_imei(char *buffer, int size);
+    
+        /** Get the IMEI of the module.
+     *
+     * @return a pointer to the IMEI as a null-terminated string.
+     */
+    const char *imei();
+ 
+    /** Get the Mobile Equipment ID (which may be the same as the IMEI).
+     *
+     * @return a pointer to the Mobile Equipment ID as a null-terminated string.
+     */
+    const char *meid();
+ 
+    /** Get the IMSI of the SIM.
+     *
+     * @return a pointer to the IMSI as a null-terminated string.
+     */
+    const char *imsi();
+ 
+    /** Get the ICCID of the SIM.
+     *
+     * @return a pointer to the ICCID as a null-terminated string.
+     */
+    const char *iccid();
+ 
+    /** Get the RSSI.
+     *
+     * @return the RSSI in dBm. If it is not possible to obtain an
+     *         RSSI reading at the time (e.g. because the modem is in
+     *         data mode rather than AT command mode) then 0 is returned.
+     */
+    int rssi();
 
 protected: