Hello everyone, I want to implement a function: A dials B. After B is connected, A dials C to let them talk to 3 people. How do I implement it?
@hfoster Thank you for your reply. I have tried the conference mode, but C needs to actively enter the conference. I don't know how to use A to invite C to join the call.If I recall, conferencing calls is a feature of the phones if you are a using ad-hoc conferencing which is why it's usually limited to 3 parties.
Personally, I would just do:
1. Dial B from Handset A
2. Press Conference on Handset A
3. Dial C.
Otherwise, I think you'll have to experiment with the Freeswitch action application="conference" if you needed to do it from the PBX side.
@Adrian FretwellConference bridge?
OK, Thanks ~You could certainly do what you require with an .lua script. I'm pretty busy at the moment but if I get time I will dig out some examples for you.
@hfoster Thank you for your reply. I have tried the conference mode, but C needs to actively enter the conference. I don't know how to use A to invite C to join the call.
My customers use this facility on the Yealinks a lot.Nah, I just meant using the functionality of the handset if it has it. On my Yealink, I call one party, tell them I'm conferencing in C and 'Press conference' and call C. Then it just calls to invtie them. The limitation is it's limited to 3 parties.
In other words, does this feature need device support?Nah, I just meant using the functionality of the handset if it has it. On my Yealink, I call one party, tell them I'm conferencing in C and 'Press conference' and call C. Then it just calls to invtie them. The limitation is it's limited to 3 parties.
It may be that I did not express it clearly enough. I do not consider whether C is an external call. In other words, we do not consider the conference mode now, but use eavesdrop as an example: ABC all communicate with SIP extensions, A calls B, and C can pass through Dial *33 to monitor the conversation between A and B or even participate in the conversation, then can I call C from extension A and actively call him to monitor it (I think it must be possible, maybe my technology is not good enough. So I haven't understood their operating mechanism yet)?Nah, I just meant using the functionality of the handset if it has it. On my Yealink, I call one party, tell them I'm conferencing in C and 'Press conference' and call C. Then it just calls to invtie them. The limitation is it's limited to 3 parties.
-- vm_call_screen.lua
-- FusionPBX
-- Version: MPL 1.1
--
-- The contents of this file are subject to the Mozilla Public License Version
-- 1.1 (the "License"); you may not use this file except in compliance with
-- the License. You may obtain a copy of the License at
-- http://www.mozilla.org/MPL/
--
-- Software distributed under the License is distributed on an "AS IS" basis,
-- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-- for the specific language governing rights and limitations under the
-- License.
--
-- The Original Code is FusionPBX
--
-- Inspired by the Initial Developer of the Original Code
-- Mark J Crane <markjcrane@fusionpbx.com>
-- Copyright (C) 2010-2020
-- the Initial Developer. All Rights Reserved.
--
-- Contributor(s):
-- Adrian Fretwell <adrian.fretwell@topgreen.co.uk>
--
-- call this from the dialplan as a destination with voicemail extension and eavesdrop extension as parameters:
-- <extension name="vm_call_screen" continue="false" uuid="40caf546-e343-404d-9931-0364c7bc7527">
-- <condition field="destination_number" expression="^6201$">
-- <action application="lua" data="vm_call_screen.lua 201 201"/>
-- </condition>
-- </extension>
-- set up API object and get parameters
api = freeswitch.API();
vm_destination = argv[1];
ev_destination = argv[2];
-- make sure the session is ready
if ( session:ready() ) then
-- answer the call
session:answer();
-- get the dialplan variables and set them as local variables
destination_number = session:getVariable("destination_number");
domain_name = session:getVariable("domain_name");
sounds_dir = session:getVariable("sounds_dir");
rtp_secure_media = session:getVariable("rtp_secure_media");
caller_id_name = session:getVariable("caller_id_name");
caller_id_number = session:getVariable("caller_id_number");
sip_from_user = session:getVariable("sip_from_user");
mute = session:getVariable("mute");
call_uuid = session:get_uuid();
-- 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 = 'gb'; end
if (not default_voice) then default_voice = 'rachael'; end
-- set rtp_secure_media to an empty string if not provided.
if (rtp_secure_media == nil) then
rtp_secure_media = 'false';
end
-- set the caller id
if (caller_id_name) then
--caller id name provided do nothing
else
effective_caller_id_name = session:getVariable("effective_caller_id_name");
caller_id_name = effective_caller_id_name;
end
if (caller_id_number) then
--caller id number provided do nothing
else
effective_caller_id_number = session:getVariable("effective_caller_id_number");
caller_id_number = effective_caller_id_number;
end
if (not vm_destination or vm_destination == "") then
freeswitch.consoleLog("NOTICE", "[vm_call_screen] vm_destination (argv[1]) is not valid\n");
session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-invalid_number_format.wav");
session:hangup("INVALID_NUMBER_FORMAT");
return;
end
if (not ev_destination or ev_destination == "") then
freeswitch.consoleLog("NOTICE", "[vm_call_screen] ev_destination (argv[2]) is not valid\n");
session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-invalid_number_format.wav");
session:hangup("INVALID_NUMBER_FORMAT");
return;
end
-- transfer the call to voicemail
-- check to see if the user extension exists
local cmd = "user_exists id ".. vm_destination .." "..domain_name;
local result = api:executeString(cmd);
if result == "true" then
session:execute("transfer", "*99"..vm_destination.." XML "..domain_name);
else
freeswitch.consoleLog("NOTICE", "[vm_call_screen] unallocated number transfer "..vm_destination.." XML "..domain_name);
session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-unallocated_number.wav");
session:hangup("UNALLOCATED_NUMBER");
return;
end
session:sleep(1000);
-- Originate call to bridge eavesdrop extension and eavesdrop application
-- On answer execute bind_meta_app so it will execute an intercept id *5 is pressed
local cmd = "user_exists id ".. ev_destination .." "..domain_name;
local result = api:executeString(cmd);
if result == "true" then
cmd_string = "bgapi originate {sip_auto_answer=true,sip_h_Alert-Info='Ring Answer',execute_on_answer='bind_meta_app 5 a i transfer::intercept:"..call_uuid.." inline',hangup_after_bridge=false,rtp_secure_media="..rtp_secure_media..",origination_caller_id_name='"..caller_id_name.."',origination_caller_id_number="..caller_id_number..",effective_caller_id_number="..caller_id_number..",effective_caller_id_name='"..caller_id_name.."',caller_destination="..ev_destination.."}user/"..ev_destination.."@"..domain_name.." eavesdrop:"..call_uuid.." inline";
api:executeString(cmd_string);
else
freeswitch.consoleLog("NOTICE", "[vm_call_screen] unallocated number eavesdrop "..ev_destination.."@"..domain_name);
end
return;
end
Thanks, I have a lot of clarity through your explanation~Probably not out of the box on FusionPBX. Sounds like it would require a whole new lua script to be able to call an extension, but instead make that user start an eavesdrop of the callers session.
@Adrian Fretwell Thank you so much, through your example, I think I already know how to do it.@hfoster Good you should mention eavesdrop. The .lua below was written to emulate an old fashioned answering machine using voicemail and a standard extension, where you can listen to the message being left and pick up if you want to. This may serve as an eavesdrop example for HeisenbergQin:
Code:-- vm_call_screen.lua -- FusionPBX -- Version: MPL 1.1 -- -- The contents of this file are subject to the Mozilla Public License Version -- 1.1 (the "License"); you may not use this file except in compliance with -- the License. You may obtain a copy of the License at -- http://www.mozilla.org/MPL/ -- -- Software distributed under the License is distributed on an "AS IS" basis, -- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -- for the specific language governing rights and limitations under the -- License. -- -- The Original Code is FusionPBX -- -- Inspired by the Initial Developer of the Original Code -- Mark J Crane <markjcrane@fusionpbx.com> -- Copyright (C) 2010-2020 -- the Initial Developer. All Rights Reserved. -- -- Contributor(s): -- Adrian Fretwell <adrian.fretwell@topgreen.co.uk> -- -- call this from the dialplan as a destination with voicemail extension and eavesdrop extension as parameters: -- <extension name="vm_call_screen" continue="false" uuid="40caf546-e343-404d-9931-0364c7bc7527"> -- <condition field="destination_number" expression="^6201$"> -- <action application="lua" data="vm_call_screen.lua 201 201"/> -- </condition> -- </extension> -- set up API object and get parameters api = freeswitch.API(); vm_destination = argv[1]; ev_destination = argv[2]; -- make sure the session is ready if ( session:ready() ) then -- answer the call session:answer(); -- get the dialplan variables and set them as local variables destination_number = session:getVariable("destination_number"); domain_name = session:getVariable("domain_name"); sounds_dir = session:getVariable("sounds_dir"); rtp_secure_media = session:getVariable("rtp_secure_media"); caller_id_name = session:getVariable("caller_id_name"); caller_id_number = session:getVariable("caller_id_number"); sip_from_user = session:getVariable("sip_from_user"); mute = session:getVariable("mute"); call_uuid = session:get_uuid(); -- 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 = 'gb'; end if (not default_voice) then default_voice = 'rachael'; end -- set rtp_secure_media to an empty string if not provided. if (rtp_secure_media == nil) then rtp_secure_media = 'false'; end -- set the caller id if (caller_id_name) then --caller id name provided do nothing else effective_caller_id_name = session:getVariable("effective_caller_id_name"); caller_id_name = effective_caller_id_name; end if (caller_id_number) then --caller id number provided do nothing else effective_caller_id_number = session:getVariable("effective_caller_id_number"); caller_id_number = effective_caller_id_number; end if (not vm_destination or vm_destination == "") then freeswitch.consoleLog("NOTICE", "[vm_call_screen] vm_destination (argv[1]) is not valid\n"); session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-invalid_number_format.wav"); session:hangup("INVALID_NUMBER_FORMAT"); return; end if (not ev_destination or ev_destination == "") then freeswitch.consoleLog("NOTICE", "[vm_call_screen] ev_destination (argv[2]) is not valid\n"); session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-invalid_number_format.wav"); session:hangup("INVALID_NUMBER_FORMAT"); return; end -- transfer the call to voicemail -- check to see if the user extension exists local cmd = "user_exists id ".. vm_destination .." "..domain_name; local result = api:executeString(cmd); if result == "true" then session:execute("transfer", "*99"..vm_destination.." XML "..domain_name); else freeswitch.consoleLog("NOTICE", "[vm_call_screen] unallocated number transfer "..vm_destination.." XML "..domain_name); session:streamFile(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/ivr/ivr-unallocated_number.wav"); session:hangup("UNALLOCATED_NUMBER"); return; end session:sleep(1000); -- Originate call to bridge eavesdrop extension and eavesdrop application -- On answer execute bind_meta_app so it will execute an intercept id *5 is pressed local cmd = "user_exists id ".. ev_destination .." "..domain_name; local result = api:executeString(cmd); if result == "true" then cmd_string = "bgapi originate {sip_auto_answer=true,sip_h_Alert-Info='Ring Answer',execute_on_answer='bind_meta_app 5 a i transfer::intercept:"..call_uuid.." inline',hangup_after_bridge=false,rtp_secure_media="..rtp_secure_media..",origination_caller_id_name='"..caller_id_name.."',origination_caller_id_number="..caller_id_number..",effective_caller_id_number="..caller_id_number..",effective_caller_id_name='"..caller_id_name.."',caller_destination="..ev_destination.."}user/"..ev_destination.."@"..domain_name.." eavesdrop:"..call_uuid.." inline"; api:executeString(cmd_string); else freeswitch.consoleLog("NOTICE", "[vm_call_screen] unallocated number eavesdrop "..ev_destination.."@"..domain_name); end return; end