Пример фрагмента конф. файла:
Код: Выделить всё
[Read]
commandline=sms-status.cmd %sms_type% %sms_sender% "%sms_senttime%" %sms_statuscode% "%sms_statustext%"
commandline=sms-deliver.cmd
commandline=cscript process_sms.js //nologo
Для каждого созданного процесса будут установлены переменные окружения %sms_type%, %sms_sender% и т.д. (полный список в nhsms-help.htm) в соответствии с данными принятого СМС. Переменные окружения могут быть использованы в командной строке (пример 1), тогда командный файл sms-status.cmd может выглядеть так:
Код: Выделить всё
@echo off
rem Обрабатываем только сообщения о статусе
if not "%1" == "SMS-STATUS-REPORT" exit /b 0
rem Обрабатываем только ошибки доставки
if "%sms_statuscode%" == "0" exit /b 0
echo %2 %~3 %4 %~5 >>sms-delivery-fail.txt
rem Дальнейшая обработка...
Код: Выделить всё
@echo off
rem Обрабатываем только входящие СМС
if not "%sms_type%" == "SMS-DELIVER" exit /b 0
rem Проверяем отправителя
if not "%sms_sender%" == "79161111111" exit /b 0
rem Проверяем команду
echo "%sms_messagetext%" >>sms-command.txt
if "%sms_messagetext%" == "Restart" nhss -r
if "%sms_messagetext%" == "Rebuild" call D:\Dev\rebuild.cmd
rem Дальнейшая обработка...
Код: Выделить всё
var shell=WScript.CreateObject("WScript.Shell");
var type=shell.ExpandEnvironmentStrings("%sms_type%");
var phone=shell.ExpandEnvironmentStrings("%sms_sender%");
var sent_time=shell.ExpandEnvironmentStrings("%sms_senttime%");
var text=shell.ExpandEnvironmentStrings("%sms_messagetext%");
var fso=WScript.CreateObject("Scripting.FileSystemObject");
var f=fso.OpenTextFile("sms-js.txt",8,true,false);
f.WriteLine(type+" "+phone+" "+sent_time+" "+text);
f.Close();
То есть файл с русским текстом СМС, сохранённый командным файлом BAT/CMD, будет некорректно отображаться в Блокноте Windows. В то время как файл с тем же СМС, но сохранённым скриптом JScript, будет отображаться в Блокноте Windows корректно.
Ещё одна сложность обработки входящих СМС связана с записью их в текстовый файл. Поскольку программа NHSMS запускает программы и скрипты, заданные параметром commandline асинхронно, то при считывании из телефона сразу нескольких СМС возможна ситуация, когда запущенные от разных СМС скрипты будут писать одновременно в один файл, в результате чего возникает конфликт доступа, и информация не сохраняется.
Для скриптов, написанных на JScript или VBS, возможно добавить проверку (перехват исключения) и, в случае ошибки, повтор попытки открытия файла.
Т.е. можно заменить открытие файла со строки
Код: Выделить всё
var f=fso.OpenTextFile("sms-js.txt",8,true,false);
Код: Выделить всё
var f=OpenTextFileEC("sms-js.txt",8,true,false);
Код: Выделить всё
function OpenTextFileEC(filename,iomode,create,format){
var f;
do{
var fopenerr=false;
try{
f=fso.OpenTextFile(filename,iomode,create,format);
}
catch(e){
fopenerr=true;
WScript.Sleep(10);
}
}
while(fopenerr==true);
return f;
}
В командных файлах не удалось найти возможность отслеживать ошибки записи в файл оператора перенаправления (>>).
Альтернативный вариант записи - сохранение входящих СМС не в файл, а в базу данных, пример записи в dBase имеется на сайте (http://nhutils.ru/sms_sample_sms2db.htm).