Cisco CP 69xx VoIP Telefone mit Asterisk Gemeinschaft - amooma/GS3 GitHub Wiki

Cisco CP-69xx VoIP-Telefone mit Asterisk/Gemeinschaft

Allgemeines

Cisco CP-69xx sind Business-VoIP-Telefone für den Gebrauch mit dem Cisco CallManager. Die Telefone werden standardmässig mit einem Firmware-Image ausgeliefert, das das proprietäre SCCP- ("Skinny"-) Protokoll unterstützt. Es gibt aber auch Firmware-Images für SIP, die bei Cisco zum Download zur Verfügung stehen (kostenpflichtiger Cisco-Account erforderlich, alternativ Cisco-Partner um die Images bitten). Die nachfolgende Anleitung wurde für ein CP-6941 erstellt. Sie sollte ebenso mit einem CP-6921, -6945 oder -6961 funktionieren. Für das CP-6901 und das -6911 gibt es (anscheinend) keine Firmware-Images für SIP.

Man kann mit den Cisco-Telefonen kein Provisioning machen, wie man es von Gemeinschaft gewohnt ist, ausserdem gibt es Einschränkungen bei SIP (s.u.). Cisco vermarktet die Telefone auch nicht für SIP und Support für was anderes als den Betrieb mit dem Cisco CallManager gibt es nicht. Kurz gesagt, wer die Wahl hat, welche Telefone er für seine Asterisk/Gemeinschaft-Anlage kauft, sollte eher Modelle eines Herstellers wählen, die vom Gemeinschaft-Provisioning unterstützt werden - oder aber das Gemeinschaft-Provisioning für die Cisco-Geräte erweitern (was nicht ganz trivial sein dürfte). Die hier beschriebene Methode des Betriebs ist für eine grössere Zahl Telefone jedenfalls eher unkomfortabel.

Grundsätzlich funktioniert der Betrieb der Cisco-Telefone an Asterisk/Gemeinschaft folgendermassen: Nach den erforderlichen Änderungen am Gemeinschaft-Server (s.u.) benötigt man für jedes Telefon eine Konfigurationsdatei im XML-Format im Root-Verzeichnis des TFTP-Servers. Nach dem Booten bekommen die Cisco-Telefone ihre IP-Daten per DHCP und holen sich ihre individuelle Konfigurationsdatei (sowie eine oder mehrere globale Konfigurationsdateien) per TFTP vom Gemeinschaft-Server. In der individuellen Konfigurationsdatei muss der SIP-Username (Durchwahl) und das SIP-Passwort des auf dem Gemeinschaft-Server eingerichteten Benutzers eingetragen sein. Damit jedes einzelne Telefon "weiss", welche Konfigurationsdatei die eigene ist, haben die Konfigurationsdateien systematische Namen, in denen die MAC-Adresse des jeweiligen Telefons auftaucht (z.B. SEPD0D0FD17395E.cnf.xml - MAC-Adresse D0:D0:FD:17:39:5E, wichtig: Nur Grossbuchstaben verwenden!).

Nachfolgend wird als Beispiel angenommen, dass der Gemeinschaft-Server und alle Telefone sich im IP-Subnetz 10.10.32.0/19 befinden. Die Benutzerin des Cisco-Telefons mit der MAC-Adresse D0:D0:FD:17:39:5E ist Lieschen Mueller. Sie hat die Durchwahl 7939 (=SIP-Username) und das SIP-Passwort 4711081542 (und ist mit diesen Daten im Gemeinschaft-Server eingetragen).

Voraussetzungen

Ausser dem Cisco-Telefon und einem funktionierenden Gemeinschaft ist folgendes erforderlich:

  • DHCP-Konfiguration erweitern
    Man benötigt einen neuen Abschnitt in /etc/dhcp/dhcpd.conf, der den Cisco-Telefonen ihren TFTP-Server "mitteilt" (s.u.)

  • TFTP-Server auf Gemeinschaft

    • apt-get install atftpd
    • Parameter in /etc/default/atftpd
      • USE_INETD=false
      • OPTIONS="--bind-address 10.10.32.1 --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /srv/tftp"
    • Das Root-Verzeichnis des TFTP-Servers ist /srv/tftp
  • NAT für Asterisk/SIP abschalten

    • In /opt/gemeinschaft/etc/asterisk/sip.conf
      nat = never
      setzen. Wer SIP mit NAT-Unterstützung braucht, kann die Cisco-Telefone nicht benutzen.
    • Danach Asterisk neu starten und mit
      asterisk -rvvvvvv
      auf den laufenden Asterisk aufschalten. Ein
      sip show settings
      sollte "Nat: No" unter "Default Settings" anzeigen.
  • Die SIP-Firmware für die Telefone gibt es in Form eines ZIP-Archivs. Gegenwärtig (Februar 2012) ist Version 9.2.2.7 aktuell. Das zugehörige ZIP-Archiv ist "cmterm-69xx-sip.9-2-2-7.zip" und muss im Root-Verzeichnis des TFTP-Servers entpackt werden.

Weitere Hinweise

  • In
    /var/log/daemon.log
    kann man sehen, welche IP-Adresse das Telefon bekommt, welche MAC-Adresse es hat (steht auch hinten auf dem Gerät drauf) und welche Dateien es per TFTP zu laden versucht. Auch ein Blick in die Webserver-Logs ist hilfreich, wenn man sich mit der Konfiguration der Telefonbuch-Taste herumschlägt.

  • Bevor man das Telefon anschliesst und mit Strom versorgt, sollten alle Änderungen vorgenommen sein und die erforderlichen Dateien im TFTP-Rootverzeichnis vorliegen. Als erstes flasht das Telefon dann die SIP-Firmware und startet neu. Wenn danach alles glatt geht, erscheinen auf dem Display die konfigurierten Daten und das Telefon funktioniert.

  • Findet ein Telefon keine Konfigurationsdatei auf dem TFTP-Server, versucht es ca. alle 30 s erneut, eine Datei zu laden. Sobald es eine Datei geladen hat, unterbleiben weitere Ladeversuche. Hat man eine Konfigurationsdatei geändert und will, dass das Telefon die Datei lädt, führt man per Telefon-Menue einen Reset durch (die Taste mit dem Zahnrad drücken und dann zu den "Admin-Settings" und "Reset All" durchhangeln).

  • Wenn das Telefon partout nicht funktionieren will, obwohl alle hier genannten Massnahmen umgesetzt wurden und stattdessen im daemon.log Meldungen über nicht vorhandene Dateien auftauchen, die das Telefon unbedingt laden will, hilft evtl. ein "Factory Reset": Stromkabel (bei PoE: Netzwerkkabel) des Telefons abziehen und wieder einstecken. Während das Telefon startet und bevor die LED in der Lautsprecher-Taste an- und wieder ausgeht, die "#"-Taste drücken und halten. Dann warten, bis die Line-Tasten orange blinken und die "#"-Taste loslassen. Zum Schluss die Tastenfolge "123456789*0#" eingeben. Danach startet das Telefon wieder neu und tut hoffentlich seinen Dienst.

  • Mit der unten als Beispiel angeführten XML-Konfigurationsdatei funktioniert das Cisco-Telefon grundsätzlich, aber sie schöpft nicht alle Möglichkeiten aus, die das Telefon bietet. Die Voicemail-Taste funktioniert (Tag "messagesNumber") bei einem Standard-Gemeinschaft, ist aber leicht anpassbar, wenn man eine andere Nummer für Voicemail verwendet. Die Line-Tasten am Display lassen sich mit verschiedenen Funktionen belegen (Tag "featureID") - nicht nur mit einer SIP-Line, sondern z.B. auch mit einer Kurzwahl. Innerhalb der Gemeinschaft-Anlage funktionieren Konferenz und Call-Transfer. Weniger trivial ist das Telefonbuch: Cisco sieht hier ein "Personal-" und ein "Corporate-Directory" vor - bei beiden wird eine HTTP-URL aufgerufen, die man auch in der XML-Konfigurationsdatei definieren kann. Wenn man entsprechende Verzeichnisse und Dateien auf dem Webserver der Gemeinschaft-Anlage einrichtet, kann man hier zumindest eine rudimentäre Funktionalität gewährleisten. Da Cisco keine Dokumentation zu den Konfigurationsoptionen veröffentlicht, muss man für eine gewünschte Option (z.B. Tastenbelegung) ggf. etwas herumprobieren. Die Cisco-VoIP-Telefone der Produktreihe 79xx werden auf die gleiche Art konfiguriert (XML-Datei per TFTP) und viele Konfigurationsoptionen sind auch gleich.

  • Klingeltöne: Im Root-Verzeichnis des TFTP-Servers werden in der Datei Ringlist.xml (s.u.) die Klingeltöne definiert, die per Telefon-Menue auswählbar sein sollen. Die Kodierung der Klingeltöne muss U-law sein, headerless, bei 8 kHz sample-rate und 8 Bit per sample. Hier muss man ggf. etwas mit dem Audio-Editor der Wahl (sox, audacity, etc.) experimentieren.

  • In der Datei dialplan.xml wird (insbesondere) festgelegt, wie das Telefon beim Wählen reagiert. In der Beispieldatei (s.u.) ist definiert, dass beim Wählen einer vierstelligen Durchwahl nur eine Sekunde gewartet wird, bevor das Telefon wählt. In allen anderen Fällen wird 10 Sekunden gewartet. Man kann aber immer mit einer der Kontext-Tasten unter dem Display mittels "Call" den Wählvorgang einleiten.

  • Die Menuetexte der Telefone sind grundsätzlich englisch. Eine deutsche Sprachanpassung existiert wohl, aber funktioniert anscheinend nur in Verbindung mit dem Cisco CallManager.

  • Nützliche Links:

