Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Introduction

Digium phones have typically been configured as defined in DPMA's res_digium_phone.conf; or, separately, by eschewing DPMA's built-in apps / provisioning capabilities and using XML-based configuration instead. This page describes a method that allows the configuration of Digium's phones using DPMA as a transport mechanism, requiring only limited DPMA configuration, in conjunction with XML-based sheets for the bulk of phone settings.

Consumers of this page should have a good working familiarity with both DPMA and XML-configuration of Digium's phones.

Why This Matters

DPMA's res_digium_phone.conf configuration system is key-value pair-driven.  Digium phones are, even when connected to DPMA, configured via XML-styled configuration files.  Much of DPMA's code is built merely to turn those keys and values into XML-styled configurations.  In order to manage phones, what DPMA does present in key-value mappings has, over time, become quite complex.  There are, at present, at least 8 object types that DPMA's config handle parser, including: line, ringtone, alert, application, multicastpage, network and phone.  Each of these has to be manipulated and properly added to a phone, in order to achieve a desired configuration.  

When new features are added to phones, as features are driven by XML configuration options set in the phone's configuration file, creating those XML configuration options via DPMA  requires additional key-value pairs, and sometimes additional object types, to be added to DPMA's configuration parser.  Users of phones with DPMA are thus beholden to DPMA's understanding of a key-value pair, in order to use a capability that may already be present in their phone firmware.  This situation is needlessly complex.  The benefits of using simple key-value pairs are outweighed by the flexibility of XML and the ability for users to more quickly integrate new phone capabilities.  Users shouldn't have to wait for new versions of DPMA to be released to use a phone capability.

Further, one of the biggest benefits of DPMA is that it provides server discovery as well as a secure and reliable method for delivering a phone's configuration, without requiring external daemons to accomplish the delivery.  Digium phones use Multicast discovery in order to find DPMA servers on a network.  The found servers are organized into a list, from which the user can choose.  Upon choosing a server, a phone can be provisioned directly based on MAC, or the user can select their phone from DPMA's phone list, and can input their PIN code, which is not their SIP endpoint password.  Phones that don't use DPMA don't have this capability.

When XML configuration is used, outside of Asterisk, typically via an HTTPs daemon, the phone must first be provisioned to point to a configuration file. This bootstrapping process provides an opportunity for the location of the configuration file, or the username and password used to retrieve it, to be disclosed - someone has to configure it in DHCP Option66 or type it into the phone's keypad manually. Phone configuration is simpler and better when DPMA delivers chunked XML configuration to a phone that is encrypted inside the DPMA protocol.  

Also, many phone provisioning systems are built to create and manage XML-style configurations. A method that allows those systems to more easily integrate Digium's phones, including the D80, while still allowing the use of built-in DPMA-native applications enhances the value of Digium's phones for users of those systems.

Traditional DPMA Configuration, Simplified

Assuming a pre-existing PJSIP endpoint definition for an endpoint named 101 with the wholly insecure password of 1234, let's examine a simplified DPMA configuration for a phone. The brief res_digium_phone.conf sample would look like:

No Format
[general]
globalpin=1234
userlist_auth=disabled
config_auth=disabled
mdns_address=asterisk.example.com
mdns_port=5060
service_name=Asterisk
service_discovery_enabled=yes

[mynetwork]
type=network
alias=My Default Network
cidr=0.0.0.0/0
registration_address=asterisk.example.com
registration_port=5060

[101]
type=line
digit_map=[0-8]xx
line_label=Bobby J

[101]
type=phone
line=101
network=mynetwork
full_name=Bob Jones

In this sample, we have set DPMA general settings to allow any Digium phone to connect and retrieve a phone config, without any needed PIN code, we have created a network and a line, and then we roll those up into a phone object.  The result is a phone, 101, Bobby J, with digit mapping [0-8]xx, set to register to asterisk.example.com at port 5060.

Traditional XML Configuration, Simplified

A simplified configuration, 012345678abc.cfg, for an XML-defined phone, which doesn't take advantage of any built-in DPMA apps or otherwise utilize DPMA's provisioning, and which depends on , would look something like:

Code Block
languagexml
<?xml version="1.0" ?>
<config>
    <accounts>
        <account index="0" status="1" register="1" account_id="101" username="101" authname="101" password="1234" passcode="1234" line_label="Bobby J" caller_id="Bobby J" dial_plan="[0-8]xx">
            <host_primary server="asterisk.example.com" port="5060" transport="udp" />
        </account>
    </accounts>
</config>

Here, we've attached Bobby J's account to the phone directly, and we've defined the account credentials and the primary registration server, asterisk.example.com on port 5060.

Combined Configuration, Simplified

Now, let's look at a scenario under which we utilize DPMA to authenticate the phone, but not to configure it.  All of the configuration of the phone will be done in the phone's XML configuration file, served up by DPMA itself, not by any external daemon. Here's a sample res_digium_phone.conf:

No Format
[general]
globalpin=1234
userlist_auth=disabled
config_auth=disabled
mdns_address=asterisk.example.com
mdns_port=5060
service_name=Asterisk
service_discovery_enabled=yes
file_directory=/var/lib/asterisk/digium/phones

[101]
type=phone
config_file=012345678abc.cfg
full_name=Bob Jones

In it, we're no longer defining a network, a line, a digit map, or a line label for the phone.  Instead, we're defining only the phone, and we're only passing in the phone's configuration file, 012345678abc.cfg, loaded from /var/lib/asterisk/digium/phones (as set by file_directory):

Code Block
languagexml
<?xml version="1.0" ?>
<config>
    <setting id="config_server_url" value="sip:proxy@asterisk.example.com:5060;transport=udp" />
    <setting id="server_environment" value="DPMA" />
    <accounts>
        <account index="0" status="1" register="1" account_id="101" username="101" authname="101" password="1234" passcode="1234" line_label="Bobby J" caller_id="Bobby J" dial_plan="[0-8]xx">
            <host_primary server="asterisk.example.com" port="5060" transport="udp" />
        </account>
    </accounts>
</config>

In the XML config, things remains the same, except for the inclusion of the config_server_url setting, pointed at the DPMA server, and the server_environment setting, indicating to the phone that it'll be operating in a DPMA environment.

Warning

This is an example only, and will not lead to a fully-functioning phone. We're still explaining the basics at this point

Words of Warning

Before continuing, some words of warning.  You cannot mix and match traditional DPMA configuration with the config_file phone object parameter.  If you specify a config file for a phone, none of the DPMA configuration options that pertain to phone config, except those in the general section and those discussed on this page, because they pertain to internal DPMA objects and permissions, are valid.

One of the nice things that traditional DPMA configuration is that it uses internal Asterisk configuration hooks to do certain things; in particular, traditionally-configured DPMA can go retrieve PJSIP endpoint information and will properly construct the phone's configuration so that passwords are correct.  When you write your own phone XML configuration file, you are responsible for use the proper account credentials, that you keep synchronized with PJSIP.

