[Freeswitch-users] Re- FreeSWITCH CDRs ${billsec} not correct when using Lua scripts and running a hangup handler with any delays inside it

Steven Ayre steveayre at gmail.com
Fri Feb 27 02:32:44 MSK 2015


CDR processing should be done in the reporting not hangup state.

On 26 February 2015 at 22:50, Andrew Keil <andrew.keil at visytel.com> wrote:

>  To FreeSWITCH users,
>
>
>
> I am currently experimenting with Lua scripts on FreeSWITCH (latest build)
> and found an interesting issue with FreeSWITCH default CDRs (inside
> log/cdr-csv/1000.csv).
>
>
>
> See below for my simple Lua script called from a diaplan as follows:
>
>
>
> <include>
>
>     <!-- To test Lua script  -->
>
>     <extension name="ivr_demo">
>
>       <condition field="destination_number" expression="^(9101)$">
>
>                                 <action application="lua"
> data="myservice.lua"/>
>
>       </condition>
>
>     </extension>
>
> </include>
>
>
>
> What I noticed is that placing a call into FreeSWITCH via a SIP phone
> (calling 9101) and landing on myservice.lua everything processes as
> expected.  If I hangup after 3 seconds then I should expect the CDR to show
> ${billsec} = 3.  However this is not the case since both ${duration} and
> ${billsec} are actually set once the Lua script completes (not based on
> HANGUP).  So inside 1000.csv I see duration and billsec both having 8
> seconds.
>
>
>
> You will see below that inside my hangup handler (function myHangupHook(s,
> status, arg)) I fire an event and wait up to 5000ms for an event to be
> returned (currently I am not returning an event so the 5000ms will take
> place).  This explains the extra 5 seconds after the 3 seconds of the call.
>
>
>
> My question is since FreeSWITCH knows that the HANGUP has taken place why
> is the ${billsec} not correct (ie. should be 3 seconds)?
>
>
>
> I tried adding “session:hangup()” as the first line inside my hangup
> handler (function myHangupHook(s, status, arg)) and this made no difference.
>
>
>
> Is there a solution to this issue?  Perhaps there is a different CDR
> variable that will contain the correct duration based on when HANGUP was
> actually received.
>
>
>
> Thanks in advance for any assistance with this.
>
>
>
> Regards,
>
>
>
> Andrew Keil
>
>
>
>
>
> Simple Lua Script:
>
>
>
> -- myservice.lua
>
> -- To test a simple service
>
>
>
> function MainService()
>
>                 freeswitch.consoleLog("INFO", "MAIN SERVICE SECTION\n")
>
>
>
>                 -- answer the call
>
>                 freeswitch.consoleLog("INFO", "ANSWER CALLER\n")
>
>                 session:answer();
>
>
>
>                 -- sleep a second
>
>                 freeswitch.consoleLog("INFO", "Sleep for 1000ms\n")
>
>                 session:sleep(1000);
>
>
>
>                 freeswitch.consoleLog("INFO", "Playing 12345\n")
>
>                 session:say("12345", "en", "number", "pronounced");
>
>                 freeswitch.consoleLog("INFO", "Finished playing 12345\n")
>
>
>
>                 if (session:ready()) then
>
>                                 -- hangup
>
>                                 freeswitch.consoleLog("INFO", "HANGUP\n")
>
>                                 session:hangup()
>
>                 end
>
> end
>
>
>
>
>
>
> --------------------------------------------------------------------------------------------
>
>
>
>
>
> -- Functions section …
>
>
>
> function myHangupHook(s, status, arg)
>
>     freeswitch.consoleLog("INFO", "myHangupHook: " .. status .. "\n")
>
>
>
>     -- send hangup event test (after caller hangs up)
>
>     local event = freeswitch.Event("CUSTOM", "visytel::HANGUP?")
>
>                 event:addHeader("hi", "there")
>
>                 event:addHeader("channel-uuid", channeluuid)
>
>                 -- Add Event consumer if a response is required!
>
>                 local con = freeswitch.EventConsumer("CUSTOM",
> "visytel::HANGUP!")
>
>     -- fire event
>
>     freeswitch.consoleLog("INFO", "Fire HANGUP event\n")
>
>     event:fire()
>
>                 -- Wait for 5000ms to test response
>
>                 local retevent = con:pop(1, 5000)
>
>                 if retevent then
>
>                                 freeswitch.consoleLog("INFO", "Reply
> received!\n")
>
>                                 freeswitch.consoleLog("INFO",
> string.format("Reply received: %s\n",retevent:getHeader("Result")))
>
>                 end
>
> end
>
>
>
> -- Setup handlers here
>
> myparam="empty";
>
> session:setHangupHook("myHangupHook", "myparam")
>
>
>
> -- Source channel-uuid here {used inside myHangupHook handler and for all
> fired events inside the header
>
> channeluuid = session:getVariable("uuid");
>
>
>
> MainService()
>
>
>
>
>
> -- End of lua script
>
>
>
> _________________________________________________________________________
> Professional FreeSWITCH Consulting Services:
> consulting at freeswitch.org
> http://www.freeswitchsolutions.com
>
> Official FreeSWITCH Sites
> http://www.freeswitch.org
> http://confluence.freeswitch.org
> http://www.cluecon.com
>
> FreeSWITCH-users mailing list
> FreeSWITCH-users at lists.freeswitch.org
> http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
> UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
> http://www.freeswitch.org
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.freeswitch.org/pipermail/freeswitch-users/attachments/20150226/2f00f436/attachment-0001.html 


Join us at ClueCon 2016 Aug 8-12, 2016
More information about the FreeSWITCH-users mailing list