DEV Community

Ekim
Ekim

Posted on

Make calls through Asterisk CLI

Weekly sharing

Hi everyone, I am Ekim, a fresh Bootcamp graduate and an IT helper (I don't dare to call myself a programmer yet). Every Friday, I will share some of the work that I've done over the last week in a bid to get feedbacks from you guys and record my journey to become a programmer.

Previously

Record and Hear your voice through Asterisk

Introduction

As promised, I will go through a more user-friendly process of recording a voice. Also, I would like to show you how to originate a call (make a call) from Asterisk.

Voice Navigation

  • If you are careful enough, you would have noticed that the Record dialplan application includes a "beep" sound when you dial 41XXXX.
  • So now, let's make our voice navigation based on that.
  • Record a track that signals people to start recording their voices after hearing a "beep" sound and press # when they finish recording.

Phone restriction

  • If you dial 41XXXX to record your navigation audio, just like the previous sharing, you wouldn't need to worry about the audio restrictions. However, if you record your navigation audio through your smartphone application or other devices, the recording you got is highly likely incompatible with the telephony codecs.

  • Often, for hardphones, there are restrictions for the audio file.

    • Codec → .gsm (convention and saves space) | .wav (better quality but occupying more space)
    • Channels → mono
    • Sample rate → 8000hz (at max)
    • Bits per sample → 16bits
  • So, we need to convert the file into what we need using ffmpeg.

ffmpeg -i <file> -ac 1 -ar 8000 -c:a pcm_s16le "<new file>.wav"
Enter fullscreen mode Exit fullscreen mode

Audio track location

  • After that, let's move the converted file to the location where Asterisk stores sounds.
cd /var/lib/asterisk/sounds/
Enter fullscreen mode Exit fullscreen mode
  • I would like to create a folder for better organization, so I create a folder called "playback"
mkdir playback
Enter fullscreen mode Exit fullscreen mode

Dialplan modifications

  • Going back to our extensions.conf,
[recordAndPlayback]
exten = _41XXXX,1,Answer
; Playback is the application; playback is the folder in /var/lib/asterisk/sounds/ ; xxxxx is the converted audio name where .wav is excluded.
same = n,Playback(playback/xxxxx)   
; record your voice and save it in the name of XXXX, the any 4 digits you dialed and in .gsm format
same = n,Record(record/${EXTEN:2}.gsm)      
same = n,Wait(1)
same = n,Hangup()

exten = _42XXXX,1,Answer
same = n,Wait(1)
; play the audio file you recorded from /var/lib/asterisk/sounds/record
same = n,Playback(record/${EXTEN:2})        
same = n,Wait(1)
same = n,Hangup()
Enter fullscreen mode Exit fullscreen mode
  • As always, after doing changes in the dialplan, reload it in the CLI.
sudo asterisk -rvvvvv
dialplan reload
Enter fullscreen mode Exit fullscreen mode
  • Now, it is more user-friendly.

Calling through CLI

  • Before we originate a call through CLI, we need to do some settings in pjsip.conf, extensions.conf and modules.conf.

  • In pjsip.conf,

[transport-udp-nat]
type = transport
protocol = udp
bind = 0.0.0.0


[endpoint-useragent](!)
type=endpoint
context=calling         ;Context is now "calling"
allow = !all,ulaw,alaw
direct_media=no
trust_id_outbound=yes
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
device_state_busy_at=1
dtmf_mode=rfc4733

[auth-userpass](!)
type = auth
auth_type = userpass

[aor-single-reg](!)
type = aor
max_contacts = 1

[1112](endpoint-useragent)      ;created 1112 endpoint
auth=1112
aors=1112
callerid = 1112 <1112>

[1112](auth-userpass)
password = 1112
username = 1112

[1113](endpoint-useragent)      ;created 1113 endpoint
auth=1113
aors=1113
callerid = 1113 <1113>

[1113](auth-userpass)
password = 1113
username = 1113
Enter fullscreen mode Exit fullscreen mode
  • In extensions.conf
[calling]
exten = _111X,1,Dial(PJSIP/${EXTEN})
 same = n,Hangup()
Enter fullscreen mode Exit fullscreen mode
  • In modules.conf
;Application
load = app_bridgewait.so
load = app_dial.so
load = app_playback.so
load = app_stack.so
load = app_verbose.so
load = app_voicemail.so
load = app_directory.so
load = app_confbridge.so
load = app_queue.so
load = app_record.so
load = app_originate.so     ; added 
load = res_clioriginate.so  ; added 
Enter fullscreen mode Exit fullscreen mode
  • Also, don't forget to set up those endpoints on your two different softphones. For me, I use MicroSIP and Linphone.

  • And remember, restart after adding new modules in modules.conf, and reload the dialplan and pjsip.

sudo service asterisk restart
sudo asterisk -rvvvvv
dialplan reload     ; not necessary after restart
core reload     ; not necessary after restart
channel originate LOCAL/1112@calling application Dial(PJSIP/1113)       # this is how you originate a call via CLI
Enter fullscreen mode Exit fullscreen mode
  • TLDR: This is how you originate a call from CLIchannel originate LOCAL/1112@calling application Dial(PJSIP/1113).

Conclusion

  • I hope you know more about the codec for telephony system and know how to make calls from CLI. That's it for today. If you have problems regarding ffmpeg installation, which I omitted in this sharing, please comment below and see if I could help. In the meantime, stay healthy and stay tuned for more content !!!

Discussion (0)