XML Configured Phones and DPMA Apps

Having done a very basic configuration, you'll notice that calls work.  That's great.  Try and load the status application.  You'll see something like:

Why?  This is seen because the phone, and DPMA, don't know how to correlate application requests made by the phone to things happening inside of Asterisk.  In Switchvox environments, phones are configured to talk to the Switchvox API.  The Switchvox API understands requests, users, and permissions.  Asterisk itself doesn't have these concepts for users.  DPMA acts as a router, understanding requests from the phone, and tying them to core functionality inside of Asterisk.  To this end, additional configuration is needed for both the phone and for DPMA in order for the phone's applications to function.

Status Application

Let's make Status work.

Expand
titleConfiguring the Status Application

First, update the phone's XML configuration file so that it looks something like:

Code Block
languagexml
<?xml version="1.0" ?>
<config>
    <setting id="config_server_url" value="sip:proxy@asterisk.example.com:5060;transport=udp" />
    <setting id="server_environment" value="DPMA" />
    <appconfig id="appscreen">
        <application id="status"/>
        <auto_start/>
    </appconfig>
    <appconfig id="status">
        <account account_id="101" username="101" password="1234" appserver="dasp://asterisk.example.com/json" apiformat="json"/>
        <auto_start/>
        <full_application/>
    </appconfig>
    <accounts>
        <account index="0" status="1" register="1" account_id="101" username="101" authname="101" password="1234" passcode="1234" line_label="Bobby J" caller_id="Bobby J" dial_plan="[0-8]xx" subscription_extension="auto_hint_101">
            <host_primary server="asterisk.example.com" port="5060" transport="udp" />
        </account>
    </accounts>
</config>

What did we do?  First, we defined an appconfig for the appscreen.  The appscreen appconfig controls what applications are seen on the phone's applications menu.  Here, we're declaring that we'd like to see the status application.

Next, we set an appconfig for the status application itself.  First, for this application, we defined its account parameters.  Here, DPMA and the phone's application are concerned with its account_id and username (match the SIP endpoint identifier), and its password (match the SIP endpoint password), as well as the location of the appserver (set to "dasp:// asterisk.example.com /json") and the apiformat (set to json).

Then, within the account definition, we'll add the subscription_extension parameter and set it to auto_hint_101.  DPMA auto-creates magic presence + device state hints in the format "auto_hint_endpointname."

Then, update your res_digium_phone.conf file so that it includes a line definition, e.g.:

No Format
[general]
globalpin=1234
userlist_auth=disabled
config_auth=disabled
mdns_address=asterisk.example.com
mdns_port=5060
service_name=Asterisk
service_discovery_enabled=yes
file_directory=/var/lib/asterisk/digium/phones

[101]
type=line

[101]
type=phone
config_file=012345678abc.cfg
line=101
full_name=Bob Jones

The line definition is important for DPMA so that it understands which SIP endpoint it's dealing with, inside of Asterisk.

Then, reload DPMA (module reload res_digium_phone.so), and reconfigure the phone (digium_phones reconfigure phone 101), load the status app again, and you'll see:

et voilà!

Status App usage Notes

Return SIP response 486

One of the advantages of Digium's phones having a built-in presence application is that it allows the creation of Asterisk dial plan that can query the presence state before delivering a call to the phone, so that phones aren't even rung when someone's declared they're in DND.  For phones historically configured only via DPMA, to make life easier on existing platforms that don't want to write updated dial plan, Digium's phones have returned a SIP 486 message when called while they're in either the DND or Extended Away presence states.  This is affected by passing in send_dnd options to the status application appconfig, e.g.:

Code Block
languagexml
...
<appconfig id="status">
        <account account_id="101" username="101" password="1234" appserver="dasp://asterisk.example.com/json" apiformat="json"/>
        <send_dnd status="dnd"/>
        <send_dnd status="xa"/>
        <auto_start/>
        <full_application/>
</appconfig>
...

Custom Presence States

It is also possible to configure DPMA to send custom presence lists to the phone. This is accomplished by defining your own list of presences and substatuses and adding those to the phone. To do this, configure and attach them to the phone type in res_digium_phone.conf, e.g.:

 

No Format
...
[status-available]
type=application
application=status
status=available
substatus=Home Office

[status-dnd]
type=application
application=status
status=dnd
substatus=Office Closed

[status-away]
type=application
application=status
status=away
substatus=With Customer
substatus=Lunch

[status-xa]
type=application
application=status
status=xa
substatus=Vacation

[status-chat]
type=application
application=status
status=chat

[101]
type=phone
config_file=012345678abc.cfg
line=101
full_name=Bob Jones
application=status-available
application=status-dnd
application=status-away
application=status-xa
application=status-chat
...
Warning

The DPMA send486 option for status applications is not valid in this configuration mode. Instead, use the send_dnd XML configuration parameter as noted previously in this section.

 

In doing so, we end up with something on the phone that looks like:

This concludes our overview of the Status application when used inside a DPMA+XML mixed configuration environment

Voicemail Application

Next, press the voicemail button on your phone.  If it's a D80, it's not yet configured to do anything.  If it's one of Digium's other models of phones, you'll see something like this:

Like the Status application, the Voicemail application needs to be configured.  Let's have a look at the options.

Expand
titleConfiguring the Voicemail application

We'll start with our simplified XML configuration, and we'll add in what we need for the voicemail app, like so:

Code Block
languagexml
<?xml version="1.0" ?>
<config>
    <setting id="config_server_url" value="sip:proxy@asterisk.example.com:5060;transport=udp" />
    <setting id="server_environment" value="DPMA" />
    <appconfig id="appscreen">
        <application id="voicemail"/>
        <auto_start/>
    </appconfig>
    <appconfig id="voicemail">
        <account account_id="101" username="101" password="1234" appserver="dasp://asterisk.example.com/json" apiformat="json"/>
    </appconfig>
    <events>
        <event id="digium.incomingCall.voicemail" action="app"/>
    </events>
    <accounts>
        <account index="0" status="1" register="1" account_id="101" username="101" authname="101" password="1234" passcode="1234" line_label="Bobby J" caller_id="Bobby J" dial_plan="[0-8]xx" visual_voicemail="1">
            <host_primary server="asterisk.example.com" port="5060" transport="udp" />
            <permission id="use_voicemail" value="1" />
        </account>
    </accounts>
</config>

What did we do? First, we defined the voicemail application for the appscreen, so that we'll see it in the apps menu on the phone.

Next, we set an appconfig for the  voicemail  application itself.  First, for this application, we defined its account parameters.  Here, DPMA and the phone's application are concerned with its  account_id  and  username  (match the SIP endpoint identifier), and its  password  (match the SIP endpoint password), as well as the location of the  appserver  (set to "dasp:// asterisk.example.com /json") and the  apiformat  (set to  json ).

