From 947d6051c26fc273f88981794f86eb396f43899e Mon Sep 17 00:00:00 2001 From: Docenko G Date: Sat, 20 Aug 2016 18:08:47 +0300 Subject: [PATCH 1/9] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D0=BD=D1=8B=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8?= =?UTF-8?q?=20=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B8=20=D0=B2=D1=8B=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=B8=D1=82=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit При выключении, желательно не просто обесточить модуль, а выполнить корректное отключение. Тогда отключение будет зарегистрировано в сети мобильного оператора, а в энергонезависимый памяти сохранены текущие режимы и переменные. Одна и та же последовательность сигналов на управляющем спине приводит как к выключению, так и включению модуля. Результат зависит от предшествующего состояния. --- GPRS_Shield_Arduino.cpp | 50 +++++++++++++------ GPRS_Shield_Arduino.h | 28 ++--------- .../GPRS_Power_off_and_on.ino | 44 ++++++++++++++++ 3 files changed, 82 insertions(+), 40 deletions(-) create mode 100644 examples/GPRS_Power_off_and_on/GPRS_Power_off_and_on.ino diff --git a/GPRS_Shield_Arduino.cpp b/GPRS_Shield_Arduino.cpp index 690faa8..1dec1e3 100644 --- a/GPRS_Shield_Arduino.cpp +++ b/GPRS_Shield_Arduino.cpp @@ -95,29 +95,47 @@ bool GPRS::checkPowerUp(void) return sim900_check_with_cmd("AT\r\n","OK\r\n",CMD); } -void GPRS::powerUpDown() + + +bool GPRS::isPowerOn(void) { + return digitalRead(_stPin); +} + + + +void GPRS::powerUpDown() { // The same sequence is used for switching on and to power off pinMode(_pkPin, OUTPUT); - if(!digitalRead(_stPin)) - { - digitalWrite(_pkPin, HIGH); - delay(3000); - } + digitalWrite(_pkPin, LOW); + delay(1000); + digitalWrite(_pkPin, HIGH); + delay(2000); digitalWrite(_pkPin, LOW); delay(3000); } -void GPRS::powerOff() -{ - pinMode(_pkPin, OUTPUT); - if(digitalRead(_stPin)) - { - digitalWrite(_pkPin, HIGH); - delay(3000); + + +void GPRS::powerOff(void) { // Желательно корректно отключать питание, для сохранения переменных + long t1 = millis(); // в памяти и для разрегистрации в сети мобильного оператора. + sim900_send_cmd("AT+CPOWD=1\r\n"); // Даем команду на выключение + while (millis()-t1 < 8000) { // и в течение ХХХХ милисекунд джем + if(!digitalRead(_stPin)) { // произошло ли выключение. + return; // Выходим, если отключилось быстрее. + } } - digitalWrite(_pkPin, LOW); - delay(3000); -} + powerUpDown(); // Иначе передёрним питание +} + + + +void GPRS::powerOn(void) { + if(!digitalRead(_stPin)) { // Если питание не подано, + powerUpDown(); // то выполним стандартную последовательность сигналов + } +} + + bool GPRS::checkSIMStatus(void) { diff --git a/GPRS_Shield_Arduino.h b/GPRS_Shield_Arduino.h index da4fbf0..53c86a1 100644 --- a/GPRS_Shield_Arduino.h +++ b/GPRS_Shield_Arduino.h @@ -67,30 +67,11 @@ class GPRS bool init(void); - - /** check if GPRS module is powered on or not - * @returns - * true on success - * false on error - */ bool checkPowerUp(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 isPowerOn(void); + void powerUpDown(void); + void powerOff(void); + void powerOn(void); bool sendSMS(char* number, char* data); /** Check if there is any UNREAD SMS: this function DOESN'T change the UNREAD status of the SMS @@ -99,7 +80,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 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); + } + } +} From d4853d43b60a74e0b982bc7198809aa14c74508e Mon Sep 17 00:00:00 2001 From: Docenko G Date: Mon, 22 Aug 2016 00:45:00 +0300 Subject: [PATCH 2/9] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20getImei,=20=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D1=8B=20init=20=D0=B8=20getDateTime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit getDateTime - убрал секунды (не нужна такая избыточная точность). и поменял тип возвращаемых данных. int - добавил команду ATE0 - режим без эхо, чтоб легче было парсить ответы FN команд. И изменил настройки CNMI на 2,0,2,1,1 (Это означает - принимать СМС и записывать их в память, без сообщения о приходе СМС) Переформатирую потихоньку код к более компактному виду. --- GPRS_Shield_Arduino.cpp | 126 +++++++++++++++++++++++----------------- GPRS_Shield_Arduino.h | 30 ++++------ 2 files changed, 85 insertions(+), 71 deletions(-) diff --git a/GPRS_Shield_Arduino.cpp b/GPRS_Shield_Arduino.cpp index 1dec1e3..536cfb3 100644 --- a/GPRS_Shield_Arduino.cpp +++ b/GPRS_Shield_Arduino.cpp @@ -59,42 +59,22 @@ GPRS::GPRS(uint8_t pkPin, uint8_t stPin, uint8_t rx, uint8_t tx, uint32_t baudRa 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; - - 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; - } + if(!sim900_check_with_cmd("AT\r\n",OK,CMD)) return false; + if(!sim900_check_with_cmd("ATE0\r\n",OK,CMD)) return false; + if(!sim900_check_with_cmd("AT+CFUN=1\r\n",OK,CMD)) return false; + if(!checkSIMStatus()) return false; + if (!sim900_check_with_cmd("AT+CNMI?\r\n", "+CNMI: 2,0,2,1,1\r\nOK\r\n",CMD)) { + if (!sim900_check_with_cmd("AT+CNMI=2,0,2,1,1\r\n",OK,CMD)) return false; } - 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; - } - } - - if (!sim900_check_with_cmd("AT+CLIP=1\r\n","OK\r\n",CMD)) { - return false; + if (!sim900_check_with_cmd("AT+CMGF=1\r\n",OK,CMD)) return false; } - + if (!sim900_check_with_cmd("AT+CLIP=1\r\n",OK,CMD)) return false; + delay(5000); return true; } -bool GPRS::checkPowerUp(void) -{ - return sim900_check_with_cmd("AT\r\n","OK\r\n",CMD); -} - bool GPRS::isPowerOn(void) @@ -104,7 +84,7 @@ bool GPRS::isPowerOn(void) -void GPRS::powerUpDown() { // The same sequence is used for switching on and to power off +void GPRS::powerUpDown(void) { // The same sequence is used for switching on and to power off pinMode(_pkPin, OUTPUT); digitalWrite(_pkPin, LOW); delay(1000); @@ -137,6 +117,35 @@ void GPRS::powerOn(void) { +char* GPRS::getImei(char* imei) +{ + // --> CRLF = 2 + //999999999999999 --> 15 + CRLF = 17 + // --> CRLF = 2 + //OK --> 2 + CRLF = 4 + char tbuf[25]; + sim900_clean_buffer(tbuf,sizeof(tbuf)); + char* p; + char* s; + int i = 0; + sim900_flush_serial(); + sim900_send_cmd("AT+GSN\r\n"); + sim900_read_buffer(tbuf,19,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; +} + + + bool GPRS::checkSIMStatus(void) { char gprsBuffer[32]; @@ -348,6 +357,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]; @@ -488,35 +506,39 @@ 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 + + char* GPRS::getDateTime(char* buffer) + { + //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[46]; + char gprsBuffer[40]; char *p,*s; + sim900_flush_serial(); sim900_send_cmd("AT+CCLK?\r\n"); - sim900_clean_buffer(gprsBuffer,43); - sim900_read_buffer(gprsBuffer,43,DEFAULT_TIMEOUT); + 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 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'; + 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++); } - //We are going to flush serial data until OK is recieved - return sim900_wait_for_resp("OK\r\n", CMD); - } - return false; - } + buffer[i] = '\0'; + } + } + sim900_wait_for_resp(OK, CMD); + return buffer; + } + + byte GPRS::getSignalStrength() { //AT+CSQ: 00,00 --> 13 + CRLF = 15 diff --git a/GPRS_Shield_Arduino.h b/GPRS_Shield_Arduino.h index 53c86a1..b73d6f6 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, @@ -65,14 +63,13 @@ class GPRS * @return true if connected, false otherwise */ - bool init(void); - - bool checkPowerUp(void); - bool isPowerOn(void); - void powerUpDown(void); - void powerOff(void); - void powerOn(void); - bool sendSMS(char* number, char* data); + bool init(void); + bool isPowerOn(void); + void powerUpDown(void); + void powerOff(void); + void powerOn(void); + char* getImei(char* imei); + 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 @@ -112,7 +109,8 @@ class GPRS */ void readSMS(); - bool deleteSMS(int index); + bool deleteSMS(int index); // Удалить SMS по индексу + bool deleteSMS(void); // Удалить все, кроме непрочитанных /** call someone * @param number the phone number which you want to call @@ -157,13 +155,7 @@ class GPRS */ bool isCallActive(char *number); - /** get DateTime from SIM900 (see AT command: AT+CLTS=1) as string - * @param - * @returns - * true on success - * false on error - */ - bool getDateTime(char *buffer); + char* getDateTime(char* buffer); /** getSignalStrength from SIM900 (see AT command: AT+CSQ) * @returns From 694ed28274fe6fd81daa287303a39c82f20ad9f0 Mon Sep 17 00:00:00 2001 From: Docenko G Date: Wed, 24 Aug 2016 00:32:55 +0300 Subject: [PATCH 3/9] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D1=8E=20=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8E=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=20NTP=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Не завершено, хотя работает правильно. Надо сделать параметры и код завершения --- GPRS_Shield_Arduino.cpp | 50 +++++++++++++++++++++++++++++++++++++++++ GPRS_Shield_Arduino.h | 3 ++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/GPRS_Shield_Arduino.cpp b/GPRS_Shield_Arduino.cpp index 536cfb3..5a8d1d8 100644 --- a/GPRS_Shield_Arduino.cpp +++ b/GPRS_Shield_Arduino.cpp @@ -540,6 +540,56 @@ bool GPRS::hangup(void) +bool GPRS::syncNtp (const char* ntpServer) //Синхронизфция времени в модеме с NTP сервером +{ + /* + AT+SAPBR=0,1 + AT+SAPBR=3,1,"CONTYPE","GPRS" + AT+SAPBR=3,1,"APN","internet.mts.ru" + AT+SAPBR=3,1,"USER","mts" + AT+SAPBR=3,1,"PWD","mts" + AT+SAPBR=1,1 + AT+CNTP="pool.ntp.org",3,1,0 + AT+CNTP + AT+SAPBR=0,1 + */ + + char *p,*s; + + char tmpBuf[56]; + 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),DEFAULT_TIMEOUT); // Считываем ответ + if(NULL != ( s = strstr(tmpBuf,"+SAPBR: 1,"))) { // находим нужное место + char gprsStatus = *(s+10); // состояние соединения + Serial.println(gprsStatus); + if (gprsStatus == '3') { // Если не установлено, то установим + sim900_check_with_cmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",OK,CMD); + sim900_check_with_cmd("AT+SAPBR=3,1,\"APN\",\"internet.mts.ru\"\r\n",OK,CMD); + sim900_check_with_cmd("AT+SAPBR=3,1,\"USER\",\"mts\"\r\n" ,OK,CMD); + sim900_check_with_cmd("AT+SAPBR=3,1,\"PWD\",\"mts\"\r\n" ,OK,CMD); + sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD); + } + } + sim900_check_with_cmd("AT+CNTP=\"pool.ntp.org\",3,1,0\r\n" ,OK,CMD); + //sim900_send_cmd(ntpServer); + //sim900_send_cmd("\",3,1,0\r\n"); + //if (!sim900_wait_for_resp(OK,CMD)) return -6; + sim900_check_with_cmd("AT+CNTP\r\n" ,OK,DATA); // собственно синхронизация. + sim900_wait_for_resp ("+CNTP: ", DATA,19,15000); // ждем ответ об успешности + delay(100); + sim900_clean_buffer(tmpBuf,sizeof(tmpBuf)); + sim900_read_buffer(tmpBuf,4); // читаем код завершения + sim900_check_with_cmd("AT+SAPBR=0,1\r\n",OK,CMD); // отключаемся + Serial.print( "<"); + Serial.print( tmpBuf); + Serial.print( ">"); + return 1; +} + + + byte GPRS::getSignalStrength() { //AT+CSQ: 00,00 --> 13 + CRLF = 15 // --> CRLF = 2 diff --git a/GPRS_Shield_Arduino.h b/GPRS_Shield_Arduino.h index b73d6f6..79692a8 100644 --- a/GPRS_Shield_Arduino.h +++ b/GPRS_Shield_Arduino.h @@ -155,7 +155,8 @@ class GPRS */ bool isCallActive(char *number); - char* getDateTime(char* buffer); + char* getDateTime(char* buffer); // Получить время с часом модуля + bool syncNtp (const char* ntpServer = "ru.pool.ntp.org");//Синхронизфция времени модуля с NTP сервером /** getSignalStrength from SIM900 (see AT command: AT+CSQ) * @returns From 6f37ae02da37e8d5e3528e5a92a5b17d06b57847 Mon Sep 17 00:00:00 2001 From: Docenko G Date: Thu, 25 Aug 2016 00:13:09 +0300 Subject: [PATCH 4/9] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20rea?= =?UTF-8?q?dBalance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Функция запрашивает текущий баланс и парит ответ мобильного оператора. Результат возвращается в переменную типа int и в символьный буфер. --- GPRS_Shield_Arduino.cpp | 58 ++++++++++++++++++++++++++++++++++++++++- GPRS_Shield_Arduino.h | 6 +++-- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/GPRS_Shield_Arduino.cpp b/GPRS_Shield_Arduino.cpp index 5a8d1d8..32f8430 100644 --- a/GPRS_Shield_Arduino.cpp +++ b/GPRS_Shield_Arduino.cpp @@ -590,7 +590,63 @@ bool GPRS::syncNtp (const char* ntpServer) //Синхронизфция врем - byte GPRS::getSignalStrength() { +signed char GPRS::readBalance(char* moneyBalanceBuf, + int bufLen, + int& moneyBalanceInt) +{ + //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; + signed char rc; + sim900_flush_serial(); + sim900_check_with_cmd("AT+CUSD=1,\"#100#\"\r\n",OK,DATA); + sim900_clean_buffer(gprsBuffer,sizeof(gprsBuffer)); + sim900_read_buffer(gprsBuffer,sizeof(gprsBuffer)); + if(NULL != ( s = strstr(gprsBuffer,"CUSD:"))) { + s = strstr((char *)(s),"\""); + s = s + 1; // We are in the first character + p = strstr((char *)(s),"\""); // p is last character + 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; + 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; // не получен предсказуемый ответ + } + //sim900_wait_for_resp(OK, CMD); + sim900_flush_serial(); + return rc; +} + + + +byte GPRS::getSignalStrength() { //AT+CSQ: 00,00 --> 13 + CRLF = 15 // --> CRLF = 2 //OK --> 2 + CRLF = 4 diff --git a/GPRS_Shield_Arduino.h b/GPRS_Shield_Arduino.h index 79692a8..1089247 100644 --- a/GPRS_Shield_Arduino.h +++ b/GPRS_Shield_Arduino.h @@ -155,8 +155,10 @@ class GPRS */ bool isCallActive(char *number); - char* getDateTime(char* buffer); // Получить время с часом модуля - bool syncNtp (const char* ntpServer = "ru.pool.ntp.org");//Синхронизфция времени модуля с NTP сервером + char* getDateTime(char* buffer); // Получить время с часов модуля + bool syncNtp (const char* ntpServer = "ru.pool.ntp.org"); // Синхронизация времени модуля с NTP сервером + signed char readBalance(char* moneyBalanceBuf, int buflen, int &moneyBalanceInt); + /** getSignalStrength from SIM900 (see AT command: AT+CSQ) * @returns From fbdf57d0cd4e4ec702eafddf346d344cb61f9247 Mon Sep 17 00:00:00 2001 From: Docenko G Date: Sat, 27 Aug 2016 13:20:17 +0300 Subject: [PATCH 5/9] =?UTF-8?q?=D0=9D=D0=B5=D1=83=D0=B4=D0=B0=D1=87=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20Gprs=20=D1=81=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Стало виснуть на инициализации, Отваливается USB порт --- GPRS_Shield_Arduino.cpp | 131 +++++++++++++++++++++++----------------- GPRS_Shield_Arduino.h | 57 ++++++----------- 2 files changed, 94 insertions(+), 94 deletions(-) diff --git a/GPRS_Shield_Arduino.cpp b/GPRS_Shield_Arduino.cpp index 32f8430..f940f6b 100644 --- a/GPRS_Shield_Arduino.cpp +++ b/GPRS_Shield_Arduino.cpp @@ -57,22 +57,23 @@ GPRS::GPRS(uint8_t pkPin, uint8_t stPin, uint8_t rx, uint8_t tx, uint32_t baudRa gprsserial ->begin(baudRate); } -bool GPRS::init(void) +char GPRS::init(void) { - if(!sim900_check_with_cmd("AT\r\n",OK,CMD)) return false; - if(!sim900_check_with_cmd("ATE0\r\n",OK,CMD)) return false; - if(!sim900_check_with_cmd("AT+CFUN=1\r\n",OK,CMD)) return false; - if(!checkSIMStatus()) return false; + int rc; + if(!sim900_check_with_cmd("AT\r\n",OK,CMD)) { rc = 22; Serial.println(rc);} + if(!sim900_check_with_cmd("ATE0\r\n",OK,CMD)) { rc = 23; Serial.println(rc);} + if(!sim900_check_with_cmd("AT+CFUN=1\r\n",OK,CMD)) { rc = 24; Serial.println(rc);} + if(!checkSIMStatus()) { rc = 25; Serial.println(rc);} if (!sim900_check_with_cmd("AT+CNMI?\r\n", "+CNMI: 2,0,2,1,1\r\nOK\r\n",CMD)) { - if (!sim900_check_with_cmd("AT+CNMI=2,0,2,1,1\r\n",OK,CMD)) return false; + if (!sim900_check_with_cmd("AT+CNMI=2,0,2,1,1\r\n",OK,CMD)) {rc = 26; Serial.println(rc);} } 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,CMD)) return false; + if (!sim900_check_with_cmd("AT+CMGF=1\r\n",OK,CMD)) {rc = 6; Serial.println(rc);} } - if (!sim900_check_with_cmd("AT+CLIP=1\r\n",OK,CMD)) return false; + if (!sim900_check_with_cmd("AT+CLIP=1\r\n",OK,CMD)) {rc = 7; Serial.println(rc);} delay(5000); - return true; + rc = 0; } @@ -541,8 +542,7 @@ bool GPRS::hangup(void) bool GPRS::syncNtp (const char* ntpServer) //Синхронизфция времени в модеме с NTP сервером -{ - /* +{ /* AT+SAPBR=0,1 AT+SAPBR=3,1,"CONTYPE","GPRS" AT+SAPBR=3,1,"APN","internet.mts.ru" @@ -563,7 +563,6 @@ bool GPRS::syncNtp (const char* ntpServer) //Синхронизфция врем sim900_read_buffer(tmpBuf,sizeof(tmpBuf),DEFAULT_TIMEOUT); // Считываем ответ if(NULL != ( s = strstr(tmpBuf,"+SAPBR: 1,"))) { // находим нужное место char gprsStatus = *(s+10); // состояние соединения - Serial.println(gprsStatus); if (gprsStatus == '3') { // Если не установлено, то установим sim900_check_with_cmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",OK,CMD); sim900_check_with_cmd("AT+SAPBR=3,1,\"APN\",\"internet.mts.ru\"\r\n",OK,CMD); @@ -665,27 +664,28 @@ byte GPRS::getSignalStrength() { 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) - { +char GPRS::joinGprs(const char* apn, const char* lgn, const char* pwd) +{ + char *p,*s; + char tmpBuf[56]; + char rc; + rc = getGprsStatus(tmpBuf); // Запрос о состоянии GPRS соединения + if (rc != 1) { // Если не установлено, то установим + sim900_check_with_cmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",OK,CMD); + sim900_check_with_cmd("AT+SAPBR=3,1,\"APN\",\"internet.mts.ru\"\r\n",OK,CMD); + sim900_check_with_cmd("AT+SAPBR=3,1,\"USER\",\"mts\"\r\n" ,OK,CMD); + sim900_check_with_cmd("AT+SAPBR=3,1,\"PWD\",\"mts\"\r\n" ,OK,CMD); + sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD); + rc = getGprsStatus(tmpBuf); // Запрос о состоянии GPRS соединения + } + return rc; +} + + +/* 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); - - //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=\""); sim900_send_cmd(apn); sim900_send_cmd("\",\""); @@ -694,18 +694,7 @@ byte GPRS::getSignalStrength() { sim900_send_cmd(passWord); sim900_send_cmd("\"\r\n"); delay(500); - //Brings up wireless connection - - 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); @@ -738,6 +727,8 @@ byte GPRS::getSignalStrength() { Serial.write("Error = 3\r\n"); return false; } +*/ + void GPRS::disconnect() { @@ -810,27 +801,57 @@ sim900_read_buffer(resp, 96, timeout); 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; +char GPRS::getGprsStatus(char* ipv4Buf) +{ + //AT+SAPBR=2,1 + // + //+SAPBR: 1,3,"xxx.xxx.xxx.xxx" + // + //OK + + char *p, *s; + char rc; + char tmpBuf[56]; + 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),DEFAULT_TIMEOUT); // Считываем ответ + if(NULL != ( s = strstr(tmpBuf,"+SAPBR: "))) { // находим нужное место + s += 8; // + if(NULL != ( s = strstr((char *)(s),","))) { // после первой запятой + rc = *(s+1) - '0'; // для конвертации в цифру отнять код нуля + Serial.println(tmpBuf); + Serial.println(*(s+1)); + Serial.println(int(rc)); + + 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-адрес + } } else { - //+CIPSTATUS: 1,0,"TCP","216.52.233.120","80","CLOSED" - //+CIPSTATUS: 0,,"","","","INITIAL" - return false; + rc = 10; // не распознан код состояния } + } else { + rc = 10; // не распознан код состояния } +} + + bool GPRS::close() { // if not connected, return - if (!is_connected()) { - return true; - } +// if ( getGprsStatus(" ") == 3) { +// return true; +// } return sim900_check_with_cmd("AT+CIPCLOSE\r\n", "CLOSE OK\r\n", CMD); } diff --git a/GPRS_Shield_Arduino.h b/GPRS_Shield_Arduino.h index 1089247..04113c8 100644 --- a/GPRS_Shield_Arduino.h +++ b/GPRS_Shield_Arduino.h @@ -63,7 +63,7 @@ class GPRS * @return true if connected, false otherwise */ - bool init(void); + char init(void); bool isPowerOn(void); void powerUpDown(void); void powerOff(void); @@ -139,27 +139,15 @@ class GPRS * false on error */ bool ifcallNow(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); - + bool isCallActive(char *number); // Check if call active and get the phone number in that case char* getDateTime(char* buffer); // Получить время с часов модуля bool syncNtp (const char* ntpServer = "ru.pool.ntp.org"); // Синхронизация времени модуля с NTP сервером signed char readBalance(char* moneyBalanceBuf, int buflen, int &moneyBalanceInt); - /** getSignalStrength from SIM900 (see AT command: AT+CSQ) * @returns 0 — 113 dBm or less @@ -174,18 +162,12 @@ class GPRS ////////////////////////////////////////////////////// /// 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); + // Connect the GPRS module to the network. + // bool join(const __FlashStringHelper *apn = 0, const __FlashStringHelper *userName = 0, const __FlashStringHelper *passWord = 0); + char joinGprs(const char* apn, const char* lgn, const char* pwd); - /** Disconnect the GPRS module from the network - * @returns - */ - void disconnect(void); - + void disconnect(void); // Disconnect the GPRS module from the network + /** 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 @@ -197,21 +179,18 @@ class GPRS 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); + char getGprsStatus(char* ipv4Buf); // Возвращает статус GPRS соединения: + // 0 - соединение устанавливается + // 1 - соединение установлено + // 2 - соединение закрывается + // 3 - нет соединения + // 10 - состояние не распознано + // ipv4Buf возвращает в формате xxx.xxx.xxx.xxx + 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 From 9e9213387a793e55211deb3a85e3e8778c3143c0 Mon Sep 17 00:00:00 2001 From: Docenko G Date: Sat, 3 Sep 2016 23:03:31 +0300 Subject: [PATCH 6/9] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8,=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20=D0=B4=D0=BE=20httpGet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GPRS_Shield_Arduino.cpp | 394 ++++++++++++++++++++-------------------- GPRS_Shield_Arduino.h | 44 ++--- 2 files changed, 218 insertions(+), 220 deletions(-) diff --git a/GPRS_Shield_Arduino.cpp b/GPRS_Shield_Arduino.cpp index f940f6b..44231e6 100644 --- a/GPRS_Shield_Arduino.cpp +++ b/GPRS_Shield_Arduino.cpp @@ -57,23 +57,22 @@ GPRS::GPRS(uint8_t pkPin, uint8_t stPin, uint8_t rx, uint8_t tx, uint32_t baudRa gprsserial ->begin(baudRate); } -char GPRS::init(void) +unsigned char GPRS::init(void) { - int rc; - if(!sim900_check_with_cmd("AT\r\n",OK,CMD)) { rc = 22; Serial.println(rc);} - if(!sim900_check_with_cmd("ATE0\r\n",OK,CMD)) { rc = 23; Serial.println(rc);} - if(!sim900_check_with_cmd("AT+CFUN=1\r\n",OK,CMD)) { rc = 24; Serial.println(rc);} - if(!checkSIMStatus()) { rc = 25; Serial.println(rc);} + unsigned char rc; + if(!sim900_check_with_cmd("AT\r\n",OK,CMD)) return 1; + if(!sim900_check_with_cmd("ATE0\r\n",OK,CMD)) return 2; + if(!sim900_check_with_cmd("AT+CFUN=1\r\n",OK,CMD)) return 3; + if(!checkSIMStatus()) return 4; if (!sim900_check_with_cmd("AT+CNMI?\r\n", "+CNMI: 2,0,2,1,1\r\nOK\r\n",CMD)) { - if (!sim900_check_with_cmd("AT+CNMI=2,0,2,1,1\r\n",OK,CMD)) {rc = 26; Serial.println(rc);} + if (!sim900_check_with_cmd("AT+CNMI=2,0,2,1,1\r\n",OK,CMD)) return 5; } 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,CMD)) {rc = 6; Serial.println(rc);} + if (!sim900_check_with_cmd("AT+CMGF=1\r\n",OK,CMD)) return 6; } - if (!sim900_check_with_cmd("AT+CLIP=1\r\n",OK,CMD)) {rc = 7; Serial.println(rc);} - + if (!sim900_check_with_cmd("AT+CLIP=1\r\n",OK,CMD)) return 7; delay(5000); - rc = 0; + return 0; } @@ -138,9 +137,9 @@ char* GPRS::getImei(char* imei) while((*p != '\r')&&(i < 15)) { imei[i++] = *(p++); } - imei[i] = '\0'; } } + imei[i] = '\0'; sim900_wait_for_resp(OK, CMD); return imei; } @@ -555,7 +554,6 @@ bool GPRS::syncNtp (const char* ntpServer) //Синхронизфция врем */ char *p,*s; - char tmpBuf[56]; sim900_flush_serial(); sim900_send_cmd("AT+SAPBR=2,1\r\n"); // Запрос о состоянии GPRS соединения @@ -581,17 +579,14 @@ bool GPRS::syncNtp (const char* ntpServer) //Синхронизфция врем sim900_clean_buffer(tmpBuf,sizeof(tmpBuf)); sim900_read_buffer(tmpBuf,4); // читаем код завершения sim900_check_with_cmd("AT+SAPBR=0,1\r\n",OK,CMD); // отключаемся - Serial.print( "<"); - Serial.print( tmpBuf); - Serial.print( ">"); return 1; } -signed char GPRS::readBalance(char* moneyBalanceBuf, - int bufLen, - int& moneyBalanceInt) +unsigned char GPRS::readBalance(char* moneyBalanceBuf, + int bufLen, + int& moneyBalanceInt) { //AT+CUSD=1,"#100#" = 19 // = 2 @@ -603,11 +598,12 @@ signed char GPRS::readBalance(char* moneyBalanceBuf, byte i = 0; char gprsBuffer[70]; char *p, *s; - signed char rc; + unsigned char rc; sim900_flush_serial(); sim900_check_with_cmd("AT+CUSD=1,\"#100#\"\r\n",OK,DATA); sim900_clean_buffer(gprsBuffer,sizeof(gprsBuffer)); sim900_read_buffer(gprsBuffer,sizeof(gprsBuffer)); + if(NULL != ( s = strstr(gprsBuffer,"CUSD:"))) { s = strstr((char *)(s),"\""); s = s + 1; // We are in the first character @@ -633,10 +629,18 @@ signed char GPRS::readBalance(char* moneyBalanceBuf, moneyBalanceInt = atoi(gprsBuffer); rc = 0; // результат получен } else { - rc = -2; // в ответе нет баланса + rc = 2; // в ответе нет баланса } } else { - rc = -4; // не получен предсказуемый ответ + rc = 4; // не получен предсказуемый ответ + i = 0; + int n = min(sizeof(gprsBuffer), bufLen); + while (i < n) { + moneyBalanceBuf[i] = gprsBuffer[i]; + i += 1; + } + moneyBalanceBuf[i] = '\0'; + } //sim900_wait_for_resp(OK, CMD); sim900_flush_serial(); @@ -645,163 +649,168 @@ signed char GPRS::readBalance(char* moneyBalanceBuf, -byte GPRS::getSignalStrength() { - //AT+CSQ: 00,00 --> 13 + CRLF = 15 - // --> CRLF = 2 - //OK --> 2 + CRLF = 4 +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; +} - 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; - } -char GPRS::joinGprs(const char* apn, const char* lgn, const char* pwd) +unsigned char GPRS::joinGprs(const char* apn, const char* lgn, const char* pwd) { char *p,*s; char tmpBuf[56]; - char rc; + unsigned char rc; rc = getGprsStatus(tmpBuf); // Запрос о состоянии GPRS соединения if (rc != 1) { // Если не установлено, то установим - sim900_check_with_cmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",OK,CMD); - sim900_check_with_cmd("AT+SAPBR=3,1,\"APN\",\"internet.mts.ru\"\r\n",OK,CMD); - sim900_check_with_cmd("AT+SAPBR=3,1,\"USER\",\"mts\"\r\n" ,OK,CMD); - sim900_check_with_cmd("AT+SAPBR=3,1,\"PWD\",\"mts\"\r\n" ,OK,CMD); - sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD); - rc = getGprsStatus(tmpBuf); // Запрос о состоянии GPRS соединения + 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_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); + // + delay(500); + if (!sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD,15)) { // если не с первого раза + delay(15*1000); // то пауза + sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD,15); // и вторая попытка + }; + rc = getGprsStatus(tmpBuf); // Запрос о состоянии GPRS соединения } return rc; } -/* - byte i; - char *p, *s; - char ipAddr[32]; - sim900_send_cmd("AT+CSTT=\""); - 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); - 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; - } - 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++); - } - ip_string[i] = '\0'; - } - _ip = str_to_ip(ip_string); - if(_ip != 0) { +void GPRS::disconnectGprs() +{ + sim900_send_cmd("AT+CIPSHUT\r\n"); +} - return true; - } - Serial.write("Error = 3\r\n"); - return false; + + +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," ,CMD)) return 7; + // + sim900_read_buffer(tmpBuf,sizeof(tmpBuf),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 не распознан + } + // + sim900_check_with_cmd("AT+HTTPTERM\r\n",OK,CMD); + 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]; +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_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; } + 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; +} -char GPRS::getGprsStatus(char* ipv4Buf) + + +unsigned char GPRS::getGprsStatus(char* ipv4Buf) { //AT+SAPBR=2,1 // @@ -810,7 +819,7 @@ char GPRS::getGprsStatus(char* ipv4Buf) //OK char *p, *s; - char rc; + unsigned char rc; char tmpBuf[56]; int i; sim900_flush_serial(); @@ -820,11 +829,7 @@ char GPRS::getGprsStatus(char* ipv4Buf) if(NULL != ( s = strstr(tmpBuf,"+SAPBR: "))) { // находим нужное место s += 8; // if(NULL != ( s = strstr((char *)(s),","))) { // после первой запятой - rc = *(s+1) - '0'; // для конвертации в цифру отнять код нуля - Serial.println(tmpBuf); - Serial.println(*(s+1)); - Serial.println(int(rc)); - + rc = *(s+1) - '0'; // для конвертации в цифру отнять код нуля s = strstr((char *)(s),"\"")+1; // Теперь ищем ip-адрес в кавычках p = strstr((char *)(s),"\""); // Закрывающая кавычка if ((NULL != p) && (NULL != s)) { @@ -842,18 +847,19 @@ char GPRS::getGprsStatus(char* ipv4Buf) } else { rc = 10; // не распознан код состояния } + return rc; } - 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); - } +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) { @@ -870,33 +876,33 @@ char GPRS::getGprsStatus(char* ipv4Buf) 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]; @@ -926,12 +932,12 @@ char GPRS::getGprsStatus(char* ipv4Buf) 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); - } +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) { @@ -961,14 +967,6 @@ 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) { diff --git a/GPRS_Shield_Arduino.h b/GPRS_Shield_Arduino.h index 04113c8..0da7f2b 100644 --- a/GPRS_Shield_Arduino.h +++ b/GPRS_Shield_Arduino.h @@ -49,8 +49,7 @@ class GPRS * @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=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 @@ -63,12 +62,17 @@ class GPRS * @return true if connected, false otherwise */ - char init(void); + unsigned char init(void); bool isPowerOn(void); void powerUpDown(void); void powerOff(void); void powerOn(void); char* getImei(char* imei); + char* getDateTime(char* buffer); // Получить время с часов модуля + bool syncNtp (const char* ntpServer = "ru.pool.ntp.org"); // Синхронизация времени модуля с NTP сервером + unsigned char readBalance(char* moneyBalanceBuf, int buflen, int &moneyBalanceInt); + + bool sendSMS(char* number, char* data); /** Check if there is any UNREAD SMS: this function DOESN'T change the UNREAD status of the SMS @@ -108,7 +112,6 @@ class GPRS * false on error */ void readSMS(); - bool deleteSMS(int index); // Удалить SMS по индексу bool deleteSMS(void); // Удалить все, кроме непрочитанных @@ -144,9 +147,6 @@ class GPRS void callEnd(void); bool disableCLIPring(void); bool isCallActive(char *number); // Check if call active and get the phone number in that case - char* getDateTime(char* buffer); // Получить время с часов модуля - bool syncNtp (const char* ntpServer = "ru.pool.ntp.org"); // Синхронизация времени модуля с NTP сервером - signed char readBalance(char* moneyBalanceBuf, int buflen, int &moneyBalanceInt); /** getSignalStrength from SIM900 (see AT command: AT+CSQ) * @returns @@ -156,7 +156,7 @@ class GPRS 31 — 51 dBm or greater 99 — not known or not detectable */ - byte getSignalStrength(); + unsigned char getSignalStrength(); ////////////////////////////////////////////////////// @@ -164,10 +164,18 @@ class GPRS ////////////////////////////////////////////////////// // Connect the GPRS module to the network. // bool join(const __FlashStringHelper *apn = 0, const __FlashStringHelper *userName = 0, const __FlashStringHelper *passWord = 0); - char joinGprs(const char* apn, const char* lgn, const char* pwd); + unsigned char joinGprs(const char* apn, const char* lgn, const char* pwd); + unsigned char getGprsStatus(char* ipv4Buf); // Возвращает статус GPRS соединения: + // 0 - соединение устанавливается + // 1 - соединение установлено + // 2 - соединение закрывается + // 3 - нет соединения + // 10 - состояние не распознано + // ipv4Buf возвращает в формате xxx.xxx.xxx.xxx + + void disconnectGprs(void); // Disconnect the GPRS module from the network + int httpGet(char* url, int& dataLen); - void disconnect(void); // Disconnect the GPRS module from the network - /** 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 @@ -176,19 +184,11 @@ 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); - char getGprsStatus(char* ipv4Buf); // Возвращает статус GPRS соединения: - // 0 - соединение устанавливается - // 1 - соединение установлено - // 2 - соединение закрывается - // 3 - нет соединения - // 10 - состояние не распознано - // ipv4Buf возвращает в формате xxx.xxx.xxx.xxx - - bool close(void); // Close a tcp connection * @returns true if successful - int readable(void); // check if GPRS module is readable. @returns true if readable + 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 From 5cecb3d0ddcfda16eb2383823ad1ac9e75d4ef9a Mon Sep 17 00:00:00 2001 From: Docenko G Date: Tue, 6 Sep 2016 23:00:15 +0300 Subject: [PATCH 7/9] =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B1=D0=B8=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Работа над библиотекой не завершена. Однако эта версия уже имеет практическую ценность. Удалены ненужные, на мой взгляд методы. --- GPRS_Shield_Arduino.cpp | 384 +++++++++--------- GPRS_Shield_Arduino.h | 24 +- .../gprs_get_datetime/gprs_get_datetime.ino | 48 +++ examples/gprs_get_imei/gprs_get_imei.ino | 40 ++ .../gprs_money_balans/gprs_money_balans.ino | 48 +++ 5 files changed, 346 insertions(+), 198 deletions(-) create mode 100644 examples/gprs_get_datetime/gprs_get_datetime.ino create mode 100644 examples/gprs_get_imei/gprs_get_imei.ino create mode 100644 examples/gprs_money_balans/gprs_money_balans.ino diff --git a/GPRS_Shield_Arduino.cpp b/GPRS_Shield_Arduino.cpp index 44231e6..8d86267 100644 --- a/GPRS_Shield_Arduino.cpp +++ b/GPRS_Shield_Arduino.cpp @@ -146,6 +146,150 @@ char* GPRS::getImei(char* imei) + char* GPRS::getDateTime(char* buffer) + { + //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; + } + + + +bool GPRS::syncNtp (const char* ntpServer) //Синхронизфция времени в модеме с NTP сервером +{ /* + AT+SAPBR=0,1 + AT+SAPBR=3,1,"CONTYPE","GPRS" + AT+SAPBR=3,1,"APN","internet.mts.ru" + AT+SAPBR=3,1,"USER","mts" + AT+SAPBR=3,1,"PWD","mts" + AT+SAPBR=1,1 + AT+CNTP="pool.ntp.org",3,1,0 + AT+CNTP + AT+SAPBR=0,1 + */ + + char *p,*s; + char tmpBuf[56]; + 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),DEFAULT_TIMEOUT); // Считываем ответ + if(NULL != ( s = strstr(tmpBuf,"+SAPBR: 1,"))) { // находим нужное место + char gprsStatus = *(s+10); // состояние соединения + if (gprsStatus == '3') { // Если не установлено, то установим + sim900_check_with_cmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",OK,CMD); + sim900_check_with_cmd("AT+SAPBR=3,1,\"APN\",\"internet.mts.ru\"\r\n",OK,CMD); + sim900_check_with_cmd("AT+SAPBR=3,1,\"USER\",\"mts\"\r\n" ,OK,CMD); + sim900_check_with_cmd("AT+SAPBR=3,1,\"PWD\",\"mts\"\r\n" ,OK,CMD); + sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD); + } + } + sim900_check_with_cmd("AT+CNTP=\"pool.ntp.org\",3,1,0\r\n" ,OK,CMD); + //sim900_send_cmd(ntpServer); + //sim900_send_cmd("\",3,1,0\r\n"); + //if (!sim900_wait_for_resp(OK,CMD)) return -6; + sim900_check_with_cmd("AT+CNTP\r\n" ,OK,DATA); // собственно синхронизация. + sim900_wait_for_resp ("+CNTP: ", DATA,19,15000); // ждем ответ об успешности + delay(100); + sim900_clean_buffer(tmpBuf,sizeof(tmpBuf)); + sim900_read_buffer(tmpBuf,4); // читаем код завершения + sim900_check_with_cmd("AT+SAPBR=0,1\r\n",OK,CMD); // отключаемся + return 1; +} + + + +unsigned char GPRS::readBalance(const char* moneyRequestBuf, + char* moneyBalanceBuf, + int bufLen, + int& moneyBalanceInt) +{ + //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)); + + if(NULL != ( s = strstr(gprsBuffer,"CUSD:"))) { + s = strstr((char *)(s),"\""); + s = s + 1; // We are in the first character + p = strstr((char *)(s),"\""); // p is last character + 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; + 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'; + + } + //sim900_wait_for_resp(OK, CMD); + sim900_flush_serial(); + return rc; +} + + + bool GPRS::checkSIMStatus(void) { char gprsBuffer[32]; @@ -508,147 +652,6 @@ bool GPRS::hangup(void) - char* GPRS::getDateTime(char* buffer) - { - //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; - } - - - -bool GPRS::syncNtp (const char* ntpServer) //Синхронизфция времени в модеме с NTP сервером -{ /* - AT+SAPBR=0,1 - AT+SAPBR=3,1,"CONTYPE","GPRS" - AT+SAPBR=3,1,"APN","internet.mts.ru" - AT+SAPBR=3,1,"USER","mts" - AT+SAPBR=3,1,"PWD","mts" - AT+SAPBR=1,1 - AT+CNTP="pool.ntp.org",3,1,0 - AT+CNTP - AT+SAPBR=0,1 - */ - - char *p,*s; - char tmpBuf[56]; - 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),DEFAULT_TIMEOUT); // Считываем ответ - if(NULL != ( s = strstr(tmpBuf,"+SAPBR: 1,"))) { // находим нужное место - char gprsStatus = *(s+10); // состояние соединения - if (gprsStatus == '3') { // Если не установлено, то установим - sim900_check_with_cmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",OK,CMD); - sim900_check_with_cmd("AT+SAPBR=3,1,\"APN\",\"internet.mts.ru\"\r\n",OK,CMD); - sim900_check_with_cmd("AT+SAPBR=3,1,\"USER\",\"mts\"\r\n" ,OK,CMD); - sim900_check_with_cmd("AT+SAPBR=3,1,\"PWD\",\"mts\"\r\n" ,OK,CMD); - sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD); - } - } - sim900_check_with_cmd("AT+CNTP=\"pool.ntp.org\",3,1,0\r\n" ,OK,CMD); - //sim900_send_cmd(ntpServer); - //sim900_send_cmd("\",3,1,0\r\n"); - //if (!sim900_wait_for_resp(OK,CMD)) return -6; - sim900_check_with_cmd("AT+CNTP\r\n" ,OK,DATA); // собственно синхронизация. - sim900_wait_for_resp ("+CNTP: ", DATA,19,15000); // ждем ответ об успешности - delay(100); - sim900_clean_buffer(tmpBuf,sizeof(tmpBuf)); - sim900_read_buffer(tmpBuf,4); // читаем код завершения - sim900_check_with_cmd("AT+SAPBR=0,1\r\n",OK,CMD); // отключаемся - return 1; -} - - - -unsigned char GPRS::readBalance(char* moneyBalanceBuf, - int bufLen, - int& moneyBalanceInt) -{ - //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_check_with_cmd("AT+CUSD=1,\"#100#\"\r\n",OK,DATA); - sim900_clean_buffer(gprsBuffer,sizeof(gprsBuffer)); - sim900_read_buffer(gprsBuffer,sizeof(gprsBuffer)); - - if(NULL != ( s = strstr(gprsBuffer,"CUSD:"))) { - s = strstr((char *)(s),"\""); - s = s + 1; // We are in the first character - p = strstr((char *)(s),"\""); // p is last character - 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; - 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'; - - } - //sim900_wait_for_resp(OK, CMD); - sim900_flush_serial(); - return rc; -} - - - byte GPRS::getSignalStrength() { //AT+CSQ: 00,00 --> 13 + CRLF = 15 @@ -670,8 +673,18 @@ byte GPRS::getSignalStrength() -unsigned char GPRS::joinGprs(const char* apn, const char* lgn, const char* pwd) +////////////////////////////////////////////////////// +/// GPRS +////////////////////////////////////////////////////// + // Connect the GPRS module to the network. + +unsigned char GPRS::joinGprs(char* ipv4Buf, + const char* apn, + const char* lgn, + const char* pwd) { + Serial.println(); + Serial.println(millis()); char *p,*s; char tmpBuf[56]; unsigned char rc; @@ -692,11 +705,41 @@ unsigned char GPRS::joinGprs(const char* apn, const char* lgn, const char* pwd) sim900_check_with_cmd("\"\r\n", OK, CMD); // delay(500); +Serial.print("1"); + if (!sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD)) { // если не с первого раза + delay(5*1000); // то пауза +Serial.print("2"); + if (!sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD)){ // и вторая попытка + delay(8*1000); // или даже +Serial.print("3"); + sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD); // третья + } + }; + rc = getGprsStatus(tmpBuf); // Запрос о состоянии GPRS соединения + if (rc == 1) { // Если удачно соединились + sim900_check_with_cmd("AT+SAPBR=5,1\r\n", OK,CMD); // то запомним параметры + } + } + Serial.println(millis()); + return rc; +} + + + +unsigned char GPRS::joinGprs(char* ipv4Buf) +{ + char *p,*s; + //char tmpBuf[16]; + unsigned char rc; + rc = getGprsStatus(ipv4Buf); // Запрос о состоянии GPRS соединения + if (rc != 1) { // Если не установлено, то установим + sim900_check_with_cmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",OK,CMD); + delay(300); if (!sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD,15)) { // если не с первого раза delay(15*1000); // то пауза sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD,15); // и вторая попытка }; - rc = getGprsStatus(tmpBuf); // Запрос о состоянии GPRS соединения + rc = getGprsStatus(ipv4Buf); // Запрос о состоянии GPRS соединения } return rc; } @@ -705,7 +748,8 @@ unsigned char GPRS::joinGprs(const char* apn, const char* lgn, const char* pwd) void GPRS::disconnectGprs() { - sim900_send_cmd("AT+CIPSHUT\r\n"); + sim900_check_with_cmd("AT+SAPBR=0,1\r\n",OK,CMD); // отключаемся + //sim900_send_cmd("AT+CIPSHUT\r\n"); } @@ -812,20 +856,24 @@ bool GPRS::connect(Protocol ptl,const __FlashStringHelper *host, const __FlashSt unsigned char GPRS::getGprsStatus(char* ipv4Buf) { - //AT+SAPBR=2,1 - // - //+SAPBR: 1,3,"xxx.xxx.xxx.xxx" - // - //OK - + //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[56]; + 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),DEFAULT_TIMEOUT); // Считываем ответ + //Serial.println("<"); + //Serial.println(tmpBuf); + //Serial.println(">"); + if(NULL != ( s = strstr(tmpBuf,"+SAPBR: "))) { // находим нужное место s += 8; // if(NULL != ( s = strstr((char *)(s),","))) { // после первой запятой @@ -847,6 +895,8 @@ unsigned char GPRS::getGprsStatus(char* ipv4Buf) } else { rc = 10; // не распознан код состояния } + delay(10); + sim900_flush_serial(); return rc; } @@ -932,12 +982,7 @@ int GPRS::send(const char * str, int len) 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) { @@ -955,28 +1000,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; -} - - -/* 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 0da7f2b..fc83552 100644 --- a/GPRS_Shield_Arduino.h +++ b/GPRS_Shield_Arduino.h @@ -68,10 +68,12 @@ class GPRS void powerOff(void); void powerOn(void); char* getImei(char* imei); - char* getDateTime(char* buffer); // Получить время с часов модуля - bool syncNtp (const char* ntpServer = "ru.pool.ntp.org"); // Синхронизация времени модуля с NTP сервером - unsigned char readBalance(char* moneyBalanceBuf, int buflen, int &moneyBalanceInt); - + char* getDateTime(char* buffer); // Получить время с часов модуля + bool syncNtp (const char* ntpServer); // Синхронизация времени модуля с NTP сервером + unsigned char readBalance(const char* moneyRequestBuf, + char* moneyBalanceBuf, + int buflen, + int &moneyBalanceInt); bool sendSMS(char* number, char* data); @@ -163,8 +165,8 @@ class GPRS /// GPRS ////////////////////////////////////////////////////// // Connect the GPRS module to the network. - // bool join(const __FlashStringHelper *apn = 0, const __FlashStringHelper *userName = 0, const __FlashStringHelper *passWord = 0); - unsigned char joinGprs(const char* apn, const char* lgn, const char* pwd); + 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 - соединение установлено @@ -212,14 +214,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 @@ -239,7 +233,5 @@ class GPRS // 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_get_datetime/gprs_get_datetime.ino b/examples/gprs_get_datetime/gprs_get_datetime.ino new file mode 100644 index 0000000..84cb3ea --- /dev/null +++ b/examples/gprs_get_datetime/gprs_get_datetime.ino @@ -0,0 +1,48 @@ +/* Пример получения времени с внутренних часов 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!"); + Serial.print ("Power... "); + gprsModul.powerOn(); + Serial.println(" On"); +} + + + +void loop() { + unsigned char rc; + char tmpBuf[64]; + int dataLen; + // + 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(";"); + // + 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..252d524 --- /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!"); + Serial.print ("Power... "); + gprsModul.powerOn(); + Serial.println(" On"); +} + + + +void loop() { + unsigned char rc; + char tmpBuf[64]; + int dataLen; + // + 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_money_balans/gprs_money_balans.ino b/examples/gprs_money_balans/gprs_money_balans.ino new file mode 100644 index 0000000..66dff77 --- /dev/null +++ b/examples/gprs_money_balans/gprs_money_balans.ino @@ -0,0 +1,48 @@ +#include + +#define PIN_PK 8 // Контакт включения GPRS модуля +#define PIN_ST 9 // контакт состояния GPRG модуля +#define BAUDRATE 115200 // частота обмена данными + +const char balanceReq[]= "#100#"; // USSD номер проверки балланса + +GPRS gprsModul(PIN_PK, PIN_ST, BAUDRATE); // создаём объект типа GPRS +int moneyBalanceInt; // Переменная в которой хранится текущий денежный баланс +char moneyBalanceBuf[32]; // Строка ответа о текущем балансе + + + +void setup() +{ + Serial.begin(BAUDRATE); + while (!Serial) { + // ждем откроется монитор последовательного порта + } + Serial.println("Serial OK!"); + Serial.print ("Power... "); + gprsModul.powerOn(); + Serial.println(" On"); +} + + + +void loop() +{ + unsigned char rc; + // + Serial.print ("init..."); + rc = gprsModul.init(); + Serial.print (" rc="); + Serial.print (int(rc)); + // + Serial.print ("; readBalance rc="); + rc = gprsModul.readBalance(balanceReq, moneyBalanceBuf, sizeof(moneyBalanceBuf), moneyBalanceInt); + Serial.print ( int(rc) ); + Serial.print ("; BalanceBuf="); + Serial.print (moneyBalanceBuf); + Serial.print ("; moneyInt="); + Serial.print (moneyBalanceInt); + Serial.println(";"); + // + delay(5*1000); +} \ No newline at end of file From 9793b2b9251a6e031bab0de3aa13f28872e88097 Mon Sep 17 00:00:00 2001 From: Docenko G Date: Thu, 15 Sep 2016 23:53:38 +0300 Subject: [PATCH 8/9] =?UTF-8?q?=D0=9E=D1=82=D0=BB=D0=B0=D0=B4=D0=B8=D0=BB?= =?UTF-8?q?=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8,=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=D1=80=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Протестировал и отладил добавленные функции. Написал массу примеров. Ок. --- GPRS_Shield_Arduino.cpp | 423 +++++++++++------- GPRS_Shield_Arduino.h | 178 +++++--- .../GPRS_AT_Commands/GPRS_AT_Commands.ino | 188 +++----- .../gprs_get_datetime/gprs_get_datetime.ino | 18 +- examples/gprs_get_imei/gprs_get_imei.ino | 16 +- .../gprs_init_with_join_gprs.ino | 70 +++ examples/gprs_join_gprs/gprs_join_gprs.ino | 70 +++ .../gprs_money_balans/gprs_money_balans.ino | 40 +- .../gprs_ntp_datetime/gprs_ntp_datetime.ino | 58 +++ .../gprs_power_on_and_off.ino | 44 ++ 10 files changed, 699 insertions(+), 406 deletions(-) create mode 100644 examples/gprs_init_with_join_gprs/gprs_init_with_join_gprs.ino create mode 100644 examples/gprs_join_gprs/gprs_join_gprs.ino create mode 100644 examples/gprs_ntp_datetime/gprs_ntp_datetime.ino create mode 100644 examples/gprs_power_on_and_off/gprs_power_on_and_off.ino diff --git a/GPRS_Shield_Arduino.cpp b/GPRS_Shield_Arduino.cpp index 8d86267..8c252c9 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,29 +61,31 @@ GPRS::GPRS(uint8_t pkPin, uint8_t stPin, uint8_t rx, uint8_t tx, uint32_t baudRa gprsserial ->begin(baudRate); } -unsigned char GPRS::init(void) -{ - unsigned char rc; - if(!sim900_check_with_cmd("AT\r\n",OK,CMD)) return 1; - if(!sim900_check_with_cmd("ATE0\r\n",OK,CMD)) return 2; - if(!sim900_check_with_cmd("AT+CFUN=1\r\n",OK,CMD)) return 3; - if(!checkSIMStatus()) return 4; - if (!sim900_check_with_cmd("AT+CNMI?\r\n", "+CNMI: 2,0,2,1,1\r\nOK\r\n",CMD)) { - if (!sim900_check_with_cmd("AT+CNMI=2,0,2,1,1\r\n",OK,CMD)) return 5; - } - 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,CMD)) return 6; - } - if (!sim900_check_with_cmd("AT+CLIP=1\r\n",OK,CMD)) return 7; - delay(5000); - return 0; + + +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// POWER /// +/// /// +/////////////////////////////////////////////////////////////////////////////// + +void GPRS::powerOn(void) { + if(!digitalRead(_stPin)) { // Если питание не подано, + powerUpDown(); // то выполним стандартную последовательность сигналов + } } -bool GPRS::isPowerOn(void) -{ - return digitalRead(_stPin); +void GPRS::powerOff(void) { // Желательно корректно отключать питание, для сохранения переменных + long t1 = millis(); // в памяти и для разрегистрации в сети мобильного оператора. + sim900_send_cmd("AT+CPOWD=1\r\n"); // Даем команду на выключение + while (millis()-t1 < 8000) { // и в течение ХХХХ милисекунд джем + if(!digitalRead(_stPin)) { // произошло ли выключение. + return; // Выходим, если отключилось быстрее. + } + } + powerUpDown(); // Иначе передёрним питание } @@ -96,27 +102,95 @@ void GPRS::powerUpDown(void) { // The same sequence is used for switching on -void GPRS::powerOff(void) { // Желательно корректно отключать питание, для сохранения переменных - long t1 = millis(); // в памяти и для разрегистрации в сети мобильного оператора. - sim900_send_cmd("AT+CPOWD=1\r\n"); // Даем команду на выключение - while (millis()-t1 < 8000) { // и в течение ХХХХ милисекунд джем - if(!digitalRead(_stPin)) { // произошло ли выключение. - return; // Выходим, если отключилось быстрее. +bool GPRS::isPowerOn(void) +{ + return digitalRead(_stPin); +} + + + +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// INITIALIZATION /// +/// /// +/////////////////////////////////////////////////////////////////////////////// + +unsigned char GPRS::init(void) +{ + unsigned char rc; + if(0 == (rc = initialSetting())) { + delay(5000); // Пауза для завершения всех инициализационных процессов + } + return rc; +} + + + +unsigned char GPRS::init(char* ipv4Buf) +{ + unsigned char rc; + if(0 == (rc = initialSetting())) { + if(1 == joinGprs(ipv4Buf)) { + rc = 0; + } else { + rc = 9; // нет GPRS, ip-адрес не получен } } - powerUpDown(); // Иначе передёрним питание + return rc; } -void GPRS::powerOn(void) { - if(!digitalRead(_stPin)) { // Если питание не подано, - powerUpDown(); // то выполним стандартную последовательность сигналов - } +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 = 10; // нет GPRS, ip-адрес не получен + } + } + return rc; } +unsigned char GPRS::initialSetting(void) +{ + unsigned char rc; + long t1; + if(!sim900_check_with_cmd("AT\r\n",OK,CMD)) return 1; + // а есть ли вообще модуль и способен ли он отвечать? + if(!sim900_check_with_cmd("ATE0\r\n",OK,CMD)) return 2; + // отключили эхо-ответ, тем самым уменьшив объем буферов + // для анализа ответа от модуля. + if(!sim900_check_with_cmd("AT+CFUN=1\r\n",OK,CMD)) return 3; + if(!checkSIMStatus()) return 4; + if (!sim900_check_with_cmd("AT+CNMI?\r\n", "+CNMI: 2,0,2,1,1\r\nOK\r\n",CMD)) { + if (!sim900_check_with_cmd("AT+CNMI=2,0,2,1,1\r\n",OK,CMD)) return 5; + // Установили режим, при котором SMS не лезут сразу в + // serial, а сохраняются в памяти. Это удобно для последующего + // чтения и разбора SMS + } + 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,CMD)) return 6; + } + if (!sim900_check_with_cmd("AT+CLIP=1\r\n",OK,CMD)) return 7; + return 0; +} + + + +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// TOOLS /// +/// /// +/////////////////////////////////////////////////////////////////////////////// + char* GPRS::getImei(char* imei) { // --> CRLF = 2 @@ -125,8 +199,7 @@ char* GPRS::getImei(char* imei) //OK --> 2 + CRLF = 4 char tbuf[25]; sim900_clean_buffer(tbuf,sizeof(tbuf)); - char* p; - char* s; + char *p, *s; int i = 0; sim900_flush_serial(); sim900_send_cmd("AT+GSN\r\n"); @@ -178,46 +251,46 @@ char* GPRS::getImei(char* imei) -bool GPRS::syncNtp (const char* ntpServer) //Синхронизфция времени в модеме с NTP сервером +unsigned char GPRS::syncNtp (const char* ntpServer) //Синхронизфция времени в модеме с NTP сервером { /* - AT+SAPBR=0,1 - AT+SAPBR=3,1,"CONTYPE","GPRS" - AT+SAPBR=3,1,"APN","internet.mts.ru" - AT+SAPBR=3,1,"USER","mts" - AT+SAPBR=3,1,"PWD","mts" - AT+SAPBR=1,1 AT+CNTP="pool.ntp.org",3,1,0 AT+CNTP - AT+SAPBR=0,1 + + Коды завершения: + 1 - удачная синхронизация + 11 - нет GPRS + 12 - не установились параметры для синнхронизации + 61 - ошибка сетевого соединения + 62 - ошибка DNS + 63 - ошибка соединения + 64 - превышено время ожидания + 65 - ошибка сервера + 66 - операция недоступна */ - char *p,*s; - char tmpBuf[56]; - 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),DEFAULT_TIMEOUT); // Считываем ответ - if(NULL != ( s = strstr(tmpBuf,"+SAPBR: 1,"))) { // находим нужное место - char gprsStatus = *(s+10); // состояние соединения - if (gprsStatus == '3') { // Если не установлено, то установим - sim900_check_with_cmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",OK,CMD); - sim900_check_with_cmd("AT+SAPBR=3,1,\"APN\",\"internet.mts.ru\"\r\n",OK,CMD); - sim900_check_with_cmd("AT+SAPBR=3,1,\"USER\",\"mts\"\r\n" ,OK,CMD); - sim900_check_with_cmd("AT+SAPBR=3,1,\"PWD\",\"mts\"\r\n" ,OK,CMD); - sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD); - } - } - sim900_check_with_cmd("AT+CNTP=\"pool.ntp.org\",3,1,0\r\n" ,OK,CMD); - //sim900_send_cmd(ntpServer); - //sim900_send_cmd("\",3,1,0\r\n"); - //if (!sim900_wait_for_resp(OK,CMD)) return -6; - sim900_check_with_cmd("AT+CNTP\r\n" ,OK,DATA); // собственно синхронизация. - sim900_wait_for_resp ("+CNTP: ", DATA,19,15000); // ждем ответ об успешности - delay(100); - sim900_clean_buffer(tmpBuf,sizeof(tmpBuf)); - sim900_read_buffer(tmpBuf,4); // читаем код завершения - sim900_check_with_cmd("AT+SAPBR=0,1\r\n",OK,CMD); // отключаемся - return 1; + 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 { // Не установились параметры инициализации + rc = 12; + } + } else { + rc = 11; // Если не удалось подключиться по GPRS + } + return rc; } @@ -243,12 +316,13 @@ unsigned char GPRS::readBalance(const char* moneyRequestBuf, sim900_send_cmd(moneyRequestBuf); sim900_check_with_cmd("\"\r\n",OK,DATA); sim900_clean_buffer(gprsBuffer,sizeof(gprsBuffer)); - sim900_read_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),"\""); // p is last character + 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))) { @@ -257,9 +331,15 @@ unsigned char GPRS::readBalance(const char* moneyRequestBuf, moneyBalanceBuf[i] = '\0'; } // Ответ получен. Теперь попробуем из него вытащить цифры баланса - if(NULL != ( s = strstr(moneyBalanceBuf,"Balance:"))) { + if(NULL != (s = strstr(moneyBalanceBuf,"Balance:"))) { // Для МТС s = s + 8; - p = strstr((char *)(s),"r,"); + } 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) { @@ -312,6 +392,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 @@ -531,6 +638,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)) { @@ -652,41 +767,20 @@ bool GPRS::hangup(void) -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; -} - - - -////////////////////////////////////////////////////// -/// GPRS -////////////////////////////////////////////////////// - // Connect the GPRS module to the network. +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// GPRS /// +/// /// +/////////////////////////////////////////////////////////////////////////////// unsigned char GPRS::joinGprs(char* ipv4Buf, const char* apn, const char* lgn, const char* pwd) { - Serial.println(); - Serial.println(millis()); char *p,*s; char tmpBuf[56]; + long t1, t2; unsigned char rc; rc = getGprsStatus(tmpBuf); // Запрос о состоянии GPRS соединения if (rc != 1) { // Если не установлено, то установим @@ -704,23 +798,17 @@ unsigned char GPRS::joinGprs(char* ipv4Buf, sim900_send_cmd(pwd); sim900_check_with_cmd("\"\r\n", OK, CMD); // - delay(500); -Serial.print("1"); - if (!sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD)) { // если не с первого раза - delay(5*1000); // то пауза -Serial.print("2"); - if (!sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD)){ // и вторая попытка - delay(8*1000); // или даже -Serial.print("3"); - sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD); // третья - } - }; - rc = getGprsStatus(tmpBuf); // Запрос о состоянии GPRS соединения + 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); // то запомним параметры } } - Serial.println(millis()); return rc; } @@ -729,27 +817,74 @@ Serial.print("3"); unsigned char GPRS::joinGprs(char* ipv4Buf) { char *p,*s; - //char tmpBuf[16]; + 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); - delay(300); - if (!sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD,15)) { // если не с первого раза - delay(15*1000); // то пауза - sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD,15); // и вторая попытка - }; - rc = getGprsStatus(ipv4Buf); // Запрос о состоянии GPRS соединения + 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); + } } 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),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-адрес + } + } else { + rc = 10; // не распознан код состояния + } + } else { + rc = 10; // не распознан код состояния + } + delay(10); // Перед очисткой буфера надо дождаться завер- + sim900_flush_serial(); // шения вывода данных. + return rc; +} + + + void GPRS::disconnectGprs() { sim900_check_with_cmd("AT+SAPBR=0,1\r\n",OK,CMD); // отключаемся - //sim900_send_cmd("AT+CIPSHUT\r\n"); } @@ -854,54 +989,6 @@ bool GPRS::connect(Protocol ptl,const __FlashStringHelper *host, const __FlashSt -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),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-адрес - } - } else { - rc = 10; // не распознан код состояния - } - } else { - rc = 10; // не распознан код состояния - } - delay(10); - sim900_flush_serial(); - return rc; -} - - - bool GPRS::close() { // if not connected, return diff --git a/GPRS_Shield_Arduino.h b/GPRS_Shield_Arduino.h index fc83552..babc2b9 100644 --- a/GPRS_Shield_Arduino.h +++ b/GPRS_Shield_Arduino.h @@ -45,37 +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); + +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// INITIALIZATION /// +/// /// +/////////////////////////////////////////////////////////////////////////////// + + 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); + +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// TOOLS /// +/// /// +/////////////////////////////////////////////////////////////////////////////// - unsigned char init(void); - bool isPowerOn(void); - void powerUpDown(void); - void powerOff(void); - void powerOn(void); - char* getImei(char* imei); - char* getDateTime(char* buffer); // Получить время с часов модуля - bool syncNtp (const char* ntpServer); // Синхронизация времени модуля с NTP сервером - unsigned char readBalance(const char* moneyRequestBuf, - char* moneyBalanceBuf, - int buflen, - int &moneyBalanceInt); - - bool sendSMS(char* number, char* data); + 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 @@ -116,54 +153,53 @@ class GPRS void readSMS(); bool deleteSMS(int index); // Удалить SMS по индексу bool deleteSMS(void); // Удалить все, кроме непрочитанных + bool ifSMSNow(void); - /** 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 ifSMSNow(void); - bool ifcallEnd(void); - void callEnd(void); - bool disableCLIPring(void); +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// RINGS /// +/// /// +/////////////////////////////////////////////////////////////////////////////// + + /** 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 - */ - unsigned char getSignalStrength(); - + -////////////////////////////////////////////////////// -/// GPRS -////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +/// /// +/// 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); @@ -225,12 +261,10 @@ 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; }; 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_get_datetime/gprs_get_datetime.ino b/examples/gprs_get_datetime/gprs_get_datetime.ino index 84cb3ea..5afc343 100644 --- a/examples/gprs_get_datetime/gprs_get_datetime.ino +++ b/examples/gprs_get_datetime/gprs_get_datetime.ino @@ -19,30 +19,32 @@ void setup() { Serial.begin(BAUDRATE); while (!Serial) { - // ждем откроется монитор последовательного порта + // ждем, пока откроется монитор последовательного порта } Serial.println("Serial OK!"); - Serial.print ("Power... "); - gprsModul.powerOn(); - Serial.println(" On"); } -void loop() { +void loop() +{ unsigned char rc; char tmpBuf[64]; - int dataLen; // - Serial.print ("init... "); + 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 ("; 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 index 252d524..7aabe21 100644 --- a/examples/gprs_get_imei/gprs_get_imei.ino +++ b/examples/gprs_get_imei/gprs_get_imei.ino @@ -4,18 +4,15 @@ #define PIN_ST 9 // контакт состояния GPRG модуля #define BAUDRATE 115200 // частота обмена данными -GPRS gprsModul(PIN_PK, PIN_ST, BAUDRATE); // создаём объекты: +GPRS gprsModul(PIN_PK, PIN_ST, BAUDRATE); // создаём объект void setup() { Serial.begin(BAUDRATE); while (!Serial) { - // ждем откроется монитор последовательного порта + // ждем, пока откроется монитор последовательного порта } Serial.println("Serial OK!"); - Serial.print ("Power... "); - gprsModul.powerOn(); - Serial.println(" On"); } @@ -23,14 +20,17 @@ void setup() void loop() { unsigned char rc; char tmpBuf[64]; - int dataLen; // - Serial.print ("init... "); + Serial.print ("Power... "); + gprsModul.powerOn(); + Serial.print (" On"); + // + Serial.print ("; init... "); rc = gprsModul.init(); Serial.print ("rc="); Serial.print (int(rc)); // - Serial.print(" imei="); + Serial.print("; imei="); sim900_clean_buffer(tmpBuf, sizeof(tmpBuf)); gprsModul.getImei(tmpBuf); Serial.print(tmpBuf); 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 index 66dff77..90a963d 100644 --- a/examples/gprs_money_balans/gprs_money_balans.ino +++ b/examples/gprs_money_balans/gprs_money_balans.ino @@ -4,24 +4,25 @@ #define PIN_ST 9 // контакт состояния GPRG модуля #define BAUDRATE 115200 // частота обмена данными -const char balanceReq[]= "#100#"; // USSD номер проверки балланса - 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!"); - Serial.print ("Power... "); - gprsModul.powerOn(); - Serial.println(" On"); } @@ -29,20 +30,29 @@ void setup() void loop() { unsigned char rc; + char tmpBuf[64]; // - Serial.print ("init..."); + Serial.print ("Power... "); + gprsModul.powerOn(); + Serial.print (" On"); + // + Serial.print ("; init... "); rc = gprsModul.init(); - Serial.print (" rc="); + Serial.print ("rc="); Serial.print (int(rc)); // - Serial.print ("; readBalance rc="); + sim900_clean_buffer(tmpBuf, sizeof(tmpBuf)); + Serial.print ("; readBalance"); rc = gprsModul.readBalance(balanceReq, moneyBalanceBuf, sizeof(moneyBalanceBuf), moneyBalanceInt); - Serial.print ( int(rc) ); - Serial.print ("; BalanceBuf="); + Serial.print (" rc="); + Serial.print (int(rc)); + // + Serial.print ("; "); Serial.print (moneyBalanceBuf); - Serial.print ("; moneyInt="); + Serial.print ("; "); Serial.print (moneyBalanceInt); Serial.println(";"); - // - delay(5*1000); -} \ No newline at end of file + // + 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..f6c18f8 --- /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;"); // ушло на включение или выклюсчение +} From 4d1a9c812f27f504ba1c95e518677c40d3c86ea8 Mon Sep 17 00:00:00 2001 From: Docenko G Date: Sun, 18 Sep 2016 18:05:03 +0300 Subject: [PATCH 9/9] http GET MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Доработаны примеры и библиотека. Поверил на разных операторах в Москве: МТС, Мегафон, Билайн. Работает удовлетворительно --- .DS_Store | Bin 0 -> 6148 bytes GPRS_Shield_Arduino.cpp | 62 +++++++++++------- examples/gprs_http_get/gprs_http_get.ino | 61 +++++++++++++++++ .../gprs_money_balans/gprs_money_balans.ino | 4 +- .../gprs_ntp_datetime/gprs_ntp_datetime.ino | 2 +- sim900.cpp | 34 +++++++++- 6 files changed, 134 insertions(+), 29 deletions(-) create mode 100644 .DS_Store create mode 100644 examples/gprs_http_get/gprs_http_get.ino diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..aa7e3ae3fc4b976f1a9860ea0d19a0d874aedb60 GIT binary patch literal 6148 zcmeHKOHRWu5Pfd52x8MEJ8}Y~-XN;N1?UAp4Jt^Dl8RR9GI!w;?BEOt_8f&bo>7%3 zt=J(%XQc6S=3~dtk(~h$X4`TKOaP=*!Own`hdWeguwwtI zH!pUdhhjSOCpVWe%y69Ud%WHAr#-W{+^|*DbOb9t zg3TPPLJ4tpj-SPFgj~^EXTTZgGceZ2iQNC!$Ls%ol0P{E&cMH7ASA`Sm~lyVw+uI>g+tRiuUDKLU{kZ=8W&W#AhH>qQIz literal 0 HcmV?d00001 diff --git a/GPRS_Shield_Arduino.cpp b/GPRS_Shield_Arduino.cpp index 8c252c9..955319f 100644 --- a/GPRS_Shield_Arduino.cpp +++ b/GPRS_Shield_Arduino.cpp @@ -133,7 +133,7 @@ unsigned char GPRS::init(char* ipv4Buf) if(1 == joinGprs(ipv4Buf)) { rc = 0; } else { - rc = 9; // нет GPRS, ip-адрес не получен + rc = 11; // нет GPRS, ip-адрес не получен } } return rc; @@ -151,7 +151,7 @@ unsigned char GPRS::init(char* ipv4Buf, if(1 == joinGprs(ipv4Buf, apn, lgn, pwd)) { rc = 0; } else { - rc = 10; // нет GPRS, ip-адрес не получен + rc = 11; // нет GPRS, ip-адрес не получен } } return rc; @@ -163,23 +163,38 @@ unsigned char GPRS::initialSetting(void) { 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; - if (!sim900_check_with_cmd("AT+CNMI?\r\n", "+CNMI: 2,0,2,1,1\r\nOK\r\n",CMD)) { + //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 } - if (!sim900_check_with_cmd("AT+CMGF?\r\n", "+CMGF: 1\r\nOK\r\n",CMD)) { + //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; } @@ -197,13 +212,13 @@ char* GPRS::getImei(char* imei) //999999999999999 --> 15 + CRLF = 17 // --> CRLF = 2 //OK --> 2 + CRLF = 4 - char tbuf[25]; + 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,19,DEFAULT_TIMEOUT); + 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 ; @@ -272,8 +287,8 @@ unsigned char GPRS::syncNtp (const char* ntpServer) //Синхронизфция char tmpBuf[56]; unsigned char rc; sim900_clean_buffer(tmpBuf,sizeof(tmpBuf)); - if (1 == (rc = joinGprs(tmpBuf))) { // Есть GPRS подключение или удалось подключиться - sim900_send_cmd("AT+CNTP=\""); // устанавливаем параметры синхронизации + 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)) { // Параметры установились успешно @@ -284,11 +299,11 @@ unsigned char GPRS::syncNtp (const char* ntpServer) //Синхронизфция sim900_read_buffer(tmpBuf,4); // читаем код завершения rc = atoi(tmpBuf); - } else { // Не установились параметры инициализации + } else { // Не установились параметры синхронизации NTP rc = 12; } } else { - rc = 11; // Если не удалось подключиться по GPRS + rc = 11; // Если не удалось подключиться по GPRS } return rc; } @@ -350,10 +365,10 @@ unsigned char GPRS::readBalance(const char* moneyRequestBuf, moneyBalanceInt = atoi(gprsBuffer); rc = 0; // результат получен } else { - rc = 2; // в ответе нет баланса + rc = 2; // в ответе нет баланса } } else { - rc = 4; // не получен предсказуемый ответ + rc = 4; // не получен предсказуемый ответ i = 0; int n = min(sizeof(gprsBuffer), bufLen); while (i < n) { @@ -361,7 +376,6 @@ unsigned char GPRS::readBalance(const char* moneyRequestBuf, i += 1; } moneyBalanceBuf[i] = '\0'; - } //sim900_wait_for_resp(OK, CMD); sim900_flush_serial(); @@ -374,10 +388,10 @@ 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; } @@ -779,10 +793,9 @@ unsigned char GPRS::joinGprs(char* ipv4Buf, const char* pwd) { char *p,*s; - char tmpBuf[56]; long t1, t2; unsigned char rc; - rc = getGprsStatus(tmpBuf); // Запрос о состоянии GPRS соединения + rc = getGprsStatus(ipv4Buf); // Запрос о состоянии GPRS соединения if (rc != 1) { // Если не установлено, то установим sim900_check_with_cmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"\r\n",OK,CMD); // @@ -826,7 +839,7 @@ unsigned char GPRS::joinGprs(char* ipv4Buf) 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); + sim900_check_with_cmd("AT+SAPBR=1,1\r\n" ,OK,CMD); } } return rc; @@ -849,7 +862,7 @@ unsigned char GPRS::getGprsStatus(char* ipv4Buf) 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),DEFAULT_TIMEOUT); // Считываем ответ + sim900_read_buffer(tmpBuf,sizeof(tmpBuf)-1,DEFAULT_TIMEOUT); // Считываем ответ //Serial.println("<"); //Serial.println(tmpBuf); //Serial.println(">"); @@ -902,25 +915,24 @@ int GPRS::httpGet(char* url, int& dataLen) 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," ,CMD)) return 7; + if(!sim900_wait_for_resp ("+HTTPACTION:0," ,DATA)) return 7; // - sim900_read_buffer(tmpBuf,sizeof(tmpBuf),DEFAULT_TIMEOUT); + 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; // СтатусКод не распознан + result = 1; // Статус Код не распознан } // if(NULL != ( p = strstr( (char *)(s+1),"\r\n"))) { tmpBuf[ p-tmpBuf ] = '\0'; dataLen = atoi( (char *)(s+1) ); } else { - result = 2; // dataLen не распознан + result = 2; // dataLen не распознан } - // - sim900_check_with_cmd("AT+HTTPTERM\r\n",OK,CMD); return result; } 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_money_balans/gprs_money_balans.ino b/examples/gprs_money_balans/gprs_money_balans.ino index 90a963d..8bd7b9d 100644 --- a/examples/gprs_money_balans/gprs_money_balans.ino +++ b/examples/gprs_money_balans/gprs_money_balans.ino @@ -12,7 +12,7 @@ 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 balanceReq[]= "#100#"; // USSD номер проверки балланса @@ -43,7 +43,7 @@ void loop() // sim900_clean_buffer(tmpBuf, sizeof(tmpBuf)); Serial.print ("; readBalance"); - rc = gprsModul.readBalance(balanceReq, moneyBalanceBuf, sizeof(moneyBalanceBuf), moneyBalanceInt); + rc = gprsModul.readBalance(balanceReq, moneyBalanceBuf, sizeof(moneyBalanceBuf)-1, moneyBalanceInt); Serial.print (" rc="); Serial.print (int(rc)); // diff --git a/examples/gprs_ntp_datetime/gprs_ntp_datetime.ino b/examples/gprs_ntp_datetime/gprs_ntp_datetime.ino index f6c18f8..933614b 100644 --- a/examples/gprs_ntp_datetime/gprs_ntp_datetime.ino +++ b/examples/gprs_ntp_datetime/gprs_ntp_datetime.ino @@ -12,7 +12,7 @@ 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-синхронизации +const char ntpService[]= "pool.ntp.org"; // Сервер NTP-синхронизации 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