support library for C027 helper functions for Buffer Pipes, Buffered Serial Port (rtos capable) and GPS parsing. It includes modem APIs for USSD, SMS and Sockets.

Dependents:   HTTPClient_Cellular_HelloWorld Cellular_HelloMQTT MbedSmartRestMain Car_Bon_car_module ... more

This library is intended to be used with u-blox products such as the C027 or a shield with u-blox cellular and GPS modules like the cellular and positioning shield from Embedded Artist.

For 2G/GSM and 3G/UMTS you need to:

  • have a SIM card and know its PIN number
  • need to know you network operators APN setting These setting should be passed to the connect or init and join functions. You can also extend the APN database in MDMAPN.h.

For CDMA products you need to make sure that you have provisioned and activated the modem with either Sprint or Verizon.

Revision:
52:8071747a7cb3
Parent:
50:d76aece8038f
Child:
53:cb0d94b9de3a
Child:
54:7ba8e4c218e2
--- a/MDM.cpp	Mon May 12 07:09:31 2014 +0000
+++ b/MDM.cpp	Mon May 12 07:39:29 2014 +0000
@@ -82,7 +82,7 @@
             int type = TYPE(ret);
             const char* s = (type == TYPE_UNKNOWN)? YEL("UNK") : 
                             (type == TYPE_TEXT)   ? MAG("TXT") : 
-                            (type == TYPE_OK   )  ? GRE("OK ") : 
+                            (type == TYPE_RESP_OK   )  ? GRE("RESP_OK ") : 
                             (type == TYPE_ERROR)  ? RED("ERR") : 
                             (type == TYPE_PLUS)   ? CYA(" + ") : 
                             (type == TYPE_PROMPT) ? BLU(" > ") : 