Konfiguration

/etc/dhcp/dhcpd.conf (Ausschnitt)

########################################################
#  Cisco CP-6941
########################################################
class "cisco6941" {
        match if (
                (substring(hardware, 1, 3) = d0:d0:fd) or
                (substring(hardware, 1, 3) = b4:a4:e3)
        );

        option tftp-server-name "10.10.32.1";

        default-lease-time 2764800;  # 32 days
        max-lease-time     3024000;  # 35 days
}

TFTP-Rootverzeichnis

root@gemeinschaft:/srv/tftp# ls -la
total 11684
drwxr-xr-x 2 nobody root    4096 Feb  9 16:21 .
drwxr-xr-x 3 root   root    4096 Aug 30 12:12 ..
-rw-r--r-- 1 root   root   45308 Aug 16 10:19 BOOT69xx.0-0-0-14.zz.sgn
-rw-r--r-- 1 root   root  226184 Nov  1 10:06 DSP69xx.0-0-0-11.zz.sgn
-rw-r--r-- 1 root   root     407 Feb 15 11:34 Ringlist.xml
-rw-r--r-- 1 root   root    6966 Feb 10 10:44 SEPD0D0FD17395E.cnf.xml
-rw-r--r-- 1 root   root     483 Nov 22 18:10 SIP69xx.9-2-2-7.loads
-rw-r--r-- 1 root   root 2967320 Nov 22 18:09 SIP69xx.9-2-2-7.zz.sgn
-rw-r--r-- 1 root   root 3240104 Feb  2 16:00 cmterm-69xx-sip.9-2-2-7.zip
-rw-r--r-- 1 root   root     148 Feb  9 14:49 dialplan.xml
-rw-r--r-- 1 root   root   39122 Feb 13 11:54 riff.raw
-rw-r--r-- 1 root   root   39756 Feb 13 11:54 riff2.raw

/srv/tftp/dialplan.xml

<DIALTEMPLATE>
<TEMPLATE MATCH="...." TIMEOUT="1"/><!-- Internal Ext. -->
<TEMPLATE MATCH="*" TIMEOUT="10"/> <!-- Anything else -->
</DIALTEMPLATE>

/srv/tftp/SEPD0D0FD17395E.cnf.xml