Then, we define an event handler for digium.incomingCall.voicemail. When the phone is accessing the voicemail app functionality and it's playing back a voicemail, DPMA is directing Asterisk to make a call into the telephone, and it's sending that call in with a special header that we trap with this event handler, and we direct to the voicemail application. This allows the phone to stay inside the voicemail app and not consider the voicemail playback an incoming call.

In the account definition, we turn on visual_voicemail and then we set a permission on the account called use_voicemail. Together, these let the phone know that we should use the full functionality of the voicemail app and that we shouldn't grey-out the voicemail buttons on-screen.

As with the status application, we need to update our res_digium_phone.conf file so that it includes a line definition, e.g.:

No Format
[general]
globalpin=1234
userlist_auth=disabled
config_auth=disabled
mdns_address=asterisk.example.com
mdns_port=5060
service_name=Asterisk
service_discovery_enabled=yes
file_directory=/var/lib/asterisk/digium/phones

[101]
type=line

[101]
type=phone
config_file=012345678abc.cfg
line=101
full_name=Bob Jones

And that line definition must be applied to the phone that is associated with it. The line definition is important because it ties the phone to a PJSIP endpoint, wherein one must have defined a single mailboxes, e.g., in the pjsip.conf file:

No Format
[101]
type=endpoint
aors=101
auth=101
callerid="Bobby J" <101>
mailboxes=101@default
Tip

DPMA isn't capable of collapsing multiple mailboxes into one phone's view, so don't define more than one mailboxes in the PJSIP endpoint.

Then, reload DPMA (module reload res_digium_phone.so), and reconfigure the phone (digium_phones reconfigure phone 101), load the voicemail app again, and you'll see (this account already has some voicemails present on it) something like:

Success! (smile)

Voicemail App Usage Notes

Send to Voicemail

Beyond simply loading the voicemail application, there are some additional voicemail-related configuration items that can be set. First, there's an option that allows incoming calls to be sent directly to voicemail. This For D80 model phones, this option is configured as an account permission, like so:

Code Block
languagexml
<?xml version="1.0" ?>
<config>
    <setting id="config_server_url" value="sip:proxy@asterisk.example.com:5060;transport=udp" />
    <setting id="server_environment" value="DPMA" />
    <appconfig id="appscreen">
        <application id="voicemail"/>
        <auto_start/>
    </appconfig>
    <appconfig id="voicemail">
        <account account_id="101" username="101" password="1234" appserver="dasp://asterisk.example.com/json" apiformat="json"/>
    </appconfig>
    <events>
        <event id="digium.incomingCall.voicemail" action="app"/>
    </events>
    <accounts>
        <account index="0" status="1" register="1" account_id="101" username="101" authname="101" password="1234" passcode="1234" line_label="Bobby J" caller_id="Bobby J" dial_plan="[0-8]xx" subscription_extension="auto_hint_101" visual_voicemail="1">
            <host_primary server="asterisk.example.com" port="5060" transport="udp" />
            <permission id="use_voicemail" value="1" />
            <permission id="send_to_voicemail" value="1" />
        </account>
    </accounts>
</config>

When send_to_voicemail is true, D80 phones will enable the send to voicemail button on incoming call cards. For non-D80 phones , in addition to this permission, the phones require a key mapping to must be set in order to display the functionality on a key. This is handled in keymap for the incoming call state, e.g.:

 

Code Block
languagexml
...
<keymap>
    <state id="incoming" conflict="freeze">
        <softkeys>
            <key id="0" action="accept_call"/>
            <key id="1" action="reject_call"/>
            <key id="2" action="transfer_call"/>
            <key id="3" action="send_to_vmail"/>
        </softkeys>
    </state>
</keymap>
...

 

Note the inclusion of the send_to_vmail action.

Voicemail PIN

Another option that can be configured is the option to require a user to enter their voicemail PIN prior to loading the voicemail application into the background. This is accomplished with the require_password voicemail appconfig setting, e.g.:

 

Code Block
languagexml
...
<appconfig id="voicemail">
    <account account_id="101" username="101" password="1234" appserver="dasp://asterisk.example.com/json" apiformat="json" />
    <settings require_password="1" />
</appconfig>
...

When this item is true, the phone will display a prompt for the password whenever the voicemail application is foregrounded, e.g.:

The password matches the appconfig account password, e.g. 1234, in this case.

Warning

One drawback of using this method of configuration is that there is no automatic synchronization of voicemail PIN codes. When using traditional DPMA configuration, a user's phone PIN may be set to "voicemail." Then, if a user changes their voicemail pin from within the DTMF-enabled VoicemailMain() application itself, the phone's pin will be synchronized. There is no external mechanism provided by Asterisk or DPMA to handle rewriting phone XML config files in the event that the voicemail.conf PIN is rewritten by the VoicemailMain() application.

Voicemail Translations

Digium phones retrieve the names of Voicemail folders from the server itself. As such, the phones do not have built-in translation strings for those folders. Instead, the server provides the folder name to the phone. To use non-English folder names requires the configuration of voicemail folder translation lists within DPMA itself, and the application of that translation to a voicemail type application. These must then be loaded onto the telephone. This is accomplished res_digium_phone.conf, e.g.:

No Format
[general]
globalpin=1234
userlist_auth=disabled
config_auth=disabled
mdns_address=asterisk.example.com
mdns_port=5060
service_name=Asterisk
service_discovery_enabled=yes
file_directory=/var/lib/asterisk/digium/phones

[voicemail_de_DE_translation]
type=translation
INBOX=INBOX
Work=Arbeit
Family=Familie
Friends=Freunde
Recordings=Aufnahmen


[voicemail_de_DE]
type=application
application=voicemail
translation=voicemail_de_DE_translation

[101]
type=line

[101]
type=phone
config_file=012345678abc.cfg
line=101
full_name=Bob Jones
application=voicemail_de_DE

Here, we first created a translation mapping of the English folder names to German names. Then, we created a voicemail type application that referenced that translation. Finally, we applied that application, voicemail_de_DE to the phone object itself. Thus, when the phone loads the voicemail application and views its folders, it should see something like:

Note that in this example, we didn't otherwise change the language settings for the phone, thus "Select" and "Refresh" are still in English.

Solicited MWI

Commonly, Asterisk is configured so as to send an unsolicited MWI NOTIFY to a registering endpoint. In those cases, the mailboxes parameter is defined for the PJSIP endpoint. However, if your prefer Asterisk to only respond to solicited, or SUBSCRIBEd MWI, the mailboxes parameter is instead defined on the AOR, and not the endpoint; e.g.:

 

No Format
...
[101]
type=aor
mailboxes=101@default


[101]
type=endpoint
aors=101
auth=101
callerid="Bobby J" <101>
mailboxes=101@default
...

In this case then, the phone needs to be configured to SUBSCRIBE for MWI, which it doesn't do by default. This is accomplished, again referencing our simple XML config, like:

