GSM Shield(SIM 900) - запросить баланс

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Джентельмены, прошу пояснить азы запроса баланса (МТС).

В телефоне набираю *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""
Slavyanin55
Slavyanin55 аватар
Offline
Зарегистрирован: 01.06.2014

Во, у меня такая же беда. Не могу реализовать запрос баланса.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
        gprs.println("AT+CUSD=1,\"#100#\""); //так
        gprs.println("ATD#100#");  // или так

у меня работают оба варианта на МТС (Москва)

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Валера, прошу пояснить.

// initialize the library instance
GSM gsmAccess;        // GSM access: include a 'true' parameter for debug enabled
GPRS gprsAccess;  // GPRS access
GSMClient client;  // Client service for TCP connection

gprs - это какой класс?

И как вы читаете из него?

readSerial(???);

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

я работаю без библиотеки, это имя присвоенное SoftwareSerial

SoftwareSerial gprs(7, 8);

вам главное команды и строки инициализации модема, мои вот

  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
Offline
Зарегистрирован: 10.01.2016

Таки да.

С меня пиво.

Скиньте номер телефона на почту, я вам счёт пополню.

dmitron1036()mail.ru

Следующий вопрос: как с sim900 пообщаться через встроенные функции библиотеки GSM?

чего-то я потерял доверие к удобной команде modemAccess.writeModemCommand(). может зря?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

dmitron1036 пишет:

Таки да.

С меня пиво.

Скиньте номер телефона на почту, я вам счёт пополню.

dmitron1036()mail.ru

Спасибо, не надо

dmitron1036 пишет:

Следующий вопрос: как с sim900 пообщаться через встроенные функции библиотеки GSM?

чего-то я потерял доверие к удобной команде modemAccess.writeModemCommand(). может зря?

Здесь я вам не помогу, всегда пытаюсь работать без библиотек

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Ещё вопрос:

Хочу запросить отчёт по последним расходам.

в телефоне набираю: *152*1#

или *152# а потом 1

a в SIM900:

AT+CUSD=1,"*152*1#"

OK

+CUSD: 0,"0412043004480430002004370430044F0432043A04300020043F04400438043D044F04
420430002E0020041F04400438044F0442043D043E0433043E0020043E043104490435043D043804
4F00210020041C04220421002E",72

+CMT: "5800","","16/01/13,10:50:56+12"
0031002900310031002F00300031002000320033003A00330032003A00340037003B003700390037
00380030003100340036003900350033003B0053004D0053002E0020043804410445002E00208020
041C043E0431002E002003B0031003B04460435043D0430003A0031002E0

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

вместо первой звездочки решетку попробуйте

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

dmitron1036 пишет:

+CUSD: 0,"0412043004480430002004370430044F0432043A04300020043F04400438043D044F04
420430002E0020041F04400438044F0442043D043E0433043E0020043E043104490435043D043804
4F00210020041C04220421002E",72

+CMT: "5800","","16/01/13,10:50:56+12"
0031002900310031002F00300031002000320033003A00330032003A00340037003B003700390037
00380030003100340036003900350033003B0053004D0053002E0020043804410445002E00208020
041C043E0431002E002003B0031003B04460435043D0430003A0031002E0

Думаю он отвечает тебе на русском а значит закодировано в PDU

У меня декодер показал вот что User Data (decoded): [7;79780146953;SMS. исх. 耠Моб. ΰ̐ΰ䑠䍐䏐䌀Π̐ˠ]

декодер можно взять тут

Хотя работает видимо немного некорректно, но копайте в сторону расшифровки PDU

Или как вариант раньше у оператора можно было получать все уведомления транслитом. Тогда будет приходить текст латинскими символами. Если используется русский то сообщение однозначно кодируется в PDU

MaksVV
Offline
Зарегистрирован: 06.08.2015

Не стал плодить темы. Почти реализовал запрос баланса. После команды 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();
}

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Ну помогите ктонить найти косяк в , как это называется, в парсинге. Строка с 23 по 60. При наполнении массива String строкой с балансом которая начинается с +CUSD модуль почему то не видит перевод каретки.
По команде #100# тоже самое

dmitron1036
Offline
Зарегистрирован: 10.01.2016

вам на телефон тоже приходит баланс с мусором: Novinki khit-paradov i su...

Мне кажется проблема тут. Не....может вы конечно что-то в настройках не настроили.