Отправка 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