The Cisco 7940/7960 series of phones were from nearly two decades ago (2006-2009) and these days are considered very obsolote, which also means they’re incredibly inexpensive second hand. In some cases, the used Cisco VoIP phone may be cheaper than a new analog phone!
It is definitely cost prohibitive to run Call Manager for these phones in the home lab - and further, modern versions of Call Manager don’t officially support these old phones.
However, with the SIP software on them, they can be coerced into connecting to FreePBX.
First, you need some kind of TFTP server. In my case, I am using my Synology.
Within DHCP, you’ll need to configure Option 150 and set the IP of your TFTP server - this tells the phones where to go for their configuration.
Here is a sample configuration from my Palo Alto Firewall.
Within the root of the TFTP server, you will create a file named “SEP{MAC-ADDRESS-OF-PHONE}.cnf” where you’ll replace {MAC-ADDRESS-OF-PHONE} with the MAC address of the phone.
Here is a configuration for one of my test phones, with the MAC address of EC:C8:82:B0:E3:D1 or SIPECC882B0E3D1.cnf
One important note, is that the line password needs to be less than 10 characters - so keep this in mind when configuring the extension.
# Line 1 Settings
line1_name : "10009"
line1_displayname : "10009"
line1_authname : "10009"
line1_password : "Password"
line1_shortname : "10009"
# Line 2 Settings
line2_name : ""
line2_displayname : ""
line2_authname : "UNPROVISIONED"
line2_password : "UNPROVISIONED"
line2_shortname : ""
version_stamp : "1729657339-9867e346-ae68-4315-85a0-4a4ee04edd0d"
directory_url : "http://10.1.0.20:8080/ccmcip/xmldirectory.jsp"
services_url : "http://10.1.0.20:8080/ccmcip/getservicesmenu.jsp"
proxy1_address : "10.1.0.20"
proxy2_address : ""
proxy3_address : ""
proxy4_address : ""
proxy5_address : ""
proxy6_address : ""
proxy_emergency : "10.1.0.20"
proxy_emergency_port : "5060"
proxy_backup : "10.1.0.20"
proxy_backup_port : "5060"
outbound_proxy : "10.1.0.20"
outbound_proxy_port : "5060"
nat_enable : "0"
nat_address : ""
nat_received_processing : "0"
time_zone : "PST"
telnet_level : "2"
phone_prompt : "CiscoCP7940"
phone_password : "111111"
enable_vad : "0"
network_media_type : "auto"
user_info : "phone"
sntp_mode : "unicast"
sntp_server : "10.254.0.1"
ime_format_24hr : "0"
dst_offset : "1"
dst_start_month : "April"
dst_start_day : ""
dst_start_day_of_week : "Sun"
dst_start_week_of_month : "1"
dst_start_time : "2"
dst_stop_month : "Nov"
dst_stop_day : "1"
dst_stop_day_of_week : "Sunday"
dst_stop_week_of_month : ""
dst_stop_time : "2"
dst_auto_adjust : "1"
timer_register_expires : "60"
preferred_codec : "none"
cnf_join_enable : "1"
semi_attended_transfer : "1"
dtmf_inband : "1"
dtmf_db_level : "3"
timer_t1 : "500"
timer_t2 : "4000"
sip_retx : "10"
sip_invite_retx : "6"
timer_invite_expires : "180"
messages_uri : "*97"
dnd_control : "0"
callerid_blocking : "0"
anonymous_call_block : "0"
call_waiting : "1"
dtmf_avt_payload : "101"
dial_template : "dialplan"
voip_control_port : "5060"
start_media_port : "16384"
end_media_port : "32766"
<?xml version="1.0" encoding="utf-8"?>
This is enough to get the phone to try to connect to FreePBX, although two additional settings need to be changed in FreePBX to allow the older SIP implementation on the Phones to register:
The first option is to disable the “Force rport” which is a SIP negotiation to determine the return UDP port.
The second option is to disable the “Rewrite Contact” option.
After those two options have been modified for the extension and applied, the phone should register and be able to make and receive phone calls.