машинку с правильной осью (FreeBSD 7.0)
НАДО: создать автоматизированную систему рассылки SMS
Детали полной реализации я выкладывать не буду, т.к. задача весьма специфическая, но рассмотрю все основные моменты отправки SMS.
В портах нашел вот что:
Port: smstools-3.1.3
Path: /usr/ports/comms/smstools3
Info: SMS Gateway software for GSM modems and mobile phones
Maint: mm@FreeBSD.org
WWW: http://smstools3.kekekasvi.com
|
sudo make -C /usr/ports/comms/smstools3 install clean
|
Теперь цепляем телефон. Как я понял, проблем при подключении датакабеля через обычный comm-port не возникает, но в данной ситуации кабель USB. Чип используется PL2303, в FreeBSD поддерживается. Проверяем:
~> kldstat -v | grep 'u[pl]*com'
|
если не видим чего-то подобного:
берем бубен и собираем ядро, добавив в конфигурацию следующиме опции:
device ucom
device uplcom
|
как это сделать очень хорошо расписано здесь: http://www.lissyara.su/?id=1072, поэтому, повторятся не буду (а можно и отдельно модули собрать, но это тема другой статьи).
ВНИМАНИЕ! Без установленных модулей кабель тоже будет определятся как /dev/ugenX, но работать не будет.
Если все модули на месте — подключаем кабель и смотрим:
~> ls -lah /dev/cuaU* crw-rw---- 1 uucp dialer 0, 69 28 окт 15:01 /dev/cuaU0 crw-rw---- 1 uucp dialer 0, 70 24 окт 10:27 /dev/cuaU0.init crw-rw---- 1 uucp dialer 0, 71 24 окт 10:27 /dev/cuaU0.lock |
Кабель увидели, можно подключать телефон и приступать к настройке SMS-шлюза.
Так как по умолчанию smsd стартует от рута, а это не тру, создаем пользователя:
~# pw groupadd smsd -g 151
~# pw useradd -n smsd -u 151 -c 'SMS Gate worker' -g smsd \
? -G uucp,dialer -w no -s /sbin/nologin -d /nonexistent
|
теперь настраиваем SMS Tools, файл /usr/local/etc/smsd.conf
# структура файла такая:
# глобальные настройки
# ...
# ...
# [ модем 1 ]
# ...
# [ модем 2 ]
# ...
# [ модем 3 ]
# ...
# используемые устройства, если несколько — пишем через запятую
devices = GSM0
# лог, если не указан — пишется в syslog, если = 1, пишет в stdout
logfile = /var/log/smsd.log
# писать фсё
loglevel = 7
# No comments, я надеюсь ;-)
USER = smsd
GROUP = dialer
# No comments too , главное — не забыть создать
# /var/run/smsd/ и дать все права юзеру smsd
PIDFILE= /var/run/smsd/smsd.pid
INFOFILE= /var/run/smsd/smsd.working
# Теперь настраиваем все телефоны, ГСМ-момеды и пр. шелезяки
# Siemens M75
[GSM0]
# порт
device = /dev/cuaU0
# скорость в нем
baudrate = 115200
# аппаратное управление потоком
rtscts = no
# строка инициализации (взял с сайта программы),
# подробная справка по командам в приложениях
init = AT+CPMS="ME","ME","ME"
init2 = AT+CNMI=1,1,0,2
# приоритет входящих сообщений
incoming = high
# хотим отчет о доставке
report = yes
# задержка перед отправкой
send_delay = 20
|
По минимуму достаточно, уже будет работать.
Еще пару движений:
в /usr/local/etc/rc.d/smsd
pidfile=/var/run/smsd.pid
|
меняем на
pidfile=/var/run/smsd/smsd.pid
|
~# echo smsd_enable=»YES» >> /etc/rc.conf
~# /usr/local/etc/rc.d/smsd start
|
смотрим
~> ps ax | grep smsd 16711 ?? Ss 0:00,00 /usr/local/bin/smsd 16712 ?? S 0:00,01 /usr/local/bin/smsd |
~> tail -f /var/log/smsd.log Oct 28 16:39:40 smsgate smsd: Smsd v3.1.3 started. Oct 28 16:39:40 smsgate smsd: Running as smsd:dialer. Oct 28 16:39:40 smsgate smsd: File mode creation mask: 022 (0644, rw-r--r--). Oct 28 16:39:40 smsgate smsd: Outgoing file checker has started. PID: 16711. Oct 28 16:39:40 smsgate GSM0: GSM0: Modem handler 0 has started. PID: 16712. Oct 28 16:39:40 smsgate GSM0: GSM0: Checking device for incoming SMS Oct 28 16:39:40 smsgate GSM0: GSM0: Checking if modem is ready Oct 28 16:39:40 smsgate GSM0: GSM0: -> AT^M Oct 28 16:39:40 smsgate GSM0: GSM0: Command is sent, waiting for the answer Oct 28 16:39:40 smsgate GSM0: GSM0: <- OK Oct 28 16:39:40 smsgate GSM0: GSM0: Pre-initializing modem |
Все завелось, комментируем в конфиге 'logfile', ставим loglevel = 5, в /etc/syslog.conf добавляем:
!+smsd,GSM0
*.* /var/log/smsd.log
|
(если надо, после GSM0 через запятую перечисляем все названия модемов из smsd.conf)
в /etc/newsyslog.conf добавляем:
/var/log/smsd.log smsd:dialer 644 7 100 * JC
|
Теперь самое вкусное — отправлять эсэмэски.
Ничего сложного, процесс отправки похож на процесс печати, в /var/spool/sms/ есть три каталога:
checked, incoming, outgoing. В каталог outgoing кидаются файлы для отправки, по формату очень похожие на MIME: сначала заголовки, потом, через пустую строку, тело сообщения. Подробнее формат опишу ниже. В пакет входит утилита sendsms, надо добавить пользователя, от которого будут отправлятся sms в группу smsd. Затем пробуем:
sendsms 79xxxxxxxxx 'Hello! How are You?'
|
(обратите внимание, номера вводятся в международном формате но без знака «+»)
И, о Чудо!, через несколько секунд придет желанная SMS. Но мы рано радуемся. Вавилон нас ждет! А точнее — отправка SMS кириллицей. Привычно берем бубен, напильник, и допиливаем "до придания нужной формы". SMSTools умеет обрабатывать события при помощи внешних программ, используем эту возможность и нарисуем скрипт проверки сообщения перед отправкой (за прототип был взят unicode2sms, все скрипты пакета можно найти в /usr/local/share/smstools):
#!/bin/sh
# checkhandler for SMS Tools 3
# autoconverts cyrillic messages to UCS-2BE
# add checkhandler=/path/to/ucsautoconvert into global part of smsd.conf
# written by lexy (lexy@mrlexy.ru), 2008
FILE=`mktemp /tmp/smsd_XXXXXX`
if [ ! `grep '[А-Яа-я]' $1` -or `grep 'Alphabet:\s*U' $1`]
then exit 0
fi
cat $1 | awk '{if(NF==0) {s=1} if(s==0 && NF>0 && \
$0!~/Alphabet:[ \t]*U/){print}}' > $FILE
echo Alphabet: Unicode >> $FILE
cat $1 | awk '{if(NF==0){s=1}if(s==1){print}}'|iconv -t UCS-2BE >> $FILE
mv $FILE $1
chmod 644 $1
|
добавляем в smsd.conf, в основную часть (до описания модемов):
checkhandler=/path/to/ucsautoconvert
|
перезапускаем smsd:
#~ /usr/local/etc/rc.d/smsd restart
|
пробуем: sendsms 79xxxxxxxxx 'Привет! Мы победили Вавилон ?'
ждем...ждем... телефончик — Плюмммм!!! Смотрим... Аллилуя!
Кроме того можно добавить поддержку обработки и других событий (SENT, RECEIVED, FAILED, REPORT, CALL), белый и черный список.
За это отвечают параметры конфигурации:
eventhandler = /path/to/handler
whitelist = /path/to/list
blacklist = /path/to/list
|
Т.к. гейт не публичный, то чернобелые списки я использовать не стал, а вот обработчик событий написал. Вы можете его найти в приложениях. Это perl-скрипт, достаточно откоменнтированный, чтоб подогнать его под свои нужды.
Теперь вкратце про формат файла сообщений, более полный вольный и сокращенный перевод документации можно найти в приложениях.
Текстовые сообщения
Файл SMS-сообщения похож на файл электронной почты: текстовый файл состоящий из заголовков и содержимого сообщения после пустой строки.
Простой пример:
To: 491721234567
Hello, this is the sms.
|
Номер указывается в международном формате но без знака «+». Если необходимо отправить сообщение на короткий номер, то перед номером нужно указать "s".
Расширеный пример:
To: 491721234567
Flash: yes
Alphabet: ISO
Hello Stefan, how are you?
|
ВАЖНО: Заголовки регистрозависимые.
Можно добавлять свои собственные заголовки. Они игнорируются программой, но не удаляются. Можно, к примеру, привязать к сообщению ключ базы данных добавив заголовок
После отправки файл сообщения сохранится в папке отправленных с этим заголовком.
Приложения
Подробное описание многих заголовков можно найти в этом приложении:
Формат файла SMS сообщения |
файл |
скачан |
размер |
размещён |
примечание |
|
35 |
130.9kb |
2008-11-10 |
Формат файла SMS сообщения | |
Скрипт обработки событий и автоматической перекодировки сообщений в кирилице здесь:
Обработчики событий для SMSTools |
файл |
скачан |
размер |
размещён |
примечание |
|
27 |
2.1kb |
2008-11-07 |
Обработчики событий для SMSTools | |