суббота, 12 января 2013 г.


Как сэкономить и заработать с помощью Asterisk

Sergey Jaremchuk feat. Andrey Matveev
Кризис заставляет нас потуже затянуть пояса и по-новому взглянуть на многие вещи. Ситуация в IT-сфере несколько сходная: чтобы сэкономить, организации перепланируют использование имеющихся ресурсов, делая ставку на объединение функциональных возможностей, серверов и сетей. В этой статье рассмотрим, как с помощью IP-PBX Asterisk можно сократить расходы компании на телефонную связь и даже немного заработать самому.
Содержание:
  1. Тонкое сопряжение
  2. Подключаемся к SIP провайдеру
  3. Настраиваем Callback
  4. Простенький биллинг
  5. Экономия на телефонах
  6. Экономим на факс-сервере
  7. Эаключение
  8. Врезка: Продаю Украину, Белоруссию, Казахстан
  9. Врезка: Лимитируем пустые разговоры
  10. Врезка: Управление компьютером при помощи Asterisk
  11. Боковые выносы

Тонкое сопряжение
Средняя и тем более крупная организация часто имеет свои филиалы в разных городах или странах. Если в удаленных офисах есть возможность воздвигнуть IP-PBX сервера на базе Asterisk, то почему бы не объединить их в единую сеть. Этим мы убьем сразу несколько зайцев: сведем на нет стоимость звонков между «точками», обеспечим безопасное голосовое соединение (путем применения IPsec шифрования к потоку голосовых данных), создадим все условия для проведения аудио- и видеоконференций, а также получим все дополнительные телефонные свойства, присущие VoIP: запись телефонных разговоров, IVR (система предварительно записанных голосовых сообщений, выполняющая функцию маршрутизации звонков внутри call-центра), альтернативный GSM-роуминг и т.д. Продемонстрировав начальству выгоду от внедрения подобного решения, можно в корне изменить отношение к IT-подразделению (сотрудников которого зачастую считают вечными нахлебниками) и получить щедрые премиальные.
Итак, у нас есть два сервера Asterisk. Давай организуем их совместную работу, объединив их диалпланы и увеличив соответственно возможности. Подружить два Asterisk’a можно по протоколу установления сессии SIP (Session Initiation Protocol, RFC 3263), либо по IAX2 (Inter-Asterisk eXchange protocol, протокол обмена VoIP данными между IP-PBX Asterisk, RFC 5456). Мы выберем второй вариант, так как IAX2 лучше адаптирован для работы из-за NAT, использует единственный порт (4569/UDP) для передачи сигнальных данных и медиапотока (т.е. меньше проблем с настройкой файеров на шлюзах, меньше проблем с провами, которые любят резать подключения по нестандартным портам) и поддерживает функцию объединения каналов (эта способность позволяет отправлять голосовые данные множества вызовов под одним заголовком. Если между двумя офисами одновременно выполняются десятки звонков, выигрыш в пропускной способности за счет использования транка может быть значительным.) Помимо всего перечисленного, по сравнению с протоколом SIP, IAX2 позволяет прилично экономить сетевой трафик, так как сигнальная информация передается в битовых полях, а не текстом.
Все необходимые настройки производятся в файле iax.conf. Один из серверов будет подключаться к другому для оперативного обмена данными.
$ sudo nano /etc/asterisk/iax.conf
; Подключаемся ко второму Asterisk
[general]
;register => :@<имя или IP адрес>
register => userB:password@synack.ru
; Данные для подключения
[synack]
type=friend
user=username
secret=password
host=synack.ru
context=synack
Теперь необходимо добавить в диалплан описание нового маршрута:
$ sudo nano /etc/asterisk/extensions.conf
[synack]
exten => _5XXX,1,NoOp()
exten => _5XXX,n,Dial(IAX2/synack/${EXTEN})
exten => _5XXX,n,Hangup()
Вот, собственно, и все настройки на первом сервере.
На другой стороне описание в iax.conf и настройки практически аналогичны. Учитывая, что этот сервер принимает подключение, убираем параметр register.
$ sudo nano /etc/asterisk/iax.conf
[office]
type=friend
user=user
secret=password
host=dynamic
; В целях безопасности разрешим подключения только с нужного IP-адреса
deny=0.0.0.0/0
permit=11.22.33.44
context=office
А в конфиге extensions.conf задаем второй пул номеров:
exten => _8XXX,1,Dial(IAX2/office/${EXTEN})
Если в подчинении несколько IP-PBX Asterisk, добавляем их так же, как и первый сервер.
Необходимый минимум для подключения выполнен. Далее наращиваем эту схему, изменяя диалплан в зависимости от ситуации и потребностей. Например, в экстеншенах Asterisk можно указывать время действия правила. Так, чтобы звонить в удаленный офис можно было только в рабочее время, используем такую конструкцию:
exten => 3000,1,GotoIfTime(9:00-18:00|mon-fri|*|*?OUT,s,1)
Вариантов действительно много, экспериментируй.

