Hello!
I’m using cdr_adaptive_odbc module to collect RTCP data of the call to table.
More or less it looks like this:
...
; usual Dial
same => n,Set(CHANNEL(hangup_handler_push)=qos_leg_a,s,1)
same => n,Dial(${destinationStr},,b(set_qos_handler_b^s^1))
...
[qos_leg_a]
exten => s,1,Noop(Channel: ${CHANNEL(name)}, QoS stats RTCP: ${CHANNEL(rtcp,all)})
same => n,Set(CDR(sip_callid)=${CHANNEL(pjsip,call-id)})
same => n,GotoIf($["${CHANNEL(rtcp,all)}"==""]?end)
same => n,Set(CDR(rtcp_a_all)=${CHANNEL(rtcp,all)})
same => n,Set(CDR(rtcp_a_all_jitter)=${CHANNEL(rtcp,all_jitter)})
same => n,Set(CDR(rtcp_a_all_loss)=${CHANNEL(rtcp,all_loss)})
same => n,Set(CDR(rtcp_a_all_rtt)=${CHANNEL(rtcp,all_rtt)})
same => n(end),Return()
[qos_leg_b]
exten => s,1,Noop(Channel: ${CHANNEL(name)}, QoS stats RTCP: ${CHANNEL(rtcp,all)})
same => n,GotoIf($["${CHANNEL(rtcp,all)}"==""]?end)
same => n,Set(CDR(rtcp_b_all)=${CHANNEL(rtcp,all)})
same => n,Set(CDR(rtcp_b_all_jitter)=${CHANNEL(rtcp,all_jitter)})
same => n,Set(CDR(rtcp_b_all_loss)=${CHANNEL(rtcp,all_loss)})
same => n,Set(CDR(rtcp_b_all_rtt)=${CHANNEL(rtcp,all_rtt)})
same => n(end),Return()
[set_qos_handler_b]
exten => s,1,Set(CHANNEL(hangup_handler_push)=qos_leg_b,s,1)
same => n,Return()
It works like a charm if you have in ${destinationStr}
something like PJSIP/${EXTEN}
. But when it’s a complex string, like PJSIP/${EXTEN}&Local/whatever@else
I see commands are running on a legB, but no CDR extra data is being written to the table. For A leg it’s all fine, but not for B. It’s just setting NULL for all legB data, although I can see in the dialplan variables are set.
What hints are possible here to get this info in database without additional external scripting (which is possible, but adding extra layer)?