<device>
  <deviceProtocol>SIP</deviceProtocol>
  <sshUserId>admin</sshUserId>
  <sshPassword>tralala</sshPassword>
  <devicePool>
    <dateTimeSetting>
      <dateTemplate>D.M.Y</dateTemplate>
      <timeZone>W. Europe Standard/Daylight Time</timeZone>
      <ntps>
        <ntp>
          <name>10.10.32.1</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>10.10.32.1</processNodeName>
          </callManager>
        </member>
      </members>
    </callManagerGroup>
  </devicePool>
  <sipProfile>
    <sipProxies>
      <backupProxy></backupProxy>
      <backupProxyPort></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>3600</timerRegisterExpires>
      <timerRegisterDelta>5</timerRegisterDelta>
      <timerKeepAliveExpires>120</timerKeepAliveExpires>
      <timerSubscribeExpires>120</timerSubscribeExpires>
      <timerSubscribeDelta>5</timerSubscribeDelta>
      <timerT1>500</timerT1>
      <timerT2>4000</timerT2>
      <maxRedirects>70</maxRedirects>
      <remotePartyID>true</remotePartyID>
      <userInfo>None</userInfo>
    </sipStack>
    <autoAnswerTimer>1</autoAnswerTimer>
    <autoAnswerAltBehavior>false</autoAnswerAltBehavior>
    <autoAnswerOverride>true</autoAnswerOverride>
    <transferOnhookEnabled>false</transferOnhookEnabled>
    <enableVad>false</enableVad>
    <preferredCodec>none</preferredCodec>
    <dtmfAvtPayload>101</dtmfAvtPayload>
    <dtmfDbLevel>3</dtmfDbLevel>
    <dtmfOutofBand>avt</dtmfOutofBand>
    <alwaysUsePrimeLine>false</alwaysUsePrimeLine>
    <alwaysUsePrimeLineVoiceMail>false</alwaysUsePrimeLineVoiceMail>
    <kpml>3</kpml>
    <natEnabled>false</natEnabled>
    <natAddress></natAddress>
    <phoneLabel>phoneLabel</phoneLabel>
    <stutterMsgWaiting>0</stutterMsgWaiting>
    <callStats>false</callStats>
    <silentPeriodBetweenCallWaitingBursts>10</silentPeriodBetweenCallWaitingBursts>
    <disableLocalSpeedDialConfig>false</disableLocalSpeedDialConfig>
    <startMediaPort>16384</startMediaPort>
    <stopMediaPort>32766</stopMediaPort>
    <sipLines>
      <line button="1">
        <featureID>9</featureID>
        <featureLabel>L. Mueller</featureLabel>
        <proxy>USECALLMANAGER</proxy>
        <port>5060</port>
        <name>7939</name>
        <displayName>7939</displayName>
        <autoAnswer>
          <autoAnswerEnabled>2</autoAnswerEnabled>
        </autoAnswer>
        <callWaiting>3</callWaiting>
        <authName>7939</authName>
        <authPassword>4711081542</authPassword>
        <sharedLine>false</sharedLine>
        <messageWaitingLampPolicy>1</messageWaitingLampPolicy>
        <messagesNumber>80</messagesNumber>
        <ringSettingIdle>4</ringSettingIdle>
        <ringSettingActive>5</ringSettingActive>
        <contact>7939</contact>
        <forwardCallInfoDisplay>
          <callerName>true</callerName>
          <callerNumber>true</callerNumber>
          <redirectedNumber>false</redirectedNumber>
          <dialedNumber>true</dialedNumber>
        </forwardCallInfoDisplay>
      </line>
      <line button="2">
        <featureID>21</featureID>
        <featureLabel>Helpdesk</featureLabel>
        <speedDialNumber>4711</speedDialNumber>
        <featureOptionMask>1</featureOptionMask>
      </line>
    </sipLines>
    <voipControlPort>5060</voipControlPort>
    <dscpForAudio>184</dscpForAudio>
    <ringSettingBusyStationPolicy>0</ringSettingBusyStationPolicy>
    <dialTemplate>dialplan.xml</dialTemplate>
  </sipProfile>
  <commonProfile>
    <phonePassword></phonePassword>
    <backgroundImageAccess>true</backgroundImageAccess>
    <callLogBlfEnabled>1</callLogBlfEnabled>
  </commonProfile>
  <loadInformation>SIP69xx.9-2-2-7</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>
    <spanToPCPort>1</spanToPCPort>
    <loggingDisplay>1</loggingDisplay>
    <loadServer></loadServer>
  </vendorConfig>
  <networkLocale></networkLocale>
  <networkLocaleInfo>
    <name></name>
    <version></version>
  </networkLocaleInfo>
  <deviceSecurityMode>1</deviceSecurityMode>
  <authenticationURL></authenticationURL>
  <directoryURL></directoryURL>
  <idleURL></idleURL>
  <informationURL></informationURL>
  <messagesURL></messagesURL>
  <proxyServerURL></proxyServerURL>
  <servicesURL></servicesURL>
  <dscpForSCCPPhoneConfig>96</dscpForSCCPPhoneConfig>
  <dscpForSCCPPhoneServices>0</dscpForSCCPPhoneServices>
  <dscpForCm2Dvce>96</dscpForCm2Dvce>
  <transportLayerProtocol>2</transportLayerProtocol>
  <capfAuthMode>0</capfAuthMode>
  <capfList>
    <capf>
      <phonePort>3804</phonePort>
    </capf>
  </capfList>
  <certHash></certHash>
  <encrConfig>false</encrConfig>
</device>

/srv/tftp/Ringlist.xml

<CiscoIPPhoneRingList>
  <Ring>
    <DisplayName>Riff</DisplayName>
    <FileName>riff.raw</FileName>
  </Ring>
  <Ring>
    <DisplayName>Riff2</DisplayName>
    <FileName>riff2.raw</FileName>
  </Ring>
</CiscoIPPhoneRingList>

Autor: Daniel Bischof - Lizenz: CC BY-SA 3.0 http://creativecommons.org/licenses/by-sa/3.0/de/

⚠️ **GitHub.com Fallback** ⚠️