We’ve recently completed a very fun and interesting job
working on a new interface for managing VoIP phone systems. We have a VoIP phone, provided by Loho, who were also our client for this project. It’s great —
we can forward calls to our mobiles, cart the phone around
with us (plug it into a network connections and it just
works), and it even emails us our voice messages. The only
thing not great about our phone is the configuration
interface. Luckily, that’s what this project set out to
solve.
The brief was to implement an elegant online phone
configuration system. Alex, Director at Loho, provided the
vision. We provided two weeks of development time, which
was enough to create a working prototype. Alex has asked
us to not give away too many details about the system, but
I can show you a few screenshots. First up, here’s the
main screen:
The very stylish main menu of the VoIP administration tool
we’ve built for Loho.
Doesn’t give away much, does it? A bit more interesting is
a detail of editing a configuration:
Also very stylish: editing the configuration of a voice
menu
Here I’m editing a voice menu — one of those “Press 1 if
you’re interested in giving us all your money” type
things.
We think we’ve created a very nice system. Loho tell us
they were overwhelmed with interest at a recent tradefair,
suggesting we’re not alone in our opinion. While the
interface is an important aspect of the work, the backend
(which I can talk about!) is just as important. The main
task was defining a data model to capture the rich feature
set that Loho provide. This turned out to be very similar
to designing a programming language and its intermediate
representation. For example, we use a continuation-passing style representation to avoid maintaining a stack on the
server side. Our representation distinguishes between tail
calls and normal function calls to avoid excessive
resource consumption on the VoIP side. Relational
databases don’t do a very good job of storing recursive
datastructures, like the AST of a programming language, so we used Mongo for the data
store. In addition to its flexible data model, Mongo is web scale which has given us an immediate status boost at local
programmer meetups.
The backend code is implemented in Scala and Lift. There
are actually two interfaces to the service. One is the
nice interface the users see, and the other is a REST
interface that is called by the Asterisk AGI scripts that
implement the VoIP functionality. The Asterisk system
doesn’t handle all the functionality we represent
internally, so the REST interface includes a small
interpreter that executes intermediate steps till we
arrive at something Asterisk deals with.