| div.main {margin-left: 20pt; margin-right: 20pt} С.Кадаков 
      sgerr@clubpro.spb.ru
 SMS-приложение. Часть 4. Но не последняя...
      И ни в чем себе не отказывать...
 Наконец-то (с заметным перерывом), нам удалось выпустить 
      следующую статью цикла. Собственно, как мы и обещали, она содержит код 
      простого, но работающего SMS приложения (для нетерпеливых: брать тут (см. 
      заголовок ;) ). Некоторые детали. Собственно, задержка обусловлена еще и тем, что мы 
      достаточно долго решали, а насколько простым должно быть это 
      приложение. С одной стороны, это не продукт, а нечто, что можно 
      написать и отладить за пару дней и за столько же "разобрать" и осознать. 
      Но, с другой, хотелось показать основные "подводные камни", с которыми 
      приходится сталкиваться в реальных проектах. Как кажется, разумный 
      компромисс найти удалось. Что с этим делать. Архив (в формате tar) содержит исходные файлы на C++ 
      (содержащие, надеемся, достаточные комментарии); файлы окружения (.dsw) и 
      проекта (.dsp) для MS VC 6 -- в каталоге MSVC6. Под *NIX (тестировался на 
      Linux RH 6.2, если кто возьмет на себя труд собрать и потестировать на 
      другой *NIX платформе -- будем благодарны за комментарии; фактически, 
      должно работать на любой... но, как обычно -- as is) же проект собирается 
      обычным образом:  
$./configure
$make
Инсталлировать не надо -- надо положить рядышком конфигурационный 
      файл. Вот пример такого файла: 
      
# This is a dumb_esme configuration file
# Host and port
host=192.168.0.5
port=8200
# Bound parameters
system_id=System ID
password=the password
system_type=Dumb ESME
# Lifetime in seconds
lifetime=60
# Time delay for select operation seconds...
tv_sec=0
# ...and microseconds
tv_usec=100000
# i. e. 0.1 sec
      
      Где брать эмулятор SMSC. В форуме 
      проскакивала ссылка на эмулятор, написанный на Java. Мы же тестировали на 
      "внутреннем" эмуляторе и на реальном SMSC (поверьте на слово -- отправляет 
      и принимает). Как это работает. Само приложение совсем простое: будучи запущенным, оно 
      "висит" указанное количество времени (параметр "lifetime" в 
      конфигурационном файле), открывая два соединения к центру (transmitter и 
      receiver). Receiver принимает все, что успевает за это время (не забывая 
      отвечать ACK-ами) и "складывает" принятое в файл с именем "inbox", а 
      transmitter отправляет все, что смог прочитать из файла "outbox". Вот 
      пример формата файла "outbox": 
      
1234 1 1 9672345 1 1 9872345 Message text
      
      
        Первая группа цифр -- идентификатор сообщения, присваиваемый 
        пользователем, ни для кого, кроме него он значения не имеет (и никуда не 
        передается), но служит для связи ответов SMSC с исходными сообщениями. 
        Далее, через пробел, TON, NPI и адрес оригинатора (т. к. ESME, в 
        принципе, может обслуживать как отдельный номер, так и диапазон, или 
        набор), т. е. адрес ESME. 
        То же для получателя. 
        Все остальное до конца строки -- текст сообщения. Проверка на длину, 
        кстати, для простоты, опущена (как и многие другие проверки, в т. ч. на 
        длину адресов). 
       После обработки "outbox" переименовывается. Далее, по 
      приходу ACK'а заносится запись в файл "sent" (в случае, если код ACK'а 
      рапортует положительный статус) или, в обратном случае, в файл "err". В 
      файл "sent" помешается строчка, содержащая упомянутый пользовательский 
      идентификатор и идентификатор, присваиваемый центром. В файл "err" -- 
      только пользовательский. По приходу же delivery receipt'а (status 
      report'а) в файл "deliv" помещается строчка с идентификатором сообщения, 
      выданный центром, если, опять же, в рапорте сообщается об успешном 
      доведении, и, в обратном случае, такая же запись помещается в файл 
      "undeliv".  Такой механизм работы позволяет связать исходное 
      сообщение с ответами центра. Действительно, не сложно написать приложение 
      (а, фактически, с этим может справиться несложный скрипт) для анализа 
      полученных файлов. На практике же, обычно "входом" и "выходом" часто 
      является некая база данных, но механизм связывания остается примерно тем 
      же. Это то, что мы между собой называем "чехордой идентификаторов" :). Но 
      подробнее об этом в следующей статье. Заключение. Подробный "разбор полетов" будет в следующей статье. А 
      пока можно просто проанализировать код и, кому удастся, потестировать 
      приложение. Мы, к слову, ввиду недостатка времени, тестировали не очень 
      интенсивно, так что bug-report'ы направляйте в форум ;). Тем не менее, на 
      стенде этот простенький (dumb!) SMS client показал устойчивую работу при 
      нагрузках порядка 100 mess/sec в обоих каналах, что явилось некоторой 
      неожиданностью.
 |