Имеем: старый Siemens M75; родной (семёновский) дата-кабель DCA-510 к нему; машинку с правильной осью (FreeBSD 7.0)
НАДО: создать автоматизированную систему рассылки SMS
make -C /usr/ports/comms/smstools3 install clean
Теперь цепляем телефон. Как я понял, проблем при подключении датакабеля через обычный comm-port не возникает, но в данной ситуации кабель USB. Чип используется PL2303, в FreeBSD поддерживается. Проверяем:
~> kldstat -v | grep 'u[pl]*com'
если не видим чего-то подобного: 212 ucom 223 uhub/uplcom
берем бубен и собираем ядро, добавив в конфигурацию следующие опции:
device ucom
device uplcom
ВНИМАНИЕ! Без установленных модулей кабель тоже будет определятся как /dev/ugenX, но работать не будет. Если все модули на месте — подключаем кабель и смотрим:
# используемые устройства, если несколько — пишем через запятую
devices = GSM0
# лог, если не указан — пишется в syslog, если = 1, пишет в stdout
logfile = /var/log/smsd.log
# писать фсё
loglevel = 7
# No comments, я надеюсь ;)
USER = uucp
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
~> 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
(если надо, после 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 > /dev/null` -o `grep 'Alphabet:\s*U' $1 > /dev/null` ]
then exit 0
fi
добавляем в smsd.conf, в основную часть (до описания модемов):
checkhandler=/path/to/ucsautoconvert
перезапускаем smsd:
#~ /usr/local/etc/rc.d/smsd restart
пробуем: sendsms 79xxxxxxxxx 'Привет! Мы победили Вавилон ?' ждем...ждем... телефончик — Плюмммм!!! Смотрим... Аллилуя! Кроме того можно добавить поддержку обработки и других событий (SENT, RECEIVED, FAILED, REPORT, CALL), белый и черный список. За это отвечают параметры конфигурации:
Т.к. гейт не публичный, то чернобелые списки я использовать не стал, а вот обработчик событий написал. Вы можете его найти в приложениях. Это perl-скрипт, достаточно откоменнтированный, чтоб подогнать его под свои нужды.
Теперь вкратце про формат файла сообщений, более полный вольный и сокращенный перевод документации можно найти в приложениях.
Текстовые сообщения
Файл SMS-сообщения похож на файл электронной почты: текстовый файл состоящий из заголовков и содержимого сообщения после пустой строки. Простой пример:
To: 491721234567
Hello, this is the sms.
Номер указывается в международном формате но без знака «+». Если необходимо отправить сообщение на короткий номер, то перед номером нужно указать "s". Расширеный пример:
To: 491721234567 Flash: yes Alphabet: ISO
Hello Stefan, how are you?
ВАЖНО: Заголовки регистрозависимые. Можно добавлять свои собственные заголовки. Они игнорируются программой, но не удаляются. Можно, к примеру, привязать к сообщению ключ базы данных добавив заголовок
X-Db-Id: 777888
После отправки файл сообщения сохранится в папке отправленных с этим заголовком.
Теперь моя личная добавочка. Чтобы запустить это все с модемом ZTE 180 от билайна (он разлочен, берет любые симки, во всяком случае у меня ) можно опустить часть с установкой модулей для датакабеля, модем определяется фрей и без этого. В результате получается /dev/cuaU0.1, /dev/cuaU0.2 и /dev/cuaU0.3 Ну на счет 0 - это у меня так, у вас может быть другая цифра - номер усб. Если такие порты в дев появились и ваш модем в messages определился как:
kernel: u3g1: <ZTE,Incorporated ZTE WCDMA Technologies MSM, class 0/0, rev 2.00/0.00, addr 3> on usbus4
kernel: u3g1: Found 4 ports.
значит все нормально. Осталось только в smsd.conf прописать вместо того что писано про сименс в вышенаписанном:
[GSM0]
# порт
device = /dev/cuaU0.1
incoming = yes
# скорость в нем
baudrate = 115200
check_memory_method = 2
# аппаратное управление потоком
rtscts = no
init = AT+CPMS="ME","ME","ME"
init2 = AT+CFUN=1
Обратите особое внимание на запись check_memory_method = 2! Иниты взяты с сайта производителя smstools именно для данного модема. В противном случае смс получить не удастся. И под конец, чтобы это все заработало нормально, правим скрипт запуска в /usr/local/etc/rc.d/smsd убирая из строки command_args все лишнее. А точнее делаем ее вот такой:
command_args="-c$ -p$"
Еще неплохо бы в конфиге и том же скрипте поменять пользователя и группу на uucp uucp, это более правильно. Все, смс и отправляются и получаются.
Теперь что касается русификации входящих сообщений. Заходите в /usr/local/share/smstools и правите там файл eventhandler-utf-8 превратив его вот в такое:
case "$1" in
SENT|RECEIVED|FAILED)
if sed -e '/^$/ q' < "$2" | grep "^Alphabet: UCS2" > /dev/null; then
TMPFILE=`mktemp /tmp/smsd_XXXXXX`
sed -e '/^$/ q' < "$2" | sed -e 's/Alphabet: UCS2/Alphabet: UTF-8/g' > $TMPFILE
sed -e '1,/^$/ d' < "$2" | iconv -f UNICODEBIG -t UTF-8 >> $TMPFILE
mv $TMPFILE "$2"
chmod 644 $2
fi
;;
esac