Подключаемся к SIP провайдеру
За последние несколько лет SIP провайдеров, предлагающих свои услуги по весьма демократичным ценам, наплодилось предостаточно. Используя их возможности, можно существенно сэкономить на междугородных и международных звонках. Для Asterisk нет принципиальной разницы, подключаться к одному или нескольким SIP провайдерам сразу, но для нас второй вариант подключения выглядит предпочтительнее, поскольку в диалплане можно предписать ранжирование операторов связи по каждому направлению на основе критерия цена-качество. Таким образом можно звонить по разным направлениям, исходя из требуемого качества и установленных провайдерами расценок. Кстати, именно на этом подходе основана работа китов современного SIP’остроения вроде sipnet.ru.
Принцип настройки подключения и создания диалплана практически полностью совпадает с IAX2. Все установки для SIP производятся в файле sip.conf.
$ sudo nano /etc/asterisk/sip.conf
[general]
...
useragent=SipPhone
register=myusername:mypassword@sipnet.ru/2223322
; Используемые кодеки
disallow=all
allow=ulaw
allow=alaw
allow=gsm

[sipnet]
type=friend
username=myusername
secret=mypassword
callerid=sipnet
host=sipnet.ru
nat=yes
fromuser=sipnet
fromdomain=sipnet.ru
dtmfmode=rfc2833
insecure=invite
context=sipnet
Этот конфиг можно взять за основу для подключения к любому SIP серверу. Конечно, разные провайдеры могут использовать специфические установки, поэтому придется прошерстить раздел FAQ на офсайте поставщика сервиса в поисках примеров, нюансов и советов по обходу подводных камней.
Далее разбираемся с входящими и исходящими звонками:
$ sudo nano /etc/asterisk/extensions.conf
[sipnet-in]
exten => 101,1,Set(CALLERID(name)="Sipnet call")
exten => 101,n,Dial(SIP/101,20)
exten => 101,n,Playback(vm-nobodyavail)
exten => 101,n,Voicemail(101)
exten => 101,n,Hangup()

[sipnet-out-moscow]
exten => _749[59]ZXXXXXX,1,Set(CALLERID(all)="SipPhone" <2223322>)
exten => _749[59]ZXXXXXX,n,Dial(SIP/sipnet/${EXTEN},20)
exten => _749[59]ZXXXXXX,n,Hangup()
Увеличить
Рис. 1. Соединение двух серверов Asterisk по протоколу SIP

