diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..aa7e3ae Binary files /dev/null and b/.DS_Store differ diff --git a/GPRS_Shield_Arduino.cpp b/GPRS_Shield_Arduino.cpp index 690faa8..955319f 100644 --- a/GPRS_Shield_Arduino.cpp +++ b/GPRS_Shield_Arduino.cpp @@ -35,6 +35,8 @@ GPRS* GPRS::inst; + + GPRS::GPRS(uint8_t pkPin, uint8_t stPin, uint32_t baudRate) { _stPin = stPin; @@ -45,6 +47,8 @@ GPRS::GPRS(uint8_t pkPin, uint8_t stPin, uint32_t baudRate) SERIAL_PORT_HARDWARE.begin(baudRate); } + + GPRS::GPRS(uint8_t pkPin, uint8_t stPin, uint8_t rx, uint8_t tx, uint32_t baudRate) { _stPin = stPin; @@ -57,76 +61,337 @@ GPRS::GPRS(uint8_t pkPin, uint8_t stPin, uint8_t rx, uint8_t tx, uint32_t baudRa gprsserial ->begin(baudRate); } -bool GPRS::init(void) -{ - if(!sim900_check_with_cmd("AT\r\n","OK\r\n",CMD)) - return false; - - if(!sim900_check_with_cmd("AT+CFUN=1\r\n","OK\r\n",CMD)) - return false; - - if(!checkSIMStatus()) - return false; +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// POWER /// +/// /// +/////////////////////////////////////////////////////////////////////////////// - if (!sim900_check_with_cmd("AT+CNMI?\r\n", "+CNMI: 2,2,0,0,0\r\nOK\r\n",CMD)) { - if (!sim900_check_with_cmd("AT+CNMI=2,2,0,0,0\r\n","OK\r\n",CMD)) { - return false; +void GPRS::powerOn(void) { + if(!digitalRead(_stPin)) { // Если питание не подано, + powerUpDown(); // то выполним стандартную последовательность сигналов + } +} + + + +void GPRS::powerOff(void) { // Желательно корректно отключать питание, для сохранения переменных + long t1 = millis(); // в памяти и для разрегистрации в сети мобильного оператора. + sim900_send_cmd("AT+CPOWD=1\r\n"); // Даем команду на выключение + while (millis()-t1 < 8000) { // и в течение ХХХХ милисекунд джем + if(!digitalRead(_stPin)) { // произошло ли выключение. + return; // Выходим, если отключилось быстрее. } } + powerUpDown(); // Иначе передёрним питание +} - if (!sim900_check_with_cmd("AT+CMGF?\r\n", "+CMGF: 1\r\nOK\r\n",CMD)) { - if (!sim900_check_with_cmd("AT+CMGF=1\r\n","OK\r\n",CMD)) { - return false; - } + + +void GPRS::powerUpDown(void) { // The same sequence is used for switching on and to power off + pinMode(_pkPin, OUTPUT); + digitalWrite(_pkPin, LOW); + delay(1000); + digitalWrite(_pkPin, HIGH); + delay(2000); + digitalWrite(_pkPin, LOW); + delay(3000); +} + + + +bool GPRS::isPowerOn(void) +{ + return digitalRead(_stPin); +} + + + +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// INITIALIZATION /// +/// /// +/////////////////////////////////////////////////////////////////////////////// + +unsigned char GPRS::init(void) +{ + unsigned char rc; + if(0 == (rc = initialSetting())) { + delay(5000); // Пауза для завершения всех инициализационных процессов } + return rc; +} - if (!sim900_check_with_cmd("AT+CLIP=1\r\n","OK\r\n",CMD)) { - return false; + + +unsigned char GPRS::init(char* ipv4Buf) +{ + unsigned char rc; + if(0 == (rc = initialSetting())) { + if(1 == joinGprs(ipv4Buf)) { + rc = 0; + } else { + rc = 11; // нет GPRS, ip-адрес не получен + } } + return rc; +} - delay(5000); - return true; + + +unsigned char GPRS::init(char* ipv4Buf, + const char* apn, + const char* lgn, + const char* pwd) +{ + unsigned char rc; + if(0 == (rc = initialSetting())) { + if(1 == joinGprs(ipv4Buf, apn, lgn, pwd)) { + rc = 0; + } else { + rc = 11; // нет GPRS, ip-адрес не получен + } + } + return rc; } -bool GPRS::checkPowerUp(void) + + +unsigned char GPRS::initialSetting(void) { - return sim900_check_with_cmd("AT\r\n","OK\r\n",CMD); + unsigned char rc; + long t1; + //Serial.println("-1"); + if(!sim900_check_with_cmd("AT\r\n",OK,CMD)) return 1; + //Serial.println("-2"); + // а есть ли вообще модуль и способен ли он отвечать? + if(!sim900_check_with_cmd("ATE0\r\n",OK,CMD)) return 2; + //Serial.println("-3"); + // отключили эхо-ответ, тем самым уменьшив объем буферов + // для анализа ответа от модуля. + if(!sim900_check_with_cmd("AT+CFUN=1\r\n",OK,CMD)) return 3; + //Serial.println("-4"); + if(!checkSIMStatus()) return 4; + //Serial.println("-5"); + if (!sim900_check_with_cmd("AT+CNMI?\r\n", "+CNMI: 2,0,2,1,1",CMD)) { + //Serial.println("-6"); + delay(20); + sim900_flush_serial(); + if (!sim900_check_with_cmd("AT+CNMI=2,0,2,1,1\r\n",OK,CMD)) return 5; + //Serial.println("-7"); + // Установили режим, при котором SMS не лезут сразу в + // serial, а сохраняются в памяти. Это удобно для последующего + // чтения и разбора SMS + } + //Serial.println("-8"); + if (!sim900_check_with_cmd("AT+CMGF?\r\n", "+CMGF: 1",CMD)) { + //Serial.println("-9"); + if (!sim900_check_with_cmd("AT+CMGF=1\r\n",OK,CMD)) return 6; + } + //Serial.println("-10"); + if (!sim900_check_with_cmd("AT+CLIP=1\r\n",OK,CMD)) return 7; + //Serial.println("-11"); + delay(20); + sim900_flush_serial(); + return 0; } -void GPRS::powerUpDown() + + +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// TOOLS /// +/// /// +/////////////////////////////////////////////////////////////////////////////// + +char* GPRS::getImei(char* imei) { - pinMode(_pkPin, OUTPUT); - if(!digitalRead(_stPin)) + // --> CRLF = 2 + //999999999999999 --> 15 + CRLF = 17 + // --> CRLF = 2 + //OK --> 2 + CRLF = 4 + char tbuf[20]; + sim900_clean_buffer(tbuf,sizeof(tbuf)); + char *p, *s; + int i = 0; + sim900_flush_serial(); + sim900_send_cmd("AT+GSN\r\n"); + sim900_read_buffer(tbuf, sizeof(tbuf)-1, DEFAULT_TIMEOUT); + if(NULL != ( s = strstr(tbuf,"\r\n")+2 )) { + if(NULL != ( p = strstr(s,"\r\n"))){ + p = s ; + while((*p != '\r')&&(i < 15)) { + imei[i++] = *(p++); + } + } + } + imei[i] = '\0'; + sim900_wait_for_resp(OK, CMD); + return imei; +} + + + + char* GPRS::getDateTime(char* buffer) { - digitalWrite(_pkPin, HIGH); - delay(3000); + //AT+CCLK? --> 8 + CRLF = 10 + //+CCLK: "14/11/13,21:14:41+04" --> 29+ CRLF = 31 + // --> CRLF = 2 + //OK --> = 4 + + byte i = 0; + char gprsBuffer[40]; + char *p,*s; + sim900_flush_serial(); + sim900_send_cmd("AT+CCLK?\r\n"); + sim900_clean_buffer(gprsBuffer,40); + sim900_read_buffer(gprsBuffer,32,DEFAULT_TIMEOUT); + if(NULL != ( s = strstr(gprsBuffer,"+CCLK:"))) { + s = strstr((char *)(s),"\""); + s = s + 1; //We are in the first date-time character + p = strstr((char *)(s),"\"")-6; //p is last character minutes + if (NULL != s) { + i = 0; + while (s < p) { + buffer[i++] = *(s++); + } + buffer[i] = '\0'; + } + } + sim900_wait_for_resp(OK, CMD); + return buffer; } - digitalWrite(_pkPin, LOW); - delay(3000); + + + +unsigned char GPRS::syncNtp (const char* ntpServer) //Синхронизфция времени в модеме с NTP сервером +{ /* + AT+CNTP="pool.ntp.org",3,1,0 + AT+CNTP + + Коды завершения: + 1 - удачная синхронизация + 11 - нет GPRS + 12 - не установились параметры для синнхронизации + 61 - ошибка сетевого соединения + 62 - ошибка DNS + 63 - ошибка соединения + 64 - превышено время ожидания + 65 - ошибка сервера + 66 - операция недоступна + */ + + char *p,*s; + char tmpBuf[56]; + unsigned char rc; + sim900_clean_buffer(tmpBuf,sizeof(tmpBuf)); + if (1 == (rc = joinGprs(tmpBuf))) { // Есть GPRS подключение или удалось подключиться + sim900_send_cmd("AT+CNTP=\""); // устанавливаем параметры синхронизации + sim900_send_cmd(ntpServer); + sim900_send_cmd("\",3,1,0\r\n"); + if (sim900_wait_for_resp(OK,CMD)) { // Параметры установились успешно + sim900_check_with_cmd("AT+CNTP\r\n" ,OK,DATA); // собственно синхронизация. + sim900_wait_for_resp ("+CNTP: ", DATA,19,15000); // ждем ответ об успешности + delay(10); + sim900_clean_buffer(tmpBuf,sizeof(tmpBuf)); + sim900_read_buffer(tmpBuf,4); // читаем код завершения + rc = atoi(tmpBuf); + + } else { // Не установились параметры синхронизации NTP + rc = 12; + } + } else { + rc = 11; // Если не удалось подключиться по GPRS + } + return rc; } -void GPRS::powerOff() + + +unsigned char GPRS::readBalance(const char* moneyRequestBuf, + char* moneyBalanceBuf, + int bufLen, + int& moneyBalanceInt) { - pinMode(_pkPin, OUTPUT); - if(digitalRead(_stPin)) - { - digitalWrite(_pkPin, HIGH); - delay(3000); + //AT+CUSD=1,"#100#" = 19 + // = 2 + // = 2 + //OK --> CRLF = 4 + // --> CRLF = 2 + //+CUSD: 0,"Balance:45,05r,Limit:0,01r ",64 = 41 + // итого= 70 + byte i = 0; + char gprsBuffer[70]; + char *p, *s; + unsigned char rc; + sim900_flush_serial(); + sim900_send_cmd("AT+CUSD=1,\""); + sim900_send_cmd(moneyRequestBuf); + sim900_check_with_cmd("\"\r\n",OK,DATA); + sim900_clean_buffer(gprsBuffer,sizeof(gprsBuffer)); + sim900_read_buffer(gprsBuffer,sizeof(gprsBuffer)-1); + //Serial.print(gprsBuffer); + + if(NULL != ( s = strstr(gprsBuffer,"CUSD:"))) { + s = strstr((char *)(s),"\""); + s = s + 1; // We are in the first character + p = strstr((char *)(s),"r") + 1; + if (NULL != s) { + i = 0; + while ((s < p) && (i < (bufLen -1))) { + moneyBalanceBuf[i++] = *(s++); + } + moneyBalanceBuf[i] = '\0'; + } // Ответ получен. Теперь попробуем из него вытащить цифры баланса + + if(NULL != (s = strstr(moneyBalanceBuf,"Balance:"))) { // Для МТС + s = s + 8; + } else { + if(NULL != (s = strstr(moneyBalanceBuf,"balans"))) { // Для Beeline + s = s + 6; + } + } + if(NULL != s) { + p = strstr((char *)(s),"r"); + if (NULL != s) { + i = 0; + while (s < p) { + gprsBuffer[i++] = *(s++); + } + gprsBuffer[i] = '\0'; + } + moneyBalanceInt = atoi(gprsBuffer); + rc = 0; // результат получен + } else { + rc = 2; // в ответе нет баланса + } + } else { + rc = 4; // не получен предсказуемый ответ + i = 0; + int n = min(sizeof(gprsBuffer), bufLen); + while (i < n) { + moneyBalanceBuf[i] = gprsBuffer[i]; + i += 1; + } + moneyBalanceBuf[i] = '\0'; } - digitalWrite(_pkPin, LOW); - delay(3000); -} + //sim900_wait_for_resp(OK, CMD); + sim900_flush_serial(); + return rc; +} + + bool GPRS::checkSIMStatus(void) { char gprsBuffer[32]; int count = 0; - sim900_clean_buffer(gprsBuffer,32); while(count < 3) { + sim900_clean_buffer(gprsBuffer,32); sim900_send_cmd("AT+CPIN?\r\n"); - sim900_read_buffer(gprsBuffer,32,DEFAULT_TIMEOUT); + sim900_read_buffer(gprsBuffer,31,DEFAULT_TIMEOUT); if((NULL != strstr(gprsBuffer,"+CPIN: READY"))) { break; } @@ -141,6 +406,33 @@ bool GPRS::checkSIMStatus(void) +unsigned char GPRS::getSignalStrength(void) +{ + //AT+CSQ: 00,00 --> 13 + CRLF = 15 + // --> CRLF = 2 + //OK --> 2 + CRLF = 4 + + byte result = 99; + char gprsBuffer[21]; + sim900_clean_buffer(gprsBuffer,21); + char *s; + sim900_send_cmd("AT+CSQ\r\n"); + sim900_read_buffer(gprsBuffer,21,DEFAULT_TIMEOUT); + if(NULL != ( s = strstr(gprsBuffer,"+CSQ: "))) { + result = atoi(s+6); + sim900_wait_for_resp("OK\r\n", CMD); + } + return result; +} + + + +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// SMS /// +/// /// +/////////////////////////////////////////////////////////////////////////////// + bool GPRS::sendSMS(char *number, char *data) { // Set message mode to ASCII @@ -330,6 +622,15 @@ void GPRS::readSMS() Serial.write(gprsBuffer); } + + +bool GPRS::deleteSMS(void) +{ + return sim900_check_with_cmd("AT+CMGD=1,3\r\n",OK,CMD); // Удалить все, кроме непрочитанных +} + + + bool GPRS::deleteSMS(int index) { //char cmd[16]; @@ -351,6 +652,14 @@ bool GPRS::ifSMSNow(void) return sim900_check_with_cmd("","+CMT: ",CMD); } + + +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// RINGS /// +/// /// +/////////////////////////////////////////////////////////////////////////////// + bool GPRS::callUp(char *number) { if(!sim900_check_with_cmd("AT+COLP=1\r\n","OK\r\n",CMD)) { @@ -470,223 +779,236 @@ bool GPRS::hangup(void) return false; } - bool GPRS::getDateTime(char *buffer) - { - //AT+CCLK? --> 8 + CRLF = 10 - //+CCLK: "14/11/13,21:14:41+04" --> 29+ CRLF = 31 - // --> CRLF = 2 - //OK - - byte i = 0; - char gprsBuffer[46]; - char *p,*s; - sim900_send_cmd("AT+CCLK?\r\n"); - sim900_clean_buffer(gprsBuffer,43); - sim900_read_buffer(gprsBuffer,43,DEFAULT_TIMEOUT); - if(NULL != ( s = strstr(gprsBuffer,"+CCLK:"))) { - s = strstr((char *)(s),"\""); - s = s + 1; //We are in the first phone number character - p = strstr((char *)(s),"\""); //p is last character """ - if (NULL != s) { - i = 0; - while (s < p) { - buffer[i++] = *(s++); - } - buffer[i] = '\0'; - } - //We are going to flush serial data until OK is recieved - return sim900_wait_for_resp("OK\r\n", CMD); - } - return false; - } - byte GPRS::getSignalStrength() { - //AT+CSQ: 00,00 --> 13 + CRLF = 15 - // --> CRLF = 2 - //OK --> 2 + CRLF = 4 - - - byte result = 99; - char gprsBuffer[21]; - sim900_clean_buffer(gprsBuffer,21); - char *s; - sim900_send_cmd("AT+CSQ\r\n"); - sim900_read_buffer(gprsBuffer,21,DEFAULT_TIMEOUT); - if(NULL != ( s = strstr(gprsBuffer,"+CSQ: "))) { - result = atoi(s+6); - sim900_wait_for_resp("OK\r\n", CMD); - } - return result; - } -//Here is where we ask for APN configuration, with F() so we can save MEMORY -//bool GPRS::join(const __FlashStringHelper *apn, const __FlashStringHelper *userName, const __FlashStringHelper *passWord) - bool GPRS::join(char* apn, char* userName, char* passWord, int timeout) - { - byte i; - char *p, *s; - char ipAddr[32]; -/* if(!sim900_check_with_cmd("AT+CIPSHUT\r\n","SHUT OK\r\n", CMD)) { - Serial.write("Error = 1\r\n"); - return false; - } - delay(1000); -*/ - sim900_send_cmd("AT+CIPSHUT\r\n"); - delay(500); - //Select multiple connection - //sim900_check_with_cmd("AT+CIPMUX=1\r\n","OK",DEFAULT_TIMEOUT,CMD); +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// GPRS /// +/// /// +/////////////////////////////////////////////////////////////////////////////// - //set APN. OLD VERSION - //snprintf(cmd,sizeof(cmd),"AT+CSTT=\"%s\",\"%s\",\"%s\"\r\n",_apn,_userName,_passWord); - //sim900_check_with_cmd(cmd, "OK\r\n", DEFAULT_TIMEOUT,CMD); - sim900_send_cmd("AT+CSTT=\""); +unsigned char GPRS::joinGprs(char* ipv4Buf, + const char* apn, + const char* lgn, + const char* pwd) +{ + char *p,*s; + long t1, t2; + unsigned char rc; + rc = getGprsStatus(ipv4Buf); // Запрос о состоянии GPRS соединения + if (rc != 1) { // Если не установлено, то установим + sim900_check_with_cmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",OK,CMD); + // + sim900_send_cmd("AT+SAPBR=3,1,\"APN\",\""); sim900_send_cmd(apn); - sim900_send_cmd("\",\""); - sim900_send_cmd(userName); - sim900_send_cmd("\",\""); - sim900_send_cmd(passWord); - sim900_send_cmd("\"\r\n"); - delay(500); - //Brings up wireless connection + sim900_check_with_cmd("\"\r\n", OK, CMD); + // + sim900_send_cmd("AT+SAPBR=3,1,\"USER\",\""); + sim900_send_cmd(lgn); + sim900_check_with_cmd("\"\r\n", OK, CMD); + // + sim900_send_cmd("AT+SAPBR=3,1,\"PWD\",\""); + sim900_send_cmd(pwd); + sim900_check_with_cmd("\"\r\n", OK, CMD); + // + t1 = millis(); + while (1 != (rc = getGprsStatus(ipv4Buf))) { + t2 = millis(); + if (20*1000 < (t2-t1)) return 20; + sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD,1); + } + // + if (rc == 1) { // Если удачно соединились + sim900_check_with_cmd("AT+SAPBR=5,1\r\n", OK,CMD); // то запомним параметры + } + } + return rc; +} - sim900_send_cmd("AT+CIICR\r\n"); - delay(4000); - sim900_wait_for_resp("OK\r\n", CMD); - delay(500); -// sim900_check_with_cmd("AT+CIICR\r\n","OK\r\n", CMD); - //Get local IP address - sim900_send_cmd("AT+CIFSR\r\n"); - delay(500); - sim900_clean_buffer(ipAddr,32); - sim900_read_buffer(ipAddr,32,DEFAULT_TIMEOUT); - - //Response: - //AT+CIFSR\r\n --> 8 + 2 - //\r\n --> 0 + 2 - //10.160.57.120\r\n --> 15 + 2 (max) : TOTAL: 29 - //Response error: - //AT+CIFSR\r\n - //\r\n - //ERROR\r\n - if (NULL != strstr(ipAddr,"ERROR")) { - Serial.write("Error = 2\r\n"); - return false; +unsigned char GPRS::joinGprs(char* ipv4Buf) +{ + char *p,*s; + long t1, t2; + unsigned char rc; + rc = getGprsStatus(ipv4Buf); // Запрос о состоянии GPRS соединения + if (rc != 1) { // Если не установлено, то установим + sim900_check_with_cmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",OK,CMD); + t1 = millis(); + while (1 != (rc = getGprsStatus(ipv4Buf))) { + t2 = millis(); + if (20*1000 < (t2-t1)) return 20; + sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD); } - s = ipAddr + 12; - p = strstr((char *)(s),"\r\n"); //p is last character \r\n - if (NULL != s) { - i = 0; - while (s < p) { - ip_string[i++] = *(s++); + } + return rc; +} + + + +unsigned char GPRS::getGprsStatus(char* ipv4Buf) +{ + //AT+SAPBR=2,1 1 + // 1 + //+SAPBR: 1,3,"xxx.xxx.xxx.xxx" 29 + // 1 + //OK 3 + // 1 + char *p, *s; + unsigned char rc; + char tmpBuf[31]; + int i; + sim900_flush_serial(); + sim900_send_cmd("AT+SAPBR=2,1\r\n"); // Запрос о состоянии GPRS соединения + sim900_clean_buffer(tmpBuf,sizeof(tmpBuf)); + sim900_read_buffer(tmpBuf,sizeof(tmpBuf)-1,DEFAULT_TIMEOUT); // Считываем ответ + //Serial.println("<"); + //Serial.println(tmpBuf); + //Serial.println(">"); + + if(NULL != ( s = strstr(tmpBuf,"+SAPBR: "))) { // находим нужное место + s += 8; // + if(NULL != ( s = strstr((char *)(s),","))) { // после первой запятой + rc = *(s+1) - '0'; // для конвертации в цифру отнять код нуля + s = strstr((char *)(s),"\"")+1; // Теперь ищем ip-адрес в кавычках + p = strstr((char *)(s),"\""); // Закрывающая кавычка + if ((NULL != p) && (NULL != s)) { + i = 0; + while (s < p) { + ipv4Buf[i++] = *(s++); + } + ipv4Buf[i] = '\0'; + } else { + rc = 9; // не распознан ip-адрес } - ip_string[i] = '\0'; + } else { + rc = 10; // не распознан код состояния } - _ip = str_to_ip(ip_string); - if(_ip != 0) { + } else { + rc = 10; // не распознан код состояния + } + delay(10); // Перед очисткой буфера надо дождаться завер- + sim900_flush_serial(); // шения вывода данных. + return rc; +} - return true; - } - Serial.write("Error = 3\r\n"); - return false; + + +void GPRS::disconnectGprs() +{ + sim900_check_with_cmd("AT+SAPBR=0,1\r\n",OK,CMD); // отключаемся +} + + + +int GPRS::httpGet(char* url, int& dataLen) +{ + char tmpBuf[111]; + char *p, *s; + int result; + sim900_flush_serial(); + sim900_clean_buffer(tmpBuf, sizeof(tmpBuf)); + sim900_check_with_cmd("AT+HTTPINIT\r\n",OK,CMD,33); + sim900_check_with_cmd("AT+HTTPPARA=\"CID\",1\r\n",OK,CMD); + sim900_send_cmd("AT+HTTPPARA=\"URL\",\""); + sim900_send_cmd(url); + sim900_check_with_cmd("\"\r\n",OK,CMD); + sim900_check_with_cmd("AT+HTTPACTION=0\r\n",OK,CMD); + if(!sim900_wait_for_resp ("+HTTPACTION:0," ,DATA)) return 7; + // + sim900_read_buffer(tmpBuf,sizeof(tmpBuf)-1,DEFAULT_TIMEOUT); + sim900_flush_serial(); + + if(NULL != ( s = strstr(tmpBuf,","))) { + tmpBuf[ s-tmpBuf ] = '\0'; + result = atoi( tmpBuf ); + } else { + result = 1; // Статус Код не распознан + } + // + if(NULL != ( p = strstr( (char *)(s+1),"\r\n"))) { + tmpBuf[ p-tmpBuf ] = '\0'; + dataLen = atoi( (char *)(s+1) ); + } else { + result = 2; // dataLen не распознан } + return result; +} - void GPRS::disconnect() - { - sim900_send_cmd("AT+CIPSHUT\r\n"); - } - bool GPRS::connect(Protocol ptl,const char * host, int port, int timeout) - { - //char cmd[64]; - char num[4]; - char resp[96]; - //sim900_clean_buffer(cmd,64); - if(ptl == TCP) { +bool GPRS::connect(Protocol ptl, const char * host, int port, int timeout) +{ + //char cmd[64]; + char num[4]; + char resp[96]; + + //sim900_clean_buffer(cmd,64); + if(ptl == TCP) { sim900_send_cmd("AT+CIPSTART=\"TCP\",\""); - sim900_send_cmd(host); - sim900_send_cmd("\","); - itoa(port, num, 10); - sim900_send_cmd(num); - sim900_send_cmd("\r\n"); -// sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",host, port); - } else if(ptl == UDP) { + } else if (ptl == UDP) { sim900_send_cmd("AT+CIPSTART=\"UDP\",\""); - sim900_send_cmd(host); - sim900_send_cmd("\","); - itoa(port, num, 10); - sim900_send_cmd(num); - sim900_send_cmd("\r\n"); - - // sprintf(cmd, "AT+CIPSTART=\"UDP\",\"%s\",%d\r\n",host, port); } else { return false; } + sim900_send_cmd(host); + sim900_send_cmd("\","); + itoa(port, num, 10); + sim900_send_cmd(num); + sim900_send_cmd("\r\n"); + // sprintf(cmd, "AT+CIPSTART=\"UDP\",\"%s\",%d\r\n",host, port); delay(2000); - //sim900_send_cmd(cmd); + //sim900_send_cmd(cmd); sim900_read_buffer(resp,96,timeout); -//Serial.print("Connect resp: "); Serial.println(resp); - if(NULL != strstr(resp,"CONNECT")) { //ALREADY CONNECT or CONNECT OK - return true; - } - return false; + //Serial.print("Connect resp: "); Serial.println(resp); + if(NULL != strstr(resp,"CONNECT")) { //ALREADY CONNECT or CONNECT OK + return true; } - -//Overload with F() macro to SAVE memory - bool GPRS::connect(Protocol ptl,const __FlashStringHelper *host, const __FlashStringHelper *port, int timeout) - { - //char cmd[64]; - char resp[96]; - - //sim900_clean_buffer(cmd,64); - if(ptl == TCP) { - sim900_send_cmd(F("AT+CIPSTART=\"TCP\",\"")); //%s\",%d\r\n",host, port); -} else if(ptl == UDP) { - sim900_send_cmd(F("AT+CIPSTART=\"UDP\",\"")); //%s\",%d\r\n",host, port); -} else { return false; } -sim900_send_cmd(host); -sim900_send_cmd(F("\",")); -sim900_send_cmd(port); -sim900_send_cmd(F("\r\n")); -//Serial.print("Connect: "); Serial.println(cmd); -sim900_read_buffer(resp, 96, timeout); -//Serial.print("Connect resp: "); Serial.println(resp); - if(NULL != strstr(resp,"CONNECT")) { //ALREADY CONNECT or CONNECT OK - return true; - } + + + +//Overload with F() macro to SAVE memory +bool GPRS::connect(Protocol ptl,const __FlashStringHelper *host, const __FlashStringHelper *port, int timeout) +{ + //char cmd[64]; + char resp[96]; + + //sim900_clean_buffer(cmd,64); + if(ptl == TCP) { + sim900_send_cmd(F("AT+CIPSTART=\"TCP\",\"")); //%s\",%d\r\n",host, port); + } else if (ptl == UDP) { + sim900_send_cmd(F("AT+CIPSTART=\"UDP\",\"")); //%s\",%d\r\n",host, port); + } else { return false; } - - bool GPRS::is_connected(void) - { - char resp[96]; - sim900_send_cmd("AT+CIPSTATUS\r\n"); - sim900_read_buffer(resp,sizeof(resp),DEFAULT_TIMEOUT); - if(NULL != strstr(resp,"CONNECTED")) { - //+CIPSTATUS: 1,0,"TCP","216.52.233.120","80","CONNECTED" - return true; - } else { - //+CIPSTATUS: 1,0,"TCP","216.52.233.120","80","CLOSED" - //+CIPSTATUS: 0,,"","","","INITIAL" - return false; - } + sim900_send_cmd(host); + sim900_send_cmd(F("\",")); + sim900_send_cmd(port); + sim900_send_cmd(F("\r\n")); + //Serial.print("Connect: "); Serial.println(cmd); + sim900_read_buffer(resp, 96, timeout); + //Serial.print("Connect resp: "); Serial.println(resp); + if(NULL != strstr(resp,"CONNECT")) { //ALREADY CONNECT or CONNECT OK + return true; } + return false; +} - bool GPRS::close() - { - // if not connected, return - if (!is_connected()) { - return true; - } - return sim900_check_with_cmd("AT+CIPCLOSE\r\n", "CLOSE OK\r\n", CMD); - } + + +bool GPRS::close() +{ + // if not connected, return + // if ( getGprsStatus(" ") == 3) { + // return true; + // } + return sim900_check_with_cmd("AT+CIPCLOSE\r\n", "CLOSE OK\r\n", CMD); +} int GPRS::readable(void) { @@ -703,33 +1025,33 @@ sim900_read_buffer(resp, 96, timeout); return req_size+1; } - int GPRS::send(const char * str, int len) - { - //char cmd[32]; - char num[4]; - if(len > 0){ - //snprintf(cmd,sizeof(cmd),"AT+CIPSEND=%d\r\n",len); - //sprintf(cmd,"AT+CIPSEND=%d\r\n",len); - sim900_send_cmd("AT+CIPSEND="); - itoa(len, num, 10); - sim900_send_cmd(num); - if(!sim900_check_with_cmd("\r\n",">",CMD)) { - //if(!sim900_check_with_cmd(cmd,">",CMD)) { +int GPRS::send(const char * str, int len) +{ + //char cmd[32]; + char num[4]; + if(len > 0){ + //snprintf(cmd,sizeof(cmd),"AT+CIPSEND=%d\r\n",len); +//sprintf(cmd,"AT+CIPSEND=%d\r\n",len); + sim900_send_cmd("AT+CIPSEND="); + itoa(len, num, 10); + sim900_send_cmd(num); + if(!sim900_check_with_cmd("\r\n",">",CMD)) { + //if(!sim900_check_with_cmd(cmd,">",CMD)) { + return 0; + } +/*if(0 != sim900_check_with_cmd(str,"SEND OK\r\n", DEFAULT_TIMEOUT * 10 ,DATA)) { + return 0; +}*/ + delay(500); + sim900_send_cmd(str); + delay(500); + sim900_send_End_Mark(); + if(!sim900_wait_for_resp("SEND OK\r\n", DATA, DEFAULT_TIMEOUT * 10, DEFAULT_INTERCHAR_TIMEOUT * 10)) { return 0; - } - /*if(0 != sim900_check_with_cmd(str,"SEND OK\r\n", DEFAULT_TIMEOUT * 10 ,DATA)) { - return 0; - }*/ - delay(500); - sim900_send_cmd(str); - delay(500); - sim900_send_End_Mark(); - if(!sim900_wait_for_resp("SEND OK\r\n", DATA, DEFAULT_TIMEOUT * 10, DEFAULT_INTERCHAR_TIMEOUT * 10)) { - return 0; - } - } - return len; - } + } + } + return len; +} int GPRS::send(const char * str) { //char cmd[32]; @@ -759,12 +1081,7 @@ sim900_read_buffer(resp, 96, timeout); return len; } - int GPRS::recv(char* buf, int len) - { - sim900_clean_buffer(buf,len); - sim900_read_buffer(buf,len); //Ya he llamado a la funcion con la longitud del buffer - 1 y luego le estoy añadiendo el 0 - return strlen(buf); - } + uint32_t GPRS::str_to_ip(const char* str) { @@ -782,36 +1099,3 @@ uint32_t GPRS::str_to_ip(const char* str) return ip; } - -char* GPRS::getIPAddress() -{ - //I have already a buffer with ip_string: snprintf(ip_string, sizeof(ip_string), "%d.%d.%d.%d", (_ip>>24)&0xff,(_ip>>16)&0xff,(_ip>>8)&0xff,_ip&0xff); - return ip_string; -} - -unsigned long GPRS::getIPnumber() -{ - return _ip; -} - -void setST(uint8_t stPin) -{ - -} -void setPK(uint8_t pkPin) -{ - -} - -/* NOT USED bool GPRS::gethostbyname(const char* host, uint32_t* ip) -{ - uint32_t addr = str_to_ip(host); - char buf[17]; - //snprintf(buf, sizeof(buf), "%d.%d.%d.%d", (addr>>24)&0xff, (addr>>16)&0xff, (addr>>8)&0xff, addr&0xff); - if (strcmp(buf, host) == 0) { - *ip = addr; - return true; - } - return false; -} -*/ diff --git a/GPRS_Shield_Arduino.h b/GPRS_Shield_Arduino.h index da4fbf0..babc2b9 100644 --- a/GPRS_Shield_Arduino.h +++ b/GPRS_Shield_Arduino.h @@ -34,9 +34,7 @@ #include "sim900.h" -/** GPRS class. - * used to realize GPRS communication - */ +const char OK[] = "OK\r\n"; enum Protocol { CLOSED = 0, @@ -47,51 +45,74 @@ enum Protocol { class GPRS { public: - /** Create GPRS instance - * @param number default phone number during mobile communication - */ + /** Create GPRS instance + * @param number default phone number during mobile communication + */ + GPRS(uint8_t pkPin=2, uint8_t stPin = 3, uint32_t baudRate = 9600); + GPRS(uint8_t pkPin, uint8_t stPin, uint8_t rx, uint8_t tx, uint32_t baudRate = 9600 ); + + /** get instance of GPRS class + */ + static GPRS* getInstance() { + return inst; + }; - GPRS(uint8_t pkPin=2, uint8_t stPin = 3, uint32_t baudRate = 9600); - - GPRS(uint8_t pkPin, uint8_t stPin, uint8_t rx, uint8_t tx, uint32_t baudRate = 9600 ); - - /** get instance of GPRS class - */ - static GPRS* getInstance() { - return inst; - }; +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// POWER /// +/// /// +/////////////////////////////////////////////////////////////////////////////// - /** initialize GPRS module including SIM card check & signal strength - * @return true if connected, false otherwise - */ + void powerOn(void); + void powerOff(void); + void powerUpDown(void); + bool isPowerOn(void); - bool init(void); +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// INITIALIZATION /// +/// /// +/////////////////////////////////////////////////////////////////////////////// - - /** check if GPRS module is powered on or not - * @returns - * true on success - * false on error - */ - bool checkPowerUp(void); + unsigned char init(void); + unsigned char init(char* ipv4Buf); + unsigned char init(char* ipv4Buf, + const char* apn, + const char* lgn, + const char* pwd); + unsigned char initialSetting(void); - - /** power Up GPRS module (JP has to be soldered) - * @param pin pin 9 connected to JP jumper so we can power up and down through software - * @returns - * - */ - void powerUpDown(); - void powerOff(); - - /** send text SMS - * @param *number phone number which SMS will be send to - * @param *data message that will be send to - * @returns - * false on success - * true on error - */ - bool sendSMS(char* number, char* data); +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// TOOLS /// +/// /// +/////////////////////////////////////////////////////////////////////////////// + + char* getImei(char* imei); + char* getDateTime(char* buffer); // Получить время с часов модуля + unsigned char syncNtp (const char* ntpServer); // Синхронизация времени модуля с NTP сервером + unsigned char readBalance(const char* moneyRequestBuf, + char* moneyBalanceBuf, + int buflen, + int &moneyBalanceInt); + unsigned char getSignalStrength(); + /** getSignalStrength from SIM900 (see AT command: AT+CSQ) + * @returns + 0 — 113 dBm or less + 1 — 111 dBm + 2...30 — 109... 53 dBm + 31 — 51 dBm or greater + 99 — not known or not detectable + */ + bool checkSIMStatus(void); + +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// SMS /// +/// /// +/////////////////////////////////////////////////////////////////////////////// + + bool sendSMS(char* number, char* data); /** Check if there is any UNREAD SMS: this function DOESN'T change the UNREAD status of the SMS * @returns @@ -99,7 +120,6 @@ class GPRS * -1 on error * 0 - there is no SMS with specified status (UNREAD) */ - char isSMSunread(); /** read SMS, phone and date if getting a SMS message. It changes SMS status to READ @@ -131,86 +151,69 @@ class GPRS * false on error */ void readSMS(); - - bool deleteSMS(int index); - - /** call someone - * @param number the phone number which you want to call - * @returns - * true on success - * false on error - */ - bool callUp(char* number); - - /** auto answer if coming a call - * @returns - */ - void answer(void); - - /** hang up if coming a call - * @returns - * true on success - * false on error - */ - bool hangup(void); - - /** Disable +CLIP notification when an incoming call is active, RING text is always shown. See isCallActive function - * This is done in order no to overload serial outputCheck if there is a call active and get the phone number in that case - * @returns - * true on success - * false on error - */ - bool ifcallNow(void); - + bool deleteSMS(int index); // Удалить SMS по индексу + bool deleteSMS(void); // Удалить все, кроме непрочитанных bool ifSMSNow(void); - bool ifcallEnd(void); - void callEnd(void); - bool disableCLIPring(void); - - /** Check if there is a call active and get the phone number in that case - * @returns - * true on success - * false on error - */ - bool isCallActive(char *number); +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// RINGS /// +/// /// +/////////////////////////////////////////////////////////////////////////////// - /** get DateTime from SIM900 (see AT command: AT+CLTS=1) as string - * @param - * @returns - * true on success - * false on error - */ - bool getDateTime(char *buffer); + /** call someone + * @param number the phone number which you want to call + * @returns + * true on success + * false on error + */ + bool callUp(char* number); + /** auto answer if coming a call + * @returns + */ + void answer(void); + + /** hang up if coming a call + * @returns + * true on success + * false on error + */ + bool hangup(void); + /** Disable +CLIP notification when an incoming call is active, RING text is always shown. See isCallActive function + * This is done in order no to overload serial outputCheck if there is a call active and get the phone number in that case + * @returns + * true on success + * false on error + */ + bool ifcallNow(void); + bool ifcallEnd(void); + void callEnd(void); + bool disableCLIPring(void); + bool isCallActive(char *number); // Check if call active and get the phone number in that case + + - /** getSignalStrength from SIM900 (see AT command: AT+CSQ) - * @returns - 0 — 113 dBm or less - 1 — 111 dBm - 2...30 — 109... 53 dBm - 31 — 51 dBm or greater - 99 — not known or not detectable - */ - byte getSignalStrength(); - +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// GPRS /// +/// /// +/////////////////////////////////////////////////////////////////////////////// + // Connect the GPRS module to the network. + unsigned char joinGprs(char* ipv4Buf, const char* apn, const char* lgn, const char* pwd); + unsigned char joinGprs(char* ipv4Buf); + unsigned char getGprsStatus(char* ipv4Buf); // Возвращает статус GPRS соединения: + // 0 - соединение устанавливается + // 1 - соединение установлено + // 2 - соединение закрывается + // 3 - нет соединения + // 10 - состояние не распознано + // ipv4Buf возвращает в формате xxx.xxx.xxx.xxx -////////////////////////////////////////////////////// -/// GPRS -////////////////////////////////////////////////////// - /** Connect the GPRS module to the network. - * @return true if connected, false otherwise - */ - -// bool join(const __FlashStringHelper *apn = 0, const __FlashStringHelper *userName = 0, const __FlashStringHelper *passWord = 0); - bool join(char* apn = 0, char* = 0, char* = 0, int timeout = 2 * DEFAULT_TIMEOUT); + void disconnectGprs(void); // Disconnect the GPRS module from the network + int httpGet(char* url, int& dataLen); - /** Disconnect the GPRS module from the network - * @returns - */ - void disconnect(void); - /** Open a tcp/udp connection with the specified host on the specified port * @param socket an endpoint of an inter-process communication flow of GPRS module,for SIM900 module, it is in [0,6] * @param ptl protocol for socket, TCP/UDP can be choosen @@ -219,24 +222,13 @@ class GPRS * @param timeout wait seconds till connected * @returns true if successful */ - bool connect(Protocol ptl, const char * host, int port, int timeout = 2 * DEFAULT_TIMEOUT); + bool connect(Protocol ptl, const char * host, int port, int timeout = 2 * DEFAULT_TIMEOUT); bool connect(Protocol ptl, const __FlashStringHelper *host, const __FlashStringHelper *port, int timeout = 2 * DEFAULT_TIMEOUT); - /** Check if a tcp link is active - * @returns true if successful - */ - bool is_connected(void); - - /** Close a tcp connection - * @returns true if successful - */ - bool close(void); - - /** check if GPRS module is readable or not - * @returns true if readable - */ - int readable(void); + bool close(void); // Close a tcp connection * @returns true if successful + int readable(void); // check if GPRS module is readable. @returns true if readable + /** wait a few time to check if GPRS module is readable or not * @param socket socket * @param wait_time time of waiting @@ -258,14 +250,6 @@ class GPRS */ int send(const char * str, int len); - /** read data from socket - * @param socket socket - * @param buf buffer that will store the data read from socket - * @param len string length need to read from socket - * @returns bytes that actually read - */ - int recv(char* buf, int len); - /** convert the host to ip * @param host host ip string, ex. 10.11.12.13 * @param ip long int ip address, ex. 0x11223344 @@ -277,15 +261,11 @@ class GPRS unsigned long getIPnumber(); private: - bool checkSIMStatus(void); uint8_t _stPin = 3; uint8_t _pkPin = 2; uint32_t str_to_ip(const char* str); -// SoftwareSerial gprsSerial; Stream* stream; static GPRS* inst; - uint32_t _ip; - char ip_string[16]; //XXX.YYY.ZZZ.WWW + \0 }; #endif diff --git a/examples/GPRS_AT_Commands/GPRS_AT_Commands.ino b/examples/GPRS_AT_Commands/GPRS_AT_Commands.ino index b8adc63..12dcf7d 100644 --- a/examples/GPRS_AT_Commands/GPRS_AT_Commands.ino +++ b/examples/GPRS_AT_Commands/GPRS_AT_Commands.ino @@ -1,147 +1,65 @@ -// буфер PC Serial -char bufferPC_Serial[64]; -// буфер GPRS Serial -char bufferGPRS_Serial[64]; - -int i = 0; -int j = 0; - +#include + + +#define PIN_PK 8 +#define PIN_ST 9 +#define PIN_RX 10 +#define PIN_TX 11 +#define BAUDRATE 115200 + +char bufferPC_Serial[96]; +char bufferGPRS_Serial[96]; +GPRS gprsModul(PIN_PK, PIN_ST, BAUDRATE); + + void setup() { - // включаем GPRS-шилд - gprs_OnOff(); - - // открываем последовательный порт для мониторинга действий в программе - Serial.begin(9600); - - // открываем последовательный порт - // для связи с GPRS-устройством со скоростью 9600 бод - Serial1.begin(9600); - - while (!Serial) { - // ждём, пока не откроется монитор последовательного порта - // для того, чтобы отследить все события в программе - } - - // пока не установится связь с GPRS-устройством, будем крутиться в теле функции - gprsTest(); + Serial.begin(BAUDRATE); // открываем последовательный порт для мониторинга действий в программе + while (!Serial) { // ждём, пока не откроется монитор последовательного порта + } + Serial.println("Serial - OK"); + gprsModul.powerOn(); +// gprsModul.init(); // Ждём инициализацию модема + sim900_check_with_cmd("ATE1\r\n",OK,CMD); } - + + void loop() { - // считываем данные с компьютера и записываем их в GPRS Shield - serialPCread(); - // считываем данные с GPRS Shield и выводим их в Serial-порт - serialGPRSread(); + serialPCread(); // считываем данные с компьютера и записываем их в GPRS Shield + gprsSIM900read(); // считываем данные с GPRS Shield и выводим их в Serial-порт } - + + void serialPCread() { - i = 0; - // если появились данные с компьютера - if (Serial.available() > 0) { - while (Serial.available() > 0) { - // пока идёт передача данных, - // записываем каждый байт в символьный массив - bufferPC_Serial[i++]=(Serial.read()); - } - // добавляем символ конца строки - bufferPC_Serial[i] = '\0'; - // записываем данные в GPRS Shield - Serial1.println(bufferPC_Serial); - Serial.println(""); - // очищаем буфер PC Serial - clearBufferPC_Serial(); - } -} - -void serialGPRSread() -{ - j = 0; - // если появились данные с GPRS Shield - if (Serial1.available() > 0) { - while (Serial1.available() > 0) { - // пока идёт передача данных, - // записываем каждый байт в символьный массив - bufferGPRS_Serial[j++]=(Serial1.read()); - } - // добавляем символ конца строки - bufferGPRS_Serial[j] = '\0'; - // выводим полученные данные с GPRS Shield в Serial-порт - Serial.write(bufferGPRS_Serial); - // очищаем буфер GPRS Serial - clearBufferGPRS_Serial(); - } -} - -void clearBufferPC_Serial() -{ - for (int t = 0; t < i; t++) { - // очищаем буфер, - // присваивая всем индексам массива значение 0 - bufferPC_Serial[t] = 0; - } -} - -void clearBufferGPRS_Serial() -{ - for (int t = 0; t < j; t++) { - // очищаем буфер, - // присваивая всем индексам массива значение 0 - bufferGPRS_Serial[t] = 0; - } -} - -void gprsTest() -{ - // бесконечный цикл - while (1) { - // ждём 1 секунду - delay(1000); - j = 0; - // посылаем в GPRS Shield АТ-команду "AT" - Serial1.println("AT"); - // если появились данные с GPRS Shield - if (Serial1.available() > 0) { - while (Serial1.available() > 0) { - // пока идёт передача данных, - // записываем каждый байт в символьный массив - bufferGPRS_Serial[j++] = Serial1.read(); + int i = 0; + if (Serial.available() > 0) { + sim900_clean_buffer(bufferPC_Serial, 96); + while (Serial.available() > 0) { + bufferPC_Serial[i++]=(Serial.read()); } - // добавляем символ конца строки - bufferGPRS_Serial[j] = '\0'; - // посылаем АТ-команду "AT"; если GPRS Shield исправен, - // он должен вернуть команду "AT"; - // сравниваем всё что находиться в буфере GPRS Shield - // со строкой "AT\r\n\r\nOK\r\n" - if (strcmp(bufferGPRS_Serial, "AT\r\n\r\nOK\r\n") == 0) { - // если всё верно выводим в Serial порт "State OK" - // и выходим из бесконечного цикла - Serial.println("State OK"); - break; - } else { - // если строки разные, значит произошла ошибка - // выводим сообщение об ошибке и продолжаем цикл - Serial.println("Init ERROR"); - } - } - // очищаем буфер GPRS Serial - clearBufferGPRS_Serial(); - } + delay(100); + bufferPC_Serial[i] = '\0'; + if (strcmp("Q\r\n",bufferPC_Serial) == 0 ) { + gprsModul.powerOff(); + } else if (strcmp("B\r\n",bufferPC_Serial) == 0 ) { + gprsModul.powerOn(); + gprsModul.init(); + }; + sim900_send_cmd(bufferPC_Serial); + } } - -void gprs_OnOff() + + +void gprsSIM900read() { - // настраиваем пин №2 в режим выхода - pinMode(2, OUTPUT); - // проверяем состояние 3 пина - if (digitalRead(3) != HIGH) { - // если на нём «низкий уровень» - // подаём на пин 2 «высокий уровень» - digitalWrite(2, HIGH); - // ждём 3 секунды - delay(3000); - } - // подаём на пин 2 «низкий уровень» - digitalWrite(2, LOW); + int j = sim900_check_readable(); + if (j > 0) + { + sim900_clean_buffer(bufferGPRS_Serial,96); + sim900_read_buffer(bufferGPRS_Serial, j); + bufferGPRS_Serial[j] = '\0'; + Serial.print(bufferGPRS_Serial); + } } diff --git a/examples/GPRS_Power_off_and_on/GPRS_Power_off_and_on.ino b/examples/GPRS_Power_off_and_on/GPRS_Power_off_and_on.ino new file mode 100644 index 0000000..0388e84 --- /dev/null +++ b/examples/GPRS_Power_off_and_on/GPRS_Power_off_and_on.ino @@ -0,0 +1,44 @@ +#include + +#define PIN_PK 8 // Контакт включения GPRS модуля +#define PIN_ST 9 // контакт состояния GPRG модуля + +GPRS gprs(PIN_PK, PIN_ST, 115200); + +void setup() { + // открываем последовательный порт для мониторинга действий в программе + Serial.begin(115200); + while (!Serial) { + // ждём, пока не откроется монитор последовательного порта + // для того, чтобы отследить все события в программе + } + Serial.println("Serial Ok."); +} + +void loop() { + long t1,t2; + if (gprs.isPowerOn()) { + Serial.print ("Выключаем."); + t1 = millis(); + gprs.powerOff(); + if (gprs.isPowerOn()) { + Serial.print(" !!! --- не выключилось --- !!! "); + Serial.println(millis()-t1); + } else { + Serial.print("Ok. "); + Serial.println(millis()-t1); + } + } else { + Serial.print ("Включаем."); + t1 = millis(); + gprs.powerOn(); + t2 = millis(); + if (!gprs.isPowerOn()) { + Serial.print("!!! --- не включилось --- !!!"); + Serial.println(t2-t1); + } else { + Serial.print(" Ok."); + Serial.println(t2-t1); + } + } +} diff --git a/examples/gprs_get_datetime/gprs_get_datetime.ino b/examples/gprs_get_datetime/gprs_get_datetime.ino new file mode 100644 index 0000000..5afc343 --- /dev/null +++ b/examples/gprs_get_datetime/gprs_get_datetime.ino @@ -0,0 +1,50 @@ +/* Пример получения времени с внутренних часов gprs-модуля. + Если в модуле не установлена батарейка, то после каждого выключения + часы сбрасываются в начальное значение. + Для установки правильного текущего времени можно синхронизироваться + по серверам службы NTP. Для этого в библиотеке есть функция. + Пример её использования смотри в скатче + gprs_ntp_datetime +*/ + +#include + +#define PIN_PK 8 // Контакт включения GPRS модуля +#define PIN_ST 9 // контакт состояния GPRG модуля +#define BAUDRATE 115200 // частота обмена данными + +GPRS gprsModul(PIN_PK, PIN_ST, BAUDRATE); // создаём объект + +void setup() +{ + Serial.begin(BAUDRATE); + while (!Serial) { + // ждем, пока откроется монитор последовательного порта + } + Serial.println("Serial OK!"); +} + + + +void loop() +{ + unsigned char rc; + char tmpBuf[64]; + // + Serial.print ("Power... "); + gprsModul.powerOn(); + Serial.print (" On"); + // + Serial.print ("; init... "); + rc = gprsModul.init(); + Serial.print ("rc="); + Serial.print (int(rc)); + // + sim900_clean_buffer(tmpBuf, sizeof(tmpBuf)); + Serial.print ("; dateTime = "); + Serial.print (gprsModul.getDateTime(tmpBuf)); + Serial.println(";"); + // + gprsModul.powerOff(); + delay(15*1000); +} \ No newline at end of file diff --git a/examples/gprs_get_imei/gprs_get_imei.ino b/examples/gprs_get_imei/gprs_get_imei.ino new file mode 100644 index 0000000..7aabe21 --- /dev/null +++ b/examples/gprs_get_imei/gprs_get_imei.ino @@ -0,0 +1,40 @@ +#include + +#define PIN_PK 8 // Контакт включения GPRS модуля +#define PIN_ST 9 // контакт состояния GPRG модуля +#define BAUDRATE 115200 // частота обмена данными + +GPRS gprsModul(PIN_PK, PIN_ST, BAUDRATE); // создаём объект + +void setup() +{ + Serial.begin(BAUDRATE); + while (!Serial) { + // ждем, пока откроется монитор последовательного порта + } + Serial.println("Serial OK!"); +} + + + +void loop() { + unsigned char rc; + char tmpBuf[64]; + // + Serial.print ("Power... "); + gprsModul.powerOn(); + Serial.print (" On"); + // + Serial.print ("; init... "); + rc = gprsModul.init(); + Serial.print ("rc="); + Serial.print (int(rc)); + // + Serial.print("; imei="); + sim900_clean_buffer(tmpBuf, sizeof(tmpBuf)); + gprsModul.getImei(tmpBuf); + Serial.print(tmpBuf); + Serial.println(";"); + // + delay(5*1000); +} diff --git a/examples/gprs_http_get/gprs_http_get.ino b/examples/gprs_http_get/gprs_http_get.ino new file mode 100644 index 0000000..c1c0f36 --- /dev/null +++ b/examples/gprs_http_get/gprs_http_get.ino @@ -0,0 +1,61 @@ +#include + +#define PIN_PK 8 // Контакт включения GPRS модуля +#define PIN_ST 9 // контакт состояния GPRG модуля +#define BAUDRATE 115200 // частота обмена данными + +char tmpBuf[64]; // Символьный буфер +int moneyBalanceInt; // Переменная в которой хранится текущий денежный баланс +char moneyBalanceBuf[32]; // Строка ответа о текущем балансе + +const char apn[] = "internet.mts.ru";// Для билайна: "home.beeline.ru", МТС: "internet.mts.ru" megafon: "internet" +const char lgn[] = "mts"; // Логин=Пароль MTS: "mts" megafon: "gdata" +const char balanceReq[]= "#100#"; // USSD номер проверки балланса +const char ntpService[]= "pool.ntp.org"; // Сервер NTP-синхронизации + +GPRS gprsModul(PIN_PK, PIN_ST, BAUDRATE); + + + +void setup() +{ + Serial.begin(BAUDRATE); + while (!Serial) { + // ждем, пока откроется монитор последовательного порта + } + Serial.println("Serial OK!"); +} + + + +void loop() { + unsigned char rc; + char tmpBuf[64]; + char urlBuf[]="http://diribus.net/loger.php?ddddddd=fff"; + int dataLen; + // + Serial.print ("Power..."); + gprsModul.powerOn(); + Serial.print ("On; init rc="); + rc = gprsModul.init(tmpBuf, apn, lgn, lgn); + Serial.print (int(rc)); + // + rc = gprsModul.getGprsStatus(tmpBuf); + Serial.print ("; getGprsStatus rc="); + Serial.print ( int(rc) ); + Serial.print ("; ip="); + Serial.print (tmpBuf); + + int result = gprsModul.httpGet( urlBuf, dataLen ); + Serial.print ("; Http код возврата ="); + Serial.print (result); + Serial.print (" Размер страницы ="); + Serial.print (dataLen); + + Serial.print ("; dateTime="); + sim900_clean_buffer(tmpBuf, sizeof(tmpBuf)); + Serial.print(gprsModul.getDateTime(tmpBuf)); + Serial.println(); + gprsModul.powerOff(); + delay(15*1000); +} diff --git a/examples/gprs_init_with_join_gprs/gprs_init_with_join_gprs.ino b/examples/gprs_init_with_join_gprs/gprs_init_with_join_gprs.ino new file mode 100644 index 0000000..7d1f0a1 --- /dev/null +++ b/examples/gprs_init_with_join_gprs/gprs_init_with_join_gprs.ino @@ -0,0 +1,70 @@ +/* + Библиотека содержит три версии функции init для начальной инициализации + модуля. Первая версия - без параметров. Она рекомендуется, когда + не планируете выход в интернет. То есть, будете пользоваться только SMS + и голосовым вызовом. + Если же интернет нужен, то можно выполнить подключение и получение IP адреса + сразу. Для этого вторая и третья версии функции. Параметры те же, что и + в функции joinGprs. + Третья версия не только подключается к сети, но и сохраняет APN параметры. + Пока модуль не будет выключен, эти параметры использоваться по умолчанию. + + При удачном подключении к GPRS, модуль должен получит IP адрес. + Функция возвращает его в параметре. IP адрес выдаётся мобильным + оператором. В общем случае, требуется указывать APN, логин и пароль. + Если их не указать, всё равно предоставляется IP адрес, если услуга + доступна. Скорее всего, используется значение по умолчанию. + Проверял для МТС, Beeline и Мегафон. + Однако, можно не испытывать судьбу и использовать версию функции init со + всеми параметрами. Можете пробовать разные функции, поочередно закометировав + соответствующую строку. +*/ + +#include + +#define PIN_PK 8 // Контакт включения GPRS модуля +#define PIN_ST 9 // контакт состояния GPRG модуля +#define BAUDRATE 115200 // частота обмена данными + +const char apn[] = "internet"; // Для билайна: "home.beeline.ru", МТС: "internet.mts.ru" megafon: "internet" +const char lgn[] = "mts"; // Логин MTS: "mts" megafon: "gdata" +const char pwd[] = "mts"; // Пароль MTS: "mts" megafon: "gdata" + +GPRS gprsModul(PIN_PK, PIN_ST, BAUDRATE); // создаём объект + + + +void setup() +{ + Serial.begin(BAUDRATE); + while (!Serial) { + // ждем, пока откроется монитор последовательного порта + } + Serial.println("Serial OK!"); +} + + + +void loop() +{ + unsigned char rc; + char tmpBuf[16]; + // + Serial.print ("Power... "); + gprsModul.powerOn(); + Serial.print (" On"); + // + sim900_clean_buffer(tmpBuf, sizeof(tmpBuf)); // предварительная очистка буфера для IP адреса + Serial.print ("; init... "); + rc = gprsModul.init(tmpBuf); // Инициализация без APN параметров +//rc = gprsModul.init(tmpBuf, apn, lgn, pwd); // Инициализация с APN параметрами + Serial.print ("rc="); + Serial.print (int(rc)); + // + Serial.print ("; IP-address = "); + Serial.print (tmpBuf); + Serial.println(";"); + // + gprsModul.powerOff(); + delay(15*1000); +} \ No newline at end of file diff --git a/examples/gprs_join_gprs/gprs_join_gprs.ino b/examples/gprs_join_gprs/gprs_join_gprs.ino new file mode 100644 index 0000000..f7bec05 --- /dev/null +++ b/examples/gprs_join_gprs/gprs_join_gprs.ino @@ -0,0 +1,70 @@ +/* + Библиотека содержит две версии функции joinGprs для подключения к сети через + мобильного оператора. Одна версия с APN параметрами, другая без них. + Экспериментально я выявил, что подключение происходит успешно при любых + значениях параметров. Возможно, что это только в "домашней" сети и не на + всех тарифных планах. Я проверял МТС, Beeline и Мегафон в Москве. + При удачном подключении к GPRS, модуль должен получит IP адрес. + Функция joinGprs возвращает его в первом параметре. + Сама функция возвращает статус GPRS соединения: + 0 - соединение устанавливается + 1 - соединение установлено + 2 - соединение закрывается + 3 - нет соединения + 10 - состояние не распознано + ipv4Buf возвращает в формате xxx.xxx.xxx.xxx + +*/ + +#include + +#define PIN_PK 8 // Контакт включения GPRS модуля +#define PIN_ST 9 // контакт состояния GPRG модуля +#define BAUDRATE 115200 // частота обмена данными + +const char apn[] = "internet"; // Для билайна: "home.beeline.ru", МТС: "internet.mts.ru" megafon: "internet" +const char lgn[] = "mts"; // Логин MTS: "mts" megafon: "gdata" +const char pwd[] = "mts"; // Пароль MTS: "mts" megafon: "gdata" + +GPRS gprsModul(PIN_PK, PIN_ST, BAUDRATE); // создаём объект + + + +void setup() +{ + Serial.begin(BAUDRATE); + while (!Serial) { + // ждем, пока откроется монитор последовательного порта + } + Serial.println("Serial OK!"); +} + + + +void loop() +{ + unsigned char rc; + char tmpBuf[16]; + // + Serial.print ("Power... "); + gprsModul.powerOn(); + Serial.print (" On"); + // + Serial.print ("; init... "); + rc = gprsModul.init(); // Инициализация без подключения к сети + Serial.print ("rc="); + Serial.print (int(rc)); + // + sim900_clean_buffer(tmpBuf, sizeof(tmpBuf)); // предварительная очистка буфера для IP адреса + Serial.print ("; joinGprs... "); + rc = gprsModul.joinGprs(tmpBuf); // Инициализация без APN параметров + //rc = gprsModul.joinGprs(tmpBuf, apn,lgn,pwd); // Инициализация с APN параметрами + Serial.print ("rc="); + Serial.print (int(rc)); + Serial.print ("; IP-address = "); + Serial.print (tmpBuf); + Serial.println(";"); + // + gprsModul.powerOff(); + delay(15*1000); +} diff --git a/examples/gprs_money_balans/gprs_money_balans.ino b/examples/gprs_money_balans/gprs_money_balans.ino new file mode 100644 index 0000000..8bd7b9d --- /dev/null +++ b/examples/gprs_money_balans/gprs_money_balans.ino @@ -0,0 +1,58 @@ +#include + +#define PIN_PK 8 // Контакт включения GPRS модуля +#define PIN_ST 9 // контакт состояния GPRG модуля +#define BAUDRATE 115200 // частота обмена данными + +GPRS gprsModul(PIN_PK, PIN_ST, BAUDRATE); // создаём объект типа GPRS +int moneyBalanceInt; // Переменная в которой хранится текущий денежный баланс +char moneyBalanceBuf[32]; // Строка ответа о текущем балансе + + + +//const char apn[] = "internet.mts.ru"; // Для билайна: "home.beeline.ru", МТС: "internet.mts.ru" megafon: "internet" +//const char lgn[] = "mts"; // Логин=Пароль MTS: "mts" megafon: "gdata" +const char balanceReq[]= "#100#"; // USSD номер проверки балланса + + + +void setup() +{ + Serial.begin(BAUDRATE); + while (!Serial) { + // ждем, пока откроется монитор последовательного порта + } + Serial.println("Serial OK!"); +} + + + +void loop() +{ + unsigned char rc; + char tmpBuf[64]; + // + Serial.print ("Power... "); + gprsModul.powerOn(); + Serial.print (" On"); + // + Serial.print ("; init... "); + rc = gprsModul.init(); + Serial.print ("rc="); + Serial.print (int(rc)); + // + sim900_clean_buffer(tmpBuf, sizeof(tmpBuf)); + Serial.print ("; readBalance"); + rc = gprsModul.readBalance(balanceReq, moneyBalanceBuf, sizeof(moneyBalanceBuf)-1, moneyBalanceInt); + Serial.print (" rc="); + Serial.print (int(rc)); + // + Serial.print ("; "); + Serial.print (moneyBalanceBuf); + Serial.print ("; "); + Serial.print (moneyBalanceInt); + Serial.println(";"); + // + gprsModul.powerOff(); + delay(15*1000); +} diff --git a/examples/gprs_ntp_datetime/gprs_ntp_datetime.ino b/examples/gprs_ntp_datetime/gprs_ntp_datetime.ino new file mode 100644 index 0000000..933614b --- /dev/null +++ b/examples/gprs_ntp_datetime/gprs_ntp_datetime.ino @@ -0,0 +1,58 @@ +/* Пример получения времени с внутренних часов gprs-модуля. +*/ + +#include + +#define PIN_PK 8 // Контакт включения GPRS модуля +#define PIN_ST 9 // контакт состояния GPRG модуля +#define BAUDRATE 115200 // частота обмена данными + +GPRS gprsModul(PIN_PK, PIN_ST, BAUDRATE); // создаём объект + +//const char apn[] = "internet.mts.ru"; // Для билайна: "home.beeline.ru", МТС: "internet.mts.ru" megafon: "internet" +//const char lgn[] = "mts"; // Логин=Пароль MTS: "mts" megafon: "gdata" +//const char balanceReq[]= "#100#"; // USSD номер проверки балланса +const char ntpService[]= "pool.ntp.org"; // Сервер NTP-синхронизации + + + +void setup() +{ + Serial.begin(BAUDRATE); + while (!Serial) { + // ждем, пока откроется монитор последовательного порта + } + Serial.println("Serial OK!"); +} + + + +void loop() +{ + unsigned char rc; + char tmpBuf[64]; + // + Serial.print ("Power... "); + gprsModul.powerOn(); + Serial.print (" On"); + // + Serial.print ("; init... "); + sim900_clean_buffer(tmpBuf, sizeof(tmpBuf)); + rc = gprsModul.init(tmpBuf); + Serial.print ("rc="); + Serial.print (int(rc)); + // + sim900_clean_buffer(tmpBuf, sizeof(tmpBuf)); + Serial.print ("; ntpSync..."); + rc = gprsModul.syncNtp(ntpService); + Serial.print ("rc="); + Serial.print (int(rc)); + // + sim900_clean_buffer(tmpBuf, sizeof(tmpBuf)); + Serial.print ("; dateTime = "); + Serial.print (gprsModul.getDateTime(tmpBuf)); + Serial.println(";"); + // + gprsModul.powerOff(); + delay(15*1000); +} diff --git a/examples/gprs_power_on_and_off/gprs_power_on_and_off.ino b/examples/gprs_power_on_and_off/gprs_power_on_and_off.ino new file mode 100644 index 0000000..1f792ad --- /dev/null +++ b/examples/gprs_power_on_and_off/gprs_power_on_and_off.ino @@ -0,0 +1,44 @@ +#include + +#define PIN_PK 8 // Контакт включения GPRS модуля +#define PIN_ST 9 // контакт состояния GPRG модуля +#define BAUDRATE 115200 // частота обмена данными + +GPRS gprs(PIN_PK, PIN_ST, 115200); + +void setup() { + // открываем последовательный порт для мониторинга действий в программе + Serial.begin(115200); + while (!Serial) { + // ждём, пока не откроется монитор последовательного порта + // для того, чтобы отследить все события в программе + } + Serial.println("Serial Ok."); +} + +void loop() { + long t1,t2; + if (gprs.isPowerOn()) { + Serial.print ("Выключаем."); + t1 = millis(); + gprs.powerOff(); + t2 = millis(); + if (gprs.isPowerOn()) { + Serial.print(" !!! --- не выключилось --- !!! "); + } else { + Serial.print(" Ok. "); + } + } else { + Serial.print ("Включаем."); + t1 = millis(); + gprs.powerOn(); + t2 = millis(); + if (!gprs.isPowerOn()) { + Serial.print(" !!! --- не включилось --- !!!"); + } else { + Serial.print(" Ok. "); + } + } + Serial.print(t2-t1); // Печатаем, сколько времени (милисекунд) + Serial.println(" ms;"); // ушло на включение или выклюсчение +} diff --git a/sim900.cpp b/sim900.cpp index 14efd25..c020c4a 100644 --- a/sim900.cpp +++ b/sim900.cpp @@ -40,11 +40,15 @@ void sim900_init(void * uart_device) serialSIM900 = (Stream*)uart_device; } + + int sim900_check_readable() { return serialSIM900->available(); } + + int sim900_wait_readable (int wait_time) { unsigned long timerStart; @@ -60,6 +64,8 @@ int sim900_wait_readable (int wait_time) return dataLen; } + + void sim900_flush_serial() { while(sim900_check_readable()){ @@ -67,6 +73,8 @@ void sim900_flush_serial() } } + + void sim900_read_buffer(char *buffer, int count, unsigned int timeout, unsigned int chartimeout) { int i = 0; @@ -91,6 +99,8 @@ void sim900_read_buffer(char *buffer, int count, unsigned int timeout, unsigned } } + + void sim900_clean_buffer(char *buffer, int count) { for(int i=0; i < count; i++) { @@ -98,17 +108,23 @@ void sim900_clean_buffer(char *buffer, int count) } } + + //HACERR quitar esta funcion ? void sim900_send_byte(uint8_t data) { serialSIM900->write(data); } + + void sim900_send_char(const char c) { serialSIM900->write(c); } + + void sim900_send_cmd(const char* cmd) { for(int i=0; i