【问题标题】:How Do I set up SIP Conference Calls With Freeswitch and Jitsi如何使用 Freeswitch 和 Jitsi 设置 SIP 电话会议
【发布时间】:2021-05-16 13:31:06
【问题描述】:

我正在尝试配置我的 freeswitch 实例以将呼叫路由到 Jitsi meet 并加入会议。我该如何设置?

【问题讨论】:

    标签: lua sip freeswitch jitsi jitsi-meet


    【解决方案1】:

    我创建了一个 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, max, attempts, timeout, '#', 'phrase:conference_num', '', '\\d+');
      conference_num = session:playAndGetDigits(min, max, attempts, timeout, '#', '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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多