Code Block
languagexml
<?xml version="1.0" ?>
<config>
    <setting id="config_server_url" value="sip:proxy@asterisk.example.com:5060;transport=udp" />
    <setting id="server_environment" value="DPMA" />
    <accounts>
        <account index="0" status="1" register="1" account_id="101" username="101" authname="101" password="1234" passcode="1234" line_label="Bobby J" caller_id="Bobby J" dial_plan="[0-8]xx" needMwiSubscription="1">
            <host_primary server="asterisk.example.com" port="5060" transport="udp" />
        </account>
    </accounts>
</config>

The needMwiSubscription account parameter controls the behavior of the phone, with respect to MWI subscription.

This concludes our overview of the Voicemail application when used inside a DPMA+XML mixed configuration environment.

Parking Application

Next, place an incoming call to your phone.  Answer it.  You'll see a screen like:

On this screen, you'll see only the Conference and End Call soft keys.  You don't see the Parking soft key.  This is because the Parking application is disabled, and because the default key mapping for the phone does not tie the Parking app to any softkey.  Let's enable the Parking app.

Expand
titleConfiguring the Parking Application

First, we'll get the application going on the phone. To do that, let's have a look at our simplified XML configuration, modified with what we'll need for Parking:

Code Block
languagexml
<?xml version="1.0" ?>
<config>
    <setting id="config_server_url" value="sip:proxy@asterisk.example.com:5060;transport=udp" />
    <setting id="server_environment" value="DPMA" />
    <setting id="parking_lot_extension" value="700" />
    <setting id="parking_lot_enable_blind_transfer" value="1" />
    <appconfig id="appscreen">
        <application id="parking"/>
        <auto_start/>
    </appconfig>
    <appconfig id="parking">
        <account account_id="101" username="101" password="1234" appserver="dasp://asterisk.example.com/json" apiformat="json"/>
        <auto_start />
    </appconfig>
    <events>
        <event id="digium.parkingLot.parked" action="app"/>
    </events>
    <accounts>
        <account index="0" status="1" register="1" account_id="101" username="101" authname="101" password="1234" passcode="1234" line_label="Bobby J" caller_id="Bobby J" dial_plan="[0-8]xx">
            <host_primary server="asterisk.example.com" port="5060" transport="udp" />
            <setting id="parking_lot_extension" value="700" />
            <setting id="parking_lot_enable_blind_transfer" value="1" />
        </account>
    </accounts>
</config>

What did we do? First, we defined the parking application for the appscreen, so that we'll see it in the apps menu on the phone.

Next, we set two parameters that are used only by the D80. The first, parking_lot_extension defines where parked calls are to be transferred into. The second, parking_lot_enable_blind_transfer defines the type of transferring done (attended or blind). The D80 only does blind.

Next, we set an appconfig for the parking application itself.  First, for this application, we defined its account parameters.  Here, DPMA and the phone's application are concerned with its account_id and username (match the SIP endpoint identifier), and its password (match the SIP endpoint password), as well as the location of the appserver (set to "dasp:// asterisk.example.com /json") and the apiformat (set to json). In this appconfig, we also set the parking app to auto_start, otherwise, the phone won't show the key as functional later when we map them.

Then, we define an event handler for digium.parkingLot.parked. When DPMA needs to send the phone a message to let it know that a call has been parked, it sends along this NOTIFY event. The phone receives that into its Parking application.

In the account definition, for all models, including the D80, which also requires the phone-level settings, we set parking_lot_extension and parking_lot_enable_blind_transfer.

As with the other application, we need to update our res_digium_phone.conf file so that it includes a line definition, e.g.:

No Format
...
[101]
type=line

[101]
type=phone
config_file=012345678abc.cfg
full_name=Bob Jones
line=101
show_call_parking=yes
...

Note also the inclusion of show_call_parking.  This parameter, in addition to some older control of phone XML, also alerts DPMA whether or not it should push a NOTIFY to the phone about the parked call.  Setting this to yes will cause the NOTIFY to be sent.  Setting this to no will cause NOTIFYs not to be sent.

For the D80, that's all you need. For other models of phones, we need to add the parking key to the phone's key mapping. To accomplish this, we'll be adding the Parking application to the phone's idle state, so we can quickly get to our Parked calls, as well as auto the phone's connected state, so we can park a caller that we're talking to. To accomplish this, our key mapping will look something like:

Code Block
languagexml
...
<keymap>                                                             
    <state id="idle">                                                             
        <softkeys>                                                                           
            <key id="0" action="missed_or_call_log" />                             
            <key id="1" action="show_application" label1="_CONTACTS">                       
                <arg>contacts</arg>                                               
            </key>                                                                   
            <key id="2" action="show_application" label1="_STATUS">
                <arg>status</arg>               
            </key>                              
            <key id="3" action="info" />                                 
            <key id="4" action="show_application" label1="_PARKED_CALLS">
                <arg>parking</arg>                                            
            </key>                                                                             
            <key id="5" action="show_application" label1="_QUEUES">                            
                <arg>queues</arg>                                                              
            </key>                                                 
            <key id="6" action="forward_calls" label1="_FORWARD" />
            <key id="7" action="menu" />                                                                         
        </softkeys>                                                                                              
    </state>
    <state id="connected">                      
        <softkeys>                              
            <key id="0" action="conference" />                           
            <key id="1" action="park_call" />                            
            <key id="2" action="record_call" />                               
            <key id="3" action="end_call" />                                                   
        </softkeys>                                                                            
    </state>
</keymap>
...

 

Here you'll see that for key 2 in the idle state, we have set a show_application, with the label _PARKED_CALLS, which is a built-in phone translation key to handle "Parked Calls" in English and other languages, and we're passing in the argument parking.

 

Then, for the connected state, we've set key 1 to perform the action park_call.

Now, reload DPMA (module reload res_digium_phone.so), and reconfigure the phone (digium_phones reconfigure phone 101). Call into it, and you'll have a Park softkey, like:

which, after pressing, will show:

and, which after pressing Show will show:

Ta-dah!

Parking App Usage Notes

Multiple Parking Lots

If you want the phone to be able to track more than a single parking lot, then additional DPMA configuration must be made. In this case, let's assume we have defined two parking lots in res_parking.conf, parkinglot_sales, and parkinglot_support. In res_parking.conf, they might look like:

No Format
[parkinglot_sales]
context => parkinglot_sales_context
parkext => 800
parkpos => 801-819


[parkinglot_support]
context => parkinglot_support_context
parkext => 820
parkpos => 821-829

To go along with this, we'd need to add modify res_digium_phone.conf to track those two lots, by using the parking application type, and we'd need to add it to the phone object, such as:

No Format
...
[sales-parking]
type=application
application=parking
parkinglot=parkinglot_sales


[support-parking]
type=application
application=parking
parkinglot=parkinglot_support

[101]
type=phone
config_file=012345678abc.cfg
line=101
full_name=Bob Jones
application=sales-parking
application=support-parking
show_call_parking=yes
...

