Чтобы посмотреть список записей и вызовов в прилинкованом сервере PostgreSQL на сервере MSSQL
FS — имя прилинкованого сервера PostgreSQL
fusionpbx — имя базы на сервере PostgreSQL
выполняем:
DECLARE @SQLtext nvarchar(max) SET @SQLtext = 'select * from fusionpbx.public.v_call_recordings' SET @SQLtext = 'SELECT * FROM OPENQUERY(FS, '+ CHAR(39) + @SQLtext + CHAR(39) +') AS derivedtbl_1' insert #dataset exec (@SQLtext) - если создана таблица #dataset или просто exec (@SQLtext) -- можно и так select * from FS.fusionpbx.[public].[v_countries]
Из глюков:
Создал правило по времени, все нормально отрабатывает. Стоит зайти и пересохранить, то вместо домена записывается IP адрес, ну и привет правилу.
Замена на ${domain_name} не помогла.
Через какое то время — все нормально стало.
При отправке на email информации о пропущенном вызове (missed) или записанном сообщении (voicemail) наблюдаем ошибку:
[ERR] mod_lua.cpp:203 /usr/share/freeswitch/scripts/app/hangup/index.lua:80: attempt to index global 'subject' (a nil value) stack traceback: /usr/share/freeswitch/scripts/app/hangup/index.lua:80: in function 'missed' /usr/share/freeswitch/scripts/app/hangup/index.lua:148: in main chunk /usr/share/freeswitch/scripts/app.lua:48: in main chunk
Лечится созданием фалов по аналогии с каталогом
/usr/share/freeswitch/scripts/app/missed_calls/resources/templates/en/us/
Создаем
/usr/share/freeswitch/scripts/app/missed_calls/resources/templates/ru/RU/
И копируем туда из en/us
Тоже самое с voicemail, ну и оставляем в шаблонах включенными только default
После этого почта приходит, остается поправить кодировку писем.
Поиск файлов
find / -name pg_hba.conf -type f 2>/dev/null
Мультифон и FusionPBX
Рассмотрим 2 варианта работы :
- один через Issabel(asterisk) — далее через транк — на FusionPBX
- второй — непосредственно на FusionPBX.
с Issabel поднялось без проблем. Делаем прохождение через Issabel.
Через *137# включаем Multifon
Через строку в запросе выставляем режим работы
https://sm.megafon.ru/sm/client/routing/set?login=7927NOMER@multifon.ru&password=PASSWORD&routing=2 0 = Только GSM 1 = Только ПК 2 = ПК и GSM
В ответ придет xml с кодом 200 OK или ошибка.
Надо запустить пару раз с разными кодами (прочитано из форумов) например с кодом 0, а затем с кодом 2 !!! Заодно убеждаемся в правильности пароля.
Issabel и FusionPBX находятся в одной локальной сети.
На Issabell создаем транк multifon1234
Опции PEER
username=7927NOMER type=peer secret=PASSWORD qualify=yes port=5060 insecure=invite,port host=sbc.megafon.ru fromuser=7927NOMER fromdomain=multifon.ru canreinvite=no
Опции USER оставляем пустым
Добавляем строку регистрации
7927NOMER@multifon.ru:PASSWORD:7927NOMER@193.201.229.35:5060/7927NOMER
Смотрим состояние транка.
Добавляем в Issabell транк на freeswitch
Опции PEER
host=IPADDRESSFUSIONPBX username=issabel secret=PASSWORDGW fromdomain=IPADDRESSISSABEL port=5080 type=peer
На Issabell меняем маршрутизацию входящих на транк freeswitch
На FusionPBX создаем шлюз с Issabel
Указываем имя пользователя issabel Пароль PASSWORDGW Прокси IPADDRESSISSABEL Регистрация НЕТ Контекст public Профиль internal
Добавляем направление
Направление IPADDRESSISSABEL Контекст public
В направлении маршрутизации меняем первую строку на
condition $(sip_from_host) ^(IPADDRESSISSABEL)$
В статусе sip должен появиться шлюз issabel с состоянием NOREG
Проверяем прохождение звонка с мультифона на Issabel, затем с Issabel на FusionPBX.
Применение мультифона дало улучшение качества связи, расширило количество входящих каналов в 2 раза и появилась возможность совершить звонок на номер, с которого идет исходящий вызов.
Схема соединения была такой (БС — базовая станция):
Абонент-БС-БС-Goip4-Freeswitch-Goip4-БС-БС-Сотрудник
Стала:
Абонент-БС-Мультифон-Issabel-Freeswitch-Goip4-БС-БС-Сотрудник
Итак в результате экспериментов получилось подружить мультифон и fusionpbx
Создаем шлюз
Имя пользователя 7927NOMER Пароль PASSWORDMULTIFON От пользователя 7927NOMER From domain multifon.ru Прокси multifon.ru Область (realm) sbc.multifon.ru Имя Пользователя для авторизации 7927NOMER Время жизни регистрации 120 Повтор попытки регистрации 60 Регистрация Да Прокси-сервер регистрации sbc.multifon.ru Исходящий прокси-сервер sbc.multifon.ru Идентификатор вызывающего абонента да Подавление CNG да SIP идентификатор CID вызывающего да Домен глобальный Контекст public Профиль external
В маршрутизации входящих условие — destination_number = 7927NOMER
Схема соединения стала такой:
Абонент-БС-Мультифон-Freeswitch-Goip4-БС-БС-Сотрудник
Данные о регистрации из программы sngrep, для отладки:
в русском ivr не хватает файлика в каталоге /usr/share/freeswitch/sounds/ru/RU/elena/ivr
ivr-enter_destination_telephone_number.wav
, для всех частот
из-за этого не работает перевод звонка
При ошибках Permission denied
chown freeswitch /var/lib/php/session
Отображение имени по номеру звонящего (cidlookup)
Создаем таблицу в базе Postgresql, например
CREATE TABLE public.otrs_customer ( otrs_customer text COLLATE pg_catalog."default", otrs_number text COLLATE pg_catalog."default" ) WITH ( OIDS = FALSE ) TABLESPACE pg_default; ALTER TABLE public.otrs_customer OWNER to fusionpbx;
Наполняем ее данными из базы Mysql, у меня это — OTRS (5 и 6 версия). Запрос выполняется из MSSQL.
DECLARE @SQLtext nvarchar(max) SET @SQLtext = 'Select last_name,first_name,street, mobile,phone from customer_user ' SET @SQLtext = 'SELECT * FROM OPENQUERY(OTRS, '+ CHAR(39) + @SQLtext + CHAR(39) +') AS derivedtbl_1' create table #dataset( last_name nvarchar(1000) ,first_name nvarchar(1000) ,street nvarchar(1000) , mobile nvarchar(1000) ,phone nvarchar(1000)) insert #dataset exec (@SQLtext) --Чуток приводим к нужному виду select (last_name + ' ' + first_name + char(13) + char(10) + ' ' + street) as otrs_customer , (mobile + ',' + phone ) as otrs_number into #datasetn from #dataset update #datasetn SET otrs_number = otrs_number + ',' + REPLACE(otrs_number,'+7','8') delete from #datasetn where len(otrs_number) < 4 --Добавляю данные из MSSQL INSERT INTO #datasetn (otrs_customer,otrs_number) select FIONAME,MOBILEPHONE from ETP_Users --Очищаем таблицу на сервере FS DECLARE @SQLmysql nvarchar(max) SET @SQLmysql = 'TRUNCATE TABLE public.otrs_customer;' EXEC (@SQLmysql) AT FS --Вставляем данные INSERT INTO FS.fusionpbx.[public].otrs_customer (otrs_customer, otrs_number) SELECT otrs_customer, otrs_number From #datasetn where otrs_number is not NULL
Получили список с Фамилиями, адресами и номерами.
Включаем модуль cidlookup
Правим cidlookup.conf.xml в панели FusionPBX :
Дополнительно — Редактор XML — autoload_configs — cidlookup.conf.xml
<param name="odbc-dsn" value="pgsql://host=localhost dbname=fusionpbx user=fusionpbx password=MYPASSWORDPOSTGRESQL options='-c client_min_messages=NOTICE' application_name='fusionpbx'" />
<param name="sql" value="SELECT otrs_customer.otrs_customer as name, otrs_customer.otrs_number as number from otrs_customer where otrs_customer.otrs_number like CONCAT('%','${caller_id_number}','%') LIMIT 1"/>
Добавляем в план нумерации caller-details строку
action — set — effective_caller_id_name=${cidlookup(${caller_id_number})}
XML будет выглядеть так:
<extension name="caller-details" continue="true" uuid="6ff0c4"> <condition field="" expression="" break="never"> <action application="export" data="call_direction=inbound" inline="true"/> <action application="set" data="caller_destination=${destination_number}" inline="true"/> <action application="set" data="caller_id_name=${caller_id_name}" inline="true"/> <action application="set" data="caller_id_number=${caller_id_number}" inline="true"/> <action application="set" data="effective_caller_id_name=${cidlookup(${caller_id_number})}" inline="true"/> </condition> </extension>
Перегружаем XML, очищаем кэш в меню «Статус SIP»
Теперь в детализации звонков наблюдаем имя вместо номера CID NAME
Тоже самое можно сделать, не создавая таблицу, а беря данные напрямую из OTRS.
Оптимальным наверно будет запускать хранимую процедуру в MySQL.
Строка для Mysql в cidlookup.conf.xml примерно выглядит так:
<param name="odbc-dsn" value="odbc://DRIVER=mysql;SERVER=IPADDRESSMYSQL;UID=USERMYSQL;PWD=PASSWORD;DATABASE=otrs;OPTION=67108864"/>
Работоспособность не проверял, возможно и не сработает.
Но я дополняю список public.otrs_customer еще из другой базы MSSQL, поэтому пока так — как есть.