Связь asterisk и 1с, внешняя компонента

Подготовка окружения

Запускаем на исполнение скрипт dialplan_miko_ajam/install_scripts/create_db.sh

cd /usr/src/dialplan_miko_ajam;
sh install_scripts/create_db.sh username password
  • username — имя пользователя MySql.
  • password — пароль пользователя MySql.

После этих действий будет создана база данных с именем asteriskcdrdb. В базе данных будут созданы две таблицы PT1C_cdr и cel. При создании обязательно выполняется проверка «IF NOT EXISTS».

Опубликуем скрипты на web сервере

mkdir /var/www/admin;
mkdir -p /var/spool/asterisk/fax/;
cd /usr/src/dialplan_miko_ajam;
cp -R 1c /var/www/admin;

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

  • «1c/cdr_xml/index.php» — получение истории звонков для модуля «Расширенный журнал звонков».
  • «1c/cel_xml/index.php» — получение расширенной истории звонков для модуля «Расширенный журнал звонков».
  • «1c/download/index.php» — скачивание с АТС файла записи разговора.
  • «1c/upload/index.php» — загрузка на АТС файла факса в PDF / TIFF формате.

После этих действие указанные ресурсы должны быть опубликованы на сервере, в моем случае на порту 80.
Для проверки просто откройте ссылку:

http://ip_adress_asterisk:80/admin/1c/upload/index.php

Получите ответ:

Upload failed. File not found!

Это вполне нормальный ответ. Для реальной проверки загрузки файла факса следует использовать команду:

curl -F "file=@virtualfax.pdf" 'http://ip_adress_asterisk:80/admin/1c/upload/index.php'

Должны существовать директории:

  • «/tmp/» — для временных файлов. Web сервер должен иметь права на чтение / запись.
  • «/var/spool/asterisk/fax/» — директория файлов факсов. Web сервер должен иметь права на чтение / запись. Asterisk должен иметь правка на чтение.

В текущей директории должен лежать файл virtualfax.pdf. В случае успеха будет выведено сообщение:

File virtualfax.pdf upload success.

Обратите внимание: ресурс «80/admin/1c/upload/index.php» используется как параметр FaxSendUrl в приложении dailplan 10000111 и возвращается в 1С с прочими настройками.

Обратите внимание: ресурс «80/admin/1c/download/index.php» используется как параметр ${port}/${path} в приложении dailplan .

Extensions

extensions.conf
 

; Необходимо описать параметры подключения к базе данных MySQL
AMPDBENGINE=mysql
AMPDBNAME=asteriskcdrdb
AMPDBHOST=127.0.0.1
AMPDBUSER=root
AMPDBPASS=123 ; пароль пользователя базы данных MySQL

; Установите контекст для переадресаций.
; Панель телефонии будет его использовать при переводах. 
TRANSFER_CONTEXT=internal


; ОБЯЗАТЕЛЬНО включите контекст парковки в те контексты,
; которые используют SIP учетные записи телефонов сотрудников;
include => parkedcalls


; необходимо описать хинты для отслеживания состояния каналов 
exten => 231,hint,SIP/160-231 ;231 - добавочный номер; 160-231 - имя учетной записи SIP (sip.conf) 
exten => 232,hint,SIP/232     ;232 - добавочный номер; 232 - имя учетной записи SIP (sip.conf)


; ... пример контекста описан в файле 
; "dialplan_miko_ajam/test_sample_configs/extensions.conf"


; ... пример контекста описан в файле 
; "dialplan_miko_ajam/test_sample_configs/extensions.conf"


; Пример входящего контекста

exten => _X!,1,NoOp(--- Incoming call ---)
  ; Для определения внешней линии (модуль статистики)
  same => n,Set(__FROM_DID=${EXTEN}); EXTEN - номер, на который звонит клиент
  same => n,Set(__FROM_CHAN=${CHANNEL}); Канал клиента 
  same => n,Set(CDR(did)=${FROM_DID})
  ; Для работы функции перехвата нужно вызвать UserEvent "Interception"
  same => n,UserEvent(Interception,CALLERID: ${CALLERID(num)},chan1c: ${CHANNEL})
  ; далее произвольный dialplan для обработки входящего звонка

Запись разговоров

При настройке записи разговоров, в поле таблицы CDR «recordingfile» должно сохраняться имя файла записи разговора.

Путь к файлу записи должен указываться относительно директории «/var/spool/asterisk/monitor/. В дальнейшем скрипт
«dialplan_miko_ajam/1c/download/index.php» будет производить поиск записи именно в этой директории.

Пример реализации записи разговоров:

exten => 1000,n,Set(RecFile=${STRFTIME(${EPOCH},,%Y-%m/%d)}/in_${CDR(src)}_${STRFTIME(${EPOCH},,%Y-%m-%d-%H-%M-%S)}.gsm)
exten => 1000,n,Set(CDR(recordingfile)=${RecFile})
exten => 1000,n,MixMonitor(${RecFile})

Факсы

При отправке / получении факсимильных сообщений необходимо фиксировать эту информацию.

; при отправке
exten => h,n,Set(CDR(recordingfile)=${faxfile})
exten => h,n,Set(CDR(userfield)=SendFAX)
; при получении 
exten => h,n,Set(CDR(recordingfile)=${faxfile})
exten => h,n,Set(CDR(userfield)=ReceiveFAX)

Путь к файлу записи должен указываться относительно директории «/var/spool/asterisk/fax/. В дальнейшем скрипт
«dialplan_miko_ajam/1c/download/index.php» будет производить поиск записи именно в этой директории.

Переадресация на мобильный

На текущий момент функция может работать только с АТС Askozia 5 и более ранних версиях.

Для настройки функции в собственной сборке asterisk потребуются правки со стороны панели телефонии в 1С.

Пример dialplan (extensions,conf) для внутреннего номера 104:

exten => 104,1,Set(dstnum=${EXTEN});
exten => 104,n,Set(fw=${DB(CF/${dstnum})})
exten => 104,n,Set(dstcontext=internal)
exten => 104,n,ExecIf($?Goto(${dstcontext},${fw},1)

exten => 104,n,Dial(SIP/${EXTEN},20,Tte)
exten => 104,n,Hangup

exten => 74922293045,1,Dial(SIP/TEST-PROVIDER/${EXTEN},20,Tte)

Теперь детальнее:

; Для того, чтобы поместить в базу данных Asterisk 
; информацию о заменяющем номере можно выполнить команду:
; database put CF 104 74922293045
; Команду можно выполнить в CLI консоли Asterisk
; Аналог этой команды выполняет панель телефонии для 1С при установке статуса "Отошел" / "На мобильном". 

; Определяем номер, на который осуществляется вызов.
Set(dstnum=${EXTEN}); Номер назначения, к примеру внутренний номер сотрудника. 
; Получаем значение резервного номера из AstDB
Set(fw=${DB(CF/${dstnum})})
; Устанавливаем контекст назначания. В нем должен быть определен "fw" - резервный номер.
Set(dstcontext=internal)

; Если полученное значение не пустое, то выполняем переадресацию в контекст назначения:
ExecIf($?Goto(${dstcontext},${fw},1)

; Согласно текущему примеру, в контексте internal должен быть определен exten 74922293045.
; Проверка
; dialplan show 74922293045@internal

Настройка Asterisk Manager API

Во первых необходимо создать пользователя для управления asterisk.
Для этого достаточно внести соответствующую запись в /etc/asterisk/manager.conf, в примере ниже добавлен пользователь 1cami с паролем PASSWORD1cami.
Важно также в секцию general добавить опции указанные в примере.

manager.conf
enabled = yes
port = 5038
bindaddr = 0.0.0.0
allowmultiplelogin = yes
webenabled = yes
httptimeout = 60

 
secret = PASSWORD1cami
deny=0.0.0.0/0.0.0.0
permit=0.0.0.0/0.0.0.0
read = call,cdr,user,config
write = call,originate,reporting

;;; Дополнительные опции для ASTERISK 11+ ;;; Начало ;;;;
eventfilter=!Event: Newexten
eventfilter=!Event: DeviceStateChange
eventfilter=!Event: NewConnectedLine
eventfilter=!Event: Newchannel
eventfilter=!Event: SoftHangupRequest
eventfilter=!Event: HangupRequest
eventfilter=!Event: BridgeDestroy
eventfilter=!Event: BridgeCreate
eventfilter=!Event: BridgeMerge
eventfilter=!Event: MusicOnHoldStop
eventfilter=!Event: MusicOnHoldStart
eventfilter=!Event: NewCallerid
eventfilter=!Event: LocalBridge
eventfilter=!Event: Unhold
eventfilter=!Event: Hold
eventfilter=!Event: AttendedTransfer
;;; Дополнительные опции для ASTERISK 11+ ;;; Конец ;;;;

Обратите внимание на строки фильтра:

eventfilter=!Event: Newexten

Они актуальны для Asterisk 13. Эта настройка крайне необходима!!!

Команда register.

Когда ip адрес клиента типа user неизвестен, пользователь типа peer не знает, куда совершать вызов (например, при вызове из офиса сотрудника, который работает на дому, когда у него имеется только динамически назначаемый ip адрес или он находиться за NAT.) Для решения этой задачи, домашний работник активно регистрируется на сервере в офисе, предоставляя свои данные и местоположение в сети.

register => user:password@hostname.domain.ext

При этом непрерывно, через некоторые интервалы, будет обновляться информация о пользователе, и сервер всегда будет знать, как вызвать пользователя, даже если его IP адрес будет меняться.

~~socialite~~

Manager Asterisk

Необходимо перейти в интерфейс модуля

Указать имя / пароль менеджера, указать разрешенные / запрещенные сети:

В примере параметр «Разрешены» (Permit) установлен в значение 0.0.0.0/0.0.0.0 (разрешено подключаться под всеми сетевыми адресами).

Установите значения привилегий:

Не устанавливайте полные права для учетной записи! Больше — не значит лучше!

Современные версии FreePBX используют Asterisk 11+. Для этих версий asterisk необходимы выполнить дополнительные настройки manager AMI.

  1. Подключитесь к ПК c АТС по ssh
  2. Создайте новый файл

    touch /etc/asterisk/manager_custom_level_2.conf
  3. Предоставьте права доступа на чтение:

    chmod +r /etc/asterisk/manager_custom_level_2.conf
  4. В файл manager_custom_level_2.conf добавьте дополнительные опции для менеджера 1cami

    (+) 
    ;;; Дополнительные опции для ASTERISK 11+ ;;; Начало ;;;;
    eventfilter=!Event: Newexten
    eventfilter=!Event: DeviceStateChange
    eventfilter=!Event: NewConnectedLine
    eventfilter=!Event: Newchannel
    eventfilter=!Event: SoftHangupRequest
    eventfilter=!Event: HangupRequest
    eventfilter=!Event: BridgeDestroy
    eventfilter=!Event: BridgeCreate
    eventfilter=!Event: BridgeMerge
    eventfilter=!Event: MusicOnHoldStop
    eventfilter=!Event: MusicOnHoldStart
    eventfilter=!Event: NewCallerid
    eventfilter=!Event: LocalBridge
    eventfilter=!Event: Unhold
    eventfilter=!Event: Hold
    eventfilter=!Event: AttendedTransfer
    ;;; Дополнительные опции для ASTERISK 11+ ;;; Конец ;;;;
  5. Чтобы изменения вступили в силу выполните команду:

    asterisk -rx'manager reload'

Добавление операторов к очереди (агентов)

Пользователей, которые отвечают на звонки очереди называют агентами или операторами. Есть два типа агентов — статические и динамические. Первые прописываются в конфигурационном файле queues.conf, вторые — могут присоединятся к очереди, становясь на некоторое время оператором.

Статические агенты

Для создания статического оператора, открываем конфигурационный файл очереди:

vi /etc/asterisk/queues.conf

В настройках очереди добавляем:

strategy = ringall
member => SIP/101,1

* в данном примере, мы добавили оператора к нашей очереди. Это sip агент с именем 101. 1 на конце — пенальти (используется для выставления приоритета при использовании некоторых стратегий).

Перечитываем все конфигурационные файлы:

asterisk -x «core reload»

Динамические агенты

Динамические агенты могут присоединиться к очереди в любой момент набором специального сочетания кнопок на телефонном аппарате. Настройка сервера выполняется в конфигурационном файле диалплана:

vi /etc/asterisk/extensions.conf

exten => *999#,1,Verbose(2,Adding dynamic member to support queue)
 same => n,Set(MemberInfo=${CHANNEL(channeltype)}/${CHANNEL(peername)})
 same => n,AddQueueMember(support,${MemberInfo})
 same => n,Playback(agent-loginok)
 same => n,Hangup()
exten => *888#,1,Verbose(2,Removing dynamic member from support queue.)
 same => n,Set(MemberInfo=${CHANNEL(channeltype)}/${CHANNEL(peername)})
 same => n,RemoveQueueMember(support,${MemberInfo})
 same => n,Playback(agent-loggedoff)
 same => n,Hangup()

* в данном примере, если агент набирает *999#, он присоединяется к очереди и может принимать вызовы. При наборе *888# агент выходит из очереди.
* Verbose — вывод в консоль информации; Set — задает значение переменной, в данном примере, MemberInfo; AddQueueMember/RemoveQueueMember — соответственно, добавляет к очереди агента и удаляет из нее; Playback — проигрывает голосовой сигнал; Hangup — дает сигнал отбоя.

Аутентификация агентов

1. Общий пароль для всех агентов

Можно сделать так, чтобы Asterisk требовал от агентов ввод пароля для присоединения к очереди. Для этого наш диалплан приводим к такому виду:

vi /etc/asterisk/extensions.conf

exten => *999#,1,Verbose(2,Adding dynamic member to support queue)
 same => n,Authenticate(1234)
 same => n,Set(MemberInfo=${CHANNEL(channeltype)}/${CHANNEL(peername)})
 same => n,AddQueueMember(support,${MemberInfo})
 same => n,Playback(agent-loginok)
 same => n,Hangup()

* где Authenticate — запрос пароля, в данном примере, 1234.

2. Индивидуальные пароли для каждого агента

Если необходимо, чтобы каждый агент перед входом вводил свои номер и пароль, необходимо воспользоваться приложением VMAuthenticate (аутентификация по электронному почтовому ящику). Настройку начнем с правки диалплана:

vi /etc/asterisk/extensions.conf

exten => *999#,1,Verbose(2,Adding a member to the cc_ege_support queue.)
 same => n,Read(AGENT_USERID,agent-user)
 same => n,VMAuthenticate(${AGENT_USERID}@vmauth)
 same => n,Set(MemberInfo=${CHANNEL(channeltype)}/${CHANNEL(peername)})
 same => n,AddQueueMember(support,${MemberInfo})
 same => n,Playback(agent-loginok)
 same => n,Hangup()

* Read — запрашиваем данные у агента (agent-user — голосовой файл), и записываем в переменную AGENT_USERID; VMAuthenticate — запрашиваем пароль для почтового ящика ${AGENT_USERID} с контекстом vmauth.

Добавляем почтовые ящики:

1001 => 1234, dmosk, dmosk@example.com
1002 => 5678, dmosk2, dmosk2@example.com

* vmauth — контекст (его мы указали в диалплане); 1001/1002 — номера агентов; 1234/5678 — пароли.

Для применения настроек перечитываем диалплан:

asterisk -x «dialplan reload»

Демо-пример

В демо-примере реализовано самое необходимое и оформлено в виде внешней обработки «ПанельТелефонии» в режиме обычного приложения.

Обработка содержит множество готовых функций. Например, функция преобразования текстовых пакетов в объект Соответствие.

Есть пример обработчиков для событий Dial, Bridge, Hungup. Написать свой обработчик не составит особого труда — просто смотрите пример.

На примере функции Звонить() показано каким образом можно отдавать команды Asterisk-у. Команда Originate, используемая в примере — это всего лишь одна из множества команд, которые вы сможете использовать для управления Asterisk.

Настройка доступа со стороны Asterisk описана в статье «1С+Asterisk. Пример интеграции» Книга знаний: 1С+Asterisk;

Основные функциональные возможности программы

  • Работа с Asterisk Manager Interface (AMI) по протоколу AJAM;
  • Поддержка SSL-шифрования, Basic и Digest аутентификации;
  • Компонента является удобным интерфейсом для доступа к AMI Asterisk из программ «1С: Предприятие»;
  • Реализована поддержка 101 функции AMI Asterisk, к которым можно обращаться из программ «1С: Предприятие»;
  • Компонента работает в серверном, толстом, тонком и веб-клиенте «1C: Предприятия 8»;
  • При входящем звонке или изменении состояния АТС Asterisk, компонента вызывает внешнее событие в «1С: Предприятие». При работе в серверном режиме компонента отправляет SOAP-запрос на опубликованный веб сервис;
  • Возможность отправки произвольного файла в специализированную защищенную папку на сервере Asterisk, например, для передачи факсимильного сообщения из «1С:Предприятие»

Внешняя компонента «SDK: Компонента связи 1C и Asterisk» разработана по технологии внешних компонент «NativeAPI».

Технология Native API – собственный интерфейс системного программирования 1С:Предприятия 8. Она поддерживает операционные системы Windows и Linux, и дает возможность создавать внешние компоненты, работающие как под одной, так и под другой операционной системой. Компоненты, созданные по технологии Native API, могут быть подключены в толстом клиенте, в тонком клиенте, в веб-клиенте, внешнем соединении и в сервере приложений.

В состав продукта входит компонента связи «1С: предприятие» и Asterisk, демонстрационная обработка для тестирования в толстом клиенте и режиме управляемого приложения, расширения для работы в браузерах Internet Explorer и Mozilla Firefox, лицензия на 10 рабочих сеансов.

Внешняя компонента «SDK: Компонента связи 1C и Asterisk» не является самостоятельной, для ее работы необходимо наличие установленной платформы «1С: Предприятие 8» и сервера телефонии Asterisk.

«SDK: Компонента связи 1C и Asterisk» лицензируется по количеству активных сеансов. Для защиты от несанкционированного использования применяется программный или электронный USB-ключ защиты Sentinel HASP. При отсутствии ключа защиты программа работает без каких-либо ограничений в течение 30 дней с момента первого запуска.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *