Как отправить USSD запрос и обработать ответ
Добавлено: 19 апр 2010, 09:17
Начиная с версии 2, программа NHSMS умеет отправлять USSD запросы и получать ответ из сети. Эту функцию можно использовать, например, для автоматической проверки баланса счёта и оповещения в случае, если осталось мало денег.
Отправка USSD запроса производится аналогично отправке СМС из файла (см. также тему Как отправить СМС viewtopic.php?f=3&t=16), т.е. нужно создать файл с разделом USSD или добавить раздел USSD в файл с исходящими СМС, например:
См. также примеры *.sms файлов в приложенном files.zip
Здесь параметр USSD содержит текст запроса (1,"#100#",0).
Необязательный параметр CommandLine содержит команду, которую должна будет запустить программа NHSMS после выполнения запроса. Программа NHSMS передаёт информацию в запущенный процесс через переменные окружения %ussd_request% (текст отправленного запроса), %ussd_response% (смысловая часть полученного ответа),
%ussd_resultcode% (код ошибки, 0 - успешно), %ussd_resulttext% (текстовое пояснение результата выполнения).
Программа определяет, что запрос был выполнен успешно, если от модема получен ответ, заканчивающийся на ОК, например: в ответ на запрос 1,"#100#",0 программа получила
В этом случае программа определяет выполнение как успешное и устанавливает переменные:
%ussd_request% = 1,"#100#",0
%ussd_response% = Your request has failed, try again later
%ussd_resultcode% = 0
%ussd_resulttext% = Операция успешно завершена.
Другой пример - программа NHSMS отправила запрос 1,"#100#",0 и получила ответ
По тексту ответа видно, что телефон сообщил текущий баланс (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 для определения баланса и отправки оповещения администратору по СМС.См. пример "USSD с проверкой баланса\process_ussd.js" в приложенном files.zip
Кроме того, программа сохраняет результаты выполнения запроса в файл, как задано в конф. файле параметром Parameter.SmsFileOnComplete, например:
илиСм. примеры sent.txt в приложенном files.zip
Отправка USSD запроса производится аналогично отправке СМС из файла (см. также тему Как отправить СМС viewtopic.php?f=3&t=16), т.е. нужно создать файл с разделом USSD или добавить раздел USSD в файл с исходящими СМС, например:
Код: Выделить всё
[Balance]
USSD=1,"#100#",0
CommandLine=process_ussd.js
Здесь параметр 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
%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();
}
}
Кроме того, программа сохраняет результаты выполнения запроса в файл, как задано в конф. файле параметром 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