Скажите, пожалуйста, как в arduino вы можете узнать, сколько денег на SIM-карте в gsm модеме. Я знаю команду AT ("AT+CUSD=1,\"#100#\""), но я не знаю, как записать ответ на переменную. Помогите сделать это.
Ответ
вопрос был решён довольно давно.. но вдруг кому-то пригодится
char inputGsmFullArr[200] = {0}; //массив для хранения всей смс
short int indxGsm = 0; // счетчик символов для буфера
String inputGsmFullStr = ""; //входящая строка с gsm модема - полная
bool flagGsmActive = false;
char ch = NULL;
void loop()
{
while (gprsSerial.available())
{
delay(1);
flagGsmActive = true;
byte c = gprsSerial.read();
inputGsmFullArr[indxGsm++] = c;
logger.LogPrintBytes(c);
}
if (!gprsSerial.available() && flagGsmActive)
{
for (int i = 0; i < indxGsm; i++)
{
inputGsmFullStr += inputGsmFullArr[i];
}
ReadGsmStr(inputGsmFullStr);
ClearBufferArray(inputGsmFullArr, indxGsm);
indxGsm = 0;
flagGsmActive = false;
Serial.flush();
gprsSerial.flush();
}
}
void ClearBufferArray(char *array, short int sizeBuf) // function to clear buffer array
{
for (byte i = 0; i < sizeBuf; i++)
{
array[i] = NULL;
}
}
//Обработка смс приемника-передатчика
//----------------------------------
boolean isStringMessage = false; //Флаг, что данные с GSM содержат текстовое сообщение
String lineFullStr = ""; // Входная строка построчно из inputGsmFullStr
String currNumTmp = "";
//----------------------------------
//--------------------------------------------------------------------------------------------------//
void ReadGsmStr(String fullGmsStr)
{
//Очистили подстроку главной строки
lineFullStr = "";
//Читаем посимвольно нашу полную СМС и выдергиваем оттуда подстроки
//А вид она имеет следующий
+CMT: "+79999999999","NAME","16/01/28,00:36:38+24"
// 1234567890
// 1234567890
for (int i = 0; i < fullGmsStr.length(); i++)
{
//Если находим символ возврата каретки
if (fullGmsStr.charAt(i) == '
')
{
// если это продолжение полной смс - само тело без заголовка - 1234567890
- то обрабатываем то что внутри (команды)
if (isStringMessage)
{
lineFullStr.toUpperCase();
CheckGsmSubString(lineFullStr);
isStringMessage = false;
}
else
{
CheckGsmSubString(lineFullStr);
}
lineFullStr = "";
}
else if ('
' != fullGmsStr.charAt(i))
{
lineFullStr += fullGmsStr.charAt(i);
}
else if ('
' == fullGmsStr.charAt(i))
{
lineFullStr += '
';
}
}
inputGsmFullStr = ""; //Очищаем то что пришло с GSM
}
//--------------------------------------------------------------------------------------------------//
void CheckGsmSubString(String gsmSubStr)
{
// если это текстовое сообщение
if (StringContains(gsmSubStr, "+CMT"))
{
//Парсим смс
}
// если это звонок
else if (StringContains(gsmSubStr, "+CLIP"))
{
//Парсим звонок
}
// этот блок отлавливает ответ на запрос баланса и отправляет его смской
else if (StringContains(gsmSubStr, "+CUSD"))
{
IsRequestBalanceFromGsm(gsmSubStr);
}
//---------------------КОМАНДЫ----------------------------
// делаем запрос баланса (мтс), ответ ловится +CUSD
else if (StringContains(gsmSubStr, "BAL"))
{
gprsSerial.println("ATD#100#");
}
}
//--------------------------------------------------------------------------------------------------//
// запрос баланса и отправляет его смской +CUSD
void IsRequestBalanceFromGsm(String str)
{
str = str.substring(str.indexOf("Balance"), str.indexOf("r"));
delay(1500);
str += " is your balance of number " + currentNumber;
SendSms("ТУТ НОМЕР НА КОТОРЫЙ ОТПРАВЛЯТЬ ОТВЕТ", str);
}
//--------------------------------------------------------------------------------------------------//
const char q = (char)34; // символ "
const char r = (char)13; // символ возврата каретки (Enter)
const char z = (char)26; // передача ^Z
// Функция отправки смс
void SendSms(String number, String text)
{
logger.LogPrintlnStr("SEND SMS FUNC RETURN: ");
logger.LogPrintlnStr("NUMBER: " + number + "
TEXT: " + text);
gprsSerial.println("AT+CMGD=4"); //удалить все сообщения на сим карте
delay(1500);
gprsSerial.print("AT+CMGS="); // send the SMS the number
gprsSerial.print(q); // передача в порт символа "
gprsSerial.print(number); // передача номера телефона
gprsSerial.print(q); // передача в порт символа "
gprsSerial.print(r);
delay(1500);
gprsSerial.println(text); // передача текста сообщения
delay(500);
gprsSerial.print(z); // передача ^Z
gprsSerial.print(r); // передача Enter
}
Комментариев нет:
Отправить комментарий