Asterisk без внешних компонент?

03.05.13

Функциональные - Управление взаимоотношениями с клиентами (CRM)

Да, не вопрос! Причем, это делается просто до безобразия! И сейчас, мы с этим  безобразием разберемся. К тому же, у безобразия есть нюансы. Заодно, разберемся с особенностями AMI поверх HTTP.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
AJAM
.epf 12,88Kb
232
232 Скачать (1 SM) Купить за 1 850 руб.

Будет много текста, да еще и без картинок. Заранее благодарен тем, кто дочитает статью до конца. Постараюсь как минимум не быть нудным :-)

 

Раздел для тех, кто не в теме.

 

Кто уже читал мои предыдущие статьи и знает про AMI (Asterisk Manager Interface) и AJAM, может смело пропустить этот раздел.

AMI – это интерфейс управления Asterisk-ом. Но, подключения к AMI, как и девушки, бывают разные. Два основных:

  1. AMI поверх TCP, который часто называют просто AMI
  2. AMI поверх HTTP, его еще называют AJAM (Asynchronous Javascript Asterisk Manager). Хотя, особой асинхронности я там не увидел.

Если объяснять на пальцах, то разница между 1 и 2, как между толстым и веб-клиентом. Ссылка для тех, кто-то хочет накуриться правильных английских мануалов.

Внешняя компонента ROM-Asterisk может использовать оба способа подключения.
Внешняя компонента от МИКО использует только AJAM.
Но нам, они пока не нужны – мы будем подключаться без них.

 

Настройка AJAM на стороне Asterisk

 

Ребята из МИКО написали хорошую статью о том, как выполнить настройку AJAM в Asterisk. Вдаваться в детали настройки мы не будем, это больше для админа, дайте ему ссылку, пусть настраивает.

 

Кодировщики AJAM

 

Что еще нам нужно знать про AJAM? В нем есть разные типы кодировщиков ответов:

  1. rawman – самый простой, которым мы и будем пользоваться
  2. arawman – тоже самое, что и rawman, плюс использование более навороченной HTTP-digest аутентификации с MD5-хешами
  3. mxml – ответы сервера кодируются в XML
  4. manager – кодирует ответы в простые HTML-формы. Этот кодировщик годится разве что на побаловаться вначале

Схема работы с AJAM

 

Те, кто уже работал с HTTP-сервером, этот раздел могут пропустить.
Важно понимать, что мы работаем с HTTP-сервером. Понятно, что сразу после получения нами HTTP-ответа, сервер разорвет соединение.

Схема будет такой: Connect -> Запрос -> Ответ -> Disconnect

Если хочется еще что-то спросить у Asterisk-а, тогда добро пожаловать в новую итерацию. Это вам не AMI поверх TCP, когда можно 1 раз «зацепиться» за сервер и просто слушать события.

 

Алгоритм наших действий

 

Не менее важно понимать сам алгоритм наших действий. По шагам:

  1. Устанавливаем HTTP-соединение
  2. Авторизуемся. При удачной авторизации, сервер вернет нам Cookie, который мы прихраним для использования в следующем HTTP-запросе
  3. Выполняем нужный нам HTTP-запрос, обновляем Cookie.

Реализация

 

Считаем, что админ уже все настроил и можно приступать.
Все, что нам нужно – это HTTPСоединение и ровные руки, чтобы отправлять ровные запросы.

Код работы с Asterisk настолько тривиальный, что его нет смысла здесь приводить. Все сводится к элементарной отправке и чтению HTTP-запросов. Не верите? Смотрите сами:

Организация соединения:

Соединение=Новый HTTPСоединение(IP,Port,,,,Таймаут,);

Отправка и чтение запроса:

ТекстКоманды="/asterisk/rawman?action=…бла-бла-бла";
Запрос=Новый HTTPЗапрос();
Запрос.АдресРесурса=ТекстКоманды;
Ответ=Соединение.Получить(Запрос);

Это все :)

 

Ложка дегтя

 

Когда мы сами являемся источником события, то все вроде бы как хорошо. А вот, когда мы являемся потребителями и хотим просто слушать, то не все так гладко.

