Необходимо настроить SMS сервер для получения и отправки SMS сообщений через USB-stick (UMTS-модем). Конфигурация "сервера" с 1 GB RAM и процессором:

cat /proc/cpuinfo

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 15
model            : 2
model name    : Intel(R) Pentium(R) 4 CPU 2.80GHz
stepping         : 9
cpu MHz         : 2793.184
cache size      : 512 KB

Установлена ОС Debian 6.0.3 x86. Устанавливаем все необходимые пакеты:

apt-get update
apt-get install build-essential manpages-dev

 Для отправки смс используются модемы ZTE K3565-Z, подключённые через USB-hub. Данные модемы не привязанны к провадеру. Если у вас есть привязка к провайдеру - пишите, подскажу. Или ждите, когда будет готова об этом статья.

lsusb

Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 004: ID 19d2:0063 ONDA Communication S.p.A. ZTE K3565-Z HSDPA
Bus 001 Device 003: ID 19d2:0063 ONDA Communication S.p.A. ZTE K3565-Z HSDPA
Bus 001 Device 002: ID 1a40:0201 TERMINUS TECHNOLOGY INC.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Изначально модемы распознаются системой как cdrom. Для того, что бы они распознавались как USB устройства необходимо установить программу usb-modeswitch и перезагрузить сервер. Очень важный момент: каждый модем создаёт по 5 виртуальных USB порта. Для команд АТ модемы доступны, как правило, по ttyUSB1 и ttyUSB3. Или же по одному из них. Единственное обстоятельство, которое я не понял и не могу решить: если менять USB-hub, то после загрузки появляеются только 5 виртуальных портов одного модема. После перезагрузки сервера появляются следующие 5. И если модемов больше - то их виртуальные порты добавляются после каждой перезагрузки.

apt-get install usb-modeswitch
ls /dev/ttyUSB*

/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyUSB2
/dev/ttyUSB3
/dev/ttyUSB4
/dev/ttyUSB5
/dev/ttyUSB6
/dev/ttyUSB7
/dev/ttyUSB8
/dev/ttyUSB9

Количество виртуальных портов можно уменьшить до 3 на каждый модем. Для этого нужно отключить в нём режимы cdrom и flash-drive. Для модема ZTE это делает командой AT+ZCDRUN=E. Для возврата в режим всех устройств: AT+ZCDRUN=F. Для отключения монтирования только cdrom испольузется команада AT-ZCDRUN=8, для обратного включения AT-ZCDRUN=9. Возможно, после отключения cdrom программа usb-modeswitch не понадобится. Не проверял. Проверил на debian 6.0.4 с обновлённым ядром до 3.2 - сразу подключились в /dev/ttyUSB*. После включения режима "только модем" используются порты ttyUSB1 и ttyUSB4. Но у меня все модемы подключились без проблем по последнему порту ttyUSB2 & ttyUSB5. Для выполнения данных команд в Linux можно использовать программу minicom, предварительно установив её в системе. Подключение: minicom -D /dev/ttyUSB№.

ls /dev/ttyUSB*

/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyUSB2
/dev/ttyUSB3
/dev/ttyUSB4
/dev/ttyUSB5

Скачиваем и устанавливаем smstool:

wget http://smstools3.kekekasvi.com/packages/smstools3-3.1.14.tar.gz
tar -zxvf smstools3-3.1.14.tar.gz -C /usr/local/src
cd /usr/local/src/smstools3
make
make install

Мой конфигурационный файл sms.conf. Жирным я выделили парамерты, которые могут у вас отличаться. Все указанные в конфиге директории должны быть созданы.

cat /etc/smsd.conf

# Example smsd.conf. Read the manual for a description
devices = GSM1,GSM2
logfile = /var/log/sms/smstools.log
#loglevel = 7
loglevel = notice
outgoing = /var/spool/sms/outgoing
checked = /var/spool/sms/checked
incoming = /var/spool/sms/incoming
failed = /var/spool/sms/failed
sent = /var/spool/sms/sent
[queues]
GSM1 = /var/spool/sms/GSM/GSM1
GSM2 = /var/spool/sms/GSM/GSM2
[providers]
GSM1 = 0,1,2,3,4,5,6,7,8,9,s
GSM2 = 0,1,2,3,4,5,6,7,8,9,s
[GSM1]
device = /dev/ttyUSB1
queues = GSM1
init = AT+CPMS="SM","SM","SM"
incoming = yes
check_memory_method = 31
[GSM2]
device = /dev/ttyUSB4
queues = GSM2
init = AT+CPMS="SM","SM","SM"
incoming = yes
check_memory_method = 31

Если модемы одинаковые, то их одинаковые параметры можно вписать в секцию [default] (после [providers]). Для отправки сообщений из консоли введите команду:

sendsms +7926xxxxxxx "Test"

 На этом настройка smstools завершена. Приступаем к настройке PlaySMS. Мне на самом деле это приложение не нужно. Оно просто анализирует логи smstool и складывает их в mysql базу. Исправив php скрипты можно собирать и сохранять в базе любые параметры из логов. Скрипты: /var/www/playsms/lib/fn_core.php и /var/www/playsms/plugin/gateway/smstools/fn.php. Как править - на ваше усмотрение. Я не программист, но взлянув на имеющийся код, можно исправить простым копи-пастом с правкой переменных. Т.к. PlaySMS сразу удаляет логи я приведу пример оного (при входящем сообщении):

