Как считать СМС

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

Как считать СМС

Сообщение nhutils »

Чтобы программа NHSMS считывала входящие сообщения из телефона, в конф. файле NHSMS.INI (или файле, указанном параметром -INI), должен присутствовать раздел [Read] с хотя бы одной командой обработки, заданной параметром commandline. Программа считывает и прочитанные, и непрочитанные сообщения из всех доступных областей памяти (из памяти телефона и из СИМ карты), считанные сообщения удаляются.

Пример фрагмента конф. файла:

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

[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
Здесь указаны три командные строки, и для каждого считанного СМС будут выполнены все три команды. В команде можно вызывать любую программу, в примерах вызываются CMD и JS файлы. Запущенные команды выполняются асинхронно, т.е. не останавливают выполнение NHSMS.

Для каждого созданного процесса будут установлены переменные окружения %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 Дальнейшая обработка...
Переменные окружения доступны и в самом процессе, т.е. необязательно передавать параметры СМС через аргументы командного файла, в командном файле можно использовать переменные окружения %sms_sender%, %sms_senttime% и т.д. Командный файл sms-deliver.cmd может выглядеть так:

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

@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 Дальнейшая обработка...
Пример обработки входящего сообщения на JScript, файл process_sms.js:

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

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 записывают в файл в кодировке OEM, а скрипты VBS и JScript - в ANSI.
То есть файл с русским текстом СМС, сохранённый командным файлом 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);
Функция OpenTextFileEC определяется следующим образом:

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

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).
Kapust
Сообщения: 2
Зарегистрирован: 20 окт 2010, 14:13

Re: Как считать СМС

Сообщение Kapust »

Плохо гуглили, товарисч -_-

http://www.cyberforum.ru/cmd-bat/thread12941.html
Если файл 1.txt большого размера и копируется откуда-то, то может получится так, что пакетный файл проверит его наличие в то время, как файл еще не скопировался или занят другим приложением. В таком случае, попытка выполнить какие-то действия с файлом 1.txt приведет к ошибке. Чтобы этого не произошло пакетный файл можно модифицировать следующим образом

:test
if exist c:\1.txt goto go
sleep 10
goto test
:go
rename c:\1.txt 1.txt
if not errorlevel 0 goto go
del c:\1.txt

Когда файл 1.txt скопировался на диск С не полностью, либо занят другим приложением, попытка его переименовать вызовет ошибку и цикл будет повторяться до тех пор, пока файл не скопируется полностью либо не будет освобожден. После того, как команда rename c:\1.txt 1.txt будет выполнена без ошибки (т.е. файл свободен), то с ним можно выполнять любые действия. В последнем примере это его удаление.
nhutils
Сообщения: 595
Зарегистрирован: 09 дек 2009, 18:08
Контактная информация:

Re: Как считать СМС

Сообщение nhutils »

Можете показать здесь примера такого CMD файла? Т.е. такого, который бы осуществлял гарантированную дозапись (с разрешением конфликтов одновременной записи) в конец существующего файла через перенаправление (т.е. через строчку вида echo текст >>file.txt) или каким-то другим способом?
Aveiro
Сообщения: 6
Зарегистрирован: 23 июн 2011, 00:04

Re: Как считать СМС

Сообщение Aveiro »

Подскажите пожалуйста как запустить Exe файл ,лежащий не в папке \nhsms? Делаю вот так :

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

if "%sms_messagetext%" == "test" call D:\СИСТЕМА\Program Files\neutron\Neutron.exe
Не запускается...
nhutils
Сообщения: 595
Зарегистрирован: 09 дек 2009, 18:08
Контактная информация:

Re: Как считать СМС

Сообщение nhutils »

Aveiro писал(а):Подскажите пожалуйста как запустить Exe файл ,лежащий не в папке \nhsms? Делаю вот так :

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

if "%sms_messagetext%" == "test" call D:\СИСТЕМА\Program Files\neutron\Neutron.exe
Не запускается...
Заключите путь и имя файла в кавычки. И команда call – это для командных файлов. Её можно убрать или заменить на start.
Закрыто