Как отправить USSD запрос и обработать ответ

Обсуждение программы nhsms - отправка и приём СМС
Закрыто
nhutils
Сообщения: 595
Зарегистрирован: 09 дек 2009, 18:08
Контактная информация:

Как отправить USSD запрос и обработать ответ

Сообщение nhutils »

Начиная с версии 2, программа NHSMS умеет отправлять USSD запросы и получать ответ из сети. Эту функцию можно использовать, например, для автоматической проверки баланса счёта и оповещения в случае, если осталось мало денег.

Отправка USSD запроса производится аналогично отправке СМС из файла (см. также тему Как отправить СМС viewtopic.php?f=3&t=16), т.е. нужно создать файл с разделом USSD или добавить раздел USSD в файл с исходящими СМС, например:

Код: Выделить всё

[Balance]
USSD=1,"#100#",0
CommandLine=process_ussd.js
См. также примеры *.sms файлов в приложенном files.zip

Здесь параметр USSD содержит текст запроса (1,"#100#",0).
Необязательный параметр CommandLine содержит команду, которую должна будет запустить программа NHSMS после выполнения запроса. Программа NHSMS передаёт информацию в запущенный процесс через переменные окружения %ussd_request% (текст отправленного запроса), %ussd_response% (смысловая часть полученного ответа),
%ussd_resultcode% (код ошибки, 0 - успешно), %ussd_resulttext% (текстовое пояснение результата выполнения).

Программа определяет, что запрос был выполнен успешно, если от модема получен ответ, заканчивающийся на ОК, например: в ответ на запрос 1,"#100#",0 программа получила

Код: Выделить всё

+CUSD: 0,"Your request has failed, try again later"

OK
В этом случае программа определяет выполнение как успешное и устанавливает переменные:
%ussd_request% = 1,"#100#",0
%ussd_response% = Your request has failed, try again later
%ussd_resultcode% = 0
%ussd_resulttext% = Операция успешно завершена.

Другой пример - программа NHSMS отправила запрос 1,"#100#",0 и получила ответ

Код: Выделить всё

 +CUSD: 0,"Balance:296,44r "

ERROR
По тексту ответа видно, что телефон сообщил текущий баланс (296,44 руб.), но завершил ответ кодовым словом ERROR. Для таких случаев программа NHSMS считывает текстовую часть ответа, но устанавливает ненулевой код возврата и на всякий случай сохраняет полный ответ модема:
%ussd_request% = 1,"#100#",0
%ussd_response% = Balance:296,44r
%ussd_resultcode% = 536870912
%ussd_resulttext% = +CUSD: 0,"Balance:296,44r "\r\n\r\nERROR

Также программа будет вытаскивать текстовую часть ответа в %ussd_response% и сохранять полный ответ модема в %ussd_resulttext% в случаях нестандартных ответов. Это было сделано после обращению одного из пользователей (см. viewtopic.php?f=3&t=40#p120), т.к. его модем, судя по приведённому тексту, отвечает ОК в начале сообщения, а не в конце.

Пример обработки USSD ответа в JScript для определения баланса и отправки оповещения администратору по СМС.

Код: Выделить всё

var wsh_shell = WScript.CreateObject("WScript.Shell");
var response = WshShell.ExpandEnvironmentStrings("%ussd_response%");
// Предполагаем ответ следующего вида "Balance:296,44r"
var re1 = "Balance:[0-9]+,[0-9][0-9]r";
if(response.match(re1) != null){  // проверяем формат
  var re_money = "[0-9]+,[0-9][0-9]";
  var balance_str = response.match(re_money);
  var balance = parseFloat(balance_str); 
  if (balance < 300){ // На счету меньше 300 рублей, делаем оповещение
    var fso=WScript.CreateObject("Scripting.FileSystemObject");
    var sms_file=fso.CreateTextFile("balance.sms",false,false);
    sms_file.WriteLine("[LowBalance]\r\nphone=79161111111\r\n"+
      "text=Баланс меньше 300 рублей!");
    sms_file.Close();
  }
}
См. пример "USSD с проверкой баланса\process_ussd.js" в приложенном files.zip

Кроме того, программа сохраняет результаты выполнения запроса в файл, как задано в конф. файле параметром Parameter.SmsFileOnComplete, например:

Код: Выделить всё

[Balance33]
USSD=1,"#100#"
commandline=process_ussd.cmd
SentTm=2010-04-16 13:53:39
USSDResponse=Your request has failed, try again later
ResultCode=0
ResultText=Операция успешно завершена.

или

Код: Выделить всё

[Balance1]
USSD=1,"#100#",0
commandline=process_ussd.cmd
SentTm=2010-04-15 20:22:04
USSDResponse=Balance:296,44r 
ResultCode=536870912
ResultText= +CUSD: 0,"Balance:296,44r "\r\n\r\nERROR
См. примеры sent.txt в приложенном files.zip
Вложения
files.zip
(12.97 КБ) 883 скачивания
Mvolk
Сообщения: 2
Зарегистрирован: 21 май 2012, 10:18

Re: Как отправить USSD запрос и обработать ответ

Сообщение Mvolk »

Пожалуйста к приведенным примерам кода присоедините названия файла, в котором он должен содержаться
вам то понятно а, новичкам нет.
nhutils
Сообщения: 595
Зарегистрирован: 09 дек 2009, 18:08
Контактная информация:

Re: Как отправить USSD запрос и обработать ответ

Сообщение nhutils »

Mvolk писал(а):Пожалуйста к приведенным примерам кода присоедините названия файла, в котором он должен содержаться
вам то понятно а, новичкам нет.
Обновил files.zip, разделил на два примера (первый – просто с отправкой запроса и сохранением ответа, второй – с обработкой ответа) , добавил readme к каждому примеру. Здесь добавил к примерам названия файлов.
Закрыто