Автоответчик и приём факсов в ОС Linux с помощью старого Voice модема

Всем привет!

Завалилось у меня тут несколько Voice модемов.
Два Zyxel Omni 56k com-port и один Acorp Sprinter 56k USB (софт модем)

Я уже про них давно забыл, со времён когда ещё сидел в интернете по Dial UP
Но на этой недели их спокойная и безмятежная жизнь на полке закончилась.

Мне пришла в голову очередная идея:
Сделать автоответчик для дома.

Первое, с чего я решил начать, так это подключение самого модема к серверу.
Для начала решил попробывать завести Soft modem Acorp sprinter 56k USB
Пересобрал ядро, и принялся искать драйвера.
Для начала заглянул на страничку www.linmodems.org и скачал там скрипт scanModem
Он сам определить Ваш модем и предложит скачать подходящий драйвер.
Мне же он предложил подгрузить модуль ядра и попробывать снова.
Пересобирать ядро и возиться с драйверами мне было неохота и я решил поставить Zyxel Omni 56k с COM-port'ом

После подсоединения модема к серверу у меня возник вопрос:
Как же проверить его работоспособность?

Погуглив я наткнулся на программу minicom
Она позволяет Вам общаться с устройствами через COM port
Но почему-то она так и не смогла увидеть мой модем.
Тогда я решил послать AT команды напрямую через COM port
Делается это так:

Для начала ознакомимся с таблицей нумерации COM портов





































Serial PortDOSLinuxI/O PortIRQ
FirstCOM1/dev/ttyS003F84
SecondCOM2/dev/ttyS102F83
ThirdCOM3/dev/ttyS203E84
FourthCOM4/dev/ttyS302E83

По скольку мой модем подключён к первому COM порту я послал на него следущую команду:
echo atdt3333333 > /dev/ttyS0

Эта команда говорит модему сделать звонок на номер 3333333

Услышав щелчок модема я успокоился и понял что модем работает и воспринимает команды.
Но что-то он ни как не хотел работать.

После 2-х часов ковыряний выяснилось что IRQ 4 (прерывание) на котором он работает был занят.
Пришлось подключать сервер к монитору и в BIOS выключить LPT порт.
Как альтернативное решение:  можно было просто сменить IRQ в BIOS.

После этого я установил программы wvdial и с помощью неё окончательно убедился в работоспособности модема.

Следующим шагом был шаг:  Выбор ПО

Поскольку это была лишь идея, и я да же не знал, есть-ли такая программа вообще, то я решил спросить у народа.

К сожалению в моём Twitter'e такую программу мне никто не подсказал и пришлось искать её самому.
Немного погуглив я сначала наткнулся на программу vgetty и на её потомка mgetty
Быстренько нашёл её в своём репозитории и запустил процесс установки:
USE="fax" emerge mgetty

Спустя некоторое время всё скомпилировалось и я перешёл непосредственно к настройке программы.
Правим /etc/mgetty/voice.conf

port ttyS0 -- Последовательный порт
rings 3 -- Три звонка и поднимается трубка
answer_mode voice:fax:data -- Порядок ответа голос:факс:данные
rec_max_len 30 -- Задаем максимальную длину сообщения у меня 30 секунд.
rec_min_len 2 -- Минимальная длинна сообщения.
port_speed 115200 -- Устанавливаем скорость порта.
backup_message standard.rmd -- Файл приветственного сообщения.
phone_owner root -- Владелец файлов сообщений (root).
phone_group voice -- Группа файлов сообщений (voice).
phone_mode 0660 - Права для файлов сообщений (-rw--rw---).

В /etc/inittab пишим

# starting vgetty
S1:2345:respawn:/usr/sbin/vgetty ttyS0

В принципе уже всё готово.

Осталось записать файл приветствия для автоответчика.
Это можно сделать двумя способами:

1) Записать с помощью микрофона

Подключаем микрофон, даём команду и говорим:
sudo /usr/bin/vm record -m -l ttyS0 -v standard.rmd

Результат можно прослушать так:
rmdtopvf -b standard.rmd | pvftowav > temp.wav && play temp.wav

2) Скачать запись автоответчика в интернете и сконвертировать в формат rmd для своего модема.
Я пошёл именно таким путём

a) Конвертация wav или mp3 файла для последующей обработки

Для этого нам потребуется дополнительная программа - sox

Допустим мы скачали сообщение для автоответчика - message.wav
Тогда конвертация будет выглядеть так:
sox message.wav -r 9600 -c 1 message_new.wav

Если Вы используете mp3 файл, то добавьте ключ -t mp3
sox -t mp3 message.mp3 -r 9600 -c 1 message_new.wav

б) Конвертация wav файла в pvf файл
wavtopvf message_new.wav message_new.pvf

в) Конвертация pvf файла в rmd файл для Вашего типа модема

Для этого нам потребуется утилита pvftormd

Даём следующую команду pvftormd -L и выбираем свой или похожий модем из списка.

Затем выполняем конвертацию.
Конкретно для моего модема команда выглядит так:
pvftormd ZyXEL_Omni56K 4 message_new.pvf standard.rmd

г) Файл standard.rmd помещаем в папку с сообщениями.
По умолчанию она находится тут:
/var/spool/voice/messages/

После этого Вы уже можете звонить себе и проверять результат.

Остался только один интересный вопрос:
Как забирать оставленные сообщения?

Существует несколько способов:

1) Сделать сетевую папку
2) Заходить на сервер и слушать их от туда через скрипт
3) Установить Flash плеер на сервер и через браузер прослушивать сообщения (Придумал сам)

