вторник, 7 октября 2008 г.

Отправка SMS-сообщений

Подробное описание создание создание сервера для рассылок SMS перечню адресатов. Эта статья будет интересна IT-администраторам и руководителям, кому интересна идея централизованого оповещения своих работников или клиентов о различных новостях или событиях. Стоит отметить, что используется исключительно открытое програмное обеспечение.

Предисловие

Написать статью побудило отсутствие подобного в русскоязычном интернете. По крайней мере поиски не привели к успеху и информацию приходилось собирать по крупицам из различных источников. Многие вещи были получены экспериментально, косвенно или вообще шестое чувство подсказало :)
Статья скорее всего будет пополняться и корректироваться по мере непосредственного использования решения. Также я планирую в рамках этой статьи разместить описание интерфейса для формировки очереди сообщений.
Также оговорюсь, что решение протестировано с использованием связи от Мегафон-Северный Кавказ. Допускаю, что другие операторы могут как-то иначе работать с теми же кодировками.

Постановка задачи

  • Адресаты могут отказаться отдальнейшей рассылки, отправив определенное слово на номер модема
  • Отправка сообщений кириллицей
  • Удобный интерфейс пользователя

Реализация

Из апаратной части был использован стандартный GPRS-модем с COM-портом. Для начала устанавливаем app-mobilephone/smstools3 из нашего оверлея. Пакет app-mobilephone/smstools из основного дерева портежей не позволяет обрабатывать длинные составные сообщения в UNICODE. Перед установкой пакет необходимо размаскировать в /etc/portage/package.keywords
# emerge app-mobilephone/smstools3
Кофигурация /etc/smsd.conf
devices = GSM1
logfile = /var/log/smsd.log
loglevel = 5
mypath = /usr/bin/
 #Ошибки отправки
 failed=/var/spool/sms/sent
 #Отправленые сообщения
 sent=/var/spool/sms/sent
 #Файл со списком номеров, кто отказался от рассылки
 blacklist = /var/spool/sms/blacklist
 #Скрипт обаботки для входящих сообщений
 eventhandler = /usr/local/bin/sms_event.sh
 
 [GSM1]
 device = /dev/ttyS0
 incoming = yes
 #pin = 1111
Перед запуском демона обязательно создаем файл черного списка
# touch /var/spool/sms/blacklist
 # chown smsd /var/spool/sms/blacklist
и файл лога
# touch /var/log/smsd.log
 # chown smsd /var/log/smsd.log
Скрипт добавления адресатов в черный список(им сообщения отправляться не будут). Для его срабатывания необходимо отправить цифру 0 на номер модема.
#!/bin/bash
 
 BLACK_LST=/var/spool/sms/blacklist
 
 if [ "$1" = "RECEIVED" ] ; then
     BODY=$(cat $2 |grep "^0")
     if [ $BODY -eq 0 ] ; then
         cat $2|grep "^From:"|sed s/"From: "//;$BLACK_LST
   fi
 fi
Скрипт формиовки сообщений и постановки в очередь отправки. Здесь было уделено внимание формировке тела письма и указаню кодировки в шапке письма. Без явного указания кодировки тело не верно декодируется на телефоне. Для работы необходима утилита iconv.
#!/bin/bash   
if  -f /tmp/smsd.lock  ; 
  then  exit 0
 else  touch /tmp/smsd.lock  
fi
PREP_DIR="/root/sms"
OUT_DIR="/var/spool/sms/outgoing"
cd $PREP_DIR
for message in $(ls *) ; do  
 output=${OUT_DIR}/$(date "+%s")
 cat ${message}|grep "^To:">${output}.sms
 echo "Alphabet: UCS2">>${output}.sms
 echo "UDH: false">>${output}.sms
 echo>>${output}.sms
 cat ${message}|grep -v "^To:"|iconv -t UCS-2BE -f utf8 >> ${output}.sms
 rm -f ${message}
 sleep 1
done

rm -f /tmp/smsd.lock

--- Статья не окончена ---
Программа генерирует в определенной директории файлы для отправки. Скрипт генерации очереди перекодирует их в нужную кодировку и отдаёт для отправки демону smsd, который осуществляет рассылку через модем. Если адресат не хочет больше получать рассылку, то он отправляет 0 в ответ. Скрипт sms_event.sh добавляет его номер в файл blacklist. Больше ему сообщения отправляться не будут. Задача решена. Приятной работы :)

Комментариев нет:

Отправить комментарий