I have a new phone on my desk: it’s a Grandstream GXP2135, and I chose this model instead of one of the slightly lower-end ones because it looks a bit nicer than, say, a GXP1628. Featurewise, they are very comparable, in fact I don’t really need the 4 SIP accounts it has over the 2 of its smaller brother.

front of GXP2135

The sound quality is good on both ends, and in particular, it’s LOUD enough on my end even with hands-free.

Configuration can be done via the keypad and softkeys, via a provisioning system (FTP(S), HTTP(S) or TFTP) with a text configuration file which contains a bunch of codes, or via a decent enough Web interface; I chose the latter. (I’d use provisioning if I had a number of these phones to configure, but I do not.) Firmware upgrades can be automated and also retrieved via TFTP, FTP(S), HTTP(S) from a configurable location.


With its support for CTI (Computer-Telephony Integration), I can make calls from the command line, which is something I’ve been wanting to do for ages: copy/paste a number from a Web page, say, and speak:

$ call smith
Smith John      work    +49 1234567102
Smith Josefine  mobile  +49 123-456 7890

$ call +491234567890

For a few years I’ve had a program which dumps names and email addresses from my macOS address book into a JSON data structure which mutt(1) searches through, so I added the phone numbers to that same data and created a program with the very imaginative name call which sends of an HTTP request to the phone with a URL-encoded phone number obtained either from the command line or selected from a list

The CTI integration of these phones can do all manner of things such as request status, hang up, etc., but that’s all I want from it.

Address book

If I do use the phone only, I want to be able to select from the address book. These phones can download an XML address book (from TFTP, HTTP, or HTTPS) which looks like this, and which is easy enough to generate:

<?xml version="1.0"?>
    <Phone type="Cell|Work|Home">       <!-- "type" attribute is undocumented -->
      <phonenumber>+33 1 47 123 4567</phonenumber>
    <Company>XXX</Company>              <!-- undocumented -->


One of the reasons for choosing a phone from this manufacturer (I have my brother in law to thank for the hint) is they have so-called action URLs the phone invokes on specific triggers. This can be phone off hook or on hook, an incoming or outgoing call, missed calls, etc.

I specify a URL and the phone performs a HTTP GET request to the address. Please note that I said “HTTP” and “address”. It’s the year 2020, and in spite of installing the latest firmware, the GXP2135 can do neither HTTPS here nor can I use a hostname. (Which is painful if we take into account that address books over XML supports both.)

These URLs can have codes embedded in them which contain information about the trigger.$remote&l=$local&dir=$calldirection

Here I use three of the possible values:

  • $remote is the calling number
  • $local is the called number or device
  • $calldirection is either in or out depending on the calling direction

Some values like, $duration will make sense only when the ActionURL is invoked on Terminated call, for instance.

See also

There’s a very large number of additional features these phones have, including something called “XML applications”, but I haven’t yet looked into those.