On 20/09/2012, at 3:59 PM, Noah Engelberth 
<[email protected]<mailto:[email protected]>> wrote:
I've been working on an interactive XMPP interface so users at my office can 
interact with the timeclock and queues by XMPP (in addition to IVR menu, which 
has been running just fine for quite a while before the XMPP interface).  I'm 
using sendtodialplan=yes to handling the incoming unsolicited messages, and 
typically will have at least one point of interaction where Asterisk requests 
authentication from the user and then waits with XMPP_RECEIVE for the response. 
 Asterisk then processes the reply and finishes out the "call" as expected, no 
problems there.  However, I'm seeing some behavior that I don't really expect 
after the call finishes.

After my call finishes, sendtodialplan triggers again one time for each message 
that was sent back (and caught by XMPP_RECEIVE) during the just completed call. 
 I've avoided unwanted extra processing by using XMPP_RECEIVE on a short 
timeout to process incoming unsolicited messages, so the net effect of this 
extra trigger is one or more "XMPP calls" that trip the 1 second timeout on 
this XMPP_RECEIVE and then fall through and clean up.  However, when I 
initially started setting this up, my expectation was that sendtodialplan would 
only trigger on messages that weren't solicited.

What does your dialplan look like?

Are you using _.

--
Cheers,

Matt Riddell

No pattern matching in this portion of the dialplan.  A rough 
approximation/sanitized psuedocode of what the code winds up as is...

[xmpp-incoming]
exten => s,1,Verbose(5,incoming)
same => n,Set(REPLY_TO=${MESSAGE(from)})
same => n,Set(REPLY_TO=${CUT(REPLY_TO,:,2)}) ; to cut off xmpp:
same => n,Set(REPLY_TO=${CUT(REPLY_TO,/,1)}) ; to cut off /resource
same => n,Set(MSG=${JABBER_RECEIVE(asterisk-xmpp,${REPLY_TO},1)
same => n,GotoIf($[${ISNULL(${MSG})}]?hangup,1:message,1)

exten => message,1,Verbose(5,process message)
same => n,Set(CMD=${CUT(MSG, ,1)})
same => n,Set(PIN=Retrieve PIN via ODBC function)
same => n,JabberSend(asterisk-xmpp,${REPLY_TO},Please authenticate)
same => n,Set(ENTERED_PIN=${JABBER_RECEIVE(asterisk-xmpp,${REPLY_TO},15)
same => n,GotoIf($[${ISNULL(${ENTERED_PIN})}]?timeout,1)
... check if the pin matches, kick them to invalid-user,1 if it doesn't, or 
process their command if it does...

exten => hangup,1,Verbose(5,let the message fallthrough because using Hangup() 
dorks up message receiving)

exten => timeout,1,Verbose(5,no input on authentication)
same => n,JabberSend(asterisk-xmpp,${REPLY_TO},Sorry, you timed out.  If you 
still want to execute your command, please try again.)


What I'm seeing 100% of the time is that as soon as the "call" from the initial 
message falls through the end and gets hung up by autofallthrough, then a "new 
call" executes for the incoming message from the prompted JABBER_RECEIVE in the 
message extension (when I'm asking for authentication code.  I have one 
specific command that winds up prompting for input a second time, and both 
prompted messages spawn off new calls, in order received, one after the other, 
after the original call is cleaned up.  By having the one second timeout on the 
JABBER_RECEIVE in the s extension that pulls incoming unsolicited messages off 
the stack, I keep the XMPP calls from stacking up and impacting performance, 
but it just seems like odd behavior.  Especially that the incoming message will 
wait any amount of time and fire off exactly when the previous call ends.

Thank you,

Noah Engelberth
MetaLINK Technologies
--
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --
New to Asterisk? Join us for a live introductory webinar every Thurs:
               http://www.asterisk.org/hello

asterisk-users mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-users

Reply via email to