Внимание!
Эта wiki об устаревших версиях
Документация к актуальной версии интеграции 1С и телефонии доступна по ссылке

Инструменты пользователя

Инструменты сайта


doc:panel1ccrm:asterisk_config

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
doc:panel1ccrm:asterisk_config [2012/02/07 11:27]
pvin
doc:panel1ccrm:asterisk_config [2014/11/14 22:32] (текущий)
Строка 1: Строка 1:
-====== Настройка сервера ASTERISK для работы с панелью телефонии 1C:CRM ====== +====== Настройка сервера ASTERISK для работы с панелью телефонии 1C ====== 
-===== Настройка ajam интерфейса ===== +Если вы используете Asterisk АТС, ​то необходимо произвести дополнительные настройки для ​полноценной ​работы панели телефонии
-Настройка ajam интерфейса подробно описана в разделе ​[[doc:​1cajam:​astcastomize|Настройка сервера Asterisk ​для работы ​с компонентой]].+
  
-===== Настройка дополнительного диалплана ​для получения истории звонков =====+Также можно заказать преднастроенный образ в виде виртуальной машины или готового дистрибутива [[http://​www.askozia.ru/​|АТС Askozia]]. 
 +Пример ​подключения ​АТС Askozia к Панели телефонии Asterisk ​описан в [[http://​www.telefon1c.ru/​blogs/​askozia/​askozia-2-connecting-the-telephony-asterisk/​ |блоге]].
  
-==== Источник истории звонков база данных MYSQL ==== +Для остальных сборок Asterisk необходимо ​выполнить следующие настройки. 
-В панели реализована функция получения истории звонков с сервера asterisk, путем генерации вызова с номера 999 на номер 555 используя приведенный ниже диалплан. +{{page>astpanel:ats:asterisk#​nastrojki_dialplanov_i_ajam_interfejsa}}
- +
-<file - extensions_miko.conf>​ +
-[mikoajamdll] +
-exten => 999,​1,​NoCDR() +
-exten => 999,​n,​Answer() +
-exten => 999,​n,​Wait(60) +
-exten => 999,​n,​Hangup() +
- +
-exten => 555,​1,​NoCDR() +
-exten => 555,​2,​Set(num=0) +
-exten => 555,​3,​Set(chan=${v1}) +
-exten => 555,​4,​Set(date1=${v2}) +
-exten => 555,​5,​Set(chanmob=${v3}) +
-exten => 555,​6,​Set(dbname=${v4}) +
-exten => 555,​7,​Set(user=${v5}) +
-exten => 555,​8,​Set(password=${v6}) +
-exten => 555,​9,​Set(packet=20) +
-exten => 555,​10,​Answer() +
-exten => 555,​11,​System( mysql -sse '​SELECT calldate,​src,​dst,​channel,​dstchannel,​billsec,​disposition,​uniqueid,​userfield,​recordingfile,​lastapp FROM cdr WHERE  lastapp="​Dial"​ AND calldate Like ${QUOTE(${date1}%)} AND (dstchannel Like ${QUOTE(${chan}%)} OR channel Like ${QUOTE(${chan}%)} OR dstchannel Like ${QUOTE(${chanmob}%)} OR channel Like ${QUOTE(${chanmob}%)}) ' -u${user} -p${password} ${dbname}>​ /​var/​log/​asterisk/​cdr-csv/​${UNIQUEID}) +
-exten => 555,​12,​Set(kls=${SHELL(cat /​var/​log/​asterisk/​cdr-csv/​${UNIQUEID} |wc -l)}) +
-exten => 555,​13,​Gotoif($[ ${kls} = 0 ]?20:14) +
-exten => 555,​14,​Set(ostatok=${kls}) +
-exten => 555,​15,​Set(packet=${IF($[ ${ostatok} < ${packet}]?​${ostatok}:​${packet})}) +
-exten => 555,​16,​Set(num=$[${num} + ${packet}]) +
-exten => 555,​17,​UserEvent(FromCDR,​Channel:​ ${chan},​Date:​ ${date1},​Lines:​ ${QUOTE(${SHELL(cat /​var/​log/​asterisk/​cdr-csv/​${UNIQUEID} |head -n '​${num}'​| tail -n '​${packet}'​| sed '​s/​[\t]/'​\',​\''/​g'​|sed '​s/​$/​...../​g'​|tr "​\n"​ " "​)})}) +
-exten => 555,​18,​Set(ostatok=$[${ostatok}-${packet}]) +
-exten => 555,​19,​Gotoif($[ ${ostatok} > 0 ]?15:20) +
-exten => 555,​20,​System(rm /​var/​log/​asterisk/​cdr-csv/​${UNIQUEID}) +
-exten => 555,​21,​Gotoif($[${kls}>​0]?​22:​23) +
-exten => 555,​22,​UserEvent(Refresh1CHistory,​Channel:​ ${chan},​Date:​ ${date1}) +
-exten => 555,​23,​Hangup() +
-</​file>​ +
- +
-Для ​базы звонков в 100000 записей, отображение истории в 1С за определенный день занимает 3-5 секунд. Потому мы рекомендуем именно этот ​способ работы с CDR записями. +
-Быстрее только прямое обращение к базе данных CDR из 1С, не используя функционал ​Asterisk+
- +
-Для включения этого файла в работу ​необходимо положить его в директорию /​etc/​asterisk/​ и проинклюдить ​в файле /​etc/​asterisk/​extensions.conf с помощью ​следующей команды:​ +
-<​code>​ +
-#include extensions_miko.conf  +
-</​code>​ +
- +
-Если вы используете сборку asterisk с оболочкой freepbx тогда вам ​необходимо использовать extensions_override_freepbx.conf вместо extensions.conf +
- +
-==== Источник истории звонков файл MASTER.CSV ==== +
-Существенным ограничением данного метода является сильная нагрузка на процессор asterisk при парсинге csv файла.  +
-<note tip>​Метод парсинга файла мы рекомендуем только в образовательных целях, как самый простой в реализации. Лучше работать с базой данных.</​note>​ +
- +
-<file - extensions_miko.conf>​ +
-[mikoajamdll] +
-exten => 555,​1,​NoCDR() +
-exten => 555,​2,​Set(cdrfile=/​var/​log/​asterisk/​cdr-custom/​Master.csv) +
-exten => 555,​3,​Set(line=0) +
-exten => 555,​4,​Answer() +
-exten => 555,​5,​Set(filestr=${QUOTE(${SHELL(awk -F'","'​ '​($5~/​^${chan}/​ || $6~/​^${chan}/​ || $8~/​^${chan}/​) && ((substr($9,​1,​4) substr($9,​6,​2) substr($9,​9,​2))>=${date}) && ((substr($9,​1,​4) substr($9,​6,​2) substr($9,​9,​2))<​=${date}) {print $0}' ${cdrfile} | tail -n +${line} | head -n 1)})}) +
-exten => 555,​6,​Gotoif($[${LEN(${filestr})} <= 4]?10:7) +
-exten => 555,​7,​UserEvent(FromCDR,​Channel${chan},​Date:​ ${date},​Lines:​ ${QUOTE(${filestr})}) +
-exten => 555,​8,​Set(line=$[${line} + 1]) +
-exten => 555,​9,​Goto(5) +
-exten => 555,​10,​Hangup() +
- +
-exten => 999,​1,​NoCDR() +
-exten => 999,​n,​Answer() +
-exten => 999,​n,​Wait(60) +
-exten => 999,​n,​Hangup() +
-</​file>​ +
- +
-Скрипт может потребовать модификации,​ если последовательность полей в файле не соответствует используемой нами. +
-Для минимального количества модификаций,​ просто пропишите последовательность полей в файле /etc/asterisk/​cdr_custom.conf согласно приведенному ниже примеру +
- +
-<file - cdr_custom.conf>​ +
- +
-[mappings] +
-Master.csv => ${CSV_QUOTE(${CDR(start)})},​${CSV_QUOTE(${CDR(src)})},​${CSV_QUOTE(${CDR(dst)})},​${CSV_QUOTE(${CDR(channel)})},​${CSV_QUOTE(${CDR(dstchannel)})},​${CSV_QUOTE(${CDR(billsec)})},​${CSV_QUOTE(${CDR(disposition)})},​${CSV_QUOTE(${CDR(uniqueid)})},​${CSV_QUOTE(${CDR(userfield)})},​${CSV_QUOTE(${CDR(recordingfile)})},​${CSV_QUOTE(${CDR(lastapp)})} +
- +
-</​file>​ +
- +
-===== Настройка дополнительного диалплана для прослушивания записей разговоров из 1С ===== +
- +
-Для прослушивания звонков из 1с, нам необходима возможность получения имени файла звонка по уникальному идентификатору. +
- +
-Добавим в диалплан mikoajamdll следующие строчки:​ +
-<​code>​ +
-exten => 777,​1,​NoCDR() +
-exten => 777,​2,​Answer() +
-exten => 777,​3,​Set(monitor_path=/​var/​spool/​asterisk/​monitor) +
-exten => 777,​4,​Set(recordingfile=${SHELL(mysql -sse '​SELECT recordingfile FROM cdr WHERE uniqueid Like ${QUOTE(${uniqueid1c}%)} LIMIT 1' -u${user} -p${password} ${dbname})}) +
-exten => 777,​5,​Gotoif($[${LEN(${recordingfile})} > 4]?8:6) +
-exten => 777,​6,​Set(recordingfile=${SHELL(mysql -sse '​SELECT userfield FROM cdr WHERE uniqueid Like ${QUOTE(${uniqueid1c}%)} LIMIT 1' -u${user} -p${password} ${dbname})}) +
-exten => 777,​7,​Gotoif($[${LEN(${recordingfile})} > 4]?8:11) +
-exten => 777,​8,​Set(namedorashiren=$[${LEN(${recordingfile})}-4]) +
-exten => 777,​9,​Set(recfile=${SHELL(find ${monitor_path} -name *${recordingfile:​0:​${namedorashiren}}*|head -n 1)}) +
-exten => 777,​10,​UserEvent(CallRecord,​Channel:​ ${chan},​FileName:​ ${recfile}) +
-exten => 777,​11,​Hangup() +
-</​code>​ +
- +
-===== Настройка дополнительного диалплана для отправки факсимильных сообщения из 1С ===== +
- +
-Для отправки факсимильного сообщения из 1C, нам необходимо также дописать в диалплан mikoajamdll дополнительные строки:​  +
- +
-<​code>​ +
-exten => 333,​1,​Answer() +
-exten => 333,​n,​NoCDR() +
-exten => 333,​n,​NoOp(SendFAX amifaxfile=${amifaxfile}) +
-exten => 333,​n,​SendFAX(${amifaxfile}) +
-exten => 333,​n,​NoOp(FaxStatus : ${FAXSTATUS}) +
-exten => 333,​n,​NoOp(FaxStatusString : ${FAXSTATUSSTRING}) +
-exten => 333,​n,​NoOp(FaxError : ${FAXERROR}) +
-exten => 333,​n,​NoOp(RemoteStationID : ${REMOTESTATIONID}) +
-exten => 333,​n,​NoOp(FaxPages : ${FAXPAGES}) +
-exten => 333,​n,​Hangup() +
-</​code>​ +
- +
-<note tip>​Готовые файл скриптов лежит в дистрибутиве поставки панели asterisk для 1C:​CRM</​note>​ +
- +
-Если у вас в CDR БД отсутствует поле recordingfile,​ то нужно его добавить вручную. На MySQL это выглядит следующим образом. +
-<code mysql> ALTER TABLE `cdr` ADD `recordingfile` VARCHAR(120) NOT NULL </​code>​ +
-Так же необходимо внести изменения в контекст записи разговоров. Для FreePBX это [macro-record-enable]. +
-Скопируйте его из extensions_additional.conf в extensions_override_freepbx.conf,​ и после назначения переменной имени файла записи добавьте следующую строку:​ +
-<​code>​exten => s,​n,​Set(CDR(recordingfile)=${CALLFILENAME})</​code>​ +
- +
-===== Работа с базой данных CDR напрямую из 1С: Предприятия 8 ===== +
-Возможно специалистам 1С, будет проще работать с базой данных через новую возможность платформы 1С:​Предприятие 8 //​Внешние источники данных//​. +
-В блоге Николая Бекетова,​ описан процесс подключения к [[http://​www.miko.ru/​blogs/​SwordBlog/​52/​|базе данных из 1С]]. +
-В результате достаточно настроить связь с базой CDR записей и добавить в конфигурацию общий модуль **МИКО_Астериск_Сервер** +
-<code 1c> +
-//​Функция генерирует строку соединения с сервером через ODBC драйвер +
-Функция СформироватьСтрокуСоединенияСАстерискСервером(host,​database,​user,​pass) +
-  +
- СтрокаСоединения = "​DRIVER={MySQL ODBC 5.1 Driver}; SERVER="​+host+";​ DATABASE="​+database+";​ UID="​+user+";​ PWD="​+pass;​  +
-  +
- Возврат СтрокаСоединения;​ +
-  +
-КонецФункции +
- +
- +
-//​Функция возвращает информацию о звонках с сервера телефонии +
-Функция ВернутьЗаписиCDRДляТекущегоПользователя(ДатаНачало,​ ДатаОкончания,​КаналЛокальный,​КаналСотовый) Экспорт +
-  +
- СтрокаСоединенияСАстерискСервером = СформироватьСтрокуСоединенияСАстерискСервером("​ASTERISK_HOST","​ASTERISK_cdrdb","​ASTERISK_cdrdb_login","​ASTERISK_cdrdb_password"​);​ +
-  +
- ПараметрыСоединенияСАстерискомМИКО = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;​  +
- ПараметрыСоединенияСАстерискомМИКО.СтрокаСоединения = СтрокаСоединенияСАстерискСервером;​ +
-  +
- ВнешниеИсточникиДанных.Asterisk.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединенияСАстерискомМИКО);​  +
- ВнешниеИсточникиДанных.Asterisk.УстановитьСоединение();​  +
-  +
- Запрос = Новый Запрос;​ +
- Запрос.Текст = "​ВЫБРАТЬ +
-                ​| ВЫРАЗИТЬ(cdr.calldate КАК ДАТА) КАК calldate, +
-                ​| cdr.clid,​ +
-                ​| cdr.src,​ +
-                ​| cdr.dst,​ +
-                ​| cdr.dcontext,​ +
-                ​| cdr.channel,​ +
-                ​| cdr.dstchannel,​ +
-                ​| cdr.lastapp,​ +
-                ​| cdr.lastdata,​ +
-                ​| cdr.duration,​ +
-                ​| cdr.billsec,​ +
-                ​| cdr.disposition,​ +
-                ​| cdr.amaflags,​ +
-                ​| cdr.accountcode,​ +
-                ​| cdr.uniqueid,​ +
-                ​| cdr.userfield,​ +
-                       ​| cdr.recordingfile  +
-                ​|ИЗ +
-                ​| ВнешнийИсточникДанных.Asterisk.Таблица.cdr КАК cdr +
-                ​|ГДЕ +
-                ​| (cdr.dstchannel ПОДОБНО ""​%""​ + &​НашКанал + ""​%""​ +
-                ​| ИЛИ cdr.channel ПОДОБНО ""​%""​ + &​НашКанал + ""​%""​ +
-                ​| ИЛИ cdr.dstchannel ПОДОБНО ""​%""​ + &​НашКаналСотовый + ""​%""​ +
-                ​| ИЛИ cdr.channel ПОДОБНО ""​%""​ + &​НашКаналСотовый + ""​%""​) +
-                | И ВЫРАЗИТЬ(cdr.calldate КАК ДАТА) МЕЖДУ &​НачалоДня И &​КонецДня +
-                | +
-                ​|УПОРЯДОЧИТЬ ПО +
-                ​| calldate УБЫВ +
-                ​|АВТОУПОРЯДОЧИВАНИЕ";​ +
-  +
- Запрос.УстановитьПараметр("​НашКанал",​СокрЛП(КаналЛокальный));​ +
- Запрос.УстановитьПараметр("​НашКаналСотовый",​СокрЛП(КаналСотовый));​ +
- Запрос.УстановитьПараметр("​НачалоДня",​ДатаНачало);​ +
- Запрос.УстановитьПараметр("​КонецДня",​ДатаОкончания);​ +
-  +
- Результат = Запрос.Выполнить();​ +
-  +
- ТЗ=Результат.Выгрузить();​ +
- Возврат ТЗ; +
-  +
-КонецФункции +
- +
-// Возвращает с астериска запись разговора по переданному уникальному идентификатору +
-// +
-// Параметры +
-//  <​Дата начала периода поиска> ​ - <​Тип.Дата>​  +
-//  <​Дата окончания периода поиска> ​ - <​Тип.Дата>​  +
-//  <​ID> ​ - <​Тип.Строка>​ - Для каждого звонка Астериск возвращает такой идентификатор +
-// +
-// Возвращаемое значение:​ +
-//  +
-//​ Таблица значений со строкой CDR Записи разговоров +
-//  +
-Функция ВернутьЗаписьCDRДляУникальногоIDЗвонка(ДатаНачало,​ДатаОкончания,​ID) Экспорт +
- +
-    ПозицияТочкиВИД=Найти(ID,"​."​);​ +
- ИДДляПоиска=Лев(ID,​ПозицияТочкиВИД)+"​%";​ +
- +
- СтрокаСоединенияСАстерискСервером = СформироватьСтрокуСоединенияСАстерискСервером("​ASTERISK_HOST","​ASTERISK_cdrdb","​ASTERISK_cdrdb_login","​ASTERISK_cdrdb_password"​);​ +
-  +
- ПараметрыСоединенияСАстерискомМИКО = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;​  +
- ПараметрыСоединенияСАстерискомМИКО.СтрокаСоединения = СтрокаСоединенияСАстерискСервером;​ +
-  +
- ВнешниеИсточникиДанных.Asterisk.УстановитьОбщиеПараметрыСоединения(ПараметрыСоединенияСАстерискомМИКО);​  +
- ВнешниеИсточникиДанных.Asterisk.УстановитьСоединение();​  +
-  +
- Запрос = Новый Запрос;​ +
- Запрос.Текст = "​ВЫБРАТЬ +
-                ​| ВЫРАЗИТЬ(cdr.calldate КАК ДАТА) КАК calldate, +
-                ​| cdr.clid,​ +
-                ​| cdr.src,​ +
-                ​| cdr.dst,​ +
-                ​| cdr.dcontext,​ +
-                ​| cdr.channel,​ +
-                ​| cdr.dstchannel,​ +
-                ​| cdr.lastapp,​ +
-                ​| cdr.lastdata,​ +
-                ​| cdr.duration КАК duration, +
-                ​| cdr.billsec,​ +
-                ​| cdr.disposition,​ +
-                ​| cdr.amaflags,​ +
-                ​| cdr.accountcode,​ +
-                ​| cdr.uniqueid,​ +
-                ​| cdr.userfield,​ +
-                ​| cdr.recordingfile  +
-                ​|ИЗ +
-                ​| ВнешнийИсточникДанных.Asterisk.Таблица.cdr КАК cdr +
-                ​|ГДЕ +
-                ​| ВЫРАЗИТЬ(cdr.calldate КАК ДАТА) МЕЖДУ &​НачалоДня И &​КонецДня +
-                | И cdr.uniqueid ПОДОБНО &​uniqueid +
-                | И cdr.disposition = ""​ANSWERED""​ +
-                | +
-                ​|УПОРЯДОЧИТЬ ПО +
-                ​| duration УБЫВ +
-                ​|АВТОУПОРЯДОЧИВАНИЕ";​ +
-  +
- Запрос.УстановитьПараметр("​uniqueid",​ИДДляПоиска);​ +
- Запрос.УстановитьПараметр("​НачалоДня",​ДатаНачало);​ +
- Запрос.УстановитьПараметр("​КонецДня",​ДатаОкончания);​ +
-  +
- Результат = Запрос.Выполнить();​ +
-  +
- ТЗ=Результат.Выгрузить();​ +
- Если ТЗ.Количество()>​0 Тогда +
- Возврат ТЗ;  +
- Иначе +
- Возврат "";​  +
- КонецЕсли;​  +
- +
-КонецФункции // ВернутьЗаписьCDRДляУникальногоIDЗвонка() +
-  +
- +
-</​code>​ +
- +
- +
-<note important>​Если для вас данная инструкция оказалась сложной,​ не стесняйтесь,​ пишите,​ звоните,​ мы поможем или предложим настроенные решения от партнеров.</​note>​ +
- +
-===== Комментарии ===== +
-~~DISQUS~~+
  
doc/panel1ccrm/asterisk_config.1328614023.txt.gz · Последние изменения: 2014/11/14 22:32 (внешнее изменение)