Настраиваем Callback
Сегодня не редкость, когда менеджеры работают далеко за пределами офиса, связываясь при необходимости с руководством или работниками по мобильному телефону. В итоге в месяц за переговоры приходится платить достаточно приличную сумму. А если таких работников в офисе не один десяток? Затраты на переговоры будут весьма значительны. Но выход есть: приобрести безлимитный пакет и при поступлении звонка перезванивать вызывающему, который далее уже сам выбирает, что ему нужно — звонить кому-нибудь в офисе, делать еще один исходящий звонок, например междугородний, оставить или прослушать голосовое сообщение и так далее. При помощи Asterisk организовать это достаточно просто, причем существует сразу несколько вариантов. Самый простой способ — создание в каталоге /var/lib/asterisk/outgoing специального .call файла, который подхватывается и обрабатывается Asterisk на лету. Создаем в extensions.conf описание нового диалплана:
$ sudo nano /etc/asterisk/extensions.conf
[IncomingCall]
; Проверяем номер звонящего, если совпадает, запускаем скрипт
exten => s,1,GotoIf($["${CALLERID(num)}" = "9151234567"]?callback)
; Аналогично описываются и остальные номера, на которые должен осуществляться перезвон
; Если номер в списке отсутствует, обрабатываем вызов обычным образом
exten => s,n,Goto(normal)
exten => s,n(callback),System(/etc/asterisk/scripts/callback 8${CALLERID(num)} &)
exten => s,n,Hangup()
exten => s,n(normal)
; Экстеншен, с которого будет производиться звонок
[InternalCall]
exten => 123,1,Dial(SIP/123)
exten => 123,n,Hangup()
exten => _89X.,1,Dial(SIP/${EXTEN}@GW_IP)
exten => _89X.,n,Hangup()
Теперь собственно скрипт, который создаст нужный call файл. Напомним, что используя директиву System, можно создать файл на лету:
exten => h,6,System(echo Channel: SIP/${CALLERID(num)} > /tmp/${CALLERID(num)}.call)
Но отдельный скрипт нагляднее и проще редактируется.
$ sudo nano /etc/asterisk/scripts/callback
#!/bin/sh
sleep 5
cat << EOF > /tmp/$NUMBER.call
# Получаем номер, переданный в качестве параметра
NUMBER=$1
# Канал, используемый для исходящего звонка
echo "Channel: SIP/$NUMBER@InternalCall
# Количество повторных попыток (т.е. при значении 1 звонить будет 2 раза)
MaxRetries: 1
# Время в секундах, через которое будет произведена вторая попытка
RetryTime: 30
# Ожидание ответа на вызов
WaitTime: 30
Context: InternalCall # Контекст
Extension: 777 # Экстеншен
Priority: 1
AlwaysDelete: Yes" >/var/spool/asterisk/tmp/$NUMBER
EOF # Закончили формировать файл
# Теперь копируем файл
chown asterisk:asterisk /tmp/$NUMBER.call
mv /tmp/$NUMBER.call /var/spool/asterisk/outgoing/
Принцип работы довольно прост: абонент звонит, Asterisk определяет принадлежность к списку и в случае совпадения создает call скрипт, который затем используется для осуществления исходящего звонка.
Создавать файл сразу в каталоге outgoing нельзя, если Asterisk его успеет прочитать до того, как он будет полностью записан, произойдет сбой в работе скрипта. Поэтому рекомендуется в outgoing перемещать уже готовый файл. Далее развиваем идею, подключая нужные функции.
Напомним, что Callback можно организовать и средствами web, когда пользователь набирает свой номер телефона в специальном поле браузера, а call файл создает специальный CGI скрипт. Такая схема будет полезной и в службе поддержки. Пользователи не очень любят тратить свои кровные на переговоры с подобными сервисами, здесь Callback будет очень кстати. В таком варианте в экстеншен лучше жестко забить номер (например, службы поддержки или менеджера), с которым Asterisk будет соединять удаленного абонента. Для этого достаточно добавить в «InternalCall» вызов нужного номера.
Немного усложнив описанные выше скрипты, можно разрешить подключаться любому пользователю по карточке с PIN кодом для осуществления платного звонка в выбранном направлении. В этом случае после перезвона абоненту Asterisk запрашивает PIN код, извлекает из БД текущий баланс и выводит его звонившему (о биллинговой системе мы поговорим чуть ниже). Далее абонент указывает номер, на который он хотел бы позвонить.
А вообще, событие (триггер) для Сallback может генерировать SMS сообщение, e-mail, сигнал от системы видеонаблюдения (за подробностями обращайся к статье «Звездное попурри», опубликованной в апрельском номере ][ за 2009 год), событие на сервере (допустим, пропадание питания в электросети) и так далее. Например, при недостатке средств на счету автоматически генерируется .call файл, обеспечивающий дозвон до клиента с напоминанием о необходимости пополнения счета.
Увеличить
Рис. 2. Настройка Callback в дистрибутиве Elastix

