== Zmuszanie telefonów Cisco serii 7900 do współpracy ==
Temat odpalania telefonów cisco serii 7900 to temat w internecie opisany dość szeroko, lecz na raty. Jako, że ostatnio pojawiło się trochę telefonów cisco w szeroko pojętym internecie (tak allegro, na Ciebie patrzę) - postanowiłem, że nieco przybliżę część aprowizacji, przystosowywania i personalizowania tych wdzięcznych i bywa, że tanich telefonów.
NOTE: Na potrzeby tego artykułu przyjmijmy nieprecyzyjne definicje starych i nowych telefonów z tej serii - stare są monochromatyczne, nowe są kolorowe. Wiem, że granica leży gdzieś indziej i pewnie znajdzie się jakiś monochromatyczny telefon z nowym bebechem i nowymi potrzebami - ale nie chcę się nad tym teraz skupiać, gdyż tego przykładu nie znam i nie trafił mi na warsztat.
=== Najpierw TFTP ===
Potrzebny nam będzie jakiś działający w sieci serwer TFTP, a także wpisanie tego serwera tftp w ustawienia serwera DHCP, z któego telefony dowiedzą się jaki mają adres.
W internecie na przemian funkcjonują opisy że ma być to opcja **150** lub **66** - ja wrzucam IP tftp w oba miejsca i mam spokój. Zostawiam pole do zmiany, jeśli ktoś wyniucha, która opcja w przypadku której serii telefonów funkcjonuje - w dokumentacji TFTP obie mają tę samą funkcję.
(WARNING) Poradnik równie dobrze mógłbym zakończyć pisząc - ustaw sobie `tail -F` na logach z TFTP, podłącz telefon, zobacz o co pyta, googlaj, ściągnij, skonfiguruj, powtarzaj aż zadziała. Ale tego nie zrobię - powiem tylko, że jest to fantastyczne rozwiązanie jeśli się zawiesisz na którymś etapie. Jak to nie pomoże, pytaj @wiktor albo innych voipowych świrów (w hswaw i hswro też są)
=== Firmware ===
Co do zasady - na ogół telefonom update'uje się firmware wgrywając odpowiedni plik do głównego folderu na serwerze TFTP i puszczając na telefonie twardy reset. W sensie - najtwardszy z dostępnych..
NOTE: Twardy reset przeprowadzamy wypinając telefon z prądu, wciskając płotek/hash (#), wpinając telefon z powrotem do prądu i - w przypadku starych telefonów, na wyświetlaczu pojawi się ** reset key sequence detected ** a po puszczeniu płotka, przyciski headset/mute/speaker zaczną mrugać. Wklepujemy magiczną sekwencję, telefon zapyta czy ma usunąć wszystkie dane, co potwierdzamy cyfrą 2. W przypadku nowszych telefonów (kolorowe wyświetlacze, okolice modelu 7970) czekamy aż telefon zacznie mrugać po kolei wszystkimi przyciskami linii (po prawej od wyświetlacza) i wtedy wklepujemy magiczną sekwencję. Magiczna sekwencja to **123456789*0# **czyli wszystkie przyciski numeryczne po kolei od góry licząc, od lewej do prawej
Warto zwracać na nazwy tych firmware'ów - jeśli dla danego telefonu znajdziesz takie z SIP w nazwie, to jeśli chcesz je pożenić z asteriskiem, to jest właściwy wybór. Jeśli znajdziesz SCCP, to są to wersje kompatybilne z Ciscowym SCCP managerem.
Opcje na pozyskanie ich są takie, że albo znajdują się na rosyjskich stronach, albo gdzieś komuś ktoś dawno dał je na jakimś forum. Jeśli masz problem lub ich nie masz, daj znać, znam kogoś, kto zna kogoś, kto przed wielkim wschodnim firewallem dał `curl`owi pobiegać
=== Konfiguracja ===
Nasz telefon łyknął świeży (lub nieświeży, ale działający) firmware, trzeba mu poustawiać conieco. Różne telefony łykają różne typy konfigów - starsze łykają coś, co przypomina yamla, ale co do zasady nim nie jest, nowsze łykają XMLe. Wrzucę oba przykłady:
==== Przyklad configu "starszego" telefonu ====
lang=text, name=SIPAABBCCDDEEFF.cnf, lines=12
phone_label: "1"
phone_prompt: "1 "
line1_shortname: "Glowny"
line1_displayname: "Glowny"
line1_name: "1"
line1_authname: "1"
line1_password: "supertajnehaslo"
line2_shortname: "Drugi"
line2_displayname: "Drugi"
line2_name: "2"
line2_authname: "2"
line2_password: "supertajnehaslotylkoinne"
==== Przyklad configu "nowszego" telefonu ====
lang=xml, name=SEPAABBCCDDEEFF.cnf.xml, lines=12
<device>
<deviceProtocol>SIP</deviceProtocol>
<devicePool>
<dateTimeSetting>
<dateTemplate>D.M.Y</dateTemplate>
<timeZone>W. Europe Standard/Daylight Time</timeZone>
<ntps>
<ntp>
<name>IP ADRES NTP</name>
<ntpMode>Unicast</ntpMode>
</ntp>
</ntps>
</dateTimeSetting>
<callManagerGroup>
<members>
<member priority="0">
<callManager>
<ports>
<ethernetPhonePort>2000</ethernetPhonePort>
<sipPort>5060</sipPort>
</ports>
<processNodeName>IP ADRES ASTERISKA/SERWERA</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>
<retainForwardInformation>true</retainForwardInformation>
<anonymousCallBlock>2</anonymousCallBlock>
<callerIdBlocking>2</callerIdBlocking>
<dndControl>0</dndControl>
<remoteCcEnable>true</remoteCcEnable>
</sipCallFeatures>
<sipStack>
<sipInviteRetx>6</sipInviteRetx>
<sipRetx>10</sipRetx>
<timerInviteExpires>180</timerInviteExpires>
<timerRegisterExpires>300</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>
<preferredCodec>G711alaw</preferredCodec>
<dtmfAvtPayload>1</dtmfAvtPayload>
<dtmfDbLevel>3</dtmfDbLevel>
<dtmfOutofBand>avt</dtmfOutofBand>
<alwaysUsePrimeLine>false</alwaysUsePrimeLine>
<alwaysUsePrimeLineVoiceMail>false</alwaysUsePrimeLineVoiceMail>
<kpml>3</kpml>
<phoneLabel>TELEFON 01</phoneLabel>
<stutterMsgWaiting>1</stutterMsgWaiting>
<callStats>false</callStats>
<silentPeriodBetweenCallWaitingBursts>10</silentPeriodBetweenCallWaitingBursts>
<disableLocalSpeedDialConfig>false</disableLocalSpeedDialConfig>
<sipLines>
<line button="1" lineIndex="1">
<featureID>9</featureID>
<featureLabel>Glowny</featureLabel>
<proxy>USECALLMANAGER</proxy>
<name>1</name>
<displayName>Glowny</displayName>
<autoAnswer>
<autoAnswerEnabled>0</autoAnswerEnabled>
</autoAnswer>
<authName>1</authName>
<authPassword>HASLO</authPassword>
<sharedLine>false</sharedLine>
<messageWaitingLampPolicy>1</messageWaitingLampPolicy>
<messagesNumber>*97</messagesNumber>
<ringSettingIdle>4</ringSettingIdle>
<ringSettingActive>5</ringSettingActive>
<!--<contact>$sipUser</contact>-->
<forwardCallInfoDisplay>
<callerName>true</callerName>
<callerNumber>true</callerNumber>
<redirectedNumber>false</redirectedNumber>
<dialedNumber>true</dialedNumber>
</forwardCallInfoDisplay>
<maxNumCalls>4</maxNumCalls>
<callWaiting>1</callWaiting>
<busyTrigger>3</busyTrigger>
</line>
<line button="2" lineIndex="2">
<featureID>9</featureID>
<featureLabel>Interkom</featureLabel>
<proxy>USECALLMANAGER</proxy>
<name>2</name>
<displayName>Interkom</displayName>
<autoAnswer>
<autoAnswerEnabled>1</autoAnswerEnabled>
</autoAnswer>
<authName>2</authName>
<authPassword>HASLO</authPassword>
<sharedLine>false</sharedLine>
<messageWaitingLampPolicy>1</messageWaitingLampPolicy>
<messagesNumber>*97</messagesNumber>
<ringSettingIdle>4</ringSettingIdle>
<ringSettingActive>5</ringSettingActive>
<!--<contact>$sipUser</contact>-->
<forwardCallInfoDisplay>
<callerName>true</callerName>
<callerNumber>true</callerNumber>
<redirectedNumber>false</redirectedNumber>
<dialedNumber>true</dialedNumber>
</forwardCallInfoDisplay>
<maxNumCalls>4</maxNumCalls>
<callWaiting>1</callWaiting>
<busyTrigger>3</busyTrigger>
</line>
</sipLines>
<natEnabled>false</natEnabled>
<natAddress></natAddress>
<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>
<vendorConfig>
<defaultWallpaperFile></defaultWallpaperFile>
<disableSpeaker>false</disableSpeaker>
<disableSpeakerAndHeadset>false</disableSpeakerAndHeadset>
<g722CodecSupport>2</g722CodecSupport>
<handsetWidebandEnable>2</handsetWidebandEnable>
<headsetWidebandEnable>2</headsetWidebandEnable>
<headsetWidebandUIControl>1</headsetWidebandUIControl>
<handsetWidebandUIControl>1</handsetWidebandUIControl>
<settingsAccess>1</settingsAccess>
<videoCapability>0</videoCapability>
<ciscoCamera>0</ciscoCamera>
<webAccess>0</webAccess>
<webProtocol>0</webProtocol>
<sshAccess>0</sshAccess>
<sshPort>22</sshPort>
<loginAccess>1</loginAccess>
<daysDisplayNotActive>1,2,3,4,5,6,7</daysDisplayNotActive>
<daysBacklightNotActive>1,2,3,4,5,6,7</daysBacklightNotActive>
<displayOnTime>00:00</displayOnTime>
<backlightOnTime>00:00</backlightOnTime>
<displayOnDuration>00:00</displayOnDuration>
<backlightOnDuration>00:00</backlightOnDuration>
<displayIdleTimeout>00:01</displayIdleTimeout>
<backlightIdleTimeout>00:01</backlightIdleTimeout>
<backlightIdleDuration>00:01</backlightIdleDuration>
<displayOnWhenIncomingCall>1</displayOnWhenIncomingCall>
<backlightOnWhenIncomingCall>1</backlightOnWhenIncomingCall>
<recordingTone>0</recordingTone>
<recordingToneLocalVolume>100</recordingToneLocalVolume>
<recordingToneRemoteVolume>50</recordingToneRemoteVolume>
<recordingToneDuration></recordingToneDuration>
<moreKeyReversionTimer>5</moreKeyReversionTimer>
<autoSelectLineEnable>1</autoSelectLineEnable>
<autoCallSelect>1</autoCallSelect>
<joinAndDirectTransferPolicy>0</joinAndDirectTransferPolicy>
<minimumRingVolume></minimumRingVolume>
<simplifiedNewCall>0</simplifiedNewCall>
<peerFirmwareSharing>0</peerFirmwareSharing>
<rtcp>1</rtcp>
<videoRtcp>1</videoRtcp>
<garp>0</garp>
<bluetooth>0</bluetooth>
<bluetoothProfile>0,1</bluetoothProfile>
<wifi>0</wifi>
<sdio>0</sdio>
<usb1>1</usb1>
<usb2>1</usb2>
<usbClasses>0,1,2</usbClasses>
<pcPort>0</pcPort>
<spanToPCPort>0</spanToPCPort>
<voiceVlanAccess>0</voiceVlanAccess>
<forwardingDelay>0</forwardingDelay>
<enableCdpSwPort>0</enableCdpSwPort>
<enableCdpPcPort>0</enableCdpPcPort>
<enableLldpSwPort>0</enableLldpSwPort>
<enableLldpPcPort>0</enableLldpPcPort>
<!--
<loggingDisplay>1</loggingDisplay>
<loadServer></loadServer>
-->
</vendorConfig>
<deviceSecurityMode>1</deviceSecurityMode>
<authenticationURL></authenticationURL>
<directoryURL>ADRES XMLA Z KSIAZKA TELEFONICZNA</directoryURL>
<servicesURL>ADRES XMLA Z USLUGAMI</servicesURL>
<idleURL></idleURL>
<informationURL></informationURL>
<messagesURL></messagesURL>
<proxyServerURL></proxyServerURL>
<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>
Kiedyś postaram się rozwinąć poszczegółne opcje, większości z nich nie trzeba zmieniać, a reszta jest w miarę zrozumiała. Potknąć można się na tym, że:
- dodając w xmlu kolejną linię, trzeba też zmienić `<line button="1" lineIndex="1">` - i ustawić tam która to ma być linia / który przycisk
- w ustawieniach linii jest zarówno nazwa linii jak i jej "login" na serwerze
- za autoodbieranie linii odpowiada `autoAnswerEnabled`