Перефразируя мем «нельзя просто так взять и получать события по AJAM». При работе через AJAM нам нужно будет периодически задалбывать HTTP-сервер запросами типа «Сервер, там для меня случайно нет событий?».

Допустим, нам нужно получить инфу о том, что на нас идет входящий звонок. Тогда нам нужен какой-то обработчик ожидания, который периодически будет опрашивать HTTP-сервер.

Именно для такого случая, придумали AMI-команду WaitEvent. Она делает следующую вещь - говорит Asterisk-у: «Мол, я тут событие жду. Не разрывай пож-та соединение пока оно не придет. Я готов ждать максимум 30 секунд». Asterisk конечно же так и поступит.

Но, все это время, пока мы ждем событие, наш HTTP-запрос будет находиться в «висячем» состоянии и клиентское окно 1С будет выглядеть зависшим.

  1. Пользователю, независимо от пола, «висячее» состояние вряд ли понравится
  2. Сервер тратит свои ресурсы на поддержание открытой сессии

Вы спросите, а может делать частые HTTP-запросы, допустим каждые 10 секунд, с таймаутом ожидания 10 секунд?
Может быть… Я же не знаю вашей нагрузки на Asterisk и на 1С.
ИМХО, здесь важно найти оптимальный баланс - и сервер не задолбать, и не пропустить важное событие AMI.

 

И что с этим делать?

 

Думаю, нужно подбирать решение по конкретной ситуации. Обращайтесь – помогу, если смогу.

В качестве абстрактных рекомендаций, могу сказать следующее:

  1. Ищите, тестируйте и найдете. Весь инструмент во вложенной к статье обработке. Поиграйтесь с частотой запросов и с таймаутом ответа.
  2. Пофильтруйте события – хотя бы уберите лишние классы событий. Об этом написано в других моих статьях.

Если пользователь использует толстый клиент, то скорее всего, он сидит внутри сети. Тогда нечего заморачиваться, можно использовать обычный AMI через TCP. Подключаем этого пользователя через ROM-Asterisk и пусть себе работает.

Если пользователь использует тонкий клиент и сидит внутри сети, тогда тоже самое – AMI поверх TCP и ROM-Asterisk. Кстати, тонкому клиенту удаленному, но с хорошим каналом, это тоже подойдет.

Если пользователь использует веб-клиент или же тонкий клиент на нестабильном канале, тогда однозначно AJAM.

 

Небольшой хак

 

Если у пользователя НЕ веб-клиент, но вы хотите использовать именно AJAM, а не AMI, тогда могу вам дать хорошую подсказку, как уйти от «висячего» HTTP-запроса.

Вместо объекта HTTPСоединение можно использовать соединение ROM-Asterisk, а вместо объекта HTTPЗапрос использовать метод ВыполнитьКоманду. В этом случае, подмерзания не будет – ответ придет асинхронно, как внешнее событие. Вы отдали команду и забыли, когда придет ответ – Asterisk вам сам скажет.
Выложу реализацию этого хозяйства в отдельной статье.

 

Выводим выводы

 

Подключаться к AJAM без внешних компонент можно и это совершенно не сложно. Хотя, с точки зрения производительности, это не всегда оптимально. Иногда вместо HTTP-соединения, правильнее использовать соединение по TCP. Может в будущем в 1С появится объект TCPСоединение, а пока для этого нужны внешние компоненты.

Использовать AJAM лучше там, где это действительно нужно. Если можно использовать AMI поверх TCP – используйте, с ним проще. На нем можно делать всякие потрясающие штуки. Зато, AJAM – отличное решение для веб-клиента или плохих каналов.

К статье приложена внешняя обработка AJAM, которая будет работать как в режиме управляемого приложения, так и в обычном режиме.

Успешной вам разработки!

См. также

Управление взаимоотношениями с клиентами (CRM) Оптовая торговля Розничная торговля Пользователь Платформа 1С v8.3 Оперативный учет Управляемые формы 1С:Управление торговлей 10 1С:Розница 2 Россия Управленческий учет Платные (руб)

