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.
Diff: MDM.cpp
- 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, ¶m)) { + if (RESP_OK != waitFinalResp(_cbUSORF, ¶m)) { return SOCKET_ERROR; } *ip = param.ip; @@ -878,7 +878,7 @@ CMGLparam param; param.ix = ix; param.num = num; - if (OK != waitFinalResp(_cbCMGL, ¶m)) + if (RESP_OK != waitFinalResp(_cbCMGL, ¶m)) 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, ¶m)) { + if (RESP_OK != waitFinalResp(_cbCMGR, ¶m)) { 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;