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.
Introduction
Over the last week, I've been familiarizing myself with Asterisk, the open-source communications toolkit, which powers IP PBX systems, VoIP gateways, and conference servers. It is such a bitter start for a coding newbie like me, in which I struggled a lot in the installation process and making a simple phone call under the same network. This article aims at sharing a laconic work flow of the asterisk set-up and how a video call is made.
Before getting started ...
I'm using WSL Ubuntu to do the Asterisk set-up.
And before getting straight into the code, I would like to share several links that helped me a lot when I started from zero.
- A simplified Chinese installation guide of Asterisk 17 (Thanks for Google Translate)
- Call making via SIP Softphone
- Basic PBX set-up
- Asterisk firewall rules
Get started!
To start with, as always,
bash
sudo su # enter the superuser mode
apt update
apt upgrade
apt autoclean
How to install Asterisk ?
Installing Asterisk 18
cd /var/local/ # Go to /var/local as the download location
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz # Download Asterisk 18
tar zxf asterisk-18-current.tar.gz # Unzip it
apt install flex bison subversion # Install flex, bison, and subversion
contrib/scripts/get_mp3_source.sh # Download the mp3 decoder save it in ./asterisk 18.xxx/contrib/scripts
contrib/scripts/install_prereq install # Ensure all dependencies are set up
./configure # Set up the asterisk based on the above
make menuconfig # Choose the modules you need
make -j 3 # Allocate cpu cores to run the installation
install # Install all the things we've just set up
Softphone recommendation
I use MicroSIP and Linphone to make calls on Windows.
Connecting softphone to WSL Ubuntu
Asterisk Firewall Rules
- Config of Linux IPTables firewall (https://www.voip-info.org/asterisk-firewall-rules/)
# SIP on UDP port 5060. Other SIP servers may need TCP port 5060 as well
iptables -A INPUT -p udp -m udp --dport 5060 -j ACCEPT
# IAX2- the IAX protocol
iptables -A INPUT -p udp -m udp --dport 4569 -j ACCEPT
# IAX - most have switched to IAX v2, or ought to
iptables -A INPUT -p udp -m udp --dport 5036 -j ACCEPT
# RTP - the media stream
# (related to the port range in /etc/asterisk/rtp.conf)
iptables -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT
# MGCP - if you use media gateway control protocol in your configuration
iptables -A INPUT -p udp -m udp --dport 2727 -j ACCEPT
Basic calling set-up
- Going to set our configs.
bash
cd /etc/asterisk
nano pjsip.conf
- The below is the pjsip.conf for basic calling (Account creation).
conf
;================================ TRANSPORTS ==
; Our primary transport definition for UDP communication behind NAT.
[transport-udp-nat]
type = transport
protocol = udp
bind = 0.0.0.0
;================================ CONFIG FOR SIP ITSP ==
[calling](!) ; template
type=endpoint ; specify the below are the configurations related to an endpoint (a device)
context=interaction ; *** it refers to the context set in the dialplan (extensions.conf) ***
allow = !all, ulaw, alaw ; do not allow all codecs and only allow audio codecs - ulaw and alaw
direct_media=no ; do not allow two devices directly talking to each other
trust_id_outbound=yes
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
device_state_busy_at=1
dtmf_mode=rfc4733
[auth-userpass](!) ; template
type = auth ; specify the below are the configurations related to authentication
auth_type = userpass ; specify the type of the authentication is based on username and password
[aor-single-reg](!) ; template
type = aor
max_contacts = 1 ; specify the maximum sip addresses allocated. Here, that means each sip address could only connect to one device.
[7000](calling) ; endpoint 7000 inherits the settings in calling template
auth=7000 ; authentication = 7000
aors=7000 ; address of record = 7000
callerid = 7000 <7000> ; caller's id = 7000
[7000](auth-userpass) ; account creation for endpoint 7000
password = 7000
username = 7000
[7000](aor-single-reg)
[7100](calling)
auth=7100
aors=7100
callerid = 7100 <7100>
[7100](auth-userpass)
password = 7100
username = 7100
[7100](aor-single-reg)
- The below are the configurations of the extensions.conf (Dialplan)
[globals]
INTERNAL_DIAL_OPT=,30
[interaction] ; refers to the `context=interaction` in calling template in pjsip.conf
exten = 7000,1,Answer() ; the first argument 7000 refers to the number you dial on your softphone.
same = n,Dial(PJSIP/7000,60) ; PJSIP/7000 refers to the endpoint 7000 , 60 means waiting for 60 seconds
same = n,Playback(vm-nobodyavail)
same = n,Voicemail(7000@main)
same = n,Hangup()
exten = 7100,1,Answer()
same = n,Dial(PJSIP/7100,60)
same = n,Playback(vm-nobodyavail)
same = n,Voicemail(7000@main)
same = n,Hangup()
; same means following the same extension
; n means the next action.
- After setting the pjsip.conf and extensions.conf, you need to reload the pjsip and dialplan.
asterisk -r # go to the CLI of Asterisk (command line interface)
core reload # reload pjsip and modules
dialplan reload # reload dialplan
pjsip show endpoints # showing the endpoints you have
- The below is how you set up on the MicroSIP softphone
Do the same on another softphone for the 7100 endpoint.
-
Then call 7100 on 7000 endpoint / 7000 on 7100 endpoint to each other.
- Why I can call certain numbers on my device and can ring another device ?
https://wiki.asterisk.org/wiki/display/AST/Creating+Dialplan+Extensions
This is because we've done the set-up in the extensions.conf, in which we've set a number, for example, 6001, in the illustration below, for the dial action.
[from-internal]
exten=>6001,1,Dial(SIP/demo-alice,20)
exten=>6002,1,Dial(SIP/demo-bob,20)
Video calling
- To achieve video calling, you only need to add the video codec in the pjsip.conf to make it work. And there's no other differences from the basic calling settings.
conf
[calling](!)
type=endpoint
context=interaction
allow = !all, ulaw, alaw, vp8, h263, h263p ; video codec vp8, h263 and h263p are added
direct_media=no
trust_id_outbound=yes
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
device_state_busy_at=1
dtmf_mode=rfc4733
- After changing the pjsip.conf, remember to reload the pjsip like the above again.
Conclusion
- By now, I hope you could achieve video calling in your own network. In the meantime, stay healthy and stay tuned for more content !!!
Top comments (0)