Простенький биллинг
Если ты решил немного подзаработать с Asterisk, то без системы учета звонков не обойтись. В интернете можно найти не одно готовое решение вроде A2billingAsterisellastCDRviewAstBill, но в 9 случаях из 10 его придется адаптировать под конкретные условия. Как бы странно это ни прозвучало, но зачастую проще написать биллинговую систему или учет разговоров самому, тем более что в поставке Asterisk все для этого имеется.
Увеличить
Рис. 3. A2billing предоставляет широкие возможности по учету звонков
Asterisk сохраняет данные о каждом вызове в CDR файл (Call Detail Record). Такие записи содержат — CallerID, направление, канал, время начала вызова, ответа абонента и окончания, продолжительность переговоров, результат и некоторые другие сведения. По умолчанию Asterisk генерирует отчет в CSV файл, но очень просто подключить вывод CDR в базы MySQL, PostgreSQL, unixODBC, RADIUS. Если ранее этого не было сделано, то для импорта записей из CSV файла в MySQL используй скрипт, который найдешь на прилагаемом к журналу диске (сам скрипт размещен по адресу www.voip-info.org/wiki/view/Asterisk+CDR+csv+mysql+import).
Для поддержки MySQL Asterisk нужно собрать с поддержкой этой СУБД. По лицензионным соображениям соответствующий модуль вынесли в AddOns. При установке Asterisk из репозитария своего дистрибутива достаточно добавить в систему нужный пакет. В Debian/Ubuntu команда для этого проста:
$ sudo apt-get install asterisk-mysql
Затем создаем базу данных и наполняем ее таблицами:
$ mysql -uroot -p
mysql> CREATE DATABASE asterisk;
mysql> GRANT ALL PRIVILEGES ON asterisk.* TO asteriskuser@localhost \
    IDENTIFIED BY 'astpassw';
