This is the infrastructure used
- A Fit-PC3 for PBX, ultra low power machine for Asterisk
- A LinkSys SPA3000 as FXO/FXS port (connection to and from public telephone network)
- An old analog phone
- A couple of semi-old Cisco IP Phones
How an incoming call works
An inbound call comes in over the SPA3000 from the Public telephone network. That call is converted to SIP and routed to the PBX (step 2). The PBX then distributes the call to all 3 SIP clients: SPA3000 (now the 2nd port), the Wireless IP phone and the wired IP Phone (step 3 and 4).
How an outgoing call works
When one of the 3 phones makes a call it is sent to the PBX (1, 2, 2a, 2b) who then looks at the number dialed. It then makes a decision to route it to a SIP provider via the Internet connection (3) or route it over the public telephone network again (3 and 4). This was done because the PSTN provider has better rates for calling a mobile phone (+316xxxx)
Setting up the Cisco IP phone
Setting up the individual VOIP phones can take a bit of time, for Cisco a TFTP service is needed and the phone must be equiped with SIP firmware (if this is not already done). A good tutorial can be found here. The SIP firmware only applies to the non-wireless phones, the Cisco 7970. An other Cisco 792x can be connected to asterisk using the SCCP firmware
Setup the SPA-3000 for incoming and outgoing analog calls
There are lots of configuration settings for the SPA-3000, but I think the following are the major ones which need to be set. Using the advanced web menu configuration: the following settings will configure 2 sip clients to the asterisk PBX which you can then use to route incoming and outgoing traffic. This is a pretty cool feature of the SPA3000: basically this small device is 2 analog-to-SIP clients glued together. registering them both to the PBX makes a powerfull setup.
In the Line 1
tab:
Line Enable: Yes
Proxy: <IP Address of Asterisk Server>
Register: Yes
User ID: spa3000
Password: PASSWORD
Dial Plan: (1233|xxxxxxxxxx|000S0<:@gw0>|106S0<:@gw0>|1[38]xxxxxxxxS0<:@gw0>|13[1-9]xxxS0<:@gw0>|1[9]xxxxxxxxS0<:@gw0>|0[23478]xxxxxxxxS0|[2-9]xxxxxxxS0|001xxxx.S5|xxx.<:@gw0>|*xx.|<*,:>xx.|<#,:><:@gw0>)
The dial plan syntax for the SPA-3000 is in the documentation. This is mine and forwards all to the asterisk pbx.
In the PSTN Line
tab:
Line Enable: Yes
Proxy: <IP Address of Asterisk Server>
Register: Yes
User ID: pstn
Password: PASSWORD
Dial Plan 2: (S0<:ip-of-asterisk-colon-5060>)
PSTN-To-VoIP Gateway Enable: Yes
PSTN Ring Thru Line 1: No
PSTN CID For VoIP CID: Yes
PSTN Caller Default DP: 2
Disconnect Tone: 425@-30,425@-30;1.4(.5/.5/1+2)
Ring Thru Line1 is set to NO now: this means that even though the SPA300 will route the call to the PBX, and that PBX will route it back again: the SPA3000 is not allowed to let it already ring. It needs to wait for the PBX. You may set this setting to true if you wish the analog port to start ringing earlier than the IP phones.
In the regional tab (skip if not in NL):
Make the SPA3000 analog line sound like it’s from the Netherlands
Call Progress Tones | |||
Dial Tone: | |||
Second Dial Tone: | |||
Outside Dial Tone: | |||
Prompt Tone: | |||
Busy Tone: | |||
Reorder Tone: | |||
Off Hook Warning Tone: | |||
Ring Back Tone: | |||
Confirm Tone: | |||
SIT1 Tone: | |||
SIT2 Tone: | |||
SIT3 Tone: | |||
SIT4 Tone: | |||
MWI Dial Tone: | |||
Cfwd Dial Tone: | |||
Holding Tone: | |||
Conference Tone: | |||
Secure Call Indication Tone: | |||
VoIP PIN Tone: | |||
PSTN PIN Tone: | |||
PSTN Warning Tone: | |||
Feature Invocation Tone: | |||
Distinctive Ring Patterns | |||
Ring1 Cadence: | Ring2 Cadence: | ||
Ring3 Cadence: | Ring4 Cadence: | ||
Ring5 Cadence: | Ring6 Cadence: | ||
Ring7 Cadence: | Ring8 Cadence: | ||
 sip.conf
the sip.conf file is where you configure each individual SIP endpoint that you connect to (or is connected from) in this installation: 2x SPA3000, 2x IP phones and 1 SIP internet telephony provider. 5 in total
; part of the [general] context ;    This registers the SIP client to the VOIP provider (voipbuster) register => USERNAME:PASSWORD@sip1.voipbuster.com [cisco7970]  type=friend                   ; This device takes and makes calls  host=dynamic                  ; This host is not on the same IP addr every time  username=cisco7970            ; Username programmed into Cisco phone  secret=PASSWORD ; Password for device  context=local_phone           ; Inbound calls from this phone go to this context  nat=no                        ; nat=yes if this phone is behind a NAT box or firewall  callgroup=2                   ; the group to which this phone belongs for *8 phone ringing pickup  pickupgroup=2                 ; the pickup group allowed from this phone when *8 is dialed  mailbox=3000                  ; Activate the message waiting light if this voicemailbox has messages in it [pstn]  type=friend  host=dynamic  username=pstn  secret=PASSWORD  call-limit=2  disallow=all                   ; need to disallow=all before we can use allow=  allow=ulaw                     ; Note: In user sections the order of codecs                                ; listed with allow= does NOT matter!  allow=alaw  allow=g723.1                   ; Asterisk only supports g723.1 pass-thru!  allow=g729                     ; Pass-thru only unless g729 license obtained  allow=gsm  context=incoming [spa3000]  mailbox=3000                   ; Mailbox number (numerical so can be selected through phone)  type=friend  host=dynamic  username=spa3000  secret=PASSWORD  call-limit=2  disallow=all                   ; need to disallow=all before we can use allow=  allow=ulaw                     ; Note: In user sections the order of codecs                                ; listed with allow= does NOT matter!  allow=alaw  allow=g723.1                   ; Asterisk only supports g723.1 pass-thru!  allow=g729                     ; Pass-thru only unless g729 license obtained  allow=gsm  context=local_phone            ; This links sip.conf with the                                ; entry local_phone in extensions.conf [voipbuster]  type=peer  host=sip1.voipbuster.com  username=USERNAME  fromuser=USERNAME  secret=PASSWORD canreinvite=no insecure=very nat=no qualify=yes dtmfmode=rfc2833 context=incoming              ; This connects incoming calls to the corresponding entry in extensions.conf disallow=all allow=g729 allow=ulaw allow=alaw allow=g723.1                   ; Asterisk only supports g723.1 pass-thru! allow=g729                     ; Pass-thru only unless g729 license obtained allow=gsm
extensions.conf
Extensions.conf wires it all together: all SIP endpoints previously configured can now be connected to each other using this dailplan. there are two contexts: a local_phone and an incoming handling outgoing/local traffic (local_phone) and incoming calls (incoming)
The dailplan you see here lets all international and landlines be routed throug the SIP telephony provider and all mobile calls to the pstn.
[local_phone] exten => 1233,1,VoiceMailMain(s3000) exten => 1,1,Dial(SIP/spa3000,20) exten => 2,1,Dial(SIP/cisco7970,20) exten => 3,1,Dial(SIP/mac,20) exten => _06XXXXXXXX,1,Dial(SIP/${EXTEN}@pstn) exten => _00316XXXXXXXX,1,Dial(SIP/${EXTEN}@pstn) exten => _+316XXXXXXXX,1,Dial(SIP/${EXTEN}@pstn) exten => _0XXXXXXXXX,1,Dial(SIP/+31${EXTEN:1}@voipbuster) exten => _XXXXXXX,1,Dial(SIP/+3172${EXTEN}@voipbuster) exten => _00X.,1,Dial(SIP/${EXTEN}@voipbuster) [incoming] exten => s,1,Dial(SIP/spa3000&SIP/cisco7970, 20); Dial for 20 sec. exten => s,2,VoiceMail(3000)
 CheckSPA.sh
unfortunatly: even if the SPA3000 has the most recent firmware, it’s still not stable. After a call the line state/loop current can ‘hang’ causing the incoming line to be busy. There is no real solution for this other than a check+reset script.
crontab -e
# m h dom mon dow  command */2 * *  *   *   /srv/checkSPA.sh spa3000
using the following script check if the line-state and the loop current are in sync. if not: reset the SPA3000. If you do not implement this script, you run the risk of the inbound phone line being busy all the time.
#!/bin/sh SPA3000=$1 WGET=/usr/bin/wget ECHO="logger -t $SPA3000 -p user.notice" get_status() {        STATUS=`$WGET --keep-session-cookies --quiet --output-document=- http://$SPA3000/ |            sed -n -e '/PSTN Line Status/,/Current/p' |            sed -e 's/<\/font>/,/g'            \                -e 's/<td>/ /g'                \                -e 's/<[^>]*>//g'              \                -e 's/, Registration.*//'` } check_status() {        echo $STATUS | grep "Hook State: On" > /dev/null        if [ $? -eq 0 ]; then                echo $STATUS | grep "Loop Current: 0.0" > /dev/null                if [ $? -eq 1 ]; then                        return 1                fi        fi        return 0 } if [ -z "$SPA3000" ]; then        echo usage: `basename $0` '<spa-3000>' >&2        exit 4 fi get_status $ECHO "Status $STATUS" check_status if [ $? -ne 0 ]; then        $ECHO "$SPA3000 locked up - attempting to reboot"        $WGET --keep-session-cookies --quiet --output-document=/dev/null http://$SPA3000/admin/reboot        # allow time to reboot        sleep 15        get_status        $ECHO "Status $STATUS"        check_status        if [ $? -ne 0 ]; then                $ECHO "$SPA3000 locked up and reboot failed"                exit 2        fi        exit 1 fi exit 0
Recording calls
If you wish to record (on demand) your calls done via asterisk, use this tutorial.
Source:
- http://ozlabs.org/~cyeoh/asterisk/
echo “Hello nerdy world”