Подсистема призвана упростить и автоматизировать процесс расчета и начисления бонусов покупателей. Бонусная система работает с конфигурациями 1С:УТ 10.3, 1С:Розница. Механизм реализован в начале 2013г. и работает до сих пор с постоянными совершенствованиями.

30000 руб.

02.11.2015    112270    102    87    

185

Управление взаимоотношениями с клиентами (CRM) Управление маркетингом (EMM) Пользователь Платформа 1С v8.3 Управленческий учет Платные (руб)

Решение 1С:CRM 3.0 предназначено для компаний с потребностью совместной работы более 5 пользователей в единой информационной базе. Решение позволяет автоматизировать все бизнес-процессы компании в соответствии с концепцией CRM, включая закупки, продажи, маркетинг, сервисное обслуживание и пр.

9700 руб.

10.11.2015    43163    29    1    

17

Рабочее место Управление взаимоотношениями с клиентами (CRM) Оптовая торговля Розничная торговля Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Данная обработка - удобный инструмент в 1С для менеджеров по продажам для повседневной работы с клиентами. Позволяет упростить весь цикл работы с клиентом: первичная консультация по наличию товара, быстрое оформление нового заказа, контроль исполнения заказов. Обработка будет особенно актуальна для компаний, работающих, в основном, с юридическими лицами.

18000 руб.

08.11.2016    61152    39    23    

61

Телефония, SIP Платформа 1С v8.3 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Модуль интеграции с виртуальной телефонией Новофон для решения 1С:Управление нашей фирмой, редакция 3.0. Обновление релиза в связи с переходом на API 2.0 поставщиком сервиса. Бета-версия 2.0 до окончания перехода поставщиком на новую версию.

12000 руб.

26.02.2024    945    1    0    

2

Разработка внешних компонент Телефония, SIP Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

2400 руб.

04.05.2018    46783    122    66    

66

Управление взаимоотношениями с клиентами (CRM) Производство готовой продукции (работ, услуг) Учет рабочего времени Пользователь Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 11 Автомобили, автосервисы Управленческий учет Платные (руб)

Модуль для автоматизации СТО, служащий для планирования записи клиентов на посты (ямы и т.д) на базе УТ 11. Включает в себя Подсистему "СТО", обработку "Планирование СТО", справочник "Посты СТО" и регистр сведений "Резервирование времени СТО". Все остальные объекты полностью типовые.

4800 руб.

04.07.2018    25744    12    5    

