Not getting DTMF digits during call - asterisk

I am writing a simple asterisk extension plan, In which when user calls, User press key and that key store to a text file.
For this i write this extension:-
exten => 203,1,Answer()
exten => 203,2,Read(NUMBER1||1)
exten => 203,3,System(echo 'User entered ${NUMBER1}' >> /tmp/key.txt)
exten => 203,4,Hangup()
But whenever i call and press any key, file only have 'User entered', Means i am not getting key.
What i am doing wrong here?
Here is my sip.conf for extension:-
[mysjphone]
type=friend
host=dynamic
username=mysjphone
secret=blablabla
allow=gsm
dtmfmode = rfc2833
host = dynamic
Note: I am doing this in windows server (astriskwin32).

That package is built on an extremely old version of Asterisk, 1.2.x. Since that time, there were many, many improvements made to Asterisk's ability to detect and process RFC2833 DTMF events. You'll likely want to upgrade to a much newer version of Asterisk. For more information about Asterisk versions, please see:
https://wiki.asterisk.org/wiki/display/AST/Asterisk+Versions

Related

Asterisk - playing music whilst originating a call

I'm using a cloud-based Asterisk server as my PBX. At my current location, the Internet is rather shaky, but cell phones are reliable and commonplace. However, international cell calls are expensive, VOIP calls are much cheaper.
So, I came up with a script in Asterisk which dials my local cell phone:
exten => _abcd.,1,NoOp(-- Making outbound call to number ${EXTEN:4} --)
same => n,Answer()
same => n,Wait(1)
same => n,Originate(SIP/+86[my_cell_no]#[voip_provider],exten,incoming_remote,##${EXTEN:4})
same => n,Hangup()
Let's say I want to call a UK mobile number, +4477something. I would use my softphone to dial abcd+4477something. The script above runs, makes a call into my local cell phone. As soon as I answer, it jumps into another extension _##. which dials the outbound number, and connects the two together.
It works perfectly. However, whilst I'm waiting for the local cell to connect, I've got silence on the line. I'd quite like to play music... but I can't use the MusicOnHold() application, because it just sits there & does nothing until I hang up!
I can't add any "DIAL" style commands (i.e. "m") to the Originate command because it doesn't support them.
Is there any known way of playing (one of) the MusicOnHold channels asynchronously whilst the rest of my dialplan gets on with it?
Would the AGI command SET MUSIC do what I wanted?
e.g.
exten => _abcd.,1,NoOp(-- Making outbound call to number ${EXTEN:4} --)
same => n,AGI(turn_music_on.sh)
same => n,Answer()
.....etc.
I'm using Asterisk 1.8, if a newer version fixes/changes the MusicOnHold behaviour, then that will be the accepted answer (but the documentation seems to suggest it's the same).
You can call to Local channel(dialplan). After that in dialplan you can use m of dial command.
https://www.voip-info.org/wiki/view/Asterisk+local+channels
same => n,Originate(Local/[my_cell_no]#out/n,exten,incoming_remote,##${EXTEN:4})
[out]
exten => _X.,1,Dial(SIP/+86${EXTEN}#[voip_provider],,m)

How to install an application on Elastix?

Does anyone know, how to install an application on Elastix? In my case it is Answering Machine Detection(AMD). I need this application to detect outgoing calls, and if the answering machine is fax, hangup.
I tried to modify config files(modules.conf, extensions.conf, extensions_override_elastix.conf, amd.conf) as it is told in Asterisk documentation and forums, but non of it worked. CLI console doesn't show AMD output, and I think that AMD isn't even enabled there.
I've been looking for the answer for 3 or 4 weeks now and found almost nothing.
There must be something I've overlooked.
Maybe I should change something in the database(asterisk) or Elastix PBX settings?
Here's what I did:
Modified /etc/asterisk/amd.conf file. Appended this to the end:
[general]
initial_silence = 2250
greeting = 1500
after_greeting_silence = 1250
total_analysis_time = 5000
min_word_length = 100
between_words_silence = 50
maximum_number_of_words = 8
silence_threshold = 256
Modified /etc/asterisk/modules.conf. Appended this to the end:
load = > app_amd.so
Modified /etc/asterisk/extensions_override_elastix.conf
[outgoing] ;context
exten => s,1,Answer()
exten => s,n,AMD()
exten => s,n,NoOp(${AMDSTATUS})
exten => s,n,GotoIf($[${AMDSTATUS}=HUMAN]?humn:mach)
exten => s,n(mach),WaitForSilence(3000,1,20)
exten => s,n,Playback(${VOICEFILE})
exten => s,n,Hangup()
exten => s,n(humn),WaitForSilence(500)
exten => s,n,Playback(${VOICEFILE})
exten => s,n,Hangup()
Seeking for settings in database, in case if Elastix works through its database. Elastix writes logs into asterisk.cdr table - that's the only useful thing I've found.
I suppose, the CLI console should "say" something related to AMD application when I am calling, but it works as usual, without AMD enabled.
Thank you in advance!
You should add at options page to dialling param "M(amd)"
After that you should create macro-amd like described in manual.
That macro will be fired on call after call answered and before call bridged to other peer.

Vicidial SIP Trunk with Twilio

I need a step by step guide on configuring Twilio Elastic SIP Trunk on my Vicidial Server. I've been working it out for days now. Still can't make an outbound call. My account on twilio is still a trial account. thank you guys. :(
From vicidial admin panel, go to Admin >> Carriers
Add a new carrier named "myname"
**Replace "myname" with whatever you like but keep it consistent throughout the config. Anywhere you see "myname" replace it with the same value.
In the account entry section use this template:
Account Entry:
[myname]
type=peer
secret=mypassword ;if you created a Credentials list in Twilio the password goes here
username=myuser ;the Credentials username goes here
host=mytrunkname.pstn.twilio.com ;in Twilio this is your Termination SIP URI that you created under Elastic SIP Trunk settings
dtmfmode=rfc2833
canreinvite=no
disallow=all
allow=ulaw
insecure=port,invite
fromuser=+18005551234 ;the phone number associated with your trunk goes here
fromdomain=mytrunkname.pstn.twilio.com
Global String: DIAL9TRUNK = SIP/myname
Dialplan Entry:
exten => _91NXXNXXXXXX,1,AGI(agi://127.0.0.1:4577/call_log)
exten => _91NXXNXXXXXX,n,Dial(${DIAL9TRUNK}/+1${EXTEN:2},,To)
exten => _91NXXNXXXXXX,n,Hangup
exten => _9NXXNXXXXXX,1,AGI(agi://127.0.0.1:4577/call_log)
exten => _9NXXNXXXXXX,n,Dial(${DIAL9TRUNK}/+1${EXTEN:1},,tTo)
exten => _9NXXNXXXXXX,n,Hangup
That should activate outbound calling prefixed with the number 9. Meaning, dial 9 and then the number you want to dial as usual. You might want to remove all of my comments in the settings just to be safe. If you need any more help post back with your current config and I'll try to respond quickly.
Cheers!
The above answer is several years old, and I get emails asking how to add Twilio to Vicidial quite frequently. The problem is almost always with how you configure your Twilio account. I have to admit I have found the process fairly painful.
You going to need a unique trunk name for Twilio. I recommend you head to random.org and just use a random string. Copy one and paste it into a note.
You need to use a Twilio product called "Elastic SIP Trunking". Here's what you fill in when you create your new Twilio trunk:
Trunk Name: Vicidial
Call Recording: No
Secure Trunking: Disabled
Termination URI: [that random string from random.org].pstn.twilio.com
IP Access Control Lists: (add every public IP address of your Vicidial cluster that needs to dial)
Credential Lists: (here's what people tend to mess up in my experience; make sure these are set with both username and password - I'd copy and past them into a note for reference when trunking Vicidial)
Origination SIP URI: (add the public IP address of one server of your Vicidial cluster; I tend you pick the server that's set as the voicemail server)
Priority: 10
Weight: 10
Log into your Administration interface of your Vicidial system and head to Carriers (Administration → Admin → Carriers)
Click "Add A New Carrier". It's in the grey bar across the top.
Carrier ID: Twilio
Carrier Name: Elastic SIP Trunk
Carrier Description: (I leave that blank)
Registration String: (leave that blank)
Account Entry:
[twilio]
disallow=all
allow=ulaw
type=friend
secret=(password you created in "Credential Lists")
username=(user name you created in "Credential Lists")
host=(the value used in "Termination URI", e.g. wkR9PaMPvk9h.pstn.twilio.com)
dtmfmode=rfc2833
context=trunk-inbound
Globals String:
TWILIO = SIP/twilio
Dialplan Entry:
exten => _91XXXNXXXXXX,1,AGI(agi://127.0.0.1:4577/call_log)
exten => _91XXXNXXXXXX,2,Dial(${TWILIO}/${EXTEN:1},,To)
exten => _91XXXNXXXXXX,3,Hangup
exten => _9XXXNXXXXXX,1,AGI(agi://127.0.0.1:4577/call_log)
exten => _9XXXNXXXXXX,2,Dial(${TWILIO}/1${EXTEN:1},,To)
exten => _9XXXNXXXXXX,3,Hangup
exten => _1XXXNXXXXXX,1,AGI(agi://127.0.0.1:4577/call_log)
exten => _1XXXNXXXXXX,2,Dial(${TWILIO}/${EXTEN},,To)
exten => _1XXXNXXXXXX,3,Hangup
exten => _XXXNXXXXXX,1,AGI(agi://127.0.0.1:4577/call_log)
exten => _XXXNXXXXXX,2,Dial(${TWILIO}/1${EXTEN},,To)
exten => _XXXNXXXXXX,3,Hangup
Submit and ensure the carrier is saved as Active "Y" (you'll have to submit a second time). Wait a minute or two and you should be able to send calls to Twilio. If there's a problem, double and triple check your outbound Caller ID setting as Twilio will block calls if that's not set up perfectly.

Execute dialplan context from command line

I'm trying to execute an extension from the command line (via asterisk -rx "command") on a context that makes a AGI based query to determine which extension needs to be dialed (these extensions are updated on the DB).
It's something like this:
[autodialer]
exten => 2,1,Answer()
exten => 2,n,AGI(database_query.php); Makes a database query and generates vars
exten => 2,n,Set(CALLERID(name)=${db_customer_name}); Sets callerid from DB data
exten => 2,n,Dial(SIP/${db_customer_extension}); Also, extensions are stored on DB
exten => 2,n,Playback(custom/important_message)
exten => 2,n,SayDigits(${important_numbers}); The message, stored on DB too.
exten => h,1,Hangup()
Here, I need that context executed from command line, without having to dial it from any extension (it is supposed to be executed with a crontab every X time).
I tried with originate command, but I think I misunderstood the command syntax and didn't work.
I think that it should be something like: asterisk -rx "channel originate 2#autodialer" and then Asterisk executes that context and we're all happy with our important numbers.
I know that's not the right syntax, just trying to explain how I imagine it could work.
Thanks for your help.
There are no way do originate only one leg. You have supply second argument(other channel dest)
if you not need other channel, create context like this
[wait]
exten =>s,1,Wait(10000)
and use
asterisk -rx "channel originate 2#autodialer s#wait"
Read this article:
http://www.voip-info.org/wiki/view/Asterisk+auto-dial+out
NOTE: it is not recommended do diallout apps for people with less then 5 years dedicated asterisk experience. If you want one, use vicidial.org or other dialler.

Asterisk auto Call recording

We are running asterisk with 8 port FXO. FXO connects to our old PBX (Samsung Office Serv 100).
Now we want to record all calls routed through FXO (if it was dialed to outside or comming from outside).
Is there a simple way to do this?
Are you running plain Asterisk? If so you can modify your dial plan to start 'monitoring' the channel, which will record the call.
The monitor command's documentation: http://www.voip-info.org/wiki/view/Asterisk+cmd+monitor
Just for the sake of completion, here's the documentation:
[root#localhost ~]# asterisk -rx 'core show application monitor'
-= Info about application 'Monitor' =-
[Synopsis]
Monitor a channel
[Description]
Monitor([file_format[:urlbase],[fname_base],[options]]):
Used to start monitoring a channel. The channel's input and output
voice packets are logged to files until the channel hangs up or
monitoring is stopped by the StopMonitor application.
file_format optional, if not set, defaults to "wav"
fname_base if set, changes the filename used to the one specified.
options:
m - when the recording ends mix the two leg files into one and
delete the two leg files. If the variable MONITOR_EXEC is set, the
application referenced in it will be executed instead of
soxmix and the raw leg files will NOT be deleted automatically.
soxmix or MONITOR_EXEC is handed 3 arguments, the two leg files
and a target mixed file name which is the same as the leg file names
only without the in/out designator.
If MONITOR_EXEC_ARGS is set, the contents will be passed on as
additional arguments to MONITOR_EXEC
Both MONITOR_EXEC and the Mix flag can be set from the
administrator interface
b - Don't begin recording unless a call is bridged to another channel
i - Skip recording of input stream (disables m option)
o - Skip recording of output stream (disables m option)
By default, files are stored to /var/spool/asterisk/monitor/.
Returns -1 if monitor files can't be opened or if the channel is already
monitored, otherwise 0.
And here's a sample way you can use it:
; This fake context records all outgoing calls to /var/spool/asterisk/monitor in wav format.
[fake-outgoing-context]
exten => s,1,Answer()
exten => s,n,Monitor(wav,,b)
exten => s,n,Dial(DAHDI/g0/${EXTEN})
exten => s,n,Hangup()
Obviously you'd have to make changes to my code, but hopefully that gives you a good idea.
A real life example is
exten => _87X,1,NoOp()
exten => _87X,n,MixMonitor(${UNIQUEID}.wav,ab)
exten => _87X,n,Dial(SIP/${EXTEN},45)
exten => _87X,n,StopMixMonitor()
exten => _87X,n,Hangup()
It's good practise to always have NoOp - the first rule must start with 1, this way you can interchange the rules with the n step any way you want.
It's always best to use MixMonitor as opposed to Monitor - Monitor only records inbound or outbound audio - MixMonitor uses both.
Also wav is quite a good choice as a format - I also use a script to transform the wav files to OGG at the end of the day - the best compromise between size / quality and licensing issues.
With regards to the arguments
a is append
b is bridge (good for production - it will only record when the call is answered - not good for debugging)
With regards to StopMixMonitor(), I'm just being thorough, but for examples there are cases in which you would like to stop the recording, for example:
...
exten => _39[5-9],n,Dial(SIP/${EXTEN},45)
exten => _39[5-9],n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavailable)
exten => _39[5-9],n(busy),NoOp()
exten => _39[5-9],n,StopMixMonitor()
exten => _39[5-9],n,Voicemail(${EXTEN},u)
exten => _39[5-9],n,Hangup()
exten => _39[5-9],n(unavailble),NoOp()
exten => _39[5-9],n,StopMixMonitor()
exten => _39[5-9],n,Hangup()
...
In this example, you would stop the recording of the voice mail interaction.
Hope this will bring some light on the matter.
Depending on the specifications of your Asterisk box you might find this hack useful too. Create a rather large ramdisk and mount /var/spool/asterisk/monitor to it. That way Asterisk records to memory not disk. Then write a script under cron to move the recordings to permanent storage every 15-30 minutes or so.

Resources