GSM Shield(SIM 900) - запросить баланс
- Войдите на сайт для отправки комментариев
Вс, 10/01/2016 - 15:40
Джентельмены, прошу пояснить азы запроса баланса (МТС).
В телефоне набираю *100#
получаю: Баланс : 129,91р,Лимит0.01
В ардуине пишу:
resp = modemAccess.writeModemCommand("AT+CUSD=1,\"*100#\"", 20000);
Serial.print("Responce(OK/ERROR):[");
Serial.print(resp);
Serial.print("]");
Serial.println();
получаю:
AT+CUSD=1,"*100#"%13%%10%Responce(OK/ERROR):[]
т.е. пустую строку
а если запросить время:
resp = modemAccess.writeModemCommand("AT+CCLK?", 20000);
то получаю ответ:
AT+CCLK?%13%%10%Responce(time):[
+CCLK: "00/01/01,01:51:10+00"
]K
т.е. "+CCLK: "00/01/01,01:51:10+00""
Во, у меня такая же беда. Не могу реализовать запрос баланса.
gprs.println("AT+CUSD=1,\"#100#\""); //так gprs.println("ATD#100#"); // или таку меня работают оба варианта на МТС (Москва)
Валера, прошу пояснить.
gprs - это какой класс?
И как вы читаете из него?
readSerial(???);
я работаю без библиотеки, это имя присвоенное SoftwareSerial
вам главное команды и строки инициализации модема, мои вот
gprs.println("AT+CMGF=1\r"); delay(100); gprs.println("AT+CSCS=\"GSM\""); delay(100); gprs.println("AT+IFC=1,1"); delay(100); gprs.println("AT+CNMI=1,2,2,1,0"); delay(100);Таки да.
С меня пиво.
Скиньте номер телефона на почту, я вам счёт пополню.
dmitron1036()mail.ru
Следующий вопрос: как с sim900 пообщаться через встроенные функции библиотеки GSM?
чего-то я потерял доверие к удобной команде modemAccess.writeModemCommand(). может зря?
Таки да.
С меня пиво.
Скиньте номер телефона на почту, я вам счёт пополню.
dmitron1036()mail.ru
Спасибо, не надо
Следующий вопрос: как с sim900 пообщаться через встроенные функции библиотеки GSM?
чего-то я потерял доверие к удобной команде modemAccess.writeModemCommand(). может зря?
Здесь я вам не помогу, всегда пытаюсь работать без библиотек
Ещё вопрос:
Хочу запросить отчёт по последним расходам.
в телефоне набираю: *152*1#
или *152# а потом 1
a в SIM900:
вместо первой звездочки решетку попробуйте
Думаю он отвечает тебе на русском а значит закодировано в PDU
У меня декодер показал вот что User Data (decoded): [7;79780146953;SMS. исх. 耠Моб. ΰ̐ΰ䑠䍐䏐䌀Π̐ˠ]
декодер можно взять тут
Хотя работает видимо немного некорректно, но копайте в сторону расшифровки PDU
Или как вариант раньше у оператора можно было получать все уведомления транслитом. Тогда будет приходить текст латинскими символами. Если используется русский то сообщение однозначно кодируется в PDU
Не стал плодить темы. Почти реализовал запрос баланса. После команды ATD*100# на модуль приходит строка типа такой
+CUSD: 0,"Balans:76,20r,Limit:0,01r Novinki khit-paradov i su
получилось, но коряво. При отправке на модуль команды на запрос баланса, на модуль строка USSD с балансом приходит, но отсылать мне её обратно на телефон не хочет, только если я отправлю любую смс (с любым текстом) на GSM модуль. Как будто в приходящей USD строке не находит символа перевода каретки. Можно ли сделать всё таки, чтобы модуль сразу отсылал массив со строкой USD мне обратно?
#define mySerial Serial1 String currStr = ""; int isStringMessage = 0; // 0 - не сообщение, 1 - сообщение от Макса, 2 - сообщение от Славы bool TimeSMSzapros = false ; // флаг отправки смс о состоянии дома по времени, каждый день в 20:00 bool SMSDelete = false; // флаг удаления смс из памяти gsm модуля по времени в 00:02 bool KTOzapros = 1; // перменнная кто запросил баланс. 1 - абонент № один, 0 - аб. № два void setup (){ pinMode(9, OUTPUT); // прописываем пин программного включения gsm модуля digitalWrite(9, HIGH); // Подаем High на пин 9 delay(1500); // на 1,5 секунды digitalWrite(9, LOW); // и отпускаем в Low. delay(5000); Serial.begin (9600); mySerial.begin(19200); // сериал соединение для gsm модуля delay(2000); NastroykaGSM (); } void loop (){ if (!mySerial.available()) return; char currSymb = mySerial.read(); Serial.print (currSymb); if ('\r' == currSymb) { if (isStringMessage!=0) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом { // lcd.clear(); lcd.setCursor (0,0); lcd.print ("Message "); // if (isStringMessage == 1) {lcd.print("Max");} // if (isStringMessage == 2) {lcd.print("Slava");} // lcd.setCursor (0,1); lcd.print (currStr); if (!currStr.compareTo("ZAPROS")) { SMSzapros();} // Передача параметров по СМС // else if (!currStr.compareTo("OHRANA-ON")) { signalizON(); } // else if (!currStr.compareTo("OHRANA-OFF")) { signalizOFF();} else if (!currStr.compareTo("Balance")) { SMSbalance();} isStringMessage = 0; } else { if (currStr.startsWith("+CMT: \"+79120000001")) { isStringMessage = 1; KTOzapros = 1;} //если текущая строка начинается с "+CMT",то следующая строка является сообщением if (currStr.startsWith("+CMT: \"+79120000002")) { isStringMessage = 2; KTOzapros = 0;} if (currStr.startsWith("+CUSD: 0,")) //если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса { if (KTOzapros == 1) startMaxSMS(); if (KTOzapros == 0) startSlavaSMS(); mySerial.print (currStr); EndSMS(); } } currStr = ""; } // +CUSD: 0,"Balans:76,20r,Limit:0,01r Novinki khit-paradov i su // 00390023002000280 else if ('\n' != currSymb) { currStr += String(currSymb);} } void NastroykaGSM () { mySerial.print("AT+CMGF=1\r"); //устанавливает текстовый режим смс-сообщения delay(100); mySerial.print("AT+IFC=1, 1\r"); //устанавливает программный контроль потоком передачи данных delay(100); mySerial.print("AT+CPBS=\"SM\"\r"); //открывает доступ к данным телефонной книги SIM-карты delay(100); mySerial.print("AT+GSMBUSY=1, 1\r"); //запрет всех входящих звонков delay(100); mySerial.print("AT+CNMI=1,2,2,1,0\r"); //включает оповещение о новых сообщениях delay(300); mySerial.print("AT+CMGDA=«DEL ALL»\r"); // удаляем все смс, ки delay(2000); } void startMaxSMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру { mySerial.print("AT+CMGF=1\r"); delay(100); mySerial.println("AT + CMGS = \"+79120000001\""); // (+79000000000 сдесь должен быть ваш номер №1) delay(100); } void startSlavaSMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по второму номеру { mySerial.print("AT+CMGF=1\r"); delay(100); mySerial.println("AT + CMGS = \"+79120000002\""); // (+79000000000 сдесь должен быть ваш номер №2) delay(100); } void EndSMS () { delay(100); mySerial.println((char)26); // Команда отправки СМС delay(5000); } void SMSzapros() { if (TimeSMSzapros==true) { startSlavaSMS();} if (isStringMessage == 1) { startMaxSMS();} if (isStringMessage == 2) { startSlavaSMS();} // mySerial.println (time.gettime("H:i, D, d M")); // if (signaliz == 1) mySerial.println ("OHRANA Vkluchena!"); // if (signaliz == 0) mySerial.println ("OHRANA Otkluchena!"); if(digitalRead(23)==HIGH) mySerial.println ("Dvizhenie v kotelnoy!"); // mySerial.print("Kuhnya: "); mySerial.print (TempKuhnyaC); mySerial.println("*C"); // mySerial.print("VannaNiz: "); mySerial.print (TempVannaNizC); mySerial.println("*C"); // mySerial.print("Ulica: "); mySerial.print (TempUlicaC); mySerial.println("*C"); // mySerial.print("AntiFreeze: "); mySerial.print (TempFreezeC); mySerial.println("*C"); EndSMS(); } void SMSbalance() { //mySerial.print("AT+CMGF=1\r"); // delay(100); mySerial.println("ATD*100#"); //mySerial.println("AT + CMGS = \"111\""); // (+79000000000 сдесь должен быть ваш номер №1) delay(2000); // команда на замену на транслит *111*6*2# //mySerial.println ("11"); //EndSMS(); }Ну помогите ктонить найти косяк в , как это называется, в парсинге. Строка с 23 по 60. При наполнении массива String строкой с балансом которая начинается с +CUSD модуль почему то не видит перевод каретки.
По команде #100# тоже самое
вам на телефон тоже приходит баланс с мусором: Novinki khit-paradov i su...
Мне кажется проблема тут. Не....может вы конечно что-то в настройках не настроили.