14
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. asved.ru 36 08.05.13 09:22 Сейчас в теме
А WaitEvent можно отправить в фоновое задание.
3. oleg.rizvanov 261 08.05.13 13:16 Сейчас в теме
(1) asved.ru,
Наверное можно. Всегда считал, что фоновое задание выполняется на стороне сервера, а нам вроде как надо клиенту результат отдать...
Не до конца понимаю, как фоновое задание использовать для данной задачи? Приведете пример?
VasDmi666; +1 Ответить
5. asved.ru 36 08.05.13 13:35 Сейчас в теме
(3) честно говоря, разбираться некогда, суть в том, что этим мы избежим "зависания" на стороне пользователя. Правда, инициализировать проверку результата все равно придется со стороны клиента, через ОбработкаОжидания(), к примеру. Но это уже в рамках 1С, что, я полагаю, существенный плюс.
6. oleg.rizvanov 261 08.05.13 13:51 Сейчас в теме
(5) asved.ru,
А в именно чем плюс? Какая разница кого периодически опрашивать HTTP-сервер или 1С-сервер?
Тогда уже лучше не париться с родным объектом HTTPСоединение, а использовать XMLHTTPRequest
2. zfilin 2352 08.05.13 12:13 Сейчас в теме
Хотел тебе ссылку отправить, мол, смотри какая крутецкая статья по Asterisk. А это ты ее и написал. =)))
4. oleg.rizvanov 261 08.05.13 13:16 Сейчас в теме
(2) zfilin,
Привет, Саша. Стараюсь для сообщества :)
7. shmellevich 136 10.05.13 13:19 Сейчас в теме
Если пользоваться
Ответ=Соединение.Получить(Запрос);
для получения ответа от сервера, то нужно автору уточнить, что версия платформы должна быть не ниже 8.2.18, ибо только в этом релизе уже есть HTTPОтвет.
8. oleg.rizvanov 261 10.05.13 14:00 Сейчас в теме
(7) shmellevich,
Да, действительно, этот момент я как-то упустил.
Спасибо за важное уточнение.
9. shmellevich 136 10.05.13 14:25 Сейчас в теме
(8)
Пожалуйста, конструкция сразу глаз начала резать ;)
К хорошему быстро привыкаешь, тестил 8.3, да так увлекся, что начал теряться, где что работает )))
10. oleg1979 33 01.08.13 12:45 Сейчас в теме
Подскажите пожалуйста, можно ли в 1С 8.2 при дозвонке на какой либо номер через Asterisk определять статусы звонков "занято", "нет ответа", "трубка поднята"?
11. oleg.rizvanov 261 01.08.13 13:34 Сейчас в теме
(10) oleg1979,
Можно. Поднимите ветку с этим вопросом в форуме Simplit - вам ответят
12. Aspirant 4 30.01.14 18:35 Сейчас в теме
когда будет кросс платформенное решение ? Очень хочется на линукс пересесть..
13. Aspirant 4 04.02.14 14:33 Сейчас в теме
еще какой командой можно выцепить имя файла записи разговора?
14. Aspirant 4 13.02.14 12:12 Сейчас в теме
в веб клиенте не получится? Там не работает HTTPСоединение
15. oleg.rizvanov 261 13.02.14 19:23 Сейчас в теме
(14) Aspirant,
Для веб-клиента этот объект недоступен. Попробуйте обойти через сервер.
16. RustIG 1747 14.06.16 16:23 Сейчас в теме
(0) подскажите, пож-та, скачал вашу обработку, при указании айпи-адреса, логина и пароля, не логинится сервер. выдается ошибка
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
<hr />
<address>Asterisk Server</address>
</body></html>
17. kuzz 17.12.16 05:48 Сейчас в теме
(16) Добрый день! Получаю такую же ошибку. Удалось ли решить проблему?
18. RustIG 1747 19.12.16 21:23 Сейчас в теме
(17) ее решил сисадмин, который настраивал ами
19. kuzz 20.12.16 03:06 Сейчас в теме
(18) Спасибо! Да, верно. Эта ошибка, всего навсего, вызвана отсутствием доступа к сервису AJAM на стороне сервера. Требовалось корректно настроить сервер
20. Zixxx 26.01.17 19:49 Сейчас в теме
А как организована запись звонка, и получение его по какому-то идентификатору?
21. Denanhel 14.11.18 19:34 Сейчас в теме
Ризванову огромный респект. Данна публикация позволила организовать полноценную конфигурацию для колл-центра. Причем, что примечательно без всяких внешних компонент. Именно колл-центр только звонки, только хардкор. Всем советую обратить внимание на следующую страницу http://wiki.simplit.info/doku.php/doc/ami/action . Все методы работают так что получите и распишитесь.
22. user986187 15.12.19 13:22 Сейчас в теме
Здравствуйте, интересует вопрос интеграции 1С УНФ с астериск (FREE PBX).
Как с вами связаться.
wrofdt@ya.ru
23. kap2 24.11.21 11:56 Сейчас в теме
Здравствуйте. Можно ли с помощью вашей обработки рассылать СМС из Asterisk?
24. asdPerepel 12 08.08.24 16:11 Сейчас в теме
Здравствуйте.
Получаю в вашей обработке ошибку-

Ошибка при вызове метода контекста (Получить)
{ВнешняяОбработка.AJAM1.Форма.Обычная.Форма(34)}: Ответ=Соединение.Получить(Запрос);
по причине:
Ошибка работы с Интернет: Unsupported protocol

Что это значит?
25. asdPerepel 12 26.08.24 12:22 Сейчас в теме
(24) Сам себе отвечу. В астериск не включен HTTP интерфейс. Нужны дополнительные настройки астериска. Всё заработало.
Оставьте свое сообщение