SMS Сервер на базе ОС Linux

SMS Сервер на базе ОС Linux

Эта статья будет интересна 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

Для формирования сообщений использовался интефейс написаный Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра. с использованием библиотеки Qt. Изображение:Sms.png

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

Статья размещена с разрешения автора , впервые статья была размещена тут .

Back to top