Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
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~~ | + | |