А что если при входящем звонке вместо бездушного номера вы будете видеть на своём телефоне что-то вроде «ООО Стройпоставка» или «Иванов Семён Петрович», получаемые из базы ваших клиентов и контрагентов.
Будет весьма удобно, не правда ли?
А реализуется это очень легко.

Традиционно рассмотрю два варианта — для FreePBX, и для «чистого» Asterisk.


Общие приготовления

Сначала нужно создать в БД таблицу:

CREATE TABLE `companies` (
`name` CHAR(150) NOT NULL,
`number` BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (`number`)
);


и заполнить её списком клиентов, сотрудников и так далее. Этот список без проблем можно импортировать через промежуточный CSV из 1C, Active Directory, различных CRM и адресных книг с помощью множества доступных утилит, от HeidiSQL до PHPMyAdmin, и эта часть не должна создать проблем.

FreePBX

В меню Caller ID Lookup Sources нужно добавить source type: MySQL, прописать адрес сервера, логин, пароль, а в поле query указать:

SELECT name FROM companies WHERE number LIKE CONCAT('%',SUBSTRING('[NUMBER]',-7));


а в меню inbound routes выбрать свежесозданный lookup source из выпадающего списка.

Asterisk communications framework — то есть «чистый» Asterisk

В диалплан следует добавить следующие строки:

exten => foo,n,MYSQL(Connect connid localhost cdr cdrpass asterisk) ; Указываем хост, логин, пароль, БД.
exten => foo,n,GotoIf($["${connid}" = ""]?nodb) ; Соединение не удалось
exten => foo,n,MYSQL(Query resultid ${connid} SELECT name FROM companies WHERE number="${CALLERID(num)}" LIMIT 1)
exten => foo,n,MYSQL(Fetch fetchid ${resultid} name)
exten => foo,n,MYSQL(Clear ${resultid})
exten => foo,n,Set(CALLERID(name)=${name})
exten => foo,n,MYSQL(Disconnect ${connid})
exten => foo,n(nodb),NoOp(DoneDB)


Ну вот и всё.

Комментарии (9)


  1. la0
    07.12.2015 14:24
    +1

    Я бы если бы что-то подобное делал, делал бы или sqlite (зачем тащить мускул?) или получение этой информации по HTTP-ссылке.
    Последнее очень пригодится, например, если вдруг в компании узнают что такое CRM


    1. varnav
      07.12.2015 14:30

      Мускул в 80% и так уже на астериске будет установлен, для CDR например.
      В случае FreePBX он там будет в 100% случаев.


  1. j3st3r
    07.12.2015 16:16
    +1

    MYSQL app deprecated уже в 11 астере.
    ODBC — значительно проще и универсальнее (до тех пор пока в топик не залезет уважаемый antirek и не начнет говорить про agi:)


    1. varnav
      07.12.2015 16:49

      Проще? Я бы не сказал. Вместо одной строчки нужно править несколько конфигов.
      В остальном согласен. Но есть ли по ODBC для Asterisk нормальная документация?


      1. j3st3r
        07.12.2015 17:46
        +1

        Вообще я предерживаюсь точки зрения, что документации по любому функционалу Asterisk вполне достаточно (ну разве что по DPMA порой не совсем полные конфиги), про odbc можно почитать например тут


  1. antirek
    08.12.2015 08:19

    Мне нравятся такие маленькие сниппеты. varnav, продолжайте.

    Объясню почему. Да, документации много. Но если бы документация было достаточно, то не было бы сайтов с вопросами и ответами, коллекций рецептов по типу stackoverflow или тостера — в общем, надо обмениваться опытом.

    Еще вот недавно встретил такой формат объяснения настроек астериска: Voip Guys Asterisk Tutorials — канал на Youtube. Конфигурируют и тут же показывают что изменилось.


    1. varnav
      08.12.2015 08:42
      +1

      Я работаю с астериском очень давно, но не только с ним.
      Считаю что с документацией по астериску проблемы, она сильно уступает документации других проектов.
      Легко увидеть что по поиску обычно сверху выдаётся www.voip-info.org с устаревшей, но более полной информацией. А официальная wiki довольно куцая.


  1. Dobrotin
    08.12.2015 13:37
    +1

    Еще можно было использовать модуль FreePBX «Asterisk Phonebook», CallerID Lookup в нём тоже «ищет».


  1. shadowalone
    09.12.2015 03:05

    не совсем одно и тоже:
    SELECT name FROM companies WHERE number LIKE CONCAT('%',SUBSTRING('[NUMBER]',-7));
    и
    SELECT name FROM companies WHERE number="${CALLERID(num)}" LIMIT 1

    Во втором случае, вероятность несовпадения в разы больше… ибо номер может придти с префиксом/без страны/города — зависит от твоего оператора телефонии.