Как сэкономить и заработать с помощью AsteriskSergey Jaremchuk feat. Andrey Matveev Кризис заставляет нас потуже затянуть пояса и по-новому взглянуть на многие вещи. Ситуация в IT-сфере сходная: чтобы сэкономить, организации перепланируют использование имеющихся ресурсов, делая ставку на объединение функциональных возможностей, серверов и сетей. Рассмотрим, как с помощью IP-PBX Asterisk можно сократить расходы компании на телефонную связь и даже немного заработать самому. Тонкое сопряжениеУ средней и, тем более, крупной организации часто есть филиалы в разных городах или странах. Если в удаленных офисах существует возможность воздвигнуть 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. Один из серверов будет подключаться к другому для оперативного обмена данными.
Теперь необходимо добавить в диалплан описание нового маршрута:
Вот, собственно, и все настройки на первом сервере. На другой стороне описание в iax.conf и настройки практически аналогичны. Учитывая, что этот сервер принимает подключение, убираем параметр register.
А в конфиге extensions.conf задаем второй пул номеров:
Если в подчинении несколько IP-PBX Asterisk, то добавляем их так же, как и первый сервер. Необходимый минимум для подключения выполнен. Далее наращиваем эту схему, изменяя диалплан в зависимости от ситуации и потребностей. Например, в экстеншенах Asterisk можно указывать время действия правила. Чтобы звонить в удаленный офис можно было только в рабочее время, используем такую конструкцию:
Вариантов действительно много, экспериментируй! Подключаемся к SIP-провайдеруЗа последние несколько лет SIP-провайдеров, предлагающих свои услуги по весьма демократичным ценам, наплодилось предостаточно. Используя их возможности, можно существенно сэкономить на междугородных и международных звонках. Для Asterisk нет принципиальной разницы, подключаться к одному или нескольким SIP-провайдерам сразу, но для нас второй вариант подключения предпочтительнее, поскольку в диалплане можно предписать ранжирование операторов связи по каждому направлению на основе критерия «цена-качество». Можно звонить по разным направлениям, исходя из требуемого качества и установленных провайдерами расценок. Кстати, именно на этом подходе основана работа китов современного SIP'остроения вроде sipnet.ru. Принцип настройки подключения и создания диалплана практически полностью совпадает с IAX2. Все установки для SIP производятся в файле sip.conf.
Этот конфиг можно взять за основу для подключения к любому SIP-серверу. Конечно, разные провайдеры могут использовать специфические установки, поэтому придется прошерстить раздел FAQ на офсайте поставщика сервиса в поисках примеров, нюансов и советов по обходу подводных камней. Далее разбираемся с входящими и исходящими звонками:
Настраиваем CallbackСегодня не редкость, что менеджеры работают далеко за пределами офиса, связываясь при необходимости с руководством или работниками по мобильному. В итоге, в месяц за переговоры приходится платить достаточно приличную сумму. А если таких сотрудников в офисе не один десяток? Затраты на переговоры будут значительны. Но выход есть: приобрести безлимитный пакет и при поступлении звонка перезванивать вызывающему, который далее уже сам выбирает, что ему нужно - звонить кому-нибудь в офисе, делать еще один исходящий звонок, например, междугородний, оставить или прослушать голосовое сообщение и т.д. При помощи Asterisk организовать это достаточно просто, причем существует сразу несколько вариантов. Самый простой способ - создание в каталоге /var/lib/asterisk/outgoing специального .call-файла, который подхватывается и обрабатывается Asterisk на лету. Создаем в extensions.conf описание нового диалплана:
Теперь собственно скрипт, который создаст нужный call-файл. Напомним, что, используя директиву System, можно создать файл на лету:
Но отдельный скрипт нагляднее и проще редактируется:
Принцип работы довольно прост: абонент звонит, Asterisk определяет принадлежность к списку и в случае совпадения создает call-скрипт, который затем используется для осуществления исходящего звонка. Напомним, что Callback можно организовать и средствами web, когда пользователь набирает свой номер телефона в специальном поле браузера, а call-файл создает CGI-скрипт. Схема будет полезной и в службе поддержки. Пользователи не очень любят тратить свои кровные на переговоры с подобными сервисами, и здесь Callback будет весьма кстати. В таком варианте в экстеншен лучше жестко забить номер (например, службы поддержки или менеджера), с которым Asterisk будет соединять удаленного абонента. Для этого достаточно добавить в InternalCall вызов нужного номера. Немного усложнив описанные скрипты, можно разрешить подключаться любому пользователю по карточке с PIN-кодом для осуществления платного звонка в выбранном направлении. В этом случае после перезвона абоненту Asterisk запрашивает PIN-код, извлекает из БД текущий баланс и выводит его звонившему (о биллинговой системе мы поговорим чуть ниже). Далее абонент указывает номер, на который он хотел бы позвонить. Простенький биллингЕсли ты решил немного подзаработать с Asterisk, то без системы учета звонков не обойтись. В интернете можно найти не одно готовое решение вроде A2billing (www.asterisk2billing.org), Asterisell (asterisell.profitoss.com), astCDRview (astcdrview.berlios.de), AstBill (astbill.com), но в 9 случаях из 10 его придется адаптировать к конкретным условиям. Как бы странно это ни прозвучало, зачастую проще написать биллинговую систему или учет разговоров самому, тем более, в поставке Asterisk все для этого имеется. 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 команда для этого проста:
Затем создаем базу данных и наполняем ее таблицами:
Пример для создания таблиц БД можно найти в документации Asterisk в файле cdr_mysql.txt (в Ubuntu он лежит в /usr/share/doc/asterisk-mysql; также ты найдешь его на диске). Подключаем вывод CDR в MySQL, указав параметры подключения к серверу и базе данных «asterisk»:
Загрузим нужный модуль через консоль Asterisk:
В случае правильных настроек увидим запись о загрузке модуля и подключении к БД, просмотреть его состояние можно при помощи команды «cdr mysql status». Чтобы модуль загружался автоматически после рестарта Asterisk, добавим в /etc/asterisk/modules.conf строку:
Все, теперь ведется протоколирование звонков и можно управлять выборкой по своему усмотрению. Чтобы дать задание MySQL, следует использовать в диалплане одноименную команду. Примерно так:
Формат данных можно посмотреть, выполнив SQL-запрос. Скажем, для номера 123:
Пример, конечно, самый простой. SQL-запрос в более сложном биллинге будет содержать большее количество полей. Кроме того, для хранения промежуточных результатов лучше использовать дополнительные таблицы. Вариантов достаточно много, но главное - понять процесс. За основу своей системы можно взять существующие системы биллинга. Чтобы не включать SQL-запросы в экстеншен, проще записать их в AGI-скрипт, который и выполнять в случае необходимости. Также не забываем о специальных анализаторах CDR-записей. Например, Asterisk Queue/CDR Log Analyzer (www.micpc.com/qloganalyzer) или Asterisk-Stat (www.areski.net/asterisk-stat-v2). Экономия на телефонахAsterisk позволяет программно эмулировать функции, доступные в более дорогих моделях телефонов. За счет этого можно немного сэкономить при покупке аппаратов, а если ими уже завален офис, то сделать работу пользователей удобнее. Например, чтобы не мучить сотрудников компании запоминанием длинных номеров, используют сокращенный набор (speed dial), то есть назначают длинному и, как правило, часто используемому номеру, короткую комбинацию из 2-3 цифр. Примерно, так:
Кстати, многие софтофоны поддерживают буквенный набор:
Теперь такая ситуация. Кто-то позвонил, но менеджер не успел поднять трубку. Клиент может остаться недовольным и набрать шефа, которому скажет все, что думает о работе сервиса. Телефон с АОН или софтофон позволяет увидеть номер звонившего и набрать его (recall), простые же аппараты часто лишены такой функции. Используя возможность записи в базу Asterisk из диалплана, легко реализовать все самому.
А вот так можно реализовать возможность повторного набора номера последнего вызванного абонента (re-dial):
Примеры, конечно, несколько упрощены, но главное понять суть и возможности Asterisk. Не забываем о функциях парковки вызова (Call Parking) и перехвата вызова другому абоненту (Call Pickup), которые поддерживаются в стандартной инсталляции Asterisk. Экстеншен для Call Parking можно узнать, просмотрев значения parkext и parkpos в файле features.conf:
Причем парковку вызова можно использовать и не по прямому назначению, например, чтобы поставить звонок на удержание (Сall hold) для короткой консультации с другим специалистом. Для вызова Call Pickup обычно используется комбинация «*8». Экономим на факс-сервереКазалось бы, чего проще - отсканировать документ и отправить по 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, soft-switch.org) или 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, digium.com/en/products/software/faxforasterisk.php), которые позволяют работать с факсами как через телефонную линию, так и по IP-сети. Подключение к одной факсовой линии бесплатно, за дополнительные нужно платить (каждая лицензия по $38.50). К версии 1.8 планируется полностью перевести Asterisk на Fax For Asterisk (код которого в настоящее время открыт), заменив модуль app_fax. Как видишь, вариантов реализации несколько, что уже вызывает путаницу. Рассмотрим, что идет в стандартной поставке. В репозитариях дистрибутивов, вероятно, уже имеется модуль для работы с факсом, но, чтобы свести к минимуму количество возможных ошибок, лучше использовать последнюю версию Asterisk и SpanDSP. Последний ставится обычным образом (потребуется libtiff), затем нужно собрать Asterisk с параметром «--with-spandsp». На этапе «make menuselect» можно просмотреть наличие модуля app_fax (в Applications). После установки смотрим список приложений:
Переходим к настройке.
Пишем экстеншены:
Миссия выполнена, Asterisk научился работать с факсами. ЗаключениеНемного отойдя от стандартной схемы использования Asterisk, можно сделать много чего полезного и интересного, в том числе, и с финансовой точки зрения. Конечно, придется экспериментировать и подбирать оптимальные настройки, но зато потом дирекция будет в восторге. Продаю Украину, Белоруссию, КазахстанЕще один вариант заработка: можно продавать свободные телефонные линии на разные направления. Допустим, центральный офис компании находится в России (Москве), а дилерские отделы на Украине, в Белоруссии и Казахстане. В каждом филиале, естественно, есть телефонные линии местных операторов. Админ центрального офиса может продавать знакомым звонки в эти страны по дешевым тарифам. «Знакомый» регистрируется на Asterisk и звонит через VoIP-сеть по предоставленным направлениям. Для конторы это будут местные звонки, которые не тарифицируются, а админу лишняя копеечка. Лимитируем пустые разговорыЕсли мы знаем, что секретарша любит за счет конторы потрепаться со своей подругой из Владивостока (телефонный код 4232), то при вызове набираем номер подружки (допустим, 102030), но ограничиваем продолжительность звонка десятью минутами (600000 мс). Предупреждаем вызывающего абонента (секретутку) о разрыве соединения через 5 минут (300000 мс) и повторяем оповещение каждую минуту (60000 мс):
Управление компьютером при помощи AsteriskИспользование в диалплане функции System() открывает поистине широкие возможности по управлению любым сервером с помощью телефона. Процесс прост – набираем номер, затем пароль, и Asterisk выполняет заранее определенную команду. Например, очень просто реализовать «красную кнопку», полностью удаляющую данные с харда (работодатели, ведущие черные и серые зарплаты, будут тебе очень признательны :)). Программ для «очистки» диска в интернете можно найти невероятное количество. А линуксовая утилита winexe (eol.ovh.org/winexe) позволяет удаленно выполнять команды в Windows NT/2k/XP/2k3. Ставим ее в Linux-систему, на которой работает Asterisk, и создаем простенький диалплан:
На удаленном хосте будут выполнены все команды, описанные в файле script.bat. INFOЕще одним вариантом создания call-файла является использование AMI (Asterisk Manager Interface) - интерфейса управления Asterisk. Достаточно послать все необходимые команды в 5038 порт. О настройке биллинговой системы AstBill читай в статье «Звездные счета», опубликованной в февральском номере ][ за 2008 год. WWW
|