Пример для создания таблиц БД можно найти в документации Asterisk в файле cdr_mysql.txt (в Ubuntu он лежит в/usr/share/doc/asterisk-mysql, также ты найдешь его на диске).
Подключаем вывод CDR в MySQL, указав параметры подключения к серверу и базе данных «asterisk»:
$ sudo nano /etc/asterisk/cdr_mysql.conf
[global]
hostname=localhost
dbname=asterisk
table=cdr
password=astpassw
user=asteriskcdruser
port=3306
sock=/tmp/mysql.sock
Теперь загрузим нужный модуль через консоль Asterisk:
$ asterisk -r
CLI> module load cdr_addon_mysql.so
В случае правильных настроек увидим запись о загрузке модуля и подключении к БД, просмотреть его состояние можно при помощи команды «cdr mysql status». Чтобы модуль загружался автоматически после рестарта Asterisk, добавим в/etc/asterisk/modules.conf строку:
load = cdr_addon_mysql.so
Все, теперь ведется протоколирование звонков, и можно управлять выборкой по своему усмотрению. Чтобы дать задание MySQL, следует использовать в диалплане одноименную команду. Примерно, так:
$ sudo nano /etc/asterisk/extensions.conf
; Подключаемся к базе данных
exten => _X.,1,MYSQL(Connect connid localhost asterisk astpassw asterisk)
; Суммируем все звонки, произведенные абонентом (в billsec они хранятся в секундах),
результат запроса сохраняется в переменной ${resultid}
exten => _X.,2,MYSQL(Query resultid ${connid} SELECT SUM(billsec) FROM cdr WHERE \
    src=\'${CALLERID(num)}\')
; Сохраняем результат в billing, в found будет 1, если запрос возвратил результат
exten => _X.,3,MYSQL(Fetch found ${resultid} billing)
; Очищаем переменную
exten => _X.,4,,MYSQL(Clear ${resultid})
; Проверяем, выполнен ли запрос, если нет - выходим
exten => _X.,5,GotoIf($["${found}" = "1"]?true:false)
; Проверяем количество времени и, если оно меньше определенного значения,
; разрешаем позвонить
exten => _X.,6,GotoIf($["${billing}" < "время"]?call:end)
exten => _X.,7,n(call),Dial(звоним)
exten => _X.,8,,MYSQL(Clear ${resultid})
exten => _X.,9,n,Hangup()
exten => _X.10,n(false),Playback(end)
exten => _X.1,n,Hangup()
; Обязательно отключаемся от БД, иначе процесс будет висеть в памяти,
; и быстро исчерпается лимит подключений к MySQL
exten => h,1,MYSQL(Disconnect ${connid})
Формат данных можно посмотреть, выполнив SQL запрос. Скажем, для номера 123:
SELECT SUM(billsec) FROM `asterisk`.`cdr` WHERE src='123'
Пример, конечно, самый простой, SQL запрос в более сложном биллинге будет содержать большее количество полей. Кроме этого, для хранения промежуточных результатов лучше использовать дополнительные таблицы. Вариантов достаточно много, но главное — понять процесс. За основу своей системы можно взять существующие системы биллинга. Чтобы не включать SQL запросы в экстеншен, проще записать их в AGI скрипт, который и выполнять в случае необходимости.
Также не забываем о специальных анализаторах CDR записей. Например, Asterisk Queue/CDR Log Analyzer или Asterisk-Stat.
Увеличить
Рис. 4. Анализ CDR записей в Asterisk Queue/CDR Log Analyzer

Экономия на телефонах
Asterisk позволяет программно эмулировать функции, доступные в более дорогих моделях телефонов. За счет этого можно немного сэкономить при покупке аппаратов, а если ими уже завален офис, то сделать работу пользователей удобнее. Например, чтобы не мучать сотрудников компании запоминанием длинных номеров, используют сокращенный набор (speed dial), то есть назначают длинному и, как правило, часто используемому номеру, короткую комбинацию из 2-3 цифр. Примерно, так:
exten => *01,1,Dial(SIP/нужный_номер@${TRUNK},20)
Кстати, многие софтофоны поддерживают буквенный набор:
exten => lenok,1,Dial(SIP/server2/79101234567,20)
Теперь такая ситуация. Кто-то позвонил, но менеджер не успел поднять трубку, клиент может остаться недовольным и набрать шефа, которому сказать все, что он думает о работе сервиса. Телефон с АОН или софтофон позволяет увидеть номер звонившего и набрать его (recall), простые же аппараты часто лишены такой функции. Используя возможность записи в базу Asterisk из диалплана, легко реализовать это самому.
Для примера обеспечим возможность вызова последнего звонившего абонента комбинацией «*22″, или организуем ему Callback при нажатии «*21″.
$ sudo nano /etc/asterisk/extensions.conf
[IncomingCall]
; Запоминаем номер звонившего
exten => _5XX,1,Set(_To=${EXTEN})
exten => _5XX,n,Set(_From=${CALLERID(num)})
; Сохраняем номер для быстрого вызова комбинацией *22
exten => _5XX,n,Set(DB(${To}/LastCaller)=${From})
; Сохраняем для вызова *21
exten => _5XX,n,Set(DB(${From}/LastCalled)=${To})
; Звоним
exten => _5XX,n,Dial(SIP/${EXTEN},20)
exten => _5XX,n,Hangup()
; По *22 услышим номер, после чего звоним
exten => *22,1,Set(tmp=${DB(${CALLERID(num)}/LastCaller})
exten => *22,n,SayDigits(${tmp})
exten => *22,n,Dial(${tmp},1)
; Теперь номер *21
exten => *21,1,Set(tmp=${DB(${CALLERID(num)}/LastCalled)})
exten => *21,n,SayDigits(${tmp})
exten => *21,n,Set(DB(${tmp}/CallBack)=${CALLERID(num)})
exten => *21,n,Hangup()
А вот так можно реализовать возможность повторного набора номера последнего вызванного абонента (т.е. re-dial):
[default]
include => macro-recall

exten => _X.,1,Macro(recall,${EXTEN})
exten => *0,1,DBget(toCall=redial/${CALLERID})
exten => *0,2,Macro(recall,${toCall})
exten => *0,102,Hangup()

[macro-recall]
exten => s,1,DBput(redial/${CALLERID}=${ARG1})
exten => s,1,Dial(SIP/${ARG1},20)
exten => s,2,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Voicemail(u${ARG1})
exten => s-BUSY,1,Voicemail(b${ARG1})
exten => _s-.,1,Goto(s-NOANSWER,1)
Примеры, конечно, несколько упрощены, но главное понять суть и возможности Asterisk.
Не забываем о функциях парковки вызова (Call Parking), перехвата вызова другому абоненту (Call Pickup), которые поддерживаются в стандартной инсталляции Asterisk. Экстеншен для Call Parking можно узнать, просмотрев значения parkext иparkpos в файле features.conf:
[general]
; Экстеншен для парковки
parkext => 700
; Слоты для парковки
parkpos => 701-720
Причем парковку вызова можно использовать и не по прямому назначению, например, для постановки звонка на удержание (Сall hold) для короткой консультации с другим специалистом. Для вызова Call Pickup обычно используется комбинация «*8″.
Увеличить
Рис. 5. Смотрим возможности Asterisk

Экономим на факс-сервере
Казалось бы, чего проще — отсканировать документ и отправить по e-mail, ан нет, факсимильная связь жива, и, судя по всему, жить будет еще долго. Причины банальны: распространенность оборудования, доступность линий связи и сложившиеся привычки. Поэтому приходится подстраиваться. Для передачи факса по IP-сетям (FoIP, Fax over IP) используются две технологии: Т.37 и T.38. Первая определяет формат данных и процесс передачи сообщения посредством e-mail с предварительным его сохранением. Второй стандарт описывает процесс передачи факса в реальном времени. Технология T.38 интересует нас сегодня в большей степени.
Передача факса по VoIP-сетям не такая уж и простая задача, как кажется на первый взгляд: кодеки, адаптированные для работы с голосом, и функции подавления шумов искажают сигнал факса, а задержки, характерные для IP-сетей, не дают возможности нормально принять сигнал (аппараты просто не адаптированы для этого). В рекомендациях к Т.38 сказано, что можно использовать как UDP, так и TCP протокол. Однако во избежание издержек чаще применяют именно UDP, компенсируя возможные потери введением избыточности. В качестве кодека при передаче по VoIP настоятельно рекомендуется использовать G.711.
В Asterisk поддержка Т.38 появилась далеко не сразу: вначале были доступны отдельные патчи, затем некоторые функции были включены в исходный код. В результате Asterisk 1.4.20.1 поддерживает только прозрачные T.38 сессии на SIP каналах. Поэтому до недавнего времени были популярны следующие варианты реализации: использование модулей RxFAX/TxFAX, их аналог SendFAX/ReceiveFAX (оба используют SpanDSP) или HylaFax + iaxmodem (как вариант Т.37). Затем в asterisk-addons был добавлен код для работы с библиотекой SpanDSP, позволяющей отправлять и получать факсы по G711 каналу. А уже с 1.6.0 код для работы с библиотекой SpanDSP был включен в основную ветку (реализовано посредством модуля app_fax). Правда, первое время его использование вызывало множество ошибок, но большую часть из них разработчики устранили в версии 1.6.2. Помимо этого, был перепроектирован сам процесс установления связи по T.38, и в результате Asterisk может получать и принимать факсы по G711 и T.38. В начале апреля 2009 компания Digium представила модули Fax For Asterisk(res_fax и res_fax_digium), которые позволяют работать с факсами как через телефонную линию, так и по IP-сети. Подключение к одной факсовой линии бесплатно, за дополнительные линии нужно платить (каждая лицензия по $38.50). К версии 1.8 планируется полностью перевести Asterisk на Fax For Asterisk (код которого в настоящее время открыт), заменив тем самым модуль app_fax. Как видишь, сегодня вариантов реализации несколько, что уже вызывает путаницу.
Рассмотрим то, что идет в стандартной поставке. В репозитариях дистрибутивов, вероятно, уже имеется модуль для работы с факсом, но чтобы свести к минимуму количество возможных ошибок, лучше использовать последнюю версию Asterisk и SpanDSP. Последний ставится обычным образом (потребуется libtiff), затем нужно собрать Asterisk с параметром «—with-spandsp«. На этапе «make menuselect» можно просмотреть наличие модуля app_fax (в Applications). После установки смотрим список приложений:
$ sudo asterisk -r
CLI>core show applications like fax
ReceiveFAX: Receive a FAX
SendFAX: Send a FAX
Переходим к настройке.
$ sudo nano /etc/asterisk/sip.conf
[general]
t38pt_udptl = yes
Теперь пишем экстеншены:
$ sudo nano /etc/asterisk/extensions.conf
exten => _5,n,Dial(${TRUNK_SIP}/ххх,120,M(sendfax))
; Отправка
[macro-sendfax]
exten => _X.,1,Set(FAXFILE=//var/spool/asterisk/fax/fax)
exten => _X.,n,SendFAX(${FAXFILE}.tif)
exten => _X.,n,Hangup
; Прием
[macro-receivefax]
exten => _X.,1,Answer()
exten => _X.,n,Wait(3)
exten => _X.,n,ReceiveFAX(faxfilename)
Все, миссия выполнена, Asterisk научился работать с факсами.
Увеличить
Рис. 6. Команда «make menuselect» покажет наличие app_fax

Заключение
Как видишь, немного отойдя от стандартной схемы использования Asterisk, можно сделать много чего полезного и интересного, в том числе, и с финансовой точки зрения. Конечно, придется некоторое время экспериментировать и подбирать наиболее оптимальные настройки, но затем дирекция будет в восторге.
Увеличить
Рис. 7. Интерфейс FreePBX позволяет настроить большинство параметров Asterisk в удобной форме

Врезка: Продаю Украину, Белоруссию, Казахстан
Еще один вариант заработка: можно продавать свободные телефонные линии на разные направления. Допустим, центральный офис компании находится в России (Москве), а дилерские отделы на Украине, в Белоруссии и Казахстане. В каждом филиале, естественно, есть телефонные линии местных операторов. Админ центрального офиса может продавать знакомым звонки в эти страны по дешевым тарифам. «Знакомый» регистрируется на Asterisk и звонит через VoIP-сеть по предоставленным направлениям. Для конторы это будут местные звонки, которые не тарифицируются, а админу лишняя копеечка.

Врезка: Лимитируем пустые разговоры
Если мы знаем, что секретарша любит за счет конторы потрепаться со своей подругой из Владивостока (телефонный код 4232), при вызове набираем номер подружки (допустим, 102030), но ограничиваем продолжительность звонка десятью минутами (600000 мс), предупреждаем вызывающего абонента (секретутку) о разрыве соединения через 5 минут (300000 мс) и повторяем оповещение каждую минуту (60000 мс):
exten => _84232102030,1,Dial(SIP/8${EXTEN}@${OUTGOING},,L[600000:300000:60000])

Врезка: Управление компьютером при помощи Asterisk
Использование в диалплане функции System() открывает поистине широкие возможности по управлению любым сервером с помощью телефона. Процесс прост – набираем номер, затем пароль, и Asterisk выполняет заранее определенную команду. Например, очень просто реализовать «красную кнопку», полностью удаляющую данные с харда (работодатели, ведущие черные и серые зарплаты, будут тебе очень признательны ;-). Программ для «очистки» диска в интернете можно найти невероятное количество. А линуксовая утилита winexe позволяет удаленно выполнять команды в Windows NT/2k/XP/2k3. Ставим ее в Linux систему, на которой работает Asterisk, и создаем простенький диалплан:
exten => s,n,Read(auth||4||1|5)
exten => s,n,GotoIf($["${auth}" = "000"]?yes:no) ; пароль
exten => s,n(yes),System(winexe -U /% // "c:\script.bat" \
    >>/var/log/asterisk/win.log)
exten => s,n(no),Hangup()
Теперь на удаленном хосте будут выполнены все команды, описанные в файле script.bat.

Боковые выносы
INFO
  • Еще одним вариантом создания call файла является использование AMI (Asterisk Manager Interface) — интерфейса управления Asterisk. Для этого достаточно послать все необходимые команды в 5038 порт.
  • О настройке биллинговой системы AstBill читай в статье «Звездные счета», опубликованной в февральском номере ][ за 2008 год.
WWW
Статья опубликована в мартовском номере журнала «Xakep» за 2010 год.