Asterisk extension language
While I really like all of the things that Asterisk allows me to do with my phone system, I’m really not very fond of its configuration language. The language provided in Asterisk 1.0 is slightly better then sendmail.cf, but it’s still a lousy language. They made a few small improvements early in the Asterisk 1.2 development process that helped a bit, but I assumed that we’d have to wait for another year or two before someone broke down and wrote a decent language for Asterisk.
It looks like I may have been overly pessimestic. I discovered the Asterisk extension language on a list of new features for Asterisk 1.2 today. Somehow I’d missed this when it first went into Asterisk.
Here’s a chunk out of my old config file. It’s not perfect, but it’s what you get when you’re stuck dealing with line numbers:
[macro-diallocal]
exten => s,1,AbsoluteTimeout(7200)
exten => s,n,SetAMAFlags(default)
exten => s,n(analog),Dial(${TRUNK}/${ARG1})
exten => s,n,Congestion
exten => s,analog+101,Macro(condsetcid)
exten => s,n,SetCIDName(LAIRD SCOTT)
exten => s,n,SetAMAFlags(billing)
exten => s,n(nufone),Dial(${NUFONE}/1${ARG1})
exten => s,n,Congestion
exten => s,nufone+101,BusyAnd here’s the equivalent using the new configuration language:
macro diallocal( number ) {
AbsoluteTimeout(7200);
SetAMAFlags(default);
Dial(${TRUNK}/${number});
if(${DIALSTATUS} = "CONGESTION" || ${DIALSTATUS} = "CHANUNAVAILABLE") {
&condsetcid();
SetCIDName("LAIRD SCOTT");
SetAMAFlags(billing);
Dial(${NUFONE}/1${number});
switch(${DIALSTATUS}) {
case BUSY:
Busy;
default:
Congestion;
}
}
}It’s still not ideal–${VAR} is ugly–but it’s vastly better then the old syntax. This plus a bit of Rails integration should give us a really nice phone environment. I’m rapidly approaching the “tear it down and rebuild it” point with my Asterisk system–there’s a lot of stuff that I’d like to add that just doesn’t fit in with my current configuration files–so I’ll have a set of articles on integrating Asterisk, AEL, and Rails in a few weeks.
Rails and Asterisk
Oooh. Just when it looks like I’m going to have to stoop to programming in Perl to do a bit of Asterisk integration, someone comes out with a way to use Rails with Asterisk’s AGI scripting interface.
This has the potential to be really interesting, because Asterisk+Rails should be about a decade more advanced then anything that the IVR people are used to seeing.
I have a couple small Asterisk scripting jobs that I’ve promised to various family memebers; if my schedule allows, I’ll give RAGI a spin and share how it goes later this week.
Asterisk 1.2 is approaching
I’ve fallen a bit behind on Asterisk with all of the time that I’ve spent working on Typo lately, but I found this announcement sitting in my inbox today:
As previously mentioned on the lists by Olle Johannson, we are actively trying to get Asterisk in shape for a 1.2 release within the next 60 days.
…
I will produce the first release candidate on August 20th, with followup versions produced every week until we deem the release ready for public consumption. I expect it will require at least three -RC releases for us to get things in shape, so that means that 1.2 itself may be ready by September 15th.
Asterisk has desperately needed a new stable release for months now, and it looks like version 1.2 will be out within the next two months.
SIP/GSM MNVO/VoIP double-play?
I want to see a combination VoIP/MVNO double-play. That’s one company that sells cellular service (using someone else’s network), sells VoIP service, and integrates the two services.
There are two specific scenarios that seem obvious:
They sell the customer mobile phone service and VoIP service via an ATA or SIP hardphone. This would be great for people who have turned off their home phone service while continuing to pay for some form of Internet access. One number would ring both devices, the first one to pick up wins. Outgoing calls would have the same caller ID from either device. Alternate products would be family plans with multiple phones, each with their own number, then a shared number that will ring all devices; and centrex plans for small businesses, where the company provides both VoIP desk phones and mobile phones.
They sell the customer mobile phone service and act like a SIP client. This way the customer can integrate their mobile phones directly into their existing phone system. Ideally, the MVNO’s SIP gateway will register and unregister with the SIP PBX as the phone gains and loses service; this will let the PBX do the Right Thing with voicemail, and also enable a number of other services.
Personally, I’d love to buy services like this. I’d prefer GSM phones, simply because the most interesting phones are almost always GSM-only. Accoring to Cellular News, there are at least three GSM MVNOs in the US right now, using both Cingular and T-Mobile’s networks, so this is certainly possible.
On the hardware front, several companies seem to be providing GSM/SIP gateway equipment:
Bridgeport Networks seems to be marketing these exact ideas to carriers.
Blueslice concentrates more on WiFi/GSM roaming, but the basic technology seems similar.
It’s possible that Earthlink will be rolling something like this out soon–they’re building a MVNO, and they share at least one board member with Bridgeport Networks. They seem to be concentrating more on EV-DO then anything GSM-related, though.
There seems to be a huge push in the cellular industry to integrate SIP into their networks, so something like this will be possible sooner or later. My current contract with Cingular is up in 6 months; it’d be nice if someone has something on the market that I can buy by then.
Updated Asterisk config files
I’ve had several people ask me for a more recent version of my Asterisk configuration files, and it’s been about a year since I last posted them, so here they are.
extensions.conf
Here’s extensions.conf. I’ve lightly redacted a few phone numbers and deleted a few really obvious bits of cruft, but this is essentially what my Asterisk server is running. There’s at least a year’s worth of cruft lurking in here, but it’s a real, live example:
[general]
static=yes
writeprotect=no
[globals]
TRUNK=Zap/1 ; FXO interface
ANALOG=Zap/2 ; FXS interface
KITSIP=Sip/203
BEDSIP=Sip/204
BASESIP=Sip/210
NUFONE=IAX2/username@NuFone
EBC=IAX2/username@EBC
PHONES=${ANALOG}&${KITSIP}&${BEDSIP}
; Fax receiving macro. Handles rxfax and directing the fax to the
; correct email address.
[macro-faxreceive]
exten => s,1,SetVar(FAXFILE=/var/spool/asterisk-fax/${UNIQUEID}.tif)
exten => s,2,DBGet(EMAILADDR=extensionemail/${MACRO_EXTEN})
exten => s,3,rxfax(${FAXFILE})
exten => s,103,SetVar(EMAILADDR=scott@sigkill.org)
exten => s,104,Goto(3)
; This fixes up incoming CallerID. NuFone doesn't transmit CID name
; info on incoming toll-free calls. So, we cache the name when we see
; it and use the cached copy when we can.
;
; This is kind of close to LookupCIDName, except we also *store* the
; CID Name when we know it.
[macro-cidfix]
exten => s,1,GotoIf($["${CALLERIDNUM:0:2}" = "+1"]?600)
exten => s,n(dbget),DBGet(cidfixname=cidname/${CALLERIDNUM})
exten => s,n,SetCIDName(${cidfixname})
exten => s,dbget+101,GotoIf($[${CALLERIDNAME} = "Toll-Free Call"]?500:104)
exten => s,n,GotoIf($["X${CALLERIDNAME}" = "X"]?500:104)
exten => s,n,DBput(cidname/${CALLERIDNUM}=${CALLERIDNAME})
exten => s,500,SetCallerID("No Caller ID <Unknown>")
exten => s,600,SetCIDNum($[${CALLERIDNUM:2:100}])
exten => s,n,Goto(dbget)
; Conditionally set the CallerID. If we already have a valid CallerID
; (basically, it's more then 4 digits long), then we leave it in place.
; Otherwise, replace it with our home phone number
[macro-condsetcid]
exten => s,1,NoOp
exten => s,2,GotoIf($[${CALLERIDNUM:0:4} = ${CALLERIDNUM}]?3:4)
exten => s,3,SetCallerID(4254889014)
exten => s,4,NoOp
; Do call forwarding out of a database. Look up the caller ID number,
; and if it exists in the forward DB, then forward the call to the
; specified number.
[macro-dbcallforward]
exten => s,1,DBGet(FORWARDTO=forward/${CALLERIDNUM})
exten => s,2,Macro(condsetcid)
exten => s,3,Wait(1)
exten => s,4,Dial(Local/${FORWARDTO}@inside/n)
exten => s,102,Noop
; Outside line macro. This handles incoming phone calls from outside
; of the house, including caller-ID rewriting, blacklisting, and
; distinctive ring.
[macro-outsideline]
exten => s,1,AbsoluteTimeout(7200)
exten => s,2,SetCDRUserField(Outside (${CHANNEL}))
exten => s,3,Macro(cidfix)
exten => s,4,Macro(dbcallforward)
exten => s,5,Macro(setalertinfo)
exten => s,6,LookupBlacklist
exten => s,7,Dial(${PHONES},30,Ttr)
exten => s,8,Answer
exten => s,9,Goto(outside-ivr,s,1)
exten => s,107,Goto(208)
exten => s,108,Goto(8)
exten => s,207,Wait(3600)
exten => s,208,Hangup
; Extension dialing logic. Call an internal extension and bounce to VM
; if no answer.
[macro-callextension]
exten => s,1,Dial(${ARG1},30,t)
exten => s,2,Voicemail(${ARG2})
exten => s,3,Hangup
exten => s,102,Voicemail(${ARG2})
exten => s,103,Hangup
; The next block of macros handle outgoing calls. This is more complex
; then you'd expect for a couple reasons. First, I'm using two different
; outgoing mechanisms--NuFone and my POTS line, but I'd like either one
; to be able to work as a fallback if the other fails.
;
; Next, I want to be able to handle 7- and 10-digit dialing without
; having to remember which area codes and prefixes require a '1' first.
; I'm in the Seattle area, and part of 425 is free, along with 95% of
; 206. With POTS, I must dial a '1' iff it is a toll call. With
; NuFone I must always dial a 1.
;
; See http://scottstuff.net/scott/archives/000163.html
[macro-diallocal]
exten => s,1,AbsoluteTimeout(7200)
exten => s,n,SetAMAFlags(default)
exten => s,n(analog),Dial(${TRUNK}/${ARG1})
exten => s,n,Congestion
exten => s,analog+101,Macro(condsetcid)
exten => s,n,SetCIDName(LAIRD SCOTT)
exten => s,n,SetAMAFlags(billing)
exten => s,n(nufone),Dial(${NUFONE}/1${ARG1})
exten => s,n,Congestion
exten => s,nufone+101,Busy
; This handles 10-digit local numbers
[macro-dialanalogwithfallback]
exten => s,1,Macro(diallocal,${MACRO_EXTEN})
; This handles 7-digit local numbers
[macro-dialanalogwithfallback425]
exten => s,1,Macro(diallocal,425${MACRO_EXTEN})
; This handles 10-digit non-local numbers
[macro-dialanalogwithfallback1]
exten => s,1,Dial(${TRUNK}/1${MACRO_EXTEN})
exten => s,2,Congestion
exten => s,102,Macro(condsetcid)
exten => s,103,SetCIDName(LAIRD SCOTT)
exten => s,104,Dial(${NUFONE}/1${MACRO_EXTEN})
exten => s,105,Congestion
exten => s,205,Busy
; This just dials via POTS without any special handling
[macro-dialanalog]
exten => s,1,Dial(${TRUNK}/${MACRO_EXTEN})
exten => s,2,Congestion
exten => s,102,Busy
; ditto, but for NuFone.
[macro-dialnufone]
exten => s,1,Macro(condsetcid)
exten => s,n,SetCIDName(LAIRD SCOTT)
exten => s,n,SetAMAFlags(billing)
exten => s,n,Dial(${NUFONE}/${MACRO_EXTEN})
exten => s,n,Congestion
[macro-dialnufonewithfallback]
exten => s,1,Macro(condsetcid)
exten => s,n,SetCIDName(LAIRD SCOTT)
exten => s,n,SetAMAFlags(billing)
exten => s,n(nufone),Dial(${NUFONE}/${MACRO_EXTEN})
exten => s,n,Congestion
exten => s,nufone+101,SetAMAFlags(default)
exten => s,n(analog),Dial(${TRUNK}/${MACRO_EXTEN})
exten => s,n,Macro(fastbusy)
exten => s,analog+101,Busy
; for 10-digit dialing in non-local areas
[macro-dialnufonewithfallback1]
exten => s,1,Macro(condsetcid)
exten => s,n,SetCIDName(LAIRD SCOTT)
exten => s,n,SetAMAFlags(billing)
exten => s,n(nufone),Dial(${NUFONE}/1${MACRO_EXTEN})
exten => s,n,Congestion
exten => s,nufone+101,SetAMAFlags(default)
exten => s,n(analog),Dial(${TRUNK}/1${MACRO_EXTEN})
exten => s,n,Macro(fastbusy)
exten => s,analog+101,Busy
; This sets the ALERT_INFO variable based on the CALLERIDNUM
; setting via a lookup in the 'distinctivering' database. See
; http://scottstuff.net/scott/archives/000163.html
[macro-setalertinfo]
exten => s,1,DBGet(ALERT_INFO=distinctivering/${CALLERIDNUM})
; This is the 'inside' context, where calls made from inside of the
; house start out. The 'inside' context (or 'inside-sip'/'inside-analog')
; is referred to in sip.conf and zapata.conf. That's what ties this all
; together.
[inside]
include => parkedcalls
include => operator
include => e911
include => forced-analog
include => information
include => local
include => pstn-local10
include => tollfree
include => pstn-nonlocal10
include => international
; There's no real reason for these to exist right now; I could
; just replace the references to them in sip.conf/zapata.conf
; with references to the 'inside' context. This is kind of
; historical.
[inside-sip]
include => inside
[inside-analog]
include => inside
[operator]
exten => 0,1,Macro(dialanalog)
[e911]
exten => 911,1,Macro(dialanalog)
exten => 9911,1,Macro(dialanalog)
[forced-analog]
; Only allow 2, 3, 7, and 10-digit strings. Without this, calls to area
; codes that start with a '9' (like my sister's cell phone in NYC) don't
; work.
exten => _9XX,1,Macro(dialanalog)
exten => _9XXX,1,Macro(dialanalog)
exten => _9XXXXXXX,1,Macro(dialanalog)
exten => _9XXXXXXXXXX,1,Macro(dialanalog)
[information]
exten => 411,1,Macro(dialanalog)
; The 'local-extensions.conf' file is autogenerated. See
; http://scottstuff.net/scott/archives/000163.html and
; http://svn.scottstuff.net/project/asterisk-lca-map/
[pstn-local10]
#include "local-extensions.conf"
[pstn-nonlocal10]
exten => _NXXNXXXXXX,1,Macro(dialnufonewithfallback1)
exten => _1NXXNXXXXXX,1,Macro(dialnufonewithfallback)
[tollfree]
exten => _1888NXXXXXX,1,Macro(dialanalogwithfallback)
exten => _1877NXXXXXX,1,Macro(dialanalogwithfallback)
exten => _1866NXXXXXX,1,Macro(dialanalogwithfallback)
exten => _1855NXXXXXX,1,Macro(dialanalogwithfallback)
exten => _1800NXXXXXX,1,Macro(dialanalogwithfallback)
exten => _888NXXXXXX,1,Macro(dialanalogwithfallback1)
exten => _877NXXXXXX,1,Macro(dialanalogwithfallback1)
exten => _866NXXXXXX,1,Macro(dialanalogwithfallback1)
exten => _855NXXXXXX,1,Macro(dialanalogwithfallback1)
exten => _800NXXXXXX,1,Macro(dialanalogwithfallback1)
[international]
exten => _011.,1,Macro(dialnufone)
[local]
exten => 200,1,Macro(callextension,${PHONES},200)
exten => 201,1,Macro(callextension,${ANALOG},200)
exten => 202,1,Macro(callextension,${BEDSIP},200)
exten => 203,1,Macro(callextension,${KITSIP},200)
exten => 204,1,Macro(callextension,${BEDSIP},200)
exten => 210,1,Macro(callextension,${BASESIP},210)
exten => 230,1,Answer
exten => 230,2,Wait(5)
exten => 230,3,Goto(fax,2201,1)
exten => 221,1,Answer
exten => 221,2,Goto(outside-ivr,s,1)
exten => 221,3,Beep
exten => 221,4,Hangup
exten => 222,1,Wait,2
exten => 222,2,VoicemailMain(s200)
exten => 222,3,Hangup
exten => 211,1,Wait(2)
exten => 211,n,VoicemailMain(s210)
exten => 223,1,Wait,2
exten => 223,2,VoicemailMain
exten => 223,3,Hangup
[outside-ivr]
; This is the outside IVR
; Playback a "We're not home message"
; To leave a message for Scott, press 1
; To leave a message for C, press 2
; Otherwise stay on the line.
;
; Also, 3 => main voicemail
; 4 => check voicemail (main)
; 5 => check voicemail
;
; Check for fax, too
exten => s,1,AppendCDRUserField( -> IVR)
exten => s,2,DigitTimeout(5)
exten => s,3,ResponseTimeout(2)
exten => s,4,Wait(1)
exten => s,5,Background(laird/ivr-greeting)
exten => 1,1,AppendCDRUserField( -> 1)
exten => 1,2,Wait(1)
exten => 1,3,VoiceMail(us201)
exten => 1,4,Hangup
exten => 2,1,AppendCDRUserField( -> 2)
exten => 2,2,Wait(1)
exten => 2,3,VoiceMail(us202)
exten => 2,4,Hangup
exten => 3,1,AppendCDRUserField( -> 3)
exten => 3,2,Wait(1)
exten => 3,3,VoiceMail(us200)
exten => 3,4,Hangup
exten => 4,1,AppendCDRUserField( -> 4)
exten => 4,2,Wait(1)
exten => 4,3,VoiceMailMain(200)
exten => 4,4,Hangup
exten => 5,1,AppendCDRUserField( -> 5)
exten => 5,2,Wait(1)
exten => 5,3,VoiceMailMain
exten => 5,4,Hangup
exten => fax,1,AppendCDRUserField( -> fax)
exten => fax,2,Answer
exten => fax,3,Goto(fax,2201,1)
exten => t,1,AppendCDRUserField( -> timeout)
exten => t,2,VoiceMail(s200)
exten => t,3,Hangup
exten => i,1,AppendCDRUserField( -> invalid)
exten => i,2,Playback(tt-allbusy)
exten => i,3,Goto(s,3)
[fax]
exten => fax,1,Macro(faxreceive)
exten => 2201,1,Macro(faxreceive)
exten => 2202,1,Macro(faxreceive)
exten => 2203,1,Macro(faxreceive)
exten => h,1,system(/usr/local/sbin/mailfax ${FAXFILE} ${EMAILADDR} "${CALLERIDNUM} ${CALLERIDNAME}")
; This is where outside calls enter the system, thanks to
; zapata.conf, sip.conf, and iax2.conf. By and large, calls are
; directed to the 'outsideline' macro, *except* for the second
; 866 number; that's just for checking voicemail.
[outside]
exten => s,1,GotoIf($[X${CALLERIDNAME} = X]?200:2)
exten => s,2,Macro(outsideline)
exten => s,3,Hangup
exten => s,200,Wait(30)
exten => s,201,Hangup
exten => 4254889999,Macro(outsideline)
exten => 4254889999,2,Hangup
exten => 8662299999,1,Macro(outsideline)
exten => 8662299999,2,Hangup
exten => 2068389999,1,Macro(outsideline)
exten => 2068389999,n,Hangup
exten => 8003949999,1,Macro(cidfix)
exten => 8003949999,n,Goto(outside-ivr,s,1)
exten => 8003949999,n,Hangup
exten => 8888299999,1,SetAccount(pannell)
exten => 8888299999,n,Macro(cidfix)
exten => 8888299999,n,Dial(${BASESIP},30,t)
exten => 8888299999,n,Voicemail(u210)
exten => 4253549999,1,Macro(outsideline)
exten => 4253549999,2,Hangup
exten => 8662559999,1,VoicemailMain(200)
exten => 8662559999,2,Hangup
exten => 8662559999/2064849999,1,VoicemailMain(s200)
exten => 8662559999/2064849999,2,Hangup
exten => 8662559999/2069799999,1,VoicemailMain(s200)
exten => 8662559999/2069799999,2,Hangup
exten => scott,1,VoiceMail(us201)
exten => scott,2,Hangup
exten => cynthia,1,VoiceMail(us202)
exten => cynthia,2,Hangup
exten => fax,1,Goto(fax,2201,1)
exten => t,1,Hangup
exten => h,1,Hangup
[outside-analog]
exten => s,1,GotoIf($[X${CALLERIDNAME} = X]?200:2)
exten => s,2,Goto(outside,4254889999,1)
exten => s,3,Hangup
exten => s,200,Wait(30)
exten => s,201,Hangup
[outside-sip]
include => outside
[outside-nufone]
include => outside
[outside-ebc]
include => outside
[default]
exten => s,n,Goto(outside,2068389999,1)
exten => _x.,n,Goto(outside,2068389999,1)sip.conf
Here’s sip.conf, again slightly redacted:
;
; SIP Configuration for Asterisk
;
[general]
port = 5060 ; Port to bind to
bindaddr = 0.0.0.0 ; Address to bind to
context = outside-sip ; Default for incoming calls
srvlookup = yes ; Enable SRV lookups on outbound calls
;pedantic = yes ; Enable slow, pedantic checking for Pingtel
tos=lowdelay
disallow=all ; Disallow all codecs
allow=gsm
allow=ilbc
allow=ulaw ; Allow codecs in order of preference
insecure=very
[201]
type=friend
secret=zzzz
auth=md5
nat=yes
host=dynamic
reinvite=no
canreinvite=no
qualify=1000
dtmfmode=rfc2833
mailbox=200,201
callerid="Scott Laird" <201>
disallow=all
allow=gsm
allow=ulaw
allow=ilbc
context=inside-sip
[202]
type=friend
secret=zzzz
auth=md5
nat=yes
host=dynamic
reinvite=no
canreinvite=no
qualify=1000
dtmfmode=rfc2833
mailbox=200,202
callerid="Cynthia Laird" <202>
disallow=all
allow=gsm
allow=ulaw
allow=ilbc
context=inside-sip
[203]
type=friend
secret=zzzz
auth=md5
nat=yes
host=dynamic
reinvite=no
canreinvite=no
qualify=1000
dtmfmode=rfc2833
mailbox=200
callerid="Kitchen" <203>
disallow=all
allow=gsm
allow=ulaw
allow=ilbc
context=inside-sipiax.conf
Finally, iax.conf:
; Inter-Asterisk eXchange driver definition
;
;
[general]
bandwidth=low
allow=gsm
disallow=ilbc
disallow=speex
disallow=ulaw
disallow=alaw
disallow=lpc10 ; Icky sound quality... Mr. Roboto.
jitterbuffer=yes
register => laird:zzzz@switch-2.nufone.net
register => laird:zzzz@voip.teliax.com
authdebug=yes
tos=lowdelay
[guest]
type=user
context=outside
callerid="Guest IAX User"
[NuFone]
type=user
host=switch-2.nufone.net
secret=zzzz
context=outside-nufone
qualify=400
amaflags=billing
[NuFone]
type=peer
host=switch-1.nufone.net
secret=zzzz
qualify=400
amaflags=billing
[teliax]
context=outside
type=friend
host=voip.teliax.com
auth=md5
secret=zzzz
disallow=all
;allow=ilbc
allow=gsm
qualify=400VoIP Fraud
It’s amazing the ways that people can find to steal money. The latest scam goes like this:
- Set up the local equivalent of a CLEC in some third-world country.
- Publish exorbitant rates for a block of numbers (say, $5/minute).
- Sign up with a US-based VoIP provider using a freshly-stolen credit-card number.
- Verify that the VoIP provider doesn’t know about your rates, and only charges a small fee to dial the country in question (say, $0.10/minute).
- Have a SIP auto-dialer call your numbers via the VoIP provider until the CC is declined or the account’s balance limit is hit.
- Repeat.
- At some point in the future, the VoIP provider will receive a massive bill from their upstream provider, while the Telco in whatever third-world country you’re using will hand you a big check.
This is just a twist on the old “modem dialer” scam, but it’s been costing VoIP providers big money. NuFone has apparently lost $400,000 recently, and other providers are reporting huge fraud rates–according to Teliax, roughly 1/3 of their new customer signups are fraudulent.
There’s a long thread following this on Digium’s list server.
It looks like this has helped kill at least one VoIP provider: LiveVoIP has declared bankruptcy, although they had a spotty reputation to start with.
CNet interviews Mark Spencer
CNet just posted an interview with Mark Spencer, the guy behind Asterisk. There aren’t a huge number of details, except for this one:
[Digium] has something that eluded many a Silicon Valley wannabee during the bubble: real revenues. The company pulls in about $10 million a year
Zing! Way to go Digium.
NuFone, Teliax, LNP, and Asterisk audio quality problems
Since I’ve been having problems with my Verizon POTS line, I decided that it’s finally time to look into porting my main home phone number to a VoIP service. Right now, I’m using call forwarding on the line, so all incoming calls come in via VoIP anyway; using local number portability (LNP) to move the number directly onto a VoIP service won’t really make things any less reliable, but it will save me $15 or $20 per month.
I’ve been using NuFone for most of my VoIP traffic for over a year, but they only provide local numbers in Michigan; I’m in Washington, so that’s not very useful to me. I did a bit of research, and Teliax comes highly recommended on the Asterisk-Users mailing list and they’re able to do LNP ports in my rate center. Teliax seems to be sort of a cross between full-service VoIP providers like Vonage and pre-paid wholesale providers like NuFone–they have both prepaid by-the-minute plans and monthly minutes-included plans. Even the prepaid plans include the option of having them provide voicemail; it’s not very useful to me when I have my own Asterisk server, but I like the idea of having a provider that I use that I can recommend to non-Asterisk users.
Since Teliax can provide the service that I need, I went ahead and signed up. It only took a couple minutes to enter all of my data on their website, and my new incoming number was active immediately. Their support website includes Asterisk configuration snippets, dynamically-generated with my username and password, so all I had to do was paste them into my Asterisk config files and everything worked.
The one thing that I noticed immediately was that Teliax calls sounded a lot better then NuFone calls. By default Teliax uses the GSM codec, while I had NuFone set up for ILBC. By most accounts, ILBC should sound slightly better then GSM, so I’m not really sure what’s up. I changed my NuFone settings to use GSM, and suddenly the slightly swimmy sound that I’d been hearing on NuFone calls for the past few weeks went away. I suspect that my Asterisk build has a slightly-broken ILBC codec, but I wouldn’t have noticed this if I hadn’t added a Teliax account. Since this isn’t the first time that I’ve had ILBC problems, I’m going to drop it and stick with GSM for now. If it starts bothering me too much, then I’ll consider paying $10 and licensing G.729 from Digium, but I doubt there’s any purpose in doing that.
So far, I’ve only used Teliax for about 12 hours, and I haven’t ran more then a handful of calls through them, but so far them seem great. I have Asterisk set to reject them and log a message if their ping time rises over 400ms, but it didn’t trigger overnight. If it can make it a couple days without 400ms worth of network problems, then I’ll start the process of porting my home phone number to Teliax. For now, I’m going to change the forwarding on my Verizon POTS line to point to Teliax instead of NuFone.
Verizon's at it again--call forwarding rings busy
Verizon’s doing weird things with my home phone again. At the moment, I’m paying for call forwarding on my home line, so any time someone calls my home number, the call is forwarded to my NuFone VoIP account. This was working just fine, but I’ve received busy signals when calling home twice in the last week. Since I’m able to call home via NuFone directly without any problems, I’m assuming that the problem is on Verizon’s end.
It’s taken a bit of poking around, but I think I’ve figured out what’s happening–Verizon will only forward one call at a time. If a second caller calls while a forwarded call is in progress, then the second caller will receive a busy signal. That’s a really nasty behavior–I’ve effectively lost the ability to do call waiting and to take voicemail messasges while I’m on the phone.
Since this is clearly happening on Verizon’s end, I called their local repair line and talked to someone. In the past, I’ve had much better luck with their repair number then their sales number–the repair people have access to the switch–but this time the agent was terminally confused by this–she got mixed up and thought that I was forwarding my calls to my cell phone, and concluded that it was the cell provider’s problem. Once she got into that state, I couldn’t figure out how to un-confuse her, so I guess I’ll have to wait until tomorrow and try to get a new repair tech.
I guess I should see this as an incentive to find someplace that do a LNP port of my home number to a cheap-ish VoIP service. It looks like Teliax might be able to do it, and most people on the Asterisk-Users list seem to think highly of them.
Cisco buys Sipura
This isn’t exactly new news, but Cisco bought Sipura yesterday. Sipura makes a number of VoIP products, including the SPA-841 phone that I’ve been using for the past few weeks. They’re generally considered to have the best SIP implementation of any of the cheap vendors, and they make good, solid products for low prices. It’s a nice combination. Cisco has been licensing Sipura’s technology and using it in Linksys’s cheap VoIP hardware for around nine months now. Linksys has had to jump through a number of hoops to keep Sipura happy recently; apparently Sipura didn’t like customers buying the unlocked Linksys PAP2-NA instead of the more expensive Sipura SPA-2000. Now that Cisco owns both companies, I suspect that they’ll work out their differences.
Hopefully Cisco won’t gut Sipura to keep them from competing with Cisco’s more expensive products. The jury is still out on Cisco’s Linksys acquisition–they haven’t released many exciting new products since Cisco bought them, but they haven’t killed off any of their interesting product lines or tried to stop the flood of alternate Linux firmware distributions for the WRT54G family either.
One thing that’s interesting about this acquisition is that Sipura was formed by a bunch of ex-Cisco people. After Cisco bought Komodo in 2000, a bunch of the Komodo people left Cisco to go form Sipura. Now they’re back at Cisco again. This seems to be how Cisco does R&D these days–it spins employees off to work on their own products and then acquires them if they accomplish anything interesting. I’m not convinced that it’s a bad way to deal with R&D risk in a huge company–it shields Cisco from the cost of failure and promotes risk-taking by R&D engineers, but it doesn’t do anything to help unify Cisco’s massively fractured product lineup.