It_blog’s

Май 10, 2009

Автоответчик и приём факсов в ОС 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 Port DOS Linux I/O Port IRQ
First COM1 /dev/ttyS0 03F8 4
Second COM2 /dev/ttyS1 02F8 3
Third COM3 /dev/ttyS2 03E8 4
Fourth COM4 /dev/ttyS3 02E8 3

По скольку мой модем подключён к первому 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

Комментарии (10) »

  1. Редкий материал. Спасибо, добавил в закладки.

    Комментарий от www2 — Май 11, 2009 @ 9:04 дп

  2. Будет ли это все работать с Winmodem`ом:
    01:02.0 Communication controller: Conexant Systems, Inc. CX06834-11 HCF V.92 56k Data/Fax/Voice/Spkp Modem (rev 89)

    После установки драйверов с linmodems.org определился как /dev/ttySHCF0

    После команды

    /andrey# vm record -m -l ttySHCF0 -v standard.rmd
    vm: recording voice file standard.rmd
    Recording message…
    Recording complete.

    файл standard.rmd имеет размер 0 байт

    В чем может быть причина?

    И еще вопрос:
    1) Записать с помощью микрофона
    «Подключаем микрофон, даём команду и говорим:»
    Подключать в разъем MIC звуковой карты или MIC модема?

    Комментарий от Andrey — Май 16, 2009 @ 10:58 пп

    • Если модем проставился и работает почему бы и нет.

      Наверное в звуковую карту.
      Я просто скачал звуковой файл из интернета и сконвертировал его.
      Запиши сообщение в wav файл и сконвертируй его.

      standard.rmd – Это файл приветствия автоответчика.
      Позвони себе домой и проверь автоответчик.
      Без файла приветствия просто модем сигнал «ПИК» в линию подаст и начнёт писать сообщение.
      Если что, следи за логами программы.

      Комментарий от itbg — Май 16, 2009 @ 11:10 пп

  3. Такой вопрос:

    В /etc/inittab пишим

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

    В конце пишу естественно ttySHCF0

    Но в Ubuntu нет inittab…
    Как запустить vgetty на ttyshcf0 при старте системы в Ubuntu?

    Комментарий от Andrey — Май 17, 2009 @ 3:08 пп

    • Вроде в Ubuntu отказались от использования inittab и перешли на систему upstart
      Лично я Ubuntu не использую.
      А без этой строчки автоответчик не работает ?

      Почитай ТУТ кое-какую информацию о upstart в Ubuntu

      Комментарий от itbg — Май 17, 2009 @ 8:12 пп

  4. Подзабил на внутренний PCI Winmodem. Достал Zyxel omni 56K EE для своих экспериментов.
    Задача: настроить для начала автоответчик, затем по возможности, отправку и прием факсов.
    Пока что использую Ubuntu. Но выбор дистрибутива не критичен. Какие подводные камни ожидают?
    Пока что с upstart`ом разбираюсь..

    Комментарий от Andrey — Май 18, 2009 @ 5:08 пп

  5. Итак, для Ubuntu-like дистрибутивов:

    В каталоге /etc/event.d/ создал файл ttyS0
    Его содержимое:

    start on stopped rc2
    start on stopped rc3
    start on stopped rc4
    start on stopped rc5

    stop on runlevel 0
    stop on runlevel 1
    stop on runlevel 6

    respawn
    exec /usr/sbin/vgetty ttyS0

    Теперь автоответчик заработал по инструкции.

    Комментарий от Andrey — Май 31, 2009 @ 7:18 пп

    • Поздравляю!
      Теперь и Ты можешь наслаждаться прелестями старой техники :)

      Комментарий от itbg — Май 31, 2009 @ 8:28 пп

  6. Теперь с факсами поэкспериментировать желание появилось…
    Hylafax ?

    И еще. Возможность отправки факсов- это доп. услуга на АТС или ничего дополнительно подключать не нужно?

    Комментарий от Andrey — Май 31, 2009 @ 9:06 пп

    • Приём и отправку факсов осуществляет модем.
      Ничего дополнительного включать не нужно.

      Я факсами не пользуюсь, поэтому этих настроек не касался.

      Комментарий от itbg — Май 31, 2009 @ 10:20 пп


RSS-лента комментариев к этой записи. URI для обратной ссылки

Оставить комментарий

Блог на WordPress.com.