Интеграция с телефонией — различия между версиями
Johny (обсуждение | вклад) м (→Интеграция мобильного приложения) |
Johny (обсуждение | вклад) |
||
Строка 52: | Строка 52: | ||
Так же обязательно нужно в карточках пользователей "Настройка" - "Пользователи" ввести внутренние номера абонентов. У пользователя может быть несколько номеров, перечисленных через запятую. При нажатии кнопки "Позвонить", программа будет соединять первый телефон из списка. При входящих звонках - будет показывать сообщение при звонке на любой из номеров в списке. | Так же обязательно нужно в карточках пользователей "Настройка" - "Пользователи" ввести внутренние номера абонентов. У пользователя может быть несколько номеров, перечисленных через запятую. При нажатии кнопки "Позвонить", программа будет соединять первый телефон из списка. При входящих звонках - будет показывать сообщение при звонке на любой из номеров в списке. | ||
+ | |||
+ | == Обратные запросы от Asterisk == | ||
+ | Иногда возникает необходимость серверу телефонии получить данные из БД при входящем звонке. Для этого он напрямую подключается к MySQL, база данных courier. Приведем наиболее популярные задачи их решения: | ||
+ | |||
+ | *Звонит получатель, нужно его соединить с курьером, у которого находится его заказ. Такое особенно актуально, если мобильное приложение курьера звонит через офисную телефонию, у получателя определяется номер телефона офиса, и он перезванивает. Запрос ниже выдает сразу номер телефона курьера, с которым нужно соединить. | ||
+ | |||
+ | SELECT k.code, k.name, k.`phonem`, k.`phonek` | ||
+ | FROM contacts c JOIN givn g ON g.address=c.Source JOIN kurier k ON k.code=g.`kurier` | ||
+ | WHERE c.SourceCodeType=3 /*Контакты именно получателей*/ | ||
+ | AND g.State=1 /*Статус "На руках у курьера"*/ | ||
+ | AND c.VALUE='79161234567' /*Вот тут нормированный телефон звонящего ИМЕННО в таком формате*/ | ||
+ | |||
+ | *Звонит курьер, нужно его соединить с менеджером. Запрос вернет внутренний номер менеджера курьера: | ||
+ | |||
+ | SELECT k.code, k.name, u.extPhone AS managerext | ||
+ | FROM contacts c JOIN kurier k ON k.code=c.Source JOIN users u ON u.`user`=k.`manager` | ||
+ | WHERE c.SourceCodeType=1 /*Контакты именно курьеров*/ | ||
+ | AND c.VALUE='79161234567' /*Вот тут нормированный телефон звонящего ИМЕННО в таком формате*/ | ||
+ | |||
+ | *Звонит клиент, нужно его соединить с менеджером. Запрос вернет внутренний номер менеджера клиента, а так же статус клиента. Запрос очень упрощен. По-хорошему надо в первую очередь смотреть контакты не столько привязанные к клиентам, сколько к их контактным лицам (таблица fio, код 39). | ||
+ | |||
+ | SELECT k.code, k.company, u.extPhone AS managerext, c.State | ||
+ | FROM contacts c JOIN clients k ON k.code=c.Source LEFT JOIN users u ON u.`user`=k.`manager` | ||
+ | WHERE c.SourceCodeType=2 /*Контакты именно клиентов*/ | ||
+ | AND c.VALUE='79161234567' /*Вот тут нормированный телефон звонящего ИМЕННО в таком формате*/ | ||
+ | |||
+ | * Определить просто отправление из тех, что в работе. Возвращает данные отправления, заказа и клиента | ||
+ | |||
+ | SELECT * | ||
+ | FROM contacts c JOIN address a on a.code=c.Source join zakaz b on a.zakaz=b.code join clients k on k.code=b.source | ||
+ | WHERE c.SourceCodeType=3 /*Контакты именно получателей*/ | ||
+ | AND a.date_put is null /*Заказ в работе, не закрытый*/ | ||
+ | AND c.VALUE='79161234567' /*Вот тут нормированный телефон звонящего ИМЕННО в таком формате*/ | ||
+ | |||
+ | Конечно, при желании можно все это объединить в один запрос, и гораздо быстрее за одно действие получить информацию о том, кто это звонит, и что с ним надо делать. Здесь приведены только шаблонные запросы. В общих словах - таблица contacts содержит все индексированными контактные данные из всех таблиц системы (ну, из большинства). И все обращения за поиском по телефону должны заходить именно с нее. Коды таблиц для поля SourceCodeType можно посмотреть в таблице schema.table_list. |
Версия 14:13, 7 февраля 2018
Интеграция мобильного приложения
Для чего это нужно: использование звонков через корпоративную телефонию позволяет снизить расходы на мобильную связь, организовать централизованную запись, учет и контроль совершаемых вызовов.
Для осуществления звонков из мобильного приложения через сервер телефонии Asterisk используется подключение через AMI.
Включите AMI, задайте адреса, с которых можно получить к нему доступ в файле /etc/asterisk/manager.conf
Создайте пользователя - обычно это делается в файлах /etc/asterisk/manager_custom.conf или /etc/asterisk/manager.conf
Откройте порт в файерволе (обычно 5038, прописывается в /etc/asterisk/manager.conf) (на всякий случай Вам в помощь). Все подключения от клиентов на андроиде происходят с одного IP-адреса: 138.201.228.71, так что смело "зажимайте" только на него - этого требует безопасность. Осторожно! AMI - вещь достаточно дырявая, и открытие порта на весь мир очень опасно. Тем более что через эту функцию можно за ваш счет соединить 2 произвольных номера.
Пропишите настройки подключения здесь: https://home.courierexe.ru/extraclient/phones_settings
- Адрес сервера - IP или доменное имя. Предполагается, что у сервера Asterisk, естественно, статичный внешний IP или проброшен порт AMI, иначе ничего работать не будет.
- Порт сервера - На каком порту находится AMI
- Имя пользователя - Логин AMI, созданный в manager.conf (или manager_custom.conf)
- Пароль - пароль пользователя.
- Канал - канал, через который должен происходить звонок. Обычно выглядит как "SIP/trunk_name", где trunk_name - название транка, прописанного, обычно, в файле /etc/asterisk/sip.conf
- Контекст - Контекст обработки запроса. Обычно настраиваются в диалплане в файле /etc/asterisk/extensions.conf
- Внутренний телефон офиса - Внутренний номер, на который приходит звонок, при выборе "Позвонить в офис". Рекомендуется в настройках Asterisk сделать этот номер - номером группы менеджеров.
- Городской телефон офиса - Внешний номер телефона офиса. Приложение будет звонить по сотовой сети на этот номер в случае, если не удалось послать запрос на соединение с офисом в Asterisk. Заполните это поле, даже если не вы не интегрируете приложение с телефонией, это позволит курьерам совершать звонки в офис из приложения!
Сохраните настройку, и проверьте ее работоспособность, введя 2 телефона, и нажав кнопку "Тест". Система должна отправить запрос на Asterisk, и он должен позвонить сначала на первый телефон, потом, после поднятия трубки, идет вызов на второй номер, и происходит их коммутация. К сожалению, на этом уровне наша система может "поймать" и отобразить только ошибки подключения к AMI, т.е. ошибочный адрес сервера и/или неверный/закрытый порт. В случае неверного указания остальных данных, включая логин и пароль, система "подумает", что все прошло гладко, запрос она сформировала и на сервер отправила. В случае, если все хорошо - вы получите телефонный звонок. Если же этого не произошло - проверьте все введенные данные, попробуйте посмотреть что происходит в астериске - команда "asterisk -r".
Обратите внимание: для успешных звонков из мобильного приложения, в карточке курьера должен быть введен номер мобильного телефона в соответствующее поле!
При осуществлении вызова сервер приложения посылает на Asterisk AMI-запрос вида:
Action: login Username: $USERNAME Secret: $PASSWORD Action: originate Channel: $CHANEL/$CALL-FROM-NUMBER WaitTime: 30 CallerId: 0 Exten: $CALL-TO-NUMBER Context: $CONTEXT Priority: 1 Action: Logoff
$CALL-FROM-NUMBER и $CALL-TO-NUMBER нормируются, и приводятся к международному формату +7ХХХХХХХХХХ (для России и Казахстана). Для других стран, возможно, тестирование не проводилось, в случае проблем - обращайтесь, будем изучать форматирование номеров в конкретной стране.
Как Вы уже заметили, данная настройка подразумевает наличие глубоких знаний в области администрирования asterisk-сервера, поэтому, убедительная просьба: если Вы ими не обладаете, прежде чем звонить нам и просить помощи, обратитесь к специалисту, поддерживающему вашу телефонию, покажите ему данное руководство. С очень большой вероятностью ему все будет понятно, и он все настроит за 30 минут. Наша служба технической поддержки не обладает достаточной квалификацией в данной области, и, скорее всего, мы не сможем оказать вам поддержку в этом вопросе.
Интеграция системы с телефонным сервером
Интеграция офисной системы с телефонией позволяет упростить работу операторов и администраторов компании: набор номера одной кнопкой из программы, автоматическое определение компании и ФИО клиента, ведение журнала звонков.
Интеграция офисной системы с Asterisk происходит аналогично курьерской (см. выше) с той разницей, что запросы на астериск идут не с единого сервера, а непосредственно с пользовательских рабочих мест, поэтому файервол на сервере телефонии нужно настраивать соответственно.
Параметры подключения нужно вводить в разделе "Справочники" -> "Переменные" -> "Подключения" -> "Asterisk".
Так же обязательно нужно в карточках пользователей "Настройка" - "Пользователи" ввести внутренние номера абонентов. У пользователя может быть несколько номеров, перечисленных через запятую. При нажатии кнопки "Позвонить", программа будет соединять первый телефон из списка. При входящих звонках - будет показывать сообщение при звонке на любой из номеров в списке.
Обратные запросы от Asterisk
Иногда возникает необходимость серверу телефонии получить данные из БД при входящем звонке. Для этого он напрямую подключается к MySQL, база данных courier. Приведем наиболее популярные задачи их решения:
- Звонит получатель, нужно его соединить с курьером, у которого находится его заказ. Такое особенно актуально, если мобильное приложение курьера звонит через офисную телефонию, у получателя определяется номер телефона офиса, и он перезванивает. Запрос ниже выдает сразу номер телефона курьера, с которым нужно соединить.
SELECT k.code, k.name, k.`phonem`, k.`phonek` FROM contacts c JOIN givn g ON g.address=c.Source JOIN kurier k ON k.code=g.`kurier` WHERE c.SourceCodeType=3 /*Контакты именно получателей*/ AND g.State=1 /*Статус "На руках у курьера"*/ AND c.VALUE='79161234567' /*Вот тут нормированный телефон звонящего ИМЕННО в таком формате*/
- Звонит курьер, нужно его соединить с менеджером. Запрос вернет внутренний номер менеджера курьера:
SELECT k.code, k.name, u.extPhone AS managerext FROM contacts c JOIN kurier k ON k.code=c.Source JOIN users u ON u.`user`=k.`manager` WHERE c.SourceCodeType=1 /*Контакты именно курьеров*/ AND c.VALUE='79161234567' /*Вот тут нормированный телефон звонящего ИМЕННО в таком формате*/
- Звонит клиент, нужно его соединить с менеджером. Запрос вернет внутренний номер менеджера клиента, а так же статус клиента. Запрос очень упрощен. По-хорошему надо в первую очередь смотреть контакты не столько привязанные к клиентам, сколько к их контактным лицам (таблица fio, код 39).
SELECT k.code, k.company, u.extPhone AS managerext, c.State FROM contacts c JOIN clients k ON k.code=c.Source LEFT JOIN users u ON u.`user`=k.`manager` WHERE c.SourceCodeType=2 /*Контакты именно клиентов*/ AND c.VALUE='79161234567' /*Вот тут нормированный телефон звонящего ИМЕННО в таком формате*/
- Определить просто отправление из тех, что в работе. Возвращает данные отправления, заказа и клиента
SELECT * FROM contacts c JOIN address a on a.code=c.Source join zakaz b on a.zakaz=b.code join clients k on k.code=b.source WHERE c.SourceCodeType=3 /*Контакты именно получателей*/ AND a.date_put is null /*Заказ в работе, не закрытый*/ AND c.VALUE='79161234567' /*Вот тут нормированный телефон звонящего ИМЕННО в таком формате*/
Конечно, при желании можно все это объединить в один запрос, и гораздо быстрее за одно действие получить информацию о том, кто это звонит, и что с ним надо делать. Здесь приведены только шаблонные запросы. В общих словах - таблица contacts содержит все индексированными контактные данные из всех таблиц системы (ну, из большинства). И все обращения за поиском по телефону должны заходить именно с нее. Коды таблиц для поля SourceCodeType можно посмотреть в таблице schema.table_list.