The following procedure was used to configure and register three Cisco CP-8961 IP phones as SIP phones on FreePBX 14.0.13.24 / Asterisk 13.29.2 / PBX firmware 12.7.6-2002-2.sng7 with a Cisco SEPXXXXXXXXXXXX.cnf.xml file (a working file is at the bottom of this post).
Note: Two of the three Cisco 8961 phones were brand new and were unboxed prior the starting the procedure.
Step 0: You will need the following information:
- hostname (i.e., MAC address) of the Cisco 8961 phone
- IP address of the Cisco 8961 phone
- Active Load of the software on the Cisco 8961 phone
- Subnet Mask of your network (usually 255.255.255.0)
- Default Router of your network
- IP address of the tftp server
The hostname (MAC address), IP address, and Active Load are found on the desktop menu of the Cisco 8961 phone under Settings==>Phone Information .
Step 1: Confirm there is a working tftp server on your network. I ended up using Tftp32 by Ph. Jourin on a Windows 10 system. I found the tftp service on CentOS 7 to be buggy, as the service would constantly die (i.e., become inactive) after some minutes. One nice feature of Tftp32 is that it logs the activity of the server as the configuration and registration proceeds so the process can be monitored and checked for errors in real time. Another desirable feature of Tftp32 and Windows 10 is that–unlike a Linux system–it appears there is no need to change file permissions on the files in the tftp directory (in the case of Tptp32, the tftp directory is C:\tftp) eliminating a potential point of failure.
Step 2: If it doesn’t already exist in the tftp directory, create a DIALPLAN.xml as follows:
<DIALTEMPLATE>
<TEMPLATE MATCH=“91…” Timeout=“0”/>
<TEMPLATE MATCH=“911” Timeout=“0”/>
<TEMPLATE MATCH="*…" Timeout=“0”/>
<TEMPLATE MATCH="[1-8]…" Timeout=“1”/>
<TEMPLATE MATCH="*" Timeout=“5”/>
</DIALTEMPLATE
Step 3: (optional) Create (touch) two empty .tlv files in the tftp directory, CTLSEPB17D47C11EC3.tlv and ITLSEPB17D47C11EC3.tlv and rename each file with the MAC address of the Cisco 8961 phone.
Note: This step isn’t absolutely necessary; however it should suppress “file not found” error messages in the Tftp32 log and in the Settings==>Administrator==>Status==>Status Messages on the Cisco 8961 phone.
Step 4: In the FreePBX GUI under Applications==>Extensions, create a separate CHAN_SIP extension for each of the lines you want on the Cisco 8961. Note that the Cisco 8961 IP phone supports up to five lines (i.e., extensions). In the example of the working SEPB17D47C11EC3.cnf.xml file at the bottom of the README, four lines, one for each of the first four “buttons” on the 8961 phone display, have been configured. Each line has a unique extension and unique password (or “secret”). The fifth button has been configured as a DND (Do Not Disturb) button.
Note: I have learned that Cisco phones are notoriously finicky about the length of passwords so I have tried to limit the length of the password (“secret”) to twelve characters.
Step 5: (IMPORTANT) Since Cisco 8911 phones use TCP for transport (and not UDP as is more common on earlier Cisco IP phones as well as many other IP phone manufacturers), for each of the newly created extensions, navigate to the “Advanced” tab under Applications==>Extensions. Scroll down and change the Transport option to “TCP only”.
Step 6 (optional) For each new user that was created when the new extension was created, navigate to User Management and select the new user that was just created. Edit the user by clicking on the pencil icon and select the Fax tab. Set the “Enabled” option to “No” to avoid a warning about not having an email address for faxes in the FreePBX GUI Dashboard.
Step 7: Copy the SEPB17D47C11EC3.cnf.xml file to the tftp directory. Rename the file with the hostname of your Cisco 8961 phone. You will need to edit the following parameters in the file:
<processNodeName>FreePBX IP</processNodeName> FreePBX PBX IP address
<loadInformation>ActiveLoad</loadInformation> The Active Load information
You will need to edit the following parameters for each extension:
<featureLabel>LabelName</featureLabel>Phone label name (< 10 chars)
<phoneLabel>Company</phoneLabel> Company / Dept. name (<10 chars)
<name>EXT</name> Phone Extension
<contact>EXT</contact> Phone Extension
<displayName>DispName</displayName> Display Name (<10 chars)
<authName>EXT</authName> Phone Extension
<authPassword>Password1234</authPassword> Extension Password (“secret”)
Step 8: (optional) I’ve found it useful to check for XML errors in the SEPB17D47C11EC3.cnf.xml file with the xmllint utility, which can be found on CentOS 7. If it isn’t available on your FreePBX system, it can be installed.
Step 9: The Cisco 8961 IP phone needs to point to the tftp server, as follows:
- Plug in and boot the IP phone
- Press the Settings key
- Navigate to Administrator Settings
- Select Network Setup
- Select Ethernet Setup
- Select IPv4 Setup
- Set the "DHCP Enabled" field to "No"
- Confirm the "IP Address", "Subnet Mask", and "Default Router"
fields are correct
- Set "DNS Server 1" to the same IP as "Default Router"
- You can leave the other DNS Servers fiels blank
- The "Alternate TFTP Server" field should be "No"
- Enter the IP address of your TFTP Server in the
"TFTP Server 1" field
- Leave the "TFTP Server 2" field blank
- The BOOTP Server field should be set to "No"
- Apply the changed settings
Step 10: Navigate to Administrator Settings=>Reset Settings==>Reset Device==>Reset to reboot the Cisco 8961 phone. This should configure the phone with the parameters in SEPB17D47C11EC3.cnf.xml. Watch the output in the Tftp32 log.
Here is sample output in the Tftp32 log of a successful registration:
Connection received from 172.16.0.91 on port 49158 [23/02 15:51:26.559]
Read request for file <CTLSEPB17D47C11EC3.tlv>. Mode octet [23/02 15:51:26.559]
Using local port 52020 [23/02 15:51:26.559]
<CTLSEPB17D47C11EC3.tlv>: sent 1 blk, 0 bytes in 0 s. 0 blk resent [23/02 15:51:26.574]
Connection received from 172.16.0.91 on port 49158 [23/02 15:51:47.673]
Read request for file <ITLSEPB17D47C11EC3.tlv>. Mode octet [23/02 15:51:47.673]
Using local port 52021 [23/02 15:51:47.673]
<ITLSEPB17D47C11EC3.tlv>: sent 1 blk, 0 bytes in 0 s. 0 blk resent [23/02 15:51:47.673]
Connection received from 172.16.0.91 on port 49158 [23/02 15:52:08.807]
Read request for file <SEPB17D47C11EC3.cnf.xml>. Mode octet [23/02 15:52:08.823]
Using local port 52025 [23/02 15:52:08.823]
<SEPB17D47C11EC3.cnf.xml>: sent 22 blks, 10817 bytes in 0 s. 0 blk resent [23/02 15:52:08.854]
Connection received from 172.16.0.91 on port 49158 [23/02 15:52:33.241]
Read request for file </gh-sip.jar>. Mode octet [23/02 15:52:33.241]
File <\gh-sip.jar> : error 2 in system call CreateFile The system cannot find the file specified. [23/02 15:52:33.241]
Connection received from 172.16.0.91 on port 49158 [23/02 15:52:54.395]
Read request for file <dialplan.xml>. Mode octet [23/02 15:52:54.395]
Using local port 60256 [23/02 15:52:54.395]
<dialplan.xml>: sent 1 blk, 255 bytes in 0 s. 0 blk resent [23/02 15:52:54.395]
After the steps above, the Cisco IP phone should register with FreePBX.
Here is a sample configuration file with 4 lines and a DND (Do Not Disturb) button.
<device>
<deviceProtocol>SIP</deviceProtocol>
<sshUserId>admin</sshUserId>
<sshPassword>password</sshPassword>
<devicePool>
<dateTimeSetting>
<dateTemplate>M/D/YA</dateTemplate>
<timeZone>Pacific Standard/Daylight Time</timeZone>
<ntps>
<ntp>
<name>pool.ntp.org</name>
<ntpMode>Unicast</ntpMode>
</ntp>
</ntps>
</dateTimeSetting>
<callManagerGroup>
<members>
<member priority=“0”>
<callManager>
<ports>
<ethernetPhonePort>2000</ethernetPhonePort>
<sipPort>5060</sipPort>
<securedSipPort>5061</securedSipPort>
</ports>
<processNodeName>172.16.0.175</processNodeName>
</callManager>
</member>
</members>
</callManagerGroup>
</devicePool>
<sipProfile>
<sipProxies>
<backupProxy></backupProxy>
<backupProxyPort>5060</backupProxyPort>
<emergencyProxy></emergencyProxy>
<emergencyProxyPort></emergencyProxyPort>
<outboundProxy></outboundProxy>
<outboundProxyPort></outboundProxyPort>
<registerWithProxy>true</registerWithProxy>
</sipProxies>
<sipCallFeatures>
<cnfJoinEnabled>true</cnfJoinEnabled>
<callForwardURI>x-serviceuri-cfwdall</callForwardURI>
<callPickupURI>x-cisco-serviceuri-pickup</callPickupURI>
<callPickupListURI>x-cisco-serviceuri-opickup</callPickupListURI>
<callPickupGroupURI>x-cisco-serviceuri-gpickup</callPickupGroupURI>
<meetMeServiceURI>x-cisco-serviceuri-meetme</meetMeServiceURI>
<abbreviatedDialURI>x-cisco-serviceuri-abbrdial</abbreviatedDialURI>
<rfc2543Hold>false</rfc2543Hold>
<callHoldRingback>2</callHoldRingback>
<localCfwdEnable>true</localCfwdEnable>
<semiAttendedTransfer>true</semiAttendedTransfer>
<anonymousCallBlock>2</anonymousCallBlock>
<callerIdBlocking>2</callerIdBlocking>
<dndControl>0</dndControl>
<remoteCcEnable>true</remoteCcEnable>
</sipCallFeatures>
<sipStack>
<sipInviteRetx>6</sipInviteRetx>
<sipRetx>10</sipRetx>
<timerInviteExpires>180</timerInviteExpires>
<timerRegisterExpires>1800</timerRegisterExpires>
<timerRegisterDelta>5</timerRegisterDelta>
<timerKeepAliveExpires>120</timerKeepAliveExpires>
<timerSubscribeExpires>120</timerSubscribeExpires>
<timerSubscribeDelta>5</timerSubscribeDelta>
<timerT1>500</timerT1>
<timerT2>4000</timerT2>
<maxRedirects>70</maxRedirects>
<remotePartyID>false</remotePartyID>
<userInfo>None</userInfo>
</sipStack>
<autoAnswerTimer>1</autoAnswerTimer>
<autoAnswerAltBehavior>false</autoAnswerAltBehavior>
<autoAnswerOverride>true</autoAnswerOverride>
<transferOnhookEnabled>false</transferOnhookEnabled>
<enableVad>false</enableVad>
<dtmfAvtPayload>101</dtmfAvtPayload>
<dtmfDbLevel>3</dtmfDbLevel>
<dtmfOutofBand>avt</dtmfOutofBand>
<alwaysUsePrimeLine>false</alwaysUsePrimeLine>
<alwaysUsePrimeLineVoiceMail>false</alwaysUsePrimeLineVoiceMail>
<kpml>3</kpml>
<phoneLabel>Stewart</phoneLabel>
<stutterMsgWaiting>1</stutterMsgWaiting>
<callStats>false</callStats>
<silentPeriodBetweenCallWaitingBursts>10</silentPeriodBetweenCallWaitingBursts>
<disableLocalSpeedDialConfig>false</disableLocalSpeedDialConfig>
<sipLines>
<line button=“1”>
<featureID>9</featureID>
<featureLabel>Line 1: 8961</featureLabel>
<proxy>USECALLMANAGER</proxy>
<port>5060</port>
<name>8961</name>
<displayName>Stewart</displayName>
<autoAnswer>
<autoAnswerEnabled>2</autoAnswerEnabled>
</autoAnswer>
<callWaiting>3</callWaiting>
<authName>8961</authName>
<authPassword>Password1234</authPassword>
<sharedLine>false</sharedLine>
<messageWaitingLampPolicy>1</messageWaitingLampPolicy>
<messagesNumber>*97</messagesNumber>
<ringSettingIdle>4</ringSettingIdle>
<ringSettingActive>5</ringSettingActive>
<contact>8961</contact>
<forwardCallInfoDisplay>
<callerName>true</callerName>
<callerNumber>false</callerNumber>
<redirectedNumber>false</redirectedNumber>
<dialedNumber>true</dialedNumber>
</forwardCallInfoDisplay>
</line>
<line button=“2”>
<featureID>9</featureID>
<featureLabel>Line 2: 8962</featureLabel>
<proxy>USECALLMANAGER</proxy>
<port>5060</port>
<name>8962</name>
<displayName>Stewart</displayName>
<autoAnswer>
<autoAnswerEnabled>2</autoAnswerEnabled>
</autoAnswer>
<callWaiting>3</callWaiting>
<authName>8962</authName>
<authPassword>Password1234</authPassword>
<sharedLine>false</sharedLine>
<messageWaitingLampPolicy>1</messageWaitingLampPolicy>
<messagesNumber>*97</messagesNumber>
<ringSettingIdle>4</ringSettingIdle>
<ringSettingActive>5</ringSettingActive>
<contact>8962</contact>
<forwardCallInfoDisplay>
<callerName>true</callerName>
<callerNumber>false</callerNumber>
<redirectedNumber>false</redirectedNumber>
<dialedNumber>true</dialedNumber>
</forwardCallInfoDisplay>
</line>
<line button=“3”>
<featureID>9</featureID>
<featureLabel>Line 3: 8963</featureLabel>
<proxy>USECALLMANAGER</proxy>
<port>5060</port>
<name>8963</name>
<displayName>Stewart</displayName>
<autoAnswer>
<autoAnswerEnabled>2</autoAnswerEnabled>
</autoAnswer>
<callWaiting>3</callWaiting>
<authName>8963</authName>
<authPassword>55bc879652af</authPassword>
<sharedLine>false</sharedLine>
<messageWaitingLampPolicy>1</messageWaitingLampPolicy>
<messagesNumber>*97</messagesNumber>
<ringSettingIdle>4</ringSettingIdle>
<ringSettingActive>5</ringSettingActive>
<contact>8963</contact>
<forwardCallInfoDisplay>
<callerName>true</callerName>
<callerNumber>false</callerNumber>
<redirectedNumber>false</redirectedNumber>
<dialedNumber>true</dialedNumber>
</forwardCallInfoDisplay>
</line>
<line button=“4”>
<featureID>9</featureID>
<featureLabel>Line 4: 8964</featureLabel>
<proxy>USECALLMANAGER</proxy>
<port>5060</port>
<name>8964</name>
<displayName>Stewart</displayName>
<autoAnswer>
<autoAnswerEnabled>2</autoAnswerEnabled>
</autoAnswer>
<callWaiting>3</callWaiting>
<authName>8964</authName>
<authPassword>55bc879652af</authPassword>
<sharedLine>false</sharedLine>
<messageWaitingLampPolicy>1</messageWaitingLampPolicy>
<messagesNumber>*97</messagesNumber>
<ringSettingIdle>4</ringSettingIdle>
<ringSettingActive>5</ringSettingActive>
<contact>8964</contact>
<forwardCallInfoDisplay>
<callerName>true</callerName>
<callerNumber>false</callerNumber>
<redirectedNumber>false</redirectedNumber>
<dialedNumber>true</dialedNumber>
</forwardCallInfoDisplay>
</line>
<line button=“5”>
<featureID>130</featureID>
<featureLabel>DND</featureLabel>
</line>
</sipLines>
<voipControlPort>5060</voipControlPort>
<startMediaPort>16348</startMediaPort>
<stopMediaPort>20134</stopMediaPort>
<dscpForAudio>184</dscpForAudio>
<ringSettingBusyStationPolicy>0</ringSettingBusyStationPolicy>
<dialTemplate>dialplan.xml</dialTemplate>
<softKeyFile></softKeyFile>
</sipProfile>
<commonProfile>
<phonePassword></phonePassword>
<backgroundImageAccess>true</backgroundImageAccess>
<callLogBlfEnabled>2</callLogBlfEnabled>
</commonProfile>
<loadInformation>sip8961.9-3-2-10</loadInformation>
<vendorConfig>
<disableSpeaker>false</disableSpeaker>
<disableSpeakerAndHeadset>false</disableSpeakerAndHeadset>
<pcPort>0</pcPort>
<settingsAccess>1</settingsAccess>
<garp>0</garp>
<voiceVlanAccess>0</voiceVlanAccess>
<videoCapability>0</videoCapability>
<autoSelectLineEnable>0</autoSelectLineEnable>
<webAccess>1</webAccess>
<daysDisplayNotActive>1,2,3,4,5,6,7</daysDisplayNotActive>
<displayOnTime>00:00</displayOnTime>
<displayOnDuration>00:00</displayOnDuration>
<displayIdleTimeout>00:00</displayIdleTimeout>
<spanToPCPort>1</spanToPCPort>
<loggingDisplay>1</loggingDisplay>
<loadServer></loadServer>
</vendorConfig>
<userLocale>
<name></name>
<uid></uid>
<langCode>en_US</langCode>
<version>1.0.0.0-1</version>
<winCharSet>iso-8859-1</winCharSet>
</userLocale>
<networkLocale></networkLocale>
<networkLocaleInfo>
<name></name>
<uid></uid>
<version>1.0.0.0-1</version>
</networkLocaleInfo>
<deviceSecurityMode>1</deviceSecurityMode>
<authenticationURL></authenticationURL>
<directoryURL></directoryURL>
<servicesURL></servicesURL>
<idleURL></idleURL>
<informationURL></informationURL>
<messagesURL></messagesURL>
<proxyServerURL></proxyServerURL>
<dscpForSCCPPhoneConfig>96</dscpForSCCPPhoneConfig>
<dscpForSCCPPhoneServices>0</dscpForSCCPPhoneServices>
<dscpForCm2Dvce>96</dscpForCm2Dvce>
<transportLayerProtocol>4</transportLayerProtocol>
<capfAuthMode>0</capfAuthMode>
<capfList>
<capf>
<phonePort>3804</phonePort>
</capf>
</capfList>
<certHash></certHash>
<encrConfig>false</encrConfig>
</device>