From: 7926xxxxxxx
From_TOA: 91 international, ISDN/telephone
From_SMSC: 7926xxxxxxx
Sent: 11-11-26 08:47:33
Received: 11-11-27 08:47:40
Modem: GSM1
IMSI: 262028560066260
Alphabet: UTF-8
UDH-DATA: 05 00 03 4E 02 01 
UDH-Type: Length=6, [00]Concatenated short messages, 8-bit reference number
Length: 153
ТУПО ТЕКСТ

 Установка PlaySMS. Вначале устанавливаются необходимые пакеты для работы PlaySMS. Я устанавливаю в два приёма, т.к. мало ли что:

apt-get install apache2 mysql-server
apt-get install php5 php5-cli php5-cgi php-pear php-db libapache2-mod-php5 phpmyadmin

 Создаём нового пользователя и дериктории для PlaySMS. Скачиваем последнюю версию PlaySMS и создаём базу в mysql

adduser playsms
mkdir -p /var/www/playsms
mkdir -p /var/spool/playsms
mkdir -p /var/log/playsms
chown -R www-data /var/www/playsms
chown -R www-data /var/spool/playsms
chown -R www-data /var/log/playsms
wget http://downloads.sourceforge.net/project/playsms/playsms/Version%200.9.5.3/playsms-0.9.5.3.tar.gz
tar -zxvf playsms-0.9.5.3.tar.gz -C /usr/local/src
cd /usr/local/src/playsms-0.9.5.3/web
cp -rR * /var/www/playsms
chown -R www-data /var/www/playsms
mysqladmin -u root -p create playsms

 Импортируем в созданную базу скаченную базу:

mysql -u root -p playsms < /usr/local/src/playsms-0.9.5.3/db/playsms.sql

 Копируем конфигурациолнный файл, в котором правим одну (или две) строчку - пароль для подключения к базе (и логин, если у вас не root)

cp /var/www/playsms/config-dist.php /var/www/playsms/config.php
vi /var/www/playsms/config.php

$core_config['db']['pass'] = 'ваш пароль';          // database password

Настраиваем автоматический запуск программы:

cd /usr/local/src/playsms-0.9.5.3/bin
cp playsmsd playsmsd.php playsmsd_start /usr/local/bin/
cp playsms /etc/default/

 В /etc/init.d/rc.local добавлеям строчку - /usr/local/bin/playsmsd_start. Панель управления PlaySMS доступна по htpp://ip.адресс.вашего.сервера/playsms. Вход admin \ admin.

 Во время тестирования сервера столкнулся с проблемой: во время работы один из модемов отключался, а подключался на другой порт USB. Решил это через udev. Вначале нужно понять по какому параметру будем искать свои модемы. Для этого воспользуется командой (вывод для одного модема):

watch "dmesg | tail -55"

[    6.836418] usb 1-8.5: new high speed USB device using ehci_hcd and address 31
[    6.901346] i801_smbus 0000:00:1f.3: PCI INT B -> GSI 17 (level, low) -> IRQ 17
[    6.939272] usb 1-8.5: New USB device found, idVendor=19d2, idProduct=0016
[    6.939277] usb 1-8.5: New USB device strings: Mfr=2, Product=1, SerialNumber=0
[    6.939281] usb 1-8.5: Product: ZTE CDMA Technologies MSM
[    6.939284] usb 1-8.5: Manufacturer: ZTE,Incorporated
[    6.939472] usb 1-8.5: configuration #1 chosen from 1 choice
[    6.940906] option 1-8.5:1.0: GSM modem (1-port) converter detected
[    6.941084] usb 1-8.5: GSM modem (1-port) converter now attached to ttyUSB0
[    6.941168] option 1-8.5:1.1: GSM modem (1-port) converter detected
[    6.941268] usb 1-8.5: GSM modem (1-port) converter now attached to ttyUSB1
[    6.941345] option 1-8.5:1.2: GSM modem (1-port) converter detected
[    6.941504] usb 1-8.5: GSM modem (1-port) converter now attached to ttyUSB2

Далее пишем правило udev в /etc/udev/rules.d/ :

SUBSYSTEM=="tty", KERNELS=="1-8.1:1.2", NAME="hub1/modem1"
SUBSYSTEM=="tty", KERNELS=="1-8.2:1.2", NAME="hub1/modem2"
С учётом udev исправляем конфигурационный файл:
[GSM1]
device = hub1/modem1
queues = GSM1
init = AT+CPMS="SM","SM","SM"
incoming = yes
check_memory_method = 31

[GSM2]
device = hub1/modem2
queues = GSM2
init = AT+CPMS="SM","SM","SM"
incoming = yes
check_memory_method = 31
 
 Моя статья была написана основываясь на следующих ресурсах: собственно сайт разработчика smstools, через поиск HOWTO SMSTOOL MYSQL нашёл статью с описанием установки PlaySMS. Собственно по этому я и выбрал PlaySMS. А ещё поискав со словом UMTS нашёл статью, где и нашёл нужный параметр init. Спасибо участникам форумов http://sysadmins.ru и http://forum.ubuntu.ru за оперативные ответы. Отдельное спасибо моему начальнику - помог с udev...

Февраль 2012