Одним из неудобств пользования GoIP шлюзов является замена номера при исходящих звонках. Это связано с ограничениями операторов — нельзя подменять номера при исходящих звонках по Российскому законодательству. Таким образом, при перенаправлении звонка через GoIP шлюз мы теряем входящий номер абонента, поскольку оператор подставляет свой.
В текущей заметке мы создадим приложение на lua языке, используя стандартные возможности FusionPBX и сделаем стандартное приложение, которое можно использовать в системе, не переписывая ядро и диал планы, делая отправку входящих номеров во время перенаправления вызова.
В первую очередь, нужно во FusionPBX перейти в раздел Advanced — Email Temlates.
Создать копию шаблона письма в соответствии вашему языку. Например, скопируем ru-Ru — Missed. В категории укажем forward, в шаблоне пропишем:
Переведенный звонок с номера ${caller_id_number} <${caller_id_number}> по линии ${sip_to_user}
для ${dialed_user}
Сохраним.
Далее заходим на сервер ssh(под root), переходим по пути:
cd /usr/share/freeswitch/scripts/app
mkdir forward_number
chown -R www-data:www-data forward_number
Таким образом мы создали каталог приложения forward_number, которое можно использовать непосредственно в FusionPBX.
Создаем файл index.lua в каталоге:
touch index.lua
chown www-data:www-data index.lua
В файл index.lua вставляем следующий код:
--debug
debug["info"] = false;
debug["sql"] = false;
--include config.lua
require "resources.functions.config";
require "resources.functions.explode";
require "resources.functions.trim";
require "resources.functions.base64";
--load libraries
require 'resources.functions.send_mail'
if (session ~= nil and session:ready()) then
uuid = session:getVariable("uuid");
domain_uuid = session:getVariable("domain_uuid");
domain_name = session:getVariable("domain_name");
context = session:getVariable("context");
originate_disposition = session:getVariable("originate_disposition");
originate_causes = session:getVariable("originate_causes");
hangup_on_subscriber_absent = session:getVariable("hangup_on_subscriber_absent");
hangup_on_call_reject = session:getVariable("hangup_on_call_reject");
caller_id_name = session:getVariable("caller_id_name");
caller_id_number = session:getVariable("caller_id_number");
call_direction = session:getVariable("call_direction");
if (caller_direction == "local") then
caller_id_name = session:getVariable("effective_caller_id_name");
end
sip_to_user = session:getVariable("sip_to_user");
dialed_user = session:getVariable("dialed_extension");
missed_call_app = session:getVariable("missed_call_app");
missed_call_data = session:getVariable("missed_call_data");
sip_code = session:getVariable("last_bridge_proto_specific_hangup_cause");
--set the sounds path for the language, dialect and voice
default_language = session:getVariable("default_language");
default_dialect = session:getVariable("default_dialect");
default_voice = session:getVariable("default_voice");
if (not default_language) then default_language = 'en'; end
if (not default_dialect) then default_dialect = 'us'; end
if (not default_voice) then default_voice = 'callie'; end
--connect to the database
local Database = require "resources.functions.database";
local dbh = Database.new('system');
--get the templates
local sql = "SELECT * FROM v_email_templates ";
sql = sql .. "WHERE (domain_uuid = :domain_uuid or domain_uuid is null) ";
sql = sql .. "AND template_language = :template_language ";
sql = sql .. "AND template_category = 'forward' "
sql = sql .. "AND template_enabled = 'true' "
sql = sql .. "ORDER BY domain_uuid DESC "
local params = {domain_uuid = domain_uuid, template_language = default_language.."-"..default_dialect};
if (debug["sql"]) then
freeswitch.consoleLog("notice", "[voicemail] SQL: " .. sql .. "; params:" .. json.encode(params) .. "\n");
end
dbh:query(sql, params, function(row)
subject = row["template_subject"];
body = row["template_body"];
end);
--prepare the headers
local headers = {}
headers["X-FusionPBX-Domain-UUID"] = domain_uuid;
headers["X-FusionPBX-Domain-Name"] = domain_name;
headers["X-FusionPBX-Call-UUID"] = uuid;
headers["X-FusionPBX-Email-Type"] = 'forward';
--remove quotes from caller id name and number
caller_id_name = caller_id_name:gsub("'", "'");
caller_id_name = caller_id_name:gsub([["]], """);
caller_id_number = caller_id_number:gsub("'", "'");
caller_id_number = caller_id_number:gsub([["]], """);
--prepare the subject
subject = subject:gsub("${caller_id_name}", caller_id_name);
subject = subject:gsub("${caller_id_number}", caller_id_number);
subject = subject:gsub("${sip_to_user}", sip_to_user);
subject = subject:gsub("${dialed_user}", dialed_user);
subject = trim(subject);
subject = '=?utf-8?B?'..base64.encode(subject)..'?=';
--prepare the body
body = body:gsub("${caller_id_name}", caller_id_name);
body = body:gsub("${caller_id_number}", caller_id_number);
body = body:gsub("${sip_to_user}", sip_to_user);
body = body:gsub("${dialed_user}", dialed_user);
body = body:gsub(" ", " ");
body = body:gsub("%s+", "");
body = body:gsub(" ", " ");
body = body:gsub("\n", "");
body = body:gsub("\n", "");
body = trim(body);
--send the emails
send_mail(headers,
missed_call_data,
{subject, body}
);
if (debug["info"]) then
freeswitch.consoleLog("notice", "[forward number] " .. caller_id_number .. "->" .. sip_to_user .. "emailed to " .. missed_call_data .. "\n");
end
end
Нужно сохраниться и после этого можно добавлять приложения в нужные места. У нас это — места перенаправления звонка: Call forward, Follow Me, Not registred.
Переходим в меню Dialplan — Dialplan Manager. Ищем диалпланы follow-me-destinations, call_forward_all, call-forward-not-registered,. Добавляем в предпоследнюю строчку:
action lua app.lua forward_number
После этого нужно сбросить кеш и перегрузить XML файлы из меню Status — Sip Status.
Для получения почты нужно настроить smtp агента в настройках FusionPBX: Меню Advanced — Default Settings — Раздел Email, а так же в настройках номера в разделе Missed Call указать тип Email и внести актуальный email адрес.
Таким простым способом мы теперь не будем судорожно узнавать, а кто же позвонил. Нам на почту всегда придет письмо с номером, который бы потерялся при перенаправлении через GSM шлюз.
Так же возможно получать номер через смс шлюз (причем c того же GoIP) нажав dсего одну клавишу на сотовом телефоне во время разговора.
Tags: Freeswitch, FusionPBX, Ip-pbx, VoIP