Скрипты для конвертации сообщений в WAV или MP3 я выложу походу описания.

Рассмотрим каждый из них:

1) Тут всё просто, ставите Samba или NFS сервер и открываете доступ в сеть

2) Скрипты, я их честно не проверял, а просто скопировал.

Прослушивание сообщений:
Copy SourceCopy HTML

  1. #!/bin/bash

  2. #--------------------------------

  3. MINC=/var/spool/voice/incoming/

  4. MDIR=/home/$USER/msg

  5. #--------------------------------

  6. clear

  7. case "$1" in

  8. -h|--h|--he|--hel|--help)

  9. echo "
    Copyringts (c) Andrey G-v 2007

    Options:
    -h, --help     Показать справку и выйти
    -v, --version  Показать информацию о версии

    "

  10. exit 1

  11. ;;

  12. -v|--v|--ve|--ver|--vers|--versi|--versio|--version)

  13. echo "ubdate 0.1 "

  14. exit 1

  15. ;;

  16. -*)

  17. echo 1>&2 "$0: Unknown \`$1' option"

  18. echo 1>&2 "Try \`$0 --help' for more information"

  19. exit 1

  20. ;;

  21. esac

  22. clear

  23. echo -en "       \33[33m
    ==============================
    1) Новые сообщения:
    2) Слушать старьё:
    3) Выход:
    ==============================
    Выберите действие :# \33[0m"

  24. read num

  25. case $num in

  26. 1)

  27. if !( [ -d $MDIR ] ); then

  28. mkdir $MDIR ;

  29. fi

  30. cd $MINC

  31. for i in `ls -x1 *.[Rr][Mm][Dd] 2> /dev/null`; do

  32. MSDATE=$(date -r $i +Msg-%d%m%y-%H%M%S.wav)

  33. rmdtopvf -b $i | pvftowav > $MDIR/$MSDATE

  34. done

  35. cd $MDIR

  36. for i in `ls -x1 *.[Ww][Aa][Vv] 2> /dev/null`; do

  37. echo "Играю "$i"..."

  38. play $i

  39. done

  40. rm -f $MINC/*.[Rr][Mm][Dd]

  41. ;;

  42. 2)

  43. clear

  44. cd $MDIR

  45. LSDIR=$(ls -x1 *.[Ww][Aa][Vv] 2> /dev/null)

  46. echo -en "       \33[33m
    ==============================
    $LSDIR
    ==============================
    Имя фаила :# \33[0m"

  47. read PLFILE

  48. #ls -x1 *.[Ww][Aa][Vv]

  49. echo "Играю "$PLFILE"..."

  50. play $PLFILE

  51. ;;

  52. 3)

  53. clear

  54. echo "Не туда попал? :)"

  55. sleep 3

  56. ;;

  57. *)

  58. clear

  59. echo "ОШИБКА! НЕ ВЕРНЫЙ АРГУМЕНТ! :("

  60. exit 1

  61. ;;

  62. esac



Скрипт для уведомления о новых сообщениях на Ваш e-mail :
Copy SourceCopy HTML

  1. #!/bin/bash

  2. MESDIR=`ls /var/spool/voice/incoming/*.[Rr][Mm][Dd] 2> /dev/null | wc -l`

  3. if [ $MESDIR != "0" ]; then

  4. echo Для Вас есть $MESDIR сообщение\(ний\). | mail -s "Есть сообщения на автоответчике" $USER # Имя пользователя

  5. fi



Настраиваем его запуск через Cron и получаем уведомления.

3) Прослушиваем сообщения через Flash плеер прямо в браузере

Для начала нам нужно скачать подходящий Flash плеер.
Я остановил свой выбор на ЭТОМ
Его самый главный плюс - он автоматически генерирует playlist из mp3 файлов в папке.

Скачиваем, распаковываем и настраиваем свой WEB сервер.
Сам же плеер настраивать практически не нужно.
Я просто скопировал его себе в htdocs, удалил папку mp3
Затем сделал символическую ссылку папки /var/spool/voice/incoming в папку с плеером, и переименовал ссылку в mp3

Ещё пришлось дать права на исполнения на некоторые папки.

Затем я написал скрипт, для перегона файлов автоответчика rmd в mp3 формат:
Copy SourceCopy HTML

  1. #!/bin/sh

  2. find /var/spool/voice/incoming -type f -mtime +30 -delete #удаляю файлы старше 30 дней

  3. cd /var/spool/voice/incoming

  4. for i in `ls -x1 *.[RrWw][MmAa][DdVv] 2> /dev/null`; do

  5. dm_date=$(date -r $i +Msg-%d%m%y-%H%M%S)

  6. /usr/bin/rmdtopvf -b $i _tmp.pvf > /dev/null 2>&1

  7. /usr/bin/pvftowav _tmp.pvf $dm_date.wav > /dev/null 2>&1

  8. /usr/bin/sox -t wav $dm_date.wav -t mp3 $dm_date.mp3 > /dev/null 2>&1

  9. done

  10. rm -f *.[Pp][Vv][Ff]

  11. rm -f *.[Rr][Mm][Dd]

  12. rm -f *.[Ww][Aa][Vv]



Его запуск я добавил в Cron с интервалом в 5 минут.

А если открыть WEB сервер в интернет, то можно слушать сообщения где угодно и когда угодно.
Кому интересно, тот может поднять свой Dial IN сервер и стать провайдером модемного интернета :)

Источники:

Настройка телефонного автоответчика под Linux
Настройка vgetty для автоответчика+PPP
blog comments powered by Disqus