Freeswitch dynamic routing of all calls
Hi all I'm new to FS and I would like to know is it possible to implement following scenario: 1. User dials number 2. Routing script detects outgoing call event. Every call needs to be handled by routing script. 3. Routing script takes in input: user name, domain, dialed number. Than it query database to find best SIP trunk to route the call, it also checks destination price per minute and calculates maximum call time for prepaid user. 4. Routing script output is: SIP trunk to use, SIP call parameters (ie. callerid), maximum call duration 5. FS read output from routing script and make call using returned parameters Preferred routing implementation technology: background running unix deamon written in Java or PHP. Connection with FS via socket. Event routing script will be multi-threaded, must be able to deal with a lot of calls in parallel and processing of one call should not block processing of other calls (I have this problem with Yate voip server, and that's really big problem) Is it possible to do this using FS? Any advices where to search for additional info? I know that there is event handler but can it return "dialstring" for outgoing call events? Some code examples? I will really appreciate your help
Yes it's possible and I suggest you look at esl Steve on iPhone On 30 Jun 2011, at 09:54, Mateusz Bartczak <netcentrica@gmail.com> wrote:
Hi all
I'm new to FS and I would like to know is it possible to implement following scenario:
1. User dials number 2. Routing script detects outgoing call event. Every call needs to be handled by routing script. 3. Routing script takes in input: user name, domain, dialed number. Than it query database to find best SIP trunk to route the call, it also checks destination price per minute and calculates maximum call time for prepaid user. 4. Routing script output is: SIP trunk to use, SIP call parameters (ie. callerid), maximum call duration 5. FS read output from routing script and make call using returned parameters
Preferred routing implementation technology: background running unix deamon written in Java or PHP. Connection with FS via socket.
Event routing script will be multi-threaded, must be able to deal with a lot of calls in parallel and processing of one call should not block processing of other calls (I have this problem with Yate voip server, and that's really big problem)
Is it possible to do this using FS? Any advices where to search for additional info? I know that there is event handler but can it return "dialstring" for outgoing call events? Some code examples?
I will really appreciate your help
_______________________________________________ Join us at ClueCon 2011, Aug 9-11, Chicago http://www.cluecon.com 877-7-4ACLUE
FreeSWITCH-users mailing list FreeSWITCH-users@lists.freeswitch.org http://lists.freeswitch.org/mailman/listinfo/freeswitch-users UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users http://www.freeswitch.org
It doesn't sound like you're doing anything particularly complicated - can you just do this within the normal XML dialplan? -Avi On Fri, Jul 1, 2011 at 12:51 AM, Steven Ayre <steveayre@gmail.com> wrote:
Yes it's possible and I suggest you look at esl
Steve on iPhone
On 30 Jun 2011, at 09:54, Mateusz Bartczak <netcentrica@gmail.com> wrote:
Hi all
I'm new to FS and I would like to know is it possible to implement following scenario:
1. User dials number 2. Routing script detects outgoing call event. Every call needs to be handled by routing script. 3. Routing script takes in input: user name, domain, dialed number. Than it query database to find best SIP trunk to route the call, it also checks destination price per minute and calculates maximum call time for prepaid user. 4. Routing script output is: SIP trunk to use, SIP call parameters (ie. callerid), maximum call duration 5. FS read output from routing script and make call using returned parameters
Preferred routing implementation technology: background running unix deamon written in Java or PHP. Connection with FS via socket.
Event routing script will be multi-threaded, must be able to deal with a lot of calls in parallel and processing of one call should not block processing of other calls (I have this problem with Yate voip server, and that's really big problem)
Is it possible to do this using FS? Any advices where to search for additional info? I know that there is event handler but can it return "dialstring" for outgoing call events? Some code examples?
I will really appreciate your help
_______________________________________________ Join us at ClueCon 2011, Aug 9-11, Chicago http://www.cluecon.com 877-7-4ACLUE
FreeSWITCH-users mailing list FreeSWITCH-users@lists.freeswitch.org http://lists.freeswitch.org/mailman/listinfo/freeswitch-users UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users http://www.freeswitch.org
_______________________________________________ Join us at ClueCon 2011, Aug 9-11, Chicago http://www.cluecon.com 877-7-4ACLUE
FreeSWITCH-users mailing list FreeSWITCH-users@lists.freeswitch.org http://lists.freeswitch.org/mailman/listinfo/freeswitch-users UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users http://www.freeswitch.org
OK but how can I respond for received events? I subscribe to receive events using following event socket command: event plain CHANNEL_CREATE then I got all events of that type and that's great but the question is how can I handle those events, what's the syntax and where to put it? I will simply explain what I'm trying to achieve: 1. User dialed number 2. CHANNEL_CREATE event is created 3. I got this event using socket 4. What to do now? How to respond for that event? For example I would like to respond with dialstring to use, user called number 123, I would like to return something like sofia/gateway123/00123 2011/6/30 Steven Ayre <steveayre@gmail.com>
Yes it's possible and I suggest you look at esl
Steve on iPhone
On 30 Jun 2011, at 09:54, Mateusz Bartczak <netcentrica@gmail.com> wrote:
Hi all
I'm new to FS and I would like to know is it possible to implement following scenario:
1. User dials number 2. Routing script detects outgoing call event. Every call needs to be handled by routing script. 3. Routing script takes in input: user name, domain, dialed number. Than it query database to find best SIP trunk to route the call, it also checks destination price per minute and calculates maximum call time for prepaid user. 4. Routing script output is: SIP trunk to use, SIP call parameters (ie. callerid), maximum call duration 5. FS read output from routing script and make call using returned parameters
Preferred routing implementation technology: background running unix deamon written in Java or PHP. Connection with FS via socket.
Event routing script will be multi-threaded, must be able to deal with a lot of calls in parallel and processing of one call should not block processing of other calls (I have this problem with Yate voip server, and that's really big problem)
Is it possible to do this using FS? Any advices where to search for additional info? I know that there is event handler but can it return "dialstring" for outgoing call events? Some code examples?
I will really appreciate your help
_______________________________________________ Join us at ClueCon 2011, Aug 9-11, Chicago http://www.cluecon.com 877-7-4ACLUE
FreeSWITCH-users mailing list FreeSWITCH-users@lists.freeswitch.org http://lists.freeswitch.org/mailman/listinfo/freeswitch-users UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users http://www.freeswitch.org
_______________________________________________ Join us at ClueCon 2011, Aug 9-11, Chicago http://www.cluecon.com 877-7-4ACLUE
FreeSWITCH-users mailing list FreeSWITCH-users@lists.freeswitch.org http://lists.freeswitch.org/mailman/listinfo/freeswitch-users UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users http://www.freeswitch.org
Hello Mateusz, I'm finding ESL powerful yet complicated and using mod_xml_curl for dynamic routing. mod_xml_curl with with bindings = "dialplan" handles routing just fine. http://wiki.freeswitch.org/wiki/Mod_xml_curl Another approach is to a the Lua scripts for setting the variables "inside" the dialplan. FreeSWITH is a flexible system, so there are a lot of ways to achieve the same result. Best Regards, Nazim On 07/01/2011 05:55 PM, Mateusz Bartczak wrote:
OK but how can I respond for received events?
I subscribe to receive events using following event socket command:
event plain CHANNEL_CREATE
then I got all events of that type and that's great but the question is how can I handle those events, what's the syntax and where to put it?
I will simply explain what I'm trying to achieve:
1. User dialed number 2. CHANNEL_CREATE event is created 3. I got this event using socket 4. What to do now? How to respond for that event? For example I would like to respond with dialstring to use, user called number 123, I would like to return something like sofia/gateway123/00123
2011/6/30 Steven Ayre<steveayre@gmail.com>
Yes it's possible and I suggest you look at esl
Steve on iPhone
On 30 Jun 2011, at 09:54, Mateusz Bartczak<netcentrica@gmail.com> wrote:
Hi all
I'm new to FS and I would like to know is it possible to implement following scenario: 1. User dials number 2. Routing script detects outgoing call event. Every call needs to be handled by routing script. 3. Routing script takes in input: user name, domain, dialed number. Than it query database to find best SIP trunk to route the call, it also checks destination price per minute and calculates maximum call time for prepaid user. 4. Routing script output is: SIP trunk to use, SIP call parameters (ie. callerid), maximum call duration 5. FS read output from routing script and make call using returned parameters Preferred routing implementation technology: background running unix deamon written in Java or PHP. Connection with FS via socket. Event routing script will be multi-threaded, must be able to deal with a lot of calls in parallel and processing of one call should not block processing of other calls (I have this problem with Yate voip server, and that's really big problem) Is it possible to do this using FS? Any advices where to search for additional info? I know that there is event handler but can it return "dialstring" for outgoing call events? Some code examples?
I will really appreciate your help
Hi, It is easy to achieve using powerful Lua scripting and Core ODBC ( http://wiki.freeswitch.org/wiki/Using_ODBC_in_the_core) If you did not have any experience with Lua, just copy paste script below, and fix syntax errors if any :) (Or you can achieve similar using perl, javascript, etc...) Steps: 1. Add the following block inside your default dialplan (for example you want to handle international calls, prefix "00" or "+") ----------------------------------------------------------------------------- <extension name="international_with_some_routing"> <condition field="destination_number" expression="^(00|\+)(\d+)"> <action application="lua" data="call.lua $2"/> </condition> </extension> ----------------------------------------------------------------------------- 2. Create "call.lua" with the following lines and put it into "scripts" folder under freeswitch main folder: ----------------------------------------------------------------------------- --get db handler local dbh = assert(freeswitch.Dbh("my_routing_db","my_user","my_pass")); subscriber_number = session:getVariable("accountcode"); --or session:getVariable("caller_id_number"); if you wish called_number = argv[1]; --let's check about money balance = 0; dbh:query("select balance from subscriber where subscriber_number='"..subscriber_number.."'", function(row) balance = tonumber(row.balance); end); if (balance <= 0) then freeswitch.consoleLog("WARNING", "Call denied for "..subscriber_number.." to "..called_number.." Balance: "..balance.."\n"); return; end --select price plan and gateway (you can implement more complex logic here, to select the plan with lowest cost, etc) --assuming you use mysql dbh:query("select price_buy, price_sell, provider from dialplan where instr('"..called_number.."',prefix)=1 order by prefix desc limit 1", function(row) price_buy=tonumber(row.price_buy); price_sell=tonumber(row.price_sell); called_gateway=row.provider; end); --add some checks if needed call_duration_min = balance / price_sell; call_duration_sec = call_duration_min * 60; --release db handler dbh:release(); --prepare outgoing session called_parameters = "{ignore_early_media=true,originate_timeout=90,price_sell="..price_sell..",price_buy="..price_buy..",subscriber_number="..subscriber_number..",hangup_after_bridge=true}"; called_string = called_parameters.."sofia/gateway/"..called_gateway.."/"..called_number; session:setVariable("ringback", "%(2000,4000,440,480)"); called_session = freeswitch.Session(called_string, session); --sometimes it is needed :) session:sleep(200); if (called_session:ready()) then -- this will disconnect the call after allowed seconds session:execute("sched_hangup","+"..call_duration_sec); --finally, bridge freeswitch.bridge(session, called_session); end --that's it ----------------------------------------------------------------------------- Make sure that you have valid registered gateway as returned by "called_gateway" in your conf/sip_profiles. Any questions, I will be glad to assist. Regards, Vitalie 2011/7/7 Nazim Aghabayov <nazim.aghabayov@gmail.com>
Hello Mateusz,
I'm finding ESL powerful yet complicated and using mod_xml_curl for dynamic routing. mod_xml_curl with with bindings = "dialplan" handles routing just fine. http://wiki.freeswitch.org/wiki/Mod_xml_curl
Another approach is to a the Lua scripts for setting the variables "inside" the dialplan. FreeSWITH is a flexible system, so there are a lot of ways to achieve the same result.
Best Regards, Nazim
On 07/01/2011 05:55 PM, Mateusz Bartczak wrote:
OK but how can I respond for received events?
I subscribe to receive events using following event socket command:
event plain CHANNEL_CREATE
then I got all events of that type and that's great but the question is how can I handle those events, what's the syntax and where to put it?
I will simply explain what I'm trying to achieve:
1. User dialed number 2. CHANNEL_CREATE event is created 3. I got this event using socket 4. What to do now? How to respond for that event? For example I would like to respond with dialstring to use, user called number 123, I would like to return something like sofia/gateway123/00123
2011/6/30 Steven Ayre<steveayre@gmail.com>
Yes it's possible and I suggest you look at esl
Steve on iPhone
On 30 Jun 2011, at 09:54, Mateusz Bartczak<netcentrica@gmail.com> wrote:
Hi all
I'm new to FS and I would like to know is it possible to implement following scenario: 1. User dials number 2. Routing script detects outgoing call event. Every call needs to be handled by routing script. 3. Routing script takes in input: user name, domain, dialed number. Than it query database to find best SIP trunk to route the call, it also checks destination price per minute and calculates maximum call time for prepaid user. 4. Routing script output is: SIP trunk to use, SIP call parameters (ie. callerid), maximum call duration 5. FS read output from routing script and make call using returned parameters Preferred routing implementation technology: background running unix deamon written in Java or PHP. Connection with FS via socket. Event routing script will be multi-threaded, must be able to deal with a lot of calls in parallel and processing of one call should not block processing of other calls (I have this problem with Yate voip server, and that's really big problem) Is it possible to do this using FS? Any advices where to search for additional info? I know that there is event handler but can it return "dialstring" for outgoing call events? Some code examples?
I will really appreciate your help
_______________________________________________ Join us at ClueCon 2011, Aug 9-11, Chicago http://www.cluecon.com 877-7-4ACLUE
FreeSWITCH-users mailing list FreeSWITCH-users@lists.freeswitch.org http://lists.freeswitch.org/mailman/listinfo/freeswitch-users UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users http://www.freeswitch.org
participants (5)
-
Avi Marcus
-
Mateusz Bartczak
-
Nazim Aghabayov
-
Steven Ayre
-
Vitalie Colosov