And then, in this case, we'd have to reset our config to point to one of these new lots for parking, e.g.

Code Block
languagexml
...
    <setting id="parking_lot_extension" value="800" />
    <setting id="parking_lot_enable_blind_transfer" value="1" />
    <accounts>
        ...
            <setting id="parking_lot_extension" value="800" />
            <setting id="parking_lot_enable_blind_transfer" value="1" />
        </account>
    </accounts>
</config>
Tip

Digium phones can only park into a single parking location. The parking app itself can track multiple res_parking parking lots, as noted above.

This concludes our overview of the Parking application when used inside a DPMA+XML mixed configuration environment.

Queues Application

Now, we'll walk through the Queues application on the phone.  

Expand
titleConfiguring the Queues Application

The Queues application is used to log in, out of, or pause ones' self within a queue.  Configuring the application to run on the phone requires modification of the phone's XML configuration file, as well as modification to the res_digium_phone.conf file.

The XML modifications for our simple example to enable the Queues application are simple:

Code Block
languagexml
<?xml version="1.0" ?>
<config>
    <setting id="config_server_url" value="sip:proxy@asterisk.example.com:5060;transport=udp" />
    <setting id="server_environment" value="DPMA" />
    <appconfig id="appscreen">
        <application id="queues"/>
        <auto_start/>
    </appconfig>
    <appconfig id="queues">
        <account account_id="101" username="101" password="1234" appserver="dasp://asterisk.example.com/json" apiformat="json"/>
        <auto_start />
    </appconfig>
    <accounts>
        <account index="0" status="1" register="1" account_id="101" username="101" authname="101" password="1234" passcode="1234" line_label="Bobby J" caller_id="Bobby J" dial_plan="[0-8]xx">
            <host_primary server="asterisk.example.com" port="5060" transport="udp" />
        </account>
    </accounts>
</config>

What did we do? First, we defined the queues application for the appscreen, so that we'll see it in the apps menu on the phone.

Then, we set an appconfig for the queues application itself.  First, for this application, we defined its account parameters.  Here, DPMA and the phone's application are concerned with its account_id and username (match the SIP endpoint identifier), and its password (match the SIP endpoint password), as well as the location of the appserver (set to "dasp:// asterisk.example.com /json") and the apiformat (set to json). In this appconfig, we also set the parking app to auto_start, otherwise, the phone won't show the key as functional later when we map them.

That's it.

The real control is defined from within DPMA's res_digium_phones.conf configuration file, where we'll set queue, device location, member name, and other options in a queues type application that we'll apply to the phone object, e.g.:

 

No Format
...
[101-sales-queue]
type=application
application=queue
queue=sales-queue
membername=Bobby J
location=PJSIP/101
member=yes
permission=details


[101]
type=phone
config_file=012345678abc.cfg
line=101
full_name=Bob Jones
application=101-sales-queue

Here, we declared a queue type application, for the sales-queue queue, where our membername is something that we'll see in the app itself.  We've also defined the location of the member as their PJSIP endpoint, PJSIP/101.  We've also declared ourselves as a member of the queue, as opposed to being just a watcher, and we've set our permission level to details, so that we can see what's going on with the queue as a whole.

Further, in Asterisk's queues.conf, to control the Queue, we'll want to enable the setinterfacevarsetqueueentryvar, and setqueuevar, parameters, e.g.:

 

No Format
[sales-queue]
strategy=rrmemory
context=testing
setinterfacevar=yes
setqueueentryvar=yes
setqueuevar=yes
ringinuse=no

Now, reload DPMA (module reload res_digium_phone.so), and reconfigure the phone (digium_phones reconfigure phone 101). We'll have the Queues app available in the app menu and it'll be functional.

This concludes our overview of the Parking application when used inside a DPMA+XML mixed configuration environment.

Other Topics

Call Recording

Digium phones can also perform on-the-fly call recording.  These call recordings are stored by the phone in the Cust5 voicemail folder, which DPMA remaps as the Recordings folder.  The call recording capability is enabled on the phone by adding:

Code Block
languagexml
<permission id="record_own_calls" value="1"/>

to phone's account object.  And, were the phone configured normally via DPMA, the Call Recording functionality would be added in the key mapping to the connected and connected/conference call states, e.g.:

 

Code Block
languagexml
...
<keymap>
    <state id="connected">
        <softkeys>
            <key id="0" action="conference"/>
            <key id="1" action="park_call"/>
            <key id="2" action="record_call"/>
            <key id="3" action="end_call"/>
        </softkeys>
    </state>
    <state id="connected/conference">
        <softkeys>
            <key id="0" action="none"/>
            <key id="1" action="split_conference"/>
            <key id="2" action="record_call"/>
            <key id="3" action="end_call"/>
        </softkeys>
    </state>
</keymap>
...

Other Applications

Other applications, such as the Contacts or LogOut applications should be configured similarly to how we've shown apps to be configured in this page.  Docs for them can be found on the various, versioned XML Config phone wiki pages.

Putting It All Together

Now that we've been through the various sections, what do things look like when we put them all together?

Expand
titleAn Example of Most Everything

Here's our sample DPMA configuration, res_digium_phone.conf:

No Format
[general]
globalpin=1234
userlist_auth=disabled
config_auth=pin
mdns_address=asterisk.example.com
mdns_port=5060
mdns_transport=udp
service_name=Asterisk
service_discovery_enabled=yes
file_directory=/var/lib/asterisk/digium/phones

[status-available]
type=application
application=status
status=available

[status-dnd]
type=application
application=status
status=dnd

[status-away]
type=application
application=status
status=away

[status-xa]
type=application
application=status
status=xa

[status-chat]
type=application
application=status
status=chat

[voicemail_en_US_translation]
type=translation
INBOX=INBOX
Work=Work
Family=Family
Friends=Friends
Recordings=Recordings

[voicemail_en_US]
type=application
application=voicemail
translation=voicemail_en_US_translation

[101-sales-queue]
type=application
application=queue
queue=sales-queue
membername=Bobby J
location=PJSIP/101
member=yes
permission=details

[101]
type=line

[101]
type=phone
pin=1234
full_name=Bob Jones
mac=01234578abc
application=status-dnd
application=status-away
application=status-xa
application=status-chat
application=voicemail_en_US
application=101-sales-queue
line=101
config_file=01234578abc.cfg

This sample config sets the phone config pin to 1234, adds status applications for the basic status elements to the phone, adds a queue application to the phone, attaches line 101 (so that DPMA knows how to map the phone to something in PJSIP), and sets the config file to 012345678abc.cfg.

The corresponding 012345678abc.cfg file would look something like:

Code Block
languagexml
<?xml version="1.0" ?>
<config>
    <setting id="config_server_url" value="sip:proxy@asterisk.example.com:5060;transport=udp" />
    <setting id="login_password" value="789" />
    <setting id="use_secure_labels" value="0" />
    <setting id="send_mac_with_useragent" value="0" />
    <setting id="time_zone" value="America/Los_Angeles" />
    <setting id="time_source" value="ntp" />
    <setting id="ntp_server" value="0.digium.pool.ntp.org" />
    <setting id="ntp_resync" value="86400" />
    <setting id="ntp_prefer_option42" value="1" />
    <setting id="accept_local_calls" value="any" />
    <setting id="transport_udp_enabled" value="1" />
    <setting id="transport_udp_port" value="5060" />
    <setting id="transport_tcp_enabled" value="1" />
    <setting id="transport_tcp_port" value="5060" />
    <setting id="transport_tls_allowed" value="1" />
    <setting id="transport_tls_port" value="5061" />
    <setting id="udp_ka_interval" value="60"/>
    <setting id="logo_file" value="user" path="/user_image.png" url="https://asterisk.example.com/mylogo.png" md5="abc123" />
    <setting id="wallpaper_file" value="user" path="/user_wallpaper.png" url="https://asterisk.example.com/wallpaper.png" md5="abc123" />
    <setting id="display_mc_notification" value="1" />
    <setting id="display_pickup_notification" value="1" />
    <setting id="hide_completed_elsewhere" value="0" />
    <setting id="small_clock" value="0" />
    <setting id="idle_company_text" value="Phone 101" />
    <setting id="brightness" value="10" />
    <setting id="contrast" value="10" />
    <setting id="enable_check_sync" value="1"/>
    <setting id="dim_backlight" value="1" />
    <setting id="backlight_timeout" value="30" />
    <setting id="backlight_dim_level" value="2" />
    <setting id="blf_page_return_timeout" value="0" />
    <setting id="locale" value="en_US" />
    <setting id="time_short_format" value="h:mm a" />
    <setting id="date_short_format" value="M/d/yy" />
    <setting id="date_time_format" value="{1}, {0}" />
    <setting id="idle_screen_clock_format" value="{0} EEE, MMM d" />
    <setting id="ringer_volume" value="5" />
    <setting id="lock_ringing_volume" value="0" />
    <setting id="speaker_volume" value="5" />
    <setting id="handset_volume" value="5" />
    <setting id="headset_volume" value="5" />
    <setting id="reset_call_volume" value="0" />
    <setting id="active_ringtone" value="Digium" />
    <setting id="headset_answer" value="0" />
    <setting id="ring_headset_only" value="0" />
    <setting id="call_waiting_tone" value="1" />
    <setting id="ehs" value="auto" />
    <setting id="call_control_checkx" value="0" />
    <setting id="parking_lot_extension" value="700" />
    <setting id="parking_lot_enable_blind_transfer" value="0" />
    <setting id="enable_blf_on_unused_line_keys" value="0" />
    <setting id="contacts_max_subscriptions" value="40" />
    <setting id="name_format" value="first_last" />
    <setting id="blf_contact_group" value="Default" />
    <setting id="network_enable_dhcp" value="1" />
    <setting id="network_static_ip_address" value="" />
    <setting id="network_subnet_mask" value="" />
    <setting id="network_default_gateway" value="" />
    <setting id="network_domain_name" value="" />
    <setting id="network_primary_dns_server" value="" />
    <setting id="network_secondary_dns_server" value="" />
    <setting id="network_disable_arping" value="0" />
    <setting id="allow_insecure_ssl" value="0" />
    <setting id="network_ipv6_enabled" value="0"/>
    <setting id="network_ipv6_preferred" value="0"/>
    <setting id="network6_static_ip_address" value=""/>
    <setting id="network6_mask" value=""/>
    <setting id="network6_default_gateway" value=""/>
    <setting id="network_vlan_discovery_mode" value="LLDP" />
    <setting id="network_vlan_id" value="" />
    <setting id="pc_vlan_id" value="" />
    <setting id="lan_port_mode" value="auto" />
    <setting id="pc_port_mode" value="auto" />
    <setting id="log_level" value="debug" />
    <setting id="enable_logging" value="0" />
    <setting id="log_server" value="logs.example.com" />
    <setting id="log_port" value="514" />
    <setting id="web_ui_enabled" value="0" />
    <setting id="sip_qos" value="3" />
    <setting id="rtp_qos" value="6" />
    <setting id="pc_qos" value="1" />
    <setting id="sip_dscp" value="24" />
    <setting id="rtp_dscp" value="46" />
    <setting id="in_switchvox_environment" value="0" />
    <setting id="server_environment" value="DPMA" />
    <setting id="allow_app_dev" value="0" />
    <setting id="handshake_timeout" value="86400" />
    <setting id="retransmit_until_response" value="0" />
    <setting id="8021x_passthrough" value="1"/>
    <setting id="8021x_eapol_on_disconnect" value="1"/>
    <setting id="8021x_method" value=""/>
    <setting id="8021x_identity" value=""/>
    <setting id="8021x_anonymous_identity" value=""/>
    <setting id="8021x_password" value=""/>
    <setting id="8021x_client_key" value=""/>
    <setting id="8021x_client_cert" value=""/>
    <setting id="8021x_debug" value="" />
    <setting id="network_default_enable_openvpn" value="0" />
    <setting id="openvpn_root_cert" url="https://user:password@server.example.com/vpn/ca.crt" value="ca.crt" />
    <setting id="openvpn_inline_config" url="https://user:password@server.example.com/vpn/client.ovpn" value="0" md5="abc123" />
    <events>
        <event id="digium.incomingCall.voicemail" action="app" />
        <event id="digium.parkingLot.parked" action="app" />
    </events>
    <keymap>
        <state id="idle">
            <softkeys>
                <key id="0" action="missed_or_call_log"/>
                <key id="1" action="show_application" label1="_CONTACTS">
                    <arg>contacts</arg>
                </key>
                <key id="2" action="status"/>
                <key id="3" action="info"/>
                <key id="4" action="forward_calls" label1="_FORWARD"/>
                <key id="5" action="menu"/>
            </softkeys>
        </state>
        <state id="hold">
            <softkeys>
                <key id="0" action="resume"/>
                <key id="1" action="none"/>
                <key id="2" action="none"/>
                <key id="3" action="end_call"/>
            </softkeys>
        </state>
        <state id="hold/transfer">
            <softkeys>
                <key id="0" action="resume"/>
                <key id="1" action="show_application" label1="_CONTACTS">
                    <arg>contacts</arg>
                </key>
                <key id="2" action="none"/>
                <key id="3" action="cancel_call"/>
            </softkeys>
        </state>
        <state id="hold/conference">
            <softkeys>
                <key id="0" action="resume"/>
                <key id="1" action="split_conference"/>
                <key id="2" action="none"/>
                <key id="3" action="end_call"/>
            </softkeys>
        </state>
        <state id="hold/preconference">
            <softkeys>
                <key id="0" action="resume"/>
                <key id="1" action="show_application" label1="_CONTACTS">
                    <arg>contacts</arg>
                </key>
                <key id="2" action="none"/>
                <key id="3" action="end_call"/>
            </softkeys>
        </state>
        <state id="incoming">
            <softkeys>
                <key id="0" action="accept_call"/>
                <key id="1" action="reject_call"/>
                <key id="2" action="transfer_call"/>
            </softkeys>
        </state>
        <state id="incoming/transfer">
            <softkeys>
                <key id="0" action="show_application" label1="_CONTACTS">
                    <arg>contacts</arg>
                </key>
                <key id="1" action="none"/>
                <key id="2" action="none"/>
                <key id="3" action="cancel_call"/>
            </softkeys>
        </state>
        <state id="connected">
            <softkeys>
                <key id="0" action="conference"/>
                <key id="1" action="none"/>
                <key id="2" action="none"/>
                <key id="3" action="end_call"/>
            </softkeys>
        </state>
        <state id="connected/conference">
            <softkeys>
                <key id="0" action="none"/>
                <key id="1" action="split_conference"/>
                <key id="2" action="none"/>
                <key id="3" action="end_call"/>
            </softkeys>
        </state>
        <state id="connected/transfer">
            <softkeys>
                <key id="0" action="transfer_call"/>
                <key id="1" action="none"/>
                <key id="2" action="none"/>
                <key id="3" action="end_call"/>
            </softkeys>
        </state>
        <state id="dial">
            <softkeys>
                <key id="0" action="toggle_url_number"/>
                <key id="1" action="show_application" label1="_CONTACTS">
                    <arg>contacts</arg>
                </key>
                <key id="2" action="none"/>
                <key id="3" action="cancel_call"/>
            </softkeys>
        </state>
        <state id="dial/conference">
            <softkeys>
                <key id="0" action="none"/>
                <key id="1" action="show_application" label1="_CONTACTS">
                    <arg>contacts</arg>
                </key>
                <key id="2" action="none"/>
                <key id="3" action="cancel_call"/>
            </softkeys>
        </state>
        <state id="dial/transfer">
            <softkeys>
                <key id="0" action="none"/>
                <key id="1" action="show_application" label1="_CONTACTS">
                    <arg>contacts</arg>
                </key>
                <key id="2" action="none"/>
                <key id="3" action="cancel_call"/>
            </softkeys>
        </state>
        <state id="dialing">
            <softkeys>
                <key id="0" action="make_call"/>
                <key id="1" action="backspace"/>
                <key id="2" action="none"/>
                <key id="3" action="cancel_call"/>
            </softkeys>
        </state>
        <state id="dialing/conference">
            <softkeys>
                <key id="0" action="make_call"/>
                <key id="1" action="show_application" label1="_CONTACTS">
                    <arg>contacts</arg>
                </key>
                <key id="2" action="backspace"/>
                <key id="3" action="cancel_call"/>
            </softkeys>
        </state>
        <state id="dialing/transfer">
            <softkeys>
                <key id="0" action="transfer_call"/>
                <key id="1" action="make_call"/>
                <key id="2" action="backspace"/>
                <key id="3" action="cancel_call"/>
            </softkeys>
        </state>
        <state id="failed">
            <softkeys>
                <key id="0" action="none"/>
                <key id="1" action="none"/>
                <key id="2" action="none"/>
                <key id="3" action="clear_call"/>
            </softkeys>
        </state>
        <state id="calling">
            <softkeys>
                <key id="0" action="none"/>
                <key id="1" action="none"/>
                <key id="2" action="none"/>
                <key id="3" action="end_call"/>
            </softkeys>
        </state>
    </keymap>
    <contacts url="https://asterisk.example.com/myfile.xml" id="internal" md5="abcd123" />
    <smart_blf>
        <blf_items url="https://asterisk.example.com/myblfitems.xml" />
    </smart_blf>
    <accounts>
        <account server_uuid="0" index="0" status="1" register="1" account_id="101" username="101" authname="101" password="1234" passcode="1234" line_label="Bobby J" caller_id="Bob Jones" dial_plan="[0-8]xxxxx|911|9411|9611|9011xxx.T3|91xxxxxxxxxx|9[2-9]xxxxxx|*xx.T3|[0-8]xx.T3" visual_voicemail="1" voicemail="" needMwiSubscription="1" outbound_proxy="" outbound_port="" plar_number="" ring_type="normal" subscription_extension="auto_hint_101">
            <host_primary server="asterisk.example.com" port="5060" transport="udp" media_encryption="" reregister="300" retry="25" />
            <permission id="record_own_calls" value="1" />
            <setting id="use_call_log_api" value="0" />
            <setting id="call_log_fetch_entries" value="50" />
            <setting id="parking_lot_extension" value="700" />
            <setting id="parking_lot_enable_blind_transfer" value="1" />
            <permission id="use_voicemail" value="1" />
            <permission id="send_to_voicemail" value="1" />
            <permission id="ignore_calls" value="1" />
        </account>
    </accounts>
    <networks>
        <network id="1" display_name="All Networks" cidr="0.0.0.0/0" />
    </networks>
    <codecs>
        <codec id="PCMU" priority="255" packetization="20" jitter_min="0" jitter_max="0" jitter_target="0" enabled="1" />
        <codec id="PCMA" priority="13" packetization="20" jitter_min="0" jitter_max="0" jitter_target="0" enabled="1" />
        <codec id="G722" priority="11" packetization="20" jitter_min="0" jitter_max="0" jitter_target="0" enabled="1" />
        <codec id="G7221" priority="10" packetization="20" jitter_min="0" jitter_max="0" jitter_target="0" enabled="1" samplerate="uwb" bitrate="48000" />
        <codec id="G726-32" priority="7" packetization="20" jitter_min="0" jitter_max="0" jitter_target="0" enabled="1" />
        <codec id="opus" priority="6" packetization="20" jitter_min="0" jitter_max="0" jitter_target="0" enabled="1" complexity="10" samplerate="wb" use_vbr="0" />
        <codec id="G729" priority="5" packetization="20" jitter_min="0" jitter_max="0" jitter_target="0" enabled="1" />
        <codec id="iLBC" priority="4" packetization="30" jitter_min="0" jitter_max="0" jitter_target="0" enabled="1" />
        <codec id="L16" priority="2" packetization="20" jitter_min="0" jitter_max="0" jitter_target="0" enabled="1" />
        <codec id="L16-256" priority="1" packetization="20" jitter_min="0" jitter_max="0" jitter_target="0" enabled="1"/>
    </codecs>
    <ringtones>
        <tones>
            <tone id="Alarm" display="Alarm" type="phone"/>
            <tone id="Chimes" display="Chimes" type="phone"/>
            <tone id="Digium" display="Digium" type="phone"/>
            <tone id="GuitarStrum" display="Guitar Strum" type="phone"/>
            <tone id="Jingle" display="Jingle" type="phone"/>
            <tone id="Office" display="Office" type="phone"/>
            <tone id="Office2" display="Office 2" type="phone"/>
            <tone id="RotaryPhone" display="Rotary Phone" type="phone"/>
            <tone id="SteelDrum" display="Steel Drum" type="phone"/>
            <tone id="Techno" display="Techno" type="phone"/>
            <tone id="Theme" display="Theme" type="phone"/>
            <tone id="Tweedle" display="Tweedle" type="phone"/>
            <tone id="Twinkle" display="Twinkle" type="phone"/>
            <tone id="Vibe" display="Vibe" type="phone"/>
        </tones>
        <alerts>
            <alert alert_info="normal" ringtone_id="Digium" ring_type="normal" />
            <alert alert_info="ring-answer" ringtone_id="Digium" ring_type="ring-answer" />
            <alert alert_info="intercom" ringtone_id="" ring_type="answer" />
            <alert alert_info="visual" ringtone_id="" ring_type="visual" />
        </alerts>
    </ringtones>
    <appconfig id="appscreen">
        <application id="bluetooth" />
        <application id="voicemail" />
        <application id="parking" />
        <application id="status" />
        <application id="contacts" />
        <application id="queues" />
        <application id="call_log" />
        <application id="forward_calls" />
        <application id="LogOut" />
        <auto_start />
    </appconfig>
    <appconfig id="phonemenu">
      <auto_start />
    </appconfig>
    <appconfig id="contacts">
        <account account_id="101" username="101" password="1234" appserver="dasp://server.example.com/json" apiformat="json"/>
        <display_rules>
            <display_rule id="0" action_id="monitor" show="0"/>
            <display_rule id="1" action_id="monitor" target_status="on_the_phone" show="1"/>
            <display_rule id="2" action_id="intercom" show="0"/>
            <display_rule id="3" action_id="intercom" target_status="idle" show="1"/>
            <display_rule id="4" action_id="dial_vm" phone_state="idle" show="0"/>
            <display_rule id="5" action_id="transfer_vm" show="0"/>
            <display_rule id="6" action_id="transfer_vm" phone_state="transfer" show="1"/>
        </display_rules>
        <settings can_transfer_vm="1" name_format="last_first" use_local_storage="0" />
        <settings in_switchvox_environment="0" />
        <auto_start />
    </appconfig>
    <appconfig id="status">
        <account account_id="101" username="101" password="1234" appserver="dasp://server.example.com/json" apiformat="json"/>
        <send_dnd status="" />
        <auto_start />
        <full_application />
    </appconfig>
    <appconfig id="queues">
        <account account_id="101" username="101" password="1234" appserver="dasp://server.example.com/json" apiformat="json"/>
        <auto_start />
    </appconfig>
    <appconfig id="parking">
        <account account_id="101" username="101" password="1234" appserver="dasp://server.example.com/json" apiformat="json"/>
        <auto_start />
    </appconfig>
    <appconfig id="voicemail">
        <account account_id="101" username="101" password="1234" appserver="dasp://server.example.com/json" apiformat="json"/>
        <settings require_password="1" />
        <auto_start />
    </appconfig>
    <appconfig id="LogOut">
        <auto_start />
    </appconfig>
    <appconfig id="mycustomapp">
        <url url="https://server.example.com/myapp.zip" />
        <settings mysettinga="1" mysettingb="2" mysettingc="telephone" />
    </appconfig>
    <firmwares>
        <firmware model="D40" version="2_7_0" url="http://server.example.com/firmware/2_7_0_D40_firmware.eff" />
        <firmware model="D45" version="2_7_0" url="http://server.example.com/firmware/2_7_0_D45_firmware.eff" />
        <firmware model="D50" version="2_7_0" url="http://server.example.com/firmware/2_7_0_D50_firmware.eff" />
        <firmware model="D60" version="2_7_0" url="http://server.example.com/firmware/2_7_0_D60_firmware.eff" />
        <firmware model="D62" version="2_7_0" url="http://server.example.com/firmware/2_7_0_D62_firmware.eff" />
        <firmware model="D65" version="2_7_0" url="http://server.example.com/firmware/2_7_0_D65_firmware.eff" />
        <firmware model="D70" version="2_7_0" url="http://server.example.com/firmware/2_7_0_D70_firmware.eff" />
        <firmware model="D80" version="1_8_11" url="http://server.example.com/firmware/1_8_11_D80_firmware.eff" />
    </firmwares>
    <public_firmwares>
        <firmware model="D40" version="2_7_0" url="http://dphone.dl.digium.com/firmware/asterisk/2_7_0_D40_firmware.eff" />
        <firmware model="D45" version="2_7_0" url="http://dphone.dl.digium.com/firmware/asterisk/2_7_0_D45_firmware.eff" />
        <firmware model="D50" version="2_7_0" url="http://dphone.dl.digium.com/firmware/asterisk/2_7_0_D50_firmware.eff" />
        <firmware model="D60" version="2_7_0" url="http://dphone.dl.digium.com/firmware/asterisk/2_7_0_D60_firmware.eff" />
        <firmware model="D62" version="2_7_0" url="http://dphone.dl.digium.com/firmware/asterisk/2_7_0_D62_firmware.eff" />
        <firmware model="D65" version="2_7_0" url="http://dphone.dl.digium.com/firmware/asterisk/2_7_0_D65_firmware.eff" />
        <firmware model="D70" version="2_7_0" url="http://dphone.dl.digium.com/firmware/asterisk/2_7_0_D70_firmware.eff" />
        <firmware model="D80" version="1_8_11" url="http://dphone.dl.digium.com/firmware/asterisk/1_8_11_D80_firmware.eff" />
    </public_firmwares>
    <multicastpage>
        <listener id="1" extension="" name="SomePage" addr="239.0.0.1" port="32000" priority="1" interrupt_calls="0"/>
        <listener id="2" extension="" name="All Page" addr="239.0.0.2" port="32000" priority="2" interrupt_calls="1"/>
    </multicastpage>
    <certs>
    </certs>
    <activity_indicator>
        <setting id="idle" color="amber" state="off" />
        <setting id="default" color="amber" state="off" />
        <setting id="hold" color="red" state="slow" />
        <setting id="ringing" color="green" state="fast" /> 
        <setting id="active" color="green" state="on" />
        <setting id="new_vm" color="red" state="slow" />
        <setting id="listen_vm" color="red" state="on" />
        <setting id="leaving_vm" color="amber" state="slow" />
        <setting id="screen_vm" color="amber" state="on" />
        <setting id="announcement" color="amber" state="fast" />
    </activity_indicator>
    <use_proxy_for network="10.10.0.0/20" network_id="1" host="10.1.2.3" use="0" />
</config>

You'll want to review the XML sample before you use it. Notably, it uses a lot of https transports for file downloads. If you're doing HTTPs, you'll want to pay attention to "SSL Considerations" on the Provisioning wiki page. Good luck! (smile)

Closing

TTFN!