@@ -95,9 +95,9 @@
         if ((ret != WAIT) && (ret != NOT_FOUND))
         {
             int type = TYPE(ret);
-            if (type == TYPE_OK)        return OK;
-            if (type == TYPE_ERROR)     return ERROR;
-            if (type == TYPE_PROMPT)    return PROMPT;
+            if (type == TYPE_OK)        return RESP_OK;
+            if (type == TYPE_ERROR)     return RESP_ERROR;
+            if (type == TYPE_PROMPT)    return RESP_PROMPT;
             // handle unsolicited commands here
             if (type == TYPE_PLUS) {
                 const char* cmd = buf+3;
@@ -207,27 +207,27 @@
     while (i--) {
         // check interface and disable local echo
         sendFormated("AT\r\n");
-        if(OK == waitFinalResp())
+        if(RESP_OK == waitFinalResp())
             break;
     }
     if (i < 0)
         return false;
     // echo off
     sendFormated("AT E0\r\n");
-    if(OK != waitFinalResp())
+    if(RESP_OK != waitFinalResp())
         return false;
     // enable verbose error messages
     sendFormated("AT+CMEE=2\r\n");
-    if(OK != waitFinalResp())
+    if(RESP_OK != waitFinalResp())
         return false;
     // set baud rate
     sendFormated("AT+IPR=115200\r\n");
-    if (OK != waitFinalResp())
+    if (RESP_OK != waitFinalResp())
         return false;
     wait_ms(40);
     // identify the module 
     sendFormated("ATI\r\n");
-    if (OK != waitFinalResp(_cbATI, &_dev.dev))
+    if (RESP_OK != waitFinalResp(_cbATI, &_dev.dev))
         return false;
     if (_dev.dev == DEV_UNKNOWN)
         return false;
@@ -235,26 +235,26 @@
     if (_dev.dev == DEV_LISA_C200) {
         // get the manufacturer
         sendFormated("AT+GMI\r\n");
-        if (OK != waitFinalResp(_cbString, _dev.manu))
+        if (RESP_OK != waitFinalResp(_cbString, _dev.manu))
             return false;
         // get the model identification
         sendFormated("AT+GMM\r\n");
-        if (OK != waitFinalResp(_cbString, _dev.model))
+        if (RESP_OK != waitFinalResp(_cbString, _dev.model))
             return false;
         // get the sw version
         sendFormated("AT+GMR\r\n");
-        if (OK != waitFinalResp(_cbString, _dev.ver))
+        if (RESP_OK != waitFinalResp(_cbString, _dev.ver))
             return false;
         // Return the pseudo ESN or MEID
         sendFormated("AT+GSN\r\n");
-        if (OK != waitFinalResp(_cbString, _dev.meid))
+        if (RESP_OK != waitFinalResp(_cbString, _dev.meid))
             return false;
 #if 0
         // enable power saving
         if (_dev.lpm != LPM_DISABLED) {
              // enable power saving (requires flow control, cts at least)
             sendFormated("AT+UPSV=1,1280\r\n");
-            if (OK != waitFinalResp())
+            if (RESP_OK != waitFinalResp())
                 return false;  
             _dev.lpm = LPM_ACTIVE;
         }
@@ -263,19 +263,19 @@
         if (_dev.dev == DEV_LISA_U200) {
             // enable the network identification feature 
             sendFormated("AT+UGPIOC=20,2\r\n");
-            if (OK != waitFinalResp())
+            if (RESP_OK != waitFinalResp())
                 return false;
         } else {
             // enable the network identification feature 
             sendFormated("AT+UGPIOC=16,2\r\n");
-            if (OK != waitFinalResp())
+            if (RESP_OK != waitFinalResp())
                 return false;
         }
         // check the sim card
         for (int i = 0; (i < 5) && (_dev.sim != SIM_READY); i++) {
             sendFormated("AT+CPIN?\r\n");
             int ret = waitFinalResp(_cbCPIN, &_dev.sim);
-            if ((OK != ret) && (ERROR != ret))
+            if ((RESP_OK != ret) && (RESP_ERROR != ret))
                 return false;
             // Enter PIN if needed
             if (_dev.sim == SIM_PIN) {
@@ -284,7 +284,7 @@
                     return false;
                 }
                 sendFormated("AT+CPIN=%s\r\n", pin);
-                if (OK != waitFinalResp(_cbCPIN, &_dev.sim))
+                if (RESP_OK != waitFinalResp(_cbCPIN, &_dev.sim))
                     return false;
             } else if (_dev.sim != SIM_READY)
                 wait_ms(1000);
@@ -293,51 +293,51 @@
             return false;
         // get the manufacturer
         sendFormated("AT+CGMI\r\n");
-        if (OK != waitFinalResp(_cbString, _dev.manu))
+        if (RESP_OK != waitFinalResp(_cbString, _dev.manu))
             return false;
         // get the model identification
         sendFormated("AT+CGMM\r\n");
-        if (OK != waitFinalResp(_cbString, _dev.model))
+        if (RESP_OK != waitFinalResp(_cbString, _dev.model))
             return false;
         // get the 
         sendFormated("AT+CGMR\r\n");
-        if (OK != waitFinalResp(_cbString, _dev.ver))
+        if (RESP_OK != waitFinalResp(_cbString, _dev.ver))
             return false;            
         // Returns the ICCID (Integrated Circuit Card ID) of the SIM-card. 
         // ICCID is a serial number identifying the SIM.
         sendFormated("AT+CCID\r\n");
-        if (OK != waitFinalResp(_cbCCID, _dev.ccid))
+        if (RESP_OK != waitFinalResp(_cbCCID, _dev.ccid))
             return false;
         // Returns the product serial number, IMEI (International Mobile Equipment Identity)
         sendFormated("AT+CGSN\r\n");
-        if (OK != waitFinalResp(_cbString, _dev.imei))
+        if (RESP_OK != waitFinalResp(_cbString, _dev.imei))
             return false;
 #if 0
         // Configure New message indication
         sendFormated("AT+CNMI=2,1,0,0,0\r\n");
-        if (OK != waitFinalResp())
+        if (RESP_OK != waitFinalResp())
             return false;
 #endif
         // enable power saving
         if (_dev.lpm != LPM_DISABLED) {
              // enable power saving (requires flow control, cts at least)
             sendFormated("AT+UPSV=1\r\n");
-            if (OK != waitFinalResp())
+            if (RESP_OK != waitFinalResp())
                 return false;  
             _dev.lpm = LPM_ACTIVE;
         }
     } 
     // Setup SMS in text mode 
     sendFormated("AT+CMGF=1\r\n");
-    if (OK != waitFinalResp())
+    if (RESP_OK != waitFinalResp())
         return false;
     // setup new message indication
     sendFormated("AT+CNMI=1,1\r\n");
-    if (OK != waitFinalResp())
+    if (RESP_OK != waitFinalResp())
         return false;
     // Request IMSI (International Mobile Subscriber Identification)
     sendFormated("AT+CIMI\r\n");
-    if (OK != waitFinalResp(_cbString, _dev.imsi))
+    if (RESP_OK != waitFinalResp(_cbString, _dev.imsi))
         return false;
     if (status)
         memcpy(status, &_dev, sizeof(DevStatus));
@@ -385,18 +385,18 @@
 {
     // check registration
     sendFormated("AT+CREG?\r\n");
-    if (OK != waitFinalResp())
+    if (RESP_OK != waitFinalResp())
         return false;
     if ((_net.reg != REG_ROAMING) && (_net.reg != REG_HOME))
         return false;
     // check modem specific status messages 
     if (_dev.dev == DEV_LISA_C200) {
         sendFormated("AT+CSS?\r\n");
-        if (OK != waitFinalResp())
+        if (RESP_OK != waitFinalResp())
             return false;
         // get the Telephone number
         sendFormated("AT$MDN?\r\n");
-        if (OK != waitFinalResp(_cbString, _net.num))
+        if (RESP_OK != waitFinalResp(_cbString, _net.num))
             return false;
         // check if we have a Mobile Directory Number
         if (memcmp(_net.num, "0000", 4) == 0)
@@ -404,28 +404,28 @@
         // get the the Network access identifier string
         char nai[64];
         sendFormated("AT$QCMIPNAI?\r\n");
-        if (OK != waitFinalResp(_cbString, nai))
+        if (RESP_OK != waitFinalResp(_cbString, nai))
             return false;
     } else {
         // check GPRS attach status
         int state = 0;
         sendFormated("AT+CGATT?\r\n");
-        if (OK != waitFinalResp(_cbCGATT, &state))
+        if (RESP_OK != waitFinalResp(_cbCGATT, &state))
             return false;
         if (state != 1)
             return false;
         // check operator selection 
         sendFormated("AT+COPS?\r\n");
-        if (OK != waitFinalResp(_cbCOPS, &_net))
+        if (RESP_OK != waitFinalResp(_cbCOPS, &_net))
             return false;
         // Returns the MSISDNs related to this subscriber
         sendFormated("AT+CNUM\r\n");
-        if (OK != waitFinalResp(_cbCNUM, _net.num))
+        if (RESP_OK != waitFinalResp(_cbCNUM, _net.num))
             return false;
     }  
     // Returns the signal strength indication
     sendFormated("AT+CSQ\r\n");
-    if (OK != waitFinalResp(_cbCSQ, &_net.rssi))
+    if (RESP_OK != waitFinalResp(_cbCSQ, &_net.rssi))
         return false;
     if (status) {
         memcpy(status, &_net, sizeof(NetStatus));
@@ -481,7 +481,7 @@
 bool MDMParser::powerOff(void)
 {
     sendFormated("AT+CPWROFF\r\n");
-    if (OK != waitFinalResp(NULL,NULL,120))
+    if (RESP_OK != waitFinalResp(NULL,NULL,120))
         return false;
     return true;
 }
@@ -497,52 +497,52 @@
 
         //Get local IP address
         sendFormated("AT+CMIP?\r\n");
-        if (OK != waitFinalResp(_cbCMIP, &_ip))
+        if (RESP_OK != waitFinalResp(_cbCMIP, &_ip))
             return NOIP;
     } else { 
         // check gprs attach status 
         sendFormated("AT+CGATT?\r\n");
-        if (OK != waitFinalResp())
+        if (RESP_OK != waitFinalResp())
             return NOIP;
         
         // Check the profile
         int a = 0;
         sendFormated("AT+UPSND=" PROFILE ",8\r\n");
-        if (OK != waitFinalResp(_cbUPSND, &a))
+        if (RESP_OK != waitFinalResp(_cbUPSND, &a))
             return NOIP;
         if (a == 1) {
             // disconnect the profile already if it is connected 
             sendFormated("AT+UPSDA=" PROFILE ",4\r\n");
-            if (OK != waitFinalResp())
+            if (RESP_OK != waitFinalResp())
                 return NOIP;;
         }
         // Set up the APN
         if (apn) {
             sendFormated("AT+UPSD=" PROFILE ",1,\"%s\"\r\n", apn);
-            if (OK != waitFinalResp())
+            if (RESP_OK != waitFinalResp())
                 return NOIP;
         }
         if (user) {    
             sendFormated("AT+UPSD=" PROFILE ",2,\"%s\"\r\n", user);
-            if (OK != waitFinalResp())
+            if (RESP_OK != waitFinalResp())
                 return NOIP;
         }
         if (password) {
             sendFormated("AT+UPSD=" PROFILE ",3,\"%s\"\r\n", password);
-            if (OK != waitFinalResp())
+            if (RESP_OK != waitFinalResp())
                 return NOIP;
         }
         // Set up the dynamic IP address assignment.
         sendFormated("AT+UPSD=" PROFILE ",7,\"0.0.0.0\"\r\n");
-        if (OK != waitFinalResp())
+        if (RESP_OK != waitFinalResp())
             return NOIP;
         // Activate the profile and make connection
         sendFormated("AT+UPSDA=" PROFILE ",3\r\n");
-        if (OK != waitFinalResp())
+        if (RESP_OK != waitFinalResp())
             return NOIP;
         //Get local IP address
         sendFormated("AT+UPSND=" PROFILE ",0\r\n");
-        if (OK != waitFinalResp(_cbUPSND, &_ip))
+        if (RESP_OK != waitFinalResp(_cbUPSND, &_ip))
             return NOIP;
     }
     return _ip;
@@ -596,7 +596,7 @@
         // TODO: is there something to do here?
     } else { 
         sendFormated("AT+UPSDA=" PROFILE ",4\r\n");
-        if (OK != waitFinalResp())
+        if (RESP_OK != waitFinalResp())
             return false;
     }
     _ip = NOIP;
@@ -611,7 +611,7 @@
         ip = IPADR(a,b,c,d);
     else {
         sendFormated("AT+UDNSRN=0,\"%s\"\r\n", host);
-        if (OK != waitFinalResp(_cbUDNSRN, &ip))
+        if (RESP_OK != waitFinalResp(_cbUDNSRN, &ip))
             return false;
     }
     return ip;
@@ -643,7 +643,7 @@
     }
     sendFormated(cmd);
     int socket = -1;
-    if (OK != waitFinalResp(_cbUSOCR, &socket))
+    if (RESP_OK != waitFinalResp(_cbUSOCR, &socket))
         return SOCKET_ERROR;
     if (!ISSOCKET(socket) || (_sockets[socket].state != SOCK_FREE))
         return SOCKET_ERROR;
@@ -664,7 +664,7 @@
     if (!ISSOCKET(socket) || (_sockets[socket].state != SOCK_CREATED))
         return false;
     sendFormated("AT+USOCO=%d,\"" IPSTR "\",%d\r\n", socket, IPNUM(ip), port);
-    if (OK != waitFinalResp())
+    if (RESP_OK != waitFinalResp())
         return false;
     _sockets[socket].state = SOCK_CONNECTED;
     return true;
@@ -694,7 +694,7 @@
     if (!ISSOCKET(socket) || (_sockets[socket].state != SOCK_CONNECTED))
         return false;
     sendFormated("AT+USOCL=%d\r\n", socket);
-    if (OK != waitFinalResp())
+    if (RESP_OK != waitFinalResp())
         return false;
     _sockets[socket].state = SOCK_CREATED;
     return true;
@@ -715,11 +715,11 @@
     TRACE("socketSend(%d,,%d)\r\n", socket,len);
     if(len > 0) {
         sendFormated("AT+USOWR=%d,%d\r\n",socket,len);
-        if (PROMPT != waitFinalResp())
+        if (RESP_PROMPT != waitFinalResp())
             return SOCKET_ERROR;
         wait_ms(50);
         send(buf, len);
-        if (OK != waitFinalResp()) 
+        if (RESP_OK != waitFinalResp()) 
             return SOCKET_ERROR;
     }
     return len;
@@ -730,11 +730,11 @@
     TRACE("socketSendTo(%d," IPSTR "%d,,%d)\r\n", socket, IPNUM(ip),port,len);
     if(len > 0) {
         sendFormated("AT+USOWR=%d,\"" IPSTR "\",%d,%d\r\n",socket,IPNUM(ip),port,len);
-        if (PROMPT != waitFinalResp())
+        if (RESP_PROMPT != waitFinalResp())
             return SOCKET_ERROR;
         wait_ms(50);
         send(buf, len);
-        if (OK != waitFinalResp()) 
+        if (RESP_OK != waitFinalResp()) 
             return SOCKET_ERROR;
     }
     return len;
@@ -780,7 +780,7 @@
         if (len < blk) blk = len;
         if (blk) {
             sendFormated("AT+USORD=%d,%d\r\n",socket, blk);
-            if (OK != waitFinalResp(_cbUSORD, buf)) {
+            if (RESP_OK != waitFinalResp(_cbUSORD, buf)) {
                 return SOCKET_ERROR;
             }
             len -= blk;
@@ -834,7 +834,7 @@
             sendFormated("AT+USORF=%d,%d\r\n",socket, blk);
             USORFparam param;
             param.buf = buf;
-            if (OK != waitFinalResp(_cbUSORF, &param)) {
+            if (RESP_OK != waitFinalResp(_cbUSORF, &param)) {
                 return SOCKET_ERROR;
             }
             *ip = param.ip;
@@ -878,7 +878,7 @@
     CMGLparam param;
     param.ix = ix;
     param.num = num;
-    if (OK != waitFinalResp(_cbCMGL, &param))
+    if (RESP_OK != waitFinalResp(_cbCMGL, &param))
         return -1;
     return num - param.num;
 }
@@ -886,13 +886,13 @@
 bool MDMParser::smsSend(const char* num, const char* buf)
 {
     sendFormated("AT+CMGS=\"%s\"\r",num);
-    if (PROMPT != waitFinalResp()) {
+    if (RESP_PROMPT != waitFinalResp()) {
         return false;
     }
     send(buf, strlen(buf));
     const char ctrlZ = 0x1A;
     send(&ctrlZ, sizeof(ctrlZ));
-    if (OK != waitFinalResp()) {
+    if (RESP_OK != waitFinalResp()) {
         return false;
     }
     return true;
@@ -901,7 +901,7 @@
 bool MDMParser::smsDelete(int ix)
 {
     sendFormated("AT+CMGD=%d\r\n",ix);
-    if (OK != waitFinalResp()) {
+    if (RESP_OK != waitFinalResp()) {
         return false;
     }
     return true;
@@ -927,7 +927,7 @@
     param.num = num;
     param.buf = buf;
     sendFormated("AT+CMGR=%d\r\n",ix);
-    if (OK != waitFinalResp(_cbCMGR, &param)) {
+    if (RESP_OK != waitFinalResp(_cbCMGR, &param)) {
         return false;
     }
     return true;
@@ -950,7 +950,7 @@
 {
     *buf = '\0';
     sendFormated("AT+CUSD=1,\"%s\"\r\n",cmd);
-    if (OK != waitFinalResp(_cbCUSD, buf)) {
+    if (RESP_OK != waitFinalResp(_cbCUSD, buf)) {
         return false;
     }
     return true;