Внезапно выяснилось, что во FreeBSD нет демона gammu. Сама gammu присутствует, порт ведется, обновляется. Но daemon gammu-smsd отсутствует. А мне потребовалось отправлять SMS через старенький модем ZTE MF112, установленный в компьютер с ОС FreeBSD 12. Причем таким образом, что SMS эти поступали на FTP пользователя gammu этого же компьютера. Пришлось быстренько накалякать свой..
Установка самой gammu не представляет никаких сложностей, элементарно:
# Устанавливаем gammu: pkg install gammu |
После установки втыкаем модем, у меня это ZTE, в /dev сразу же появилось несколько новых устройств, в их числе те, что интересуют нас:
# Смотрим устройства модема. ls -al /dev/cuaU* crw-rw---- 1 uucp dialer 0x93 22 авг. 15:55 /dev/cuaU0.0 crw-rw---- 1 uucp dialer 0x94 22 авг. 15:49 /dev/cuaU0.0.init crw-rw---- 1 uucp dialer 0x95 22 авг. 15:49 /dev/cuaU0.0.lock crw-rw---- 1 uucp dialer 0x99 22 авг. 16:02 /dev/cuaU0.1 crw-rw---- 1 uucp dialer 0x9a 22 авг. 15:49 /dev/cuaU0.1.init crw-rw---- 1 uucp dialer 0x9b 22 авг. 15:49 /dev/cuaU0.1.lock crw-rw---- 1 uucp dialer 0x9f 23 авг. 00:10 /dev/cuaU0.2 crw-rw---- 1 uucp dialer 0xa0 22 авг. 15:49 /dev/cuaU0.2.init crw-rw---- 1 uucp dialer 0xa1 22 авг. 15:49 /dev/cuaU0.2.lock |
Видим, что у нас три устройства. Нам нужно найти то, через которое идет обмен данными. Пробуем подключиться через screen к устройствам модема..
# Пробуем подключиться через screen к устройствам модема. screen /dev/cuaU0.2 |
Поняв, что нужное нам устройство — /dev/cuaU0.2, сочиняем конфиг gammu, файл /etc/gamurc:
nano /etc/gamurc port = /dev/cuaU0.2 gammucoding = utf8 connection = fbus name = ZTE synchronizetime = no model = MF112 (MF112) connection = at9600 synchronizetime = yes logfile = logformat = notify use_locking = gammuloc = unicode |
Проверяем, сможет ли gammu использовать модем:
# Gammu говорит: все в порядке, вижу модем gammu --identify Устройство : /dev/cuaU0.2 Производитель : ZTE Модель : MF112 (MF112) Прошивка : BD_MF112V1.0.0B01 IMEI : 355434042361354 Номер SIM IMSI : 250996656699529 |
Пробуем отправить SMS на телефон, раз все так здорово:
# Пробуем отправить SMS на телефон через GAMMU: /usr/local/bin/gammu sendsms TEXT +910667XXXX -unicode -textutf8 "Горячий привет всем работникам связи!" |
SMS уходит, и, что важно — приходит адресату! 😉 Теперь нужно автоматизировать процесс отправки SMS, организовать простенький шлюз. Я решил написать собственный демон для отправки SMS. Для этого создадим файл нашего демона в каталоге /usr/local/etc/rc.d/ и сделаем его исполняемым. Открываем редактор nano /usr/local/etc/rc.d/gammud
И добавляем текст туда:
#!/bin/sh # # PROVIDE: gammud # REQUIRE: networking # KEYWORD: . /etc/rc.subr name="gammud" rcvar="gammud_enable" command="/usr/local/gammud/gammud" command_interpreter=/bin/sh gammud_user="root" pidfile="/var/run/${name}.pid" start_cmd="gammud_start" stop_cmd="gammud_stop" status_cmd="gammud_status" gammud_start() { /usr/sbin/daemon -P ${pidfile} -r -f -u $gammud_user $command } gammud_stop() { if [ -e "${pidfile}" ]; then kill -s TERM `cat ${pidfile}` else echo "${name} is not running" fi } gammud_status() { if [ -e "${pidfile}" ]; then echo "${name} is running as pid `cat ${pidfile}`" else echo "${name} is not running" fi } load_rc_config $name : ${gammud_enable:=no} run_rc_command "$1" |
Делаем его исполняемым:
chmod +x /usr/local/etc/rc.d/gammud
Добавляем демон в файл /etc/rc.conf, добавим туда строку gammud_enable=»YES»
Теперь пишем скрипт, который будет мониторить каталог с поступающими файлами SMS и отправляет сообщения абонентам. Для этого создаем каталог демона mkdir /usr/local/gammud и файл
/usr/local/gammud/gammud, в который помещаем следующий текст:
#!/bin/sh # homeDir="/home/gammu" outDir=$homeDir"/out" sentDir=$homeDir"/sent" inDir=$homeDir"/in" log="/var/log/gammu.log"; while true; do for f in "$outDir"/OUTA_*.txt; do sms_number=$(echo $f | /usr/local/bin/perl -n -e '/.*OUTA_([+\d]*)_[\d]*.txt/is && print "$1"' ); sms_text=$(cat "$f" | xargs ); if [ ! -z "$sms_number" ] && [ ! -z "$sms_number" ]; then echo $(date "+%Y-%m-%d %H:%M:%S" ) " $f $sms_number $sms_text" >> $log /usr/local/bin/gammu sendsms TEXT $sms_number -unicode -textutf8 "$sms_text" | xargs >> $log /bin/mv $f $sentDir fi done sleep 10 done |
Делаем файл исполняемым, cmod +x /usr/local/gammud/gammud Практически готово. Осталось только добавить пользователя gammu командой adduser и создать необходимые директории для работы демона. Выполняем следующие команды:
# Добавим пользователя в систему adduser # Создадим каталоги для получения/отправки SMS # Каталог для исходящих SMS mkdir /home/gammu/out # Каталог для отправленных SMS mkdir /home/gammu/sent mkdir /home/gammu/in |
Теперь запускаем daemon:
# Run daemon service gammud start # Check daemon status service gammud status gammud is running as pid 1261 |
Все в порядке, демон работает..Теперь кладем в каталог исходящих сообщений специально сформированный файл, например: nano /home/gammu/out/OUTA_+7910667XXXX_42221.txt. В имени файла указываем номер телефона, это +7910667XXXX, а 42221 — ID SMS, его можно придумать от балды. Я через него веду учёт отправленных SMS. Внутри файла пишем текст нашего сообщения. Например: «Привет, всё хорошо, работает gammu daemon». Через некоторое время файл исчезнет из каталога out и будет перемещен в каталог sent. При этом на телефон +7910667XXXX поступит сообщение.
Если сообщение отправляется, приходит абоненту, то на этом всё. Если нет, то смотрим логи нашего демона, которые находятся в /var/log/gammu.log. Могу еще добавить, что сообщения исходящие можно класть в каталог out по FTP, SSH, HTTP и другими способами, которых десятки. Есть даже mail2sms — конвертер писем в SMS.
Конечно же, написанный демон не совершенен, например — он не умеет читать входящие SMS, но это неплохая заготовка для думающих людей, которая позволит сделать то, что нужно добавлением нескольких строк в код скрипта. Кроме того, во FreeBSD имеется smstools, который умеет это всё, и даже больше. Но мне было быстрее сделать самому. Всем спасибо за внимание, используйте подручные средства для оповещений пользователей ваших сайтов.