Asterisk. Отправка и прием факсов

Всем привет. Сегодня я хочу написать заметку о том, как наладить отправку/прием факсов с помощью программной АТС Asterisk (физических факсов в наличии нет). Итак.

Дано:
1. Есть организация, занимающаяся скажем продажами (на самом деле чем угодно, потому что факсы используются много где). В этой организации есть пользователи, которые иногда/часто отпрвляют/принимают факсимильные сообщения.
2. Также имеется Asterisk, с подключенными городскими линиями (по SIP или через какой либо VOIP шлюз — не важно. Главное что эти пиры прописаны в sip.conf).

Задача:
Настроить Asterisk таким образом, что бы каждый пользователь мог принять/отправить факсимильное сообщение нажав определенную комбинацию клавиш на телефоне.

Решение:
Всё описанное работает на asterisk 1.8.27.0. Факсы отправленные мной принимаются без проблем на факсах типа МФУ и на обычных аппаратах, находящихся например в таможне. Наша АТС должна быть собрана/либо установлен модуль app_fax.so. В этот модуль входят две команды SendFAX и ReceiveFAX, их и будем использовать.

Файл sip.conf

[sipnet5]
type = friend
username = 004ххххххххххх
secret = ххххххххххххх
allerid = "ххххххххххххх/sipnet.ru"
host = 212.53.40.40
port = 5060
nat = yes
fromuser = ххххххххххххх
fromdomain = sipnet.ru
insecure=invite
context = incoming_calls
disallow = all
;allow = g729
;allow = ulaw
allow = alaw
allow = gsm
allow = g723
allow = g723.1

Как видите это кусок моего файла sip.conf. Здесь описан пир, который зарегистрирован на sipnet.ru. С него и на него я/мне будут звонить и я буду отправлять/принимать факсы.
allow = alaw — предпочитаемы кодек. Именно аlaw, т.к. он является «родным» кодеком факсов (будет работать как на факсах в виде МФУ так и на «железных» аппаратах).

Так же надо прописать в sip.conf служебный номер например «5555». На этот номер мы будем переводить звонок, что бы принять факс. Сделано это для того, что бы явно задать набор используемых кодеков (здесь кодек один — alaw).

[5555]
type = friend
host = 192.168.4.1
port = 5060
username = 5555
secret = ххххххххххххх
qualify = yes
videosupport = yes
nat = yes
context = office-1
host = dynamic
insecure=port,invite
dtmfmode = rfc2833
disallow = all
allow = alaw
call-limit = 0
callgroup = 1
pickupgroup = 1

Далее. Мы хотим что бы отправка/прием факса происходили при нажатии некой комбинации клавиш. Пусть это будет комбинация *3 для отправки и *4 для приема факса.

Для этого добавляем в файл features.conf в раздел [applicationmap] следующее:

[applicationmap]

fax_rec => *4,callee,Goto(office-1,5555,1)
fax_send => *3,callee,Macro(fax)

Как видим, при нажатии *3 запускается макрос fax, а при нажатии *4 происходит переход в контекст office-1, экстеншн 5555.

Файл extensions.conf:

exten => _92XXXXXX,1,Set(DYNAMIC_FEATURES=fax_rec#fax_send)
exten => _92XXXXXX,n,dial(sip/sipnet5/8863${EXTEN:1},,wWtT)

Здесь мы устанавливаем значение переменной DYNAMIC_FEATURES=fax_rec#fax_send.
fax_rec#fax_send — перечисление тех «программ» и комбинаций, которые можно запустить с этого номера, скажем так. Если значение переменной не установить, то АТС не отреагирует на комбинации *3 и *4, совсем.
Далее идет шаблон набора номера по г. Ростов-на-Дону. 92932214 (номер взят от балды).

Алгоритм отправки следующий:
0. Пользователь конвертирует текстовый файл/документ (любым способом) в формат PDF и копирует его в папку /var/spool/asterisk/fax.
1. Пользователь набирает номер 92932214.
2. АТС звонит 88632932214 — Ростов-на-дону.
3. Снимают трубку, мы говорим «примите факс», нам отвечают «стартую»
4. Мы ждем пока в трубке затрещит и жмем *3.

Теперь сам макрос отправки факса:

[macro-fax]
exten => s,1,answer()
exten => s,n,NoOp(************** SENDING FAX... *****************)
exten => s,n,System(/usr/bin/gs -dSAFER -dBATCH -dQUIET -sDEVICE=tiffg3 -sPAPERSIZE=a4 -r204x196 -dNOPAUSE -sOutputFile=/var/spool/asterisk/fax/fax.tiff /var/spool/asterisk/fax/fax.pdf)
exten => s,n,Set(LOCALSTATIONID=+78632204352)
exten => s,n,Set(LOCALHEADERINFO="OOO Roga i Kopita")
exten => s,n,SendFAX(/var/spool/asterisk/fax/fax.tiff)
exten => s,n,Hangup()

С помошью, /usr/bin/gs мы конвертируем файл PDF в TIFF(формат для отправки факсов). LOCALSTATIONID — переменая, где задаем номер с которого мы отправляем факс.
LOCALHEADERINFO — указываем название организации. Подробнее об этих переменных прочитать можно в документации к Asterisk.
Все настройки просты. Их можно усложнять по вашему жеалнию.

Далее собственно отправляем факс и после отправки кладем трубку.

Прием факса. Это фрагмент файла, где прописаны действия для входящих звонков на наш sip номер (контекст incoming_calls).

exten => 0042081926,1,Set(DYNAMIC_FEATURES=fax_rec)

Значение переменной DYNAMIC_FEATURES должно быть установлено.

1. Нам звонят (наш номер скажем 2204352, он же прописан в sip.conf как sipnet5).
2. Мы снимаем трубку, разговариваем, потом нам говорят «примите факс», мы говорим «стартую».
3. Жмём *4.
4. Происходит переход к extension 5555 на первую позицию.

Кусок файла extensions.conf

exten => 5555,1,answer()
exten => 5555,n,Set(DYNAMIC_FEATURES=fax_rec)
exten => 5555,n,receivefax(/var/spool/asterisk/fax/sss.tif)
exten => 5555,n,System(/usr/bin/tiff2pdf /var/spool/asterisk/fax/sss.tif -o /var/spool/asterisk/fax/sss.pdf)
exten => 5555,n,System(rm -f /var/spool/asterisk/fax/sss.tif)
exten => 5555,n,hangup()

1. Отвечаем
2. принимаем факс
3. конвертируем из tiff в pdf.
4. удаляем tiff

Вроде всё. Если что-то забыл написать или что то непонятно — заранее извнияюсь. Если этот материал был полезен очень рад.
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 26

    +1
    Пассаж про то, что alaw является «родным кодеком факсов» — не совсем верен. Факс шпарит в аналоговом виде и никаким кодеком не пользуется, что очевидно.

    Здесь alaw или ulaw важны потому, что не осуществляют спектральной фильтрации звукового потока, а передают в чистом виде 8кГц 8 бит — именно поэтому (и также по теореме Найквиста-Котельникова), все факсовые писки-визги удается точно перевести в цифру и восстановить на другом конце.

    Это же относится и к передаче DTMF не внутри информационного потока, а внутри звукового (у вас именно так и настроено, dtmfmode = rfc2833)- только эти два кодека в состоянии это обеспечить. Остальные кодеки, которые вы перечислили, информационный поток исказят и обмен не состоится — их нужно отключить.
      0
      я имел в виду, что кодек алау родной для SIP аккаунта в плане факсов.
        +3
        Как только начали продавать телефонию сразу поняли что только T.38 и ничего другого.
          0
          Но с Квант-телекомом (Воронеж) завелось только с alaw, t38 не работает
          Поддержка говорит, скоро будут в тестовом режиме внедрять.
            0
            Логично. Если у провайдера нет T.38, то он и не заведется.
            Мы специально искали, а то 90% обращений были факсы. При видимой 100% работе сети разные факсы (старые панасоники и т.д.) работали 50 на 50.
          0
          Так вы ошибку с кодеками устранять будете? Если вашим скриптом воспользуются люди, у которых провайдер не предоставляет доступ с кодеками без компрессии (alaw, ulaw у него — выключены), у них ничего работать не будет.

          Как верно заметил Calc, «родным» способом для передачи факсов по IP является T.38, а не засовывание их в голосовой несжатый тракт.
            0
            какую ошибку?
              0
              Я жеж написал — факс (и DTMF) идет только потому, что у вас включен кодек без компрессии, но при этом в том же самом конфиге у вас разрешены кодеки с компрессией (gsm, g723), которые факс в жизни не пропустят.

              • либо отключите в конфиге любые кодеки, кроме alaw и напишите большими буквами в посте, что способ работает только в случае, когда провайдер умеет работать на кодеках без сжатия,
              • либо настройте работу правильно — с использованием протокола T.38
                0
                у меня только алау и включен. disallow = all
                ;allow = g729
                ;allow = ulaw
                allow = alaw
                  0
                  и потом… провайдеры разные. надо узнавать конкретно.
                    0
                    Вижу, на один конкретный номер с факсом у вас оставлен только alaw. Извините, читал мельком.

                    Это конечно же хорошо, но правильнее было бы использовать T.38. Осталось только написать, что если провайдер не работает по alaw/ulaw, ваш способ — не годится.
          0
          Правильно ли я понял, что легко возникают «гонки»? В случае если один пользователь принимает факс, а другой его отправляет? Ибо факсы принимаются и отправляются из одного каталога, а какого-либо разграничения на send/receive нет?
            0
            конечно разделить можно и нужно. у меня например у каждого СИП аккаунта свой факс. и факсы отправляются из своего каталога. имена факсов уникальные, ну и все настроено так что юзер отправит/примет только свой факс.
            но это требует доп. настройки
            0
            С Ростелекомом заведется? Сейчас стоит вента-факс и есть проблемы как при приеме так и при передаче.
              +1
              Если у ростелекома нет транзитного перекодирования(g729, 726 и т.д.) и держит alaw/ulaw — заведется
              Еще лучше, если у ростелекома есть T.38
                0
                кстати есть возможность попробовать на ростелекоме завести факс. у ростелекома номер городской по SIP
                0
                с ростелекомовским сипом через раз работает, по опыту. мы для факса линию медную оставили специально и на сервер завели через шлюз. так работает 100%
                  0
                  спасибо за инфу. хотя все равно конечно буду пробовать через SIP… мало ли вдруг у них стало стабильно с этим делом.
                +1
                Не могу это видеть:

                > receivefax(/var/spool/asterisk/fax/sss.tif)

                создайте хотя бы временную переменную, а то глаза режет:

                Set(tempfax=${STRFTIME(,,%C%y%m%d%H%M)})
                ReceiveFax(${FAXDEST}/${tempfax}.tif)

                Удачи.
                  0
                  да это заметка елки-палки. самое простое решение. сейчас например у меня у каждого юзера свой СИП аккаунт и только из этой папки отправляютися/принимаются факсы. и потом на джабер аккаунт юзера скидывается сообщение что мол отправлено туда то, столько-то страниц на такой то номер

                  а да и еще, приходящие факсы (что бы не путались когда какой пришел) — имя файля PDF в виде дата+время до секунды.PDF
                  0
                  Я не знаю, как у вас, а у нас через Сипнет факсы не ходят. Ну, то есть, не то чтобы совсем не ходят, но где-то 30/70, где 70 — отвал сессии с ошибкой.
                  Пробовал и Т.38, и alaw/ulaw, все едино.
                  Потом перешел на другого оператора, у которого Т.38 заявлено, и жизнь наладилась.
                  А факсы мы используем для взаимодействия с охраной БЦ, в котором сидим. XXI век, центр Москвы…
                    0
                    у меня СИПНЕТ и ходит все. отправка/прием
                      0
                      Сейчас попробовал — действительно, один факс проскочил. А давно Вы через них факсы шлете? Раньше (полгода назад) беда была полная…
                        +1
                        шлю факсы ну примерно… месяца 2-3. так вот где то…
                        причем отправляет/ принимает по 5-10 страниц спокойно. отправоек/приемов было где то штук 20-25. и (я могу ошибиться конечно), но 98% проходили нормально
                          +1
                          1) зависит от провайдера
                          2) зависит от провайдера клиента

                          Схема прохода сигнала может быть самая разнообразная:
                          SIP->T38->E1->T38->SIP //пройдет
                          SIP->ulaw->alaw->g729->SIP //не пройдет
                          SIP->T38->E1->alaw->SIP //высокий шанс, от буфферов/джиттеров завити, т.е качество связи
                          SIP->alaw->E1->T38->SIP //тоже самое
                          SIP->T38->E1->медь //пройдет
                          SIP->alaw->E1->медь //качество связи
                          и т.д.

                          Если где ошибся — меня поправят )
                            0
                            Везде в цепочке, где речь идет об alaw или ulaw, необходимо, чтобы RTP-пакеты почти не терялись. То есть если соединение с провайдером идет через Интернет без QoS и по alaw/ulaw, возможна нестабильность.

                  Only users with full accounts can post comments. Log in, please.