问题描述
我正在尝试配置我的 freeswitch 实例以将呼叫路由到 Jitsi meet 并加入会议。我该如何设置?
解决方法
我创建了一个 lua 脚本,它将接听电话并询问会议代码并将呼叫重定向到正确的 jitsi 会议。该脚本将使用用户输入的会议号调用会议 web api,并将呼叫与正确的会议直接桥接。
--This script goes in the scripts folder for freeswitch. The default location of that folder is /usr/share/freeswitch/scripts/
local function buildGetConverenceByIdRequest(conferenceId)
--This url should match what is set in /etc/jitsi/meet/config.js in the dialInConfCodeUrl.
--In this case I used the api.jitsi.net one,but you could build your own.
return string.format('https://api.jitsi.net/conferenceMapper?id=%s',conferenceId);
end
--Pass in the domain as the first argument in the extenson xml.
local domain = argv[1];
local request = require 'http.request'
local cjson = require 'cjson'
local cjson2 = cjson.new();
attempt = 1
max_attempts = 3
function session_hangup_hook(status)
freeswitch.consoleLog("NOTICE","Session hangup: " .. status .. "\n")
error()
end
function get_conference_num(min,max,attempts,timeout)
local conference_num = "";
freeswitch.consoleLog("NOTICE","Awaiting caller to enter a conference number phrase:conference_num\n");
-- conference_num = session:playAndGetDigits(min,timeout,'#','phrase:conference_num','','\\d+');
conference_num = session:playAndGetDigits(min,'conference/8000/conf-enter_conf_number.wav','\\d+');
return(conference_num);
end
session:answer();
session:setHangupHook("session_hangup_hook");
if session:ready() then
freeswitch.consoleLog("NOTICE",string.format("Caller has called conferencing server,Playing welcome message phrase:conference_welcome\n"));
--session:execute("phrase","conference_welcome");
session:execute("playback","conference/8000/conf-welcome.wav");
end
while attempt <= max_attempts and session:ready() do
local conf_num = get_conference_num(1,20,3,4000);
local getConferenceUrl = buildGetConverenceByIdRequest(conf_num);
freeswitch.consoleLog("NOTICE",string.format("Conference url: %s",getConferenceUrl));
local headers,stream = assert(request.new_from_uri(getConferenceUrl):go());
local body = assert(stream:get_body_as_string());
local status = headers:get ":status";
if status ~= "200" then
--something went wrong
freeswitch.consoleLog("NOTICE",string.format("Unable to access conference code service. Error code: %s",status))
session:execute("speak","flite|slt|Unable to access the conference system. Please try again later.");
attempt = max_attempts;
break;
end
local responseObject = cjson.decode(body);
if responseObject.conference then --nil or false evaluates to false,so if there is a conference,this code will catch it.
--invalid conference number. Please try again.
freeswitch.consoleLog("NOTICE",string.format("Found matching conference: %s",responseObject.conference));
local conferenceFoundSentence = string.format("flite|slt|We found your conference %s",responseObject.conference);
--todo: remove this speaking here once the conference joining is worked out.
-- session:execute("speak",conferenceFoundSentence);
local conferenceHeader = string.format("sip_h_X-Room-Name=%s",responseObject.conference);
session:execute("set",conferenceHeader);
local userAddress = string.format("user/jitsiSipUser@%s",domain);
session:execute("bridge",userAddress);
break;
else
--[[ if the conference number does not exist,playback message saying it is
and invalid conference number ]]--
-- session:execute("phrase","conference_bad_num");
-- session:execute("speak","flite|slt|The conference number you entered is not valid.");
-- session:execute("playback","misc/8000/invalid_extension");
-- session:execute("playback","directory/8000/dir-please_try_again");
session:execute("playback","ivr/8000/ivr-please_check_number_try_again");
end
attempt = attempt + 1;
end
-- session:execute("phrase","conference_too_many_failures");
-- session:execute("speak","flite|slt|You entered the incorrect pin too many times.");
session:execute("playback","ivr/8000/ivr-access_denied.wav");
session:hangup();
要使用这个脚本,你需要创建一个这样的拨号计划:
<extension name="conference_jitsi">
<condition field="destination_number" expression="^[number reserved for jitsi]$">
<action application="lua" data="conference_management_jitsi_http.lua ${domain}"/>
</condition>
</extension>
在 jitsi 社区中查看此主题:https://community.jitsi.org/t/jitsi-meet-jigasi-freeswitch/29556/32