Главное меню
RSS трансляции
Наши новости могут транслироваться, используя rss.
rss1.0
rss2.0
rdf
FAQ
 FAQ #42
Back to Categories    Print this FAQ  Send a link to this FAQ to a friend pdf
Шлюз для отправки SMS на FreeBSD
Оригинал лежит тут.

Имеем:
старый 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, но работать не будет.
Если все модули на месте — подключаем кабель и смотрим:
~> 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-шлюза.
Настраиваем 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 = 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


~# 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

(если надо, после 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

cat $1 | awk ' if(s==0 && NF>0 && $0!~/Alphabet:[ \t]*U/)}' > $FILE
echo Alphabet: Unicode >> $FILE
cat $1 | awk ' if(s==1)}' | iconv -t UCS-2BE >> $FILE

mv $FILE $1
chmod 664 $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?

ВАЖНО: Заголовки регистрозависимые.
Можно добавлять свои собственные заголовки. Они игнорируются программой, но не удаляются. Можно, к примеру, привязать к сообщению ключ базы данных добавив заголовок

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


и добавляете в конфиг smsd.conf вот такое вот:

incoming_utf8 = yes
eventhandler=/usr/local/share/smstools/eventhandler-utf-8
Views 6007 (Unique 2706)
Member Rating : Not yet rated  
FAQ Posted by
Info Created: Wednesday 02 May 2012 - 00:40:50
Last Updated: Wednesday 02 May 2012 - 02:50:21
 
РадиоЭлектроника
Поиск Vampyr`s House!
Copyright © 1999-2014, Igor Muraviov. Все авторские права принадлежат их владельцам ( в случае указания) или владельцу сайта, если автор не указан.
Копирование материалов с сайта возможно только в случае размещения ссылки на первоисточник.
Protected by Copyscape DMCA Plagiarism Check