Panasonic KX-TDA600 и Asterisk. О их дружбе и недружбе
Итак, как и обещал, завершаю историю про подключение ведомственной АТС Panasonic KX-TDA600 и Asterisk.Начало тут: Краткие заметки по дружбе OpenVox D110P (Digium Wildcard TE110P) и Астериск в 2022 году
По немногочисленным руководствам из интернетов начал ковырять АТС Panasonic. В деле настройки АТС я полный ноль, поэтому на быстрый результат не рассчитывал. Нашу АТС лет 10 назад кто то настроил (по слухам - приглашённый специалист), и с тех пор она работала, работала и работала. Надёжная штука.
Скопировал себе содержимое SD карточки что бы откатиться к исходным настройкам если вдруг чо.
Поставил переключатели на плате PRI30 в нужные позиции и вставил плату в АТС.
Для RJ45 ставим переключатель на лицевой планке в положение 120 Ом. (Кстати, разъём для ISDN PRI не RJ45 на самом деле, а RJ47, господа связисты быстро начинают глумиться на форумах, если вдруг RJ47 для E1 назвал привычным RJ45. RJ45 кстати вполне подходит, и все в основном его и используют, но сам факт показать свою значимость и осведомлённость - бесценен. Я на связных форумах называл его осторожно - 8p8c :)))).
Переключатель на плате указывает, какой кабель используем - прямой или кросс. А - прямой, B - кросс. Для E1 используются 1,2 - первая пара, 4,5 - вторая.
Т.е. прямой кабель - 1 - бело-оранжевый, 2 - оранжевый, 4 - бело-зелёный, 5 - зелёный. Второй конец так же.
Кросс - 1 - бело-оранжевый, 2 - оранжевый, 4 - бело-зелёный, 5 - зелёный. С другой стороны - 1 - бело-зелёный, 2 - зелёный, 4 - бело-оранжевый, 5 - оранжевый.
Я использовал кросс.
Инструкция строго рекомендует на кабель вешать феррит. Хз, я не вешал.
Естесственно, при попытке захода на Панасоник пароль не подошел. Гуглим.
Натыкаемся на ЭТОТ форум, где человек спрашивает про сброс пароля и ему господа связисты, а именно НачШтаба рекомендует обратится к нему и он-де сбросит пароль за деньги. При этом говорит что вы, сисадмины весьма самонадеянны и считаете, что вам всё по плечу. А связь - "это вам не это". Понятно... - подумал я и продолжил гуглёж.
И на второй странице выдачи гугла нашел вот это руководство. Программа отработала на 5+, и я попал на нашу АТС. Проинициализировал плату PRI30.
По мотивам Вот этого руководства я настроил взаимодействие с Астериском, и... ничего не заработало. Ожидаемо.
Проверил ещё раз. Не заработало.
Сбрасываем всю АТС. Я не видел проблем, ибо у нас она в минимальной конфигурации - набита платами ESLC16, ну и добавилась PRI30. Ничего сложного.
Выключаем АТС. Переводим тумблер на процессорном модуле в положение инициализации, включаем. Ждём когда зелёный индикатор заморгает на корпусе АТС, ждём для верности ещё секунд 10, и переводим переключатель в режим normal.
АТС инициализируется где то 2 минуты и встаёт в работу.
Но номерной план сбит. У нас были трёхзначные номера от 100 до 212 (7 плат внутренних абонентов по 16 номеров). По умолчанию же АТС выставляет четырёхзначные 1001-1112.
Идём в 2.6.1 maitenance console и во вкладке Внутренние линии меняем 10 на 1, итд. Сохраняем и внутренние звонки пошли.
Далее опять обращаемся к тому же руководству из интернетов. Приведу его здесь.
1.1. Коннектимся к АТС с помощью консоли администрирования (KX-TDA Maintenance Console)
открываем пункт 1.1 (Slot).
1.2. Видим установленную плату PRI30.
1.3. Если она в режиме "INS" ("In Service" ), то переводим ее в режим "OUS", кликнув по ней правой кнопкой мыши и выбрав соответствующий пункт ("Out-of-service"). (В режиме INS Panasonic не дает править настройки платы).
1.4. Снова кликаем по ней мышкой и выбираем пункт "Port Property" ("Свойства порта").
1.5. Там выставляем Port Type (тип порта) в "QSIG-Master" (если плата в Asterisk у нас в режиме Slave.
Принципиально, чтобы на разных концах были разные значения, однако эмпирически получилось, что если ставить плату на Asterisk в Master (pri_net), то Panasonic постоянно отваливается, так что Master должен быть Panasonic).
1.6. CRC4 Mode (Режим CRC4) в "Disable". (Или enable, в зависимости от того как мы его выставили в Asterisk, опять же эмпирика показывает, что panasonic как-то криво обрабатывает этот пункт, лучше ставить в disable).
На этом настройка платы закончена, включаем плату (ПКМ - INS) и все должно заработать на уровне физики. Переходим на уровень логики.
Объединяем линии платы PRI30 в отдельную транковую группу:
2.1. открываем пункт "10.1" (CO Line Settings).
В таблице слева видим номер слота и номер порта. Справа можем задавать номер транковой группы (TRG) от 1 до 64. Выбираем любой неиспользуемый номер и присваиваем его всем 30-ти линиям платы.
Я поставил всем 2.2.2. Объявляем эту транковую группу локальной (в том смысле, что не "внешней") для данной АТС. Для этого идем в пункт "9.1" (TIE Table). Думаем что бы написать в графе "Leading Number". Это такие цифры, при наборе которых АТС будет "отдавать" звонок в транковую группу, то есть нам на астериск. Тогда в Leading Number я пишу "3XX" и "4XX". В графе "Trunk Group" ("Группа внешних линий") указываем тот номер, который мы задали на предыдущем шаге, в пункте 10.1 консоли. При этом запоминаем номер строки таблицы, в который мы все это вписали (!). Это важно!
2.4 Идём в пункт "2.6.1Numbering Plan, Main", (План нумерации, Основное) на вкладку "Other PBX Extension" (Внутренняя линия другой УАТС), пишем первую цифру нумерации Asterisk (у меня - 3 и 4 соответственно). ВАЖНО, чтобы строка была та же, что и в пункте 9.1.
Добавляем настройки порта платы PRI30 для работы АОН на астериске.
И генерируем CLIP
Для меня - всё. У меня нет городских линий на АТС. Весь город я заведу на Asterisk. Мне с ним проще. Во-первых, море информации. Во вторых - дружелюбное сообщество.
Настраиваем Астериск. Начинаем с DAHDI.
/etc/dahdi/system.conf
loadzone=ru
defaultzone=ru
#span = 1,1,0,ccs,hdb3,crc4
span = 1,1,0,ccs,hdb3
# Параметры по порядку:
# 1 - Номер порта (спана) - 1 для 1-й карты
# 2 - Мастер(0) и слейв (1) - 1
# 3 - для стабилизации на длинных линиях. У нас линия короткая - 0
# 4 Fraiming
# 5 Coding
# 6 - необязательный - вкл CRC. Полезно опять же на длинных линиях. Наверное.
bchan = 1-15,17-31
dchan = 16
#alaw=1-15,17-31
Обратите внимание, тут комментарии экранируются решёткой #. В конфигах астериска - точка с запятой (;).
/etc/asterisk/chan_dahdi.conf
[trunkgroups]
[channels]
language=ru
context=from-panas
switchtype=qsig ;euroisdn
nationalprefix=8
overlapdial=yes
signalling=pri_cpe
rxwink=300
usecallerid=yes
cidsignalling=bell
;bell: bell202 as used in US (default)
;v23: v23 as used in the UK
;v23_jp: v23 as used in Japan
;dtmf: DTMF as used in Denmark, Sweden and Netherlands
;smdi: Use SMDI for caller ID. Requires SMDI to be enabled
;cidstart=ring ;Determine signals the start of caller ID. The options supported by Asterisk are:
;ring: A ring signals the start (default)
;polarity: Polarity reversal signals the start
;polarity_IN: Polarity reversal signals the start, DTMF dialtone detection in India
;dtmf: DTMF Caller ID spill begins only with DTMF, at various times before the ring.
;This causes Asterisk to constantly listen for DTMF CallerID signals on the specified channels
;If cidstart is configured to use dtmf, the energy level on the line may need to be
;tuned to properly identify the DTMF tones.
; This tuning is done with the dtmfcidlevel configuration option.
; The specified value is compared to the average over a packet of audio level
;of the absolute value of 16 bit signed linear samples.
; The default is set to 256, but this is completely arbitrary.
;It must be set high enough to prevent false detections, while low
;enough to ensure no dtmf spills are missed.
;hidecallerid=no
;callwaiting=yes
usecallingpres=yes
callwaitingcallerid=yes
transfer=yes
canpark=no
cancallforward=yes
callreturn=no
echocancel=no
echocancelwhenbridged=no
rxgain=0.0
txgain=0.0
group=1
callgroup=1
pickupgroup=1
immediate=no
busydetect=yes
busycount=8
channel => 1-15,17-31
/etc/asterisk/extensions.conf
[from-panas] ; Звонки с панасоника
exten => _[34]XX,1,NoOp()
same => n, Dial(PJSIP/${EXTEN},30,tT)
same => n, Hangup()
[sip-local] ; Звонки с сипофонов и шлюзов там всяких
exten => _[34]XX, 1, NoOp() ; Звонки с сипофонов на сипофоны
same => n, DIAL(PJSIP/${EXTEN},30,tT)same => n, Hangup()
exten => _[12]XX, 1, NoOp() ; Звонки с сипофонов на панасоник
same => n, Dial(Dahdi/g1/${EXTEN},,tT)
same => n, Hangup()
Ну и настраиваем авторизацию PjSIP. В этой версии астериска он основной. Можно конечно убрать, но на форумах убеждают, что несмотря на возросшую сложность конфигурирования - за ним будущее. Хз, чтож уж. Пробуем.
Настраиваем два сипофона - с номерами 301, 302 и паролями "5825".
/etc/asterisk/pjsip.conf
[udp-transport]
type = transport
protocol = udp
bind = 0.0.0.0
; ---------------------------------------300
[300]
type=endpoint
context=sip-local
disallow=all
allow=alaw
transport=udp-transport
auth=auth300
aors=300
[auth300]
type=auth
auth_type=userpass
password=5825
username=300
[300]
type=aor
max_contacts = 1
;---------------------------------------301
[301]
type=endpoint
context=sip-local
disallow=all
allow=alaw
transport=udp-transport
auth=auth301
aors=301
[auth301]
type=auth
auth_type=userpass
password=5825
username=301
[301]
type=aor
max_contacts = 1
И внезапно при запуске asterisk выясняем что кучи функций нет. Если ставим asterisk из репозиториев убунты, то том в конфигураторе модулей стоит разрешение загружать всё, за исключением пары модулей.
Здесь же, внезапно, наоборот.
Поэтому вот Вам мой файл /etc/asterisk/modules.conf Жаль, под кат нельзя убрать.
[modules]
autoload = no
; This is a minimal module load. We are loading only the modules
; required for the Asterisk features used in the "Super Awesome
; Company" configuration.
; Applications
load = app_bridgewait.so
load = app_dial.so
load = app_playback.so
load = app_stack.so
load = app_verbose.so
load = app_voicemail.so
load = app_directory.so
load = app_confbridge.so
load = app_queue.so
; Bridging
load = bridge_builtin_features.so
load = bridge_builtin_interval_features.so
load = bridge_holding.so
load = bridge_native_rtp.so
load = bridge_simple.so
load = bridge_softmix.so
; Call Detail Records
load = cdr_custom.so
; Channel Drivers
load = chan_bridge_media.so
load = chan_pjsip.so
load = chan_dahdi.so
;load = chan_sip.so
; Codecs
load = codec_gsm.so
load = codec_resample.so
load = codec_ulaw.so
load = codec_g722.so
; Formats
load = format_gsm.so
load = format_pcm.so
load = format_wav_gsm.so
load = format_wav.so
; Functions
load = func_callerid.so
load = func_cdr.so
load = func_pjsip_endpoint.so
load = func_sorcery.so
load = func_devstate.so
load = func_strings.so
; Core/PBX
load = pbx_config.so
; Resources
load = res_http_websocket.so
load = res_musiconhold.so
load = res_pjproject.so
load = res_pjsip_acl.so
load = res_pjsip_authenticator_digest.so
load = res_pjsip_caller_id.so
load = res_pjsip_dialog_info_body_generator.so
load = res_pjsip_diversion.so
load = res_pjsip_dtmf_info.so
load = res_pjsip_endpoint_identifier_anonymous.so
load = res_pjsip_endpoint_identifier_ip.so
load = res_pjsip_endpoint_identifier_user.so
load = res_pjsip_exten_state.so
load = res_pjsip_header_funcs.so
load = res_pjsip_logger.so
load = res_pjsip_messaging.so
load = res_pjsip_mwi_body_generator.so
load = res_pjsip_mwi.so
load = res_pjsip_nat.so
load = res_pjsip_notify.so
load = res_pjsip_one_touch_record_info.so
load = res_pjsip_outbound_authenticator_digest.so
load = res_pjsip_outbound_publish.so
load = res_pjsip_outbound_registration.so
load = res_pjsip_path.so
load = res_pjsip_pidf_body_generator.so
load = res_pjsip_pidf_digium_body_supplement.so
load = res_pjsip_pidf_eyebeam_body_supplement.so
load = res_pjsip_publish_asterisk.so
load = res_pjsip_pubsub.so
load = res_pjsip_refer.so
load = res_pjsip_registrar.so
load = res_pjsip_rfc3326.so
load = res_pjsip_sdp_rtp.so
load = res_pjsip_send_to_voicemail.so
load = res_pjsip_session.so
load = res_pjsip.so
load = res_pjsip_t38.so
load = res_pjsip_transport_websocket.so
load = res_pjsip_xpidf_body_generator.so
load = res_rtp_asterisk.so
load = res_sorcery_astdb.so
load = res_sorcery_config.so
load = res_sorcery_memory.so
load = res_sorcery_realtime.so
load = res_timing_timerfd.so
; Do not load res_hep and kin unless you are using HEP monitoring
; <http://sipcapture.org> in your network.
noload = res_hep.so
noload = res_hep_pjsip.so
noload = res_hep_rtcp.so
; ------------Добавляю свои
load = res_clioriginate.so
load = app_originate.so
load = app_echo
load = app_stream_echo.so
; -----------------------------------------Отладка
load = app_agent_pool.so
load = app_alarmreceiver.so
load = app_amd.so
load = app_attended_transfer.so
load = app_audiosocket.so
load = app_authenticate.so
load = app_blind_transfer.so
load = app_bridgeaddchan.so
load = app_cdr.so
load = app_celgenuserevent.so
load = app_chanisavail.so
load = app_channelredirect.so
load = app_chanspy.so
load = app_controlplayback.so
load = app_dictate.soload = app_directed_pickup.so
load = app_dtmfstore.soload = app_dumpchan.so
load = app_exec.so
load = app_externalivr.so
load = app_festival.so
load = app_flash.so
load = app_followme.so
load = app_forkcdr.so
load = app_jack.soload = app_mf.so
load = app_milliwatt.so
load = app_minivm.so
load = app_mixmonitor.so
load = app_morsecode.so
load = app_mp3.so
load = app_page.soload = app_playtones.so
load = app_privacy.so
load = app_read.so
load = app_readexten.so
load = app_record.so
load = app_reload.so
load = app_sayunixtime.so
load = app_senddtmf.so
load = app_sendtext.so
load = app_sf.so
load = app_sms.so
load = app_softhangup.so
load = app_speech_utils.so
load = app_stasis.so
load = app_system.so
load = app_talkdetect.so
load = app_test.so
load = app_transfer.so
load = app_userevent.soload = app_waitforcond.so
load = app_waitforring.so
load = app_waitforsilence.so
load = app_waituntil.so
load = app_while.so
load = chan_audiosocket.so
load = chan_rtp.so
load = codec_adpcm.soload = codec_alaw.so
load = codec_dahdi.soload = codec_g726.so
load = codec_ilbc.so
load = codec_lpc10.so
load = codec_speex.so
load = format_g719.so
load = format_g723.so
load = format_g726.so
load = format_g729.so
load = format_h263.so
load = format_h264.so
load = format_ilbc.so
load = format_mp3.so
load = func_blacklist.soload = func_callcompletion.so
load = func_channel.so
load = func_config.so
load = func_cut.so
load = func_dialgroup.soload = func_dialplan.so
load = func_enum.so
load = func_env.so
load = func_evalexten.so
load = func_extstate.so
load = func_frame_drop.so
load = func_frame_trace.so
load = func_global.so
load = func_groupcount.so
load = func_hangupcause.so
load = func_holdintercept.so
load = func_iconv.so
load = func_jitterbuffer.so
load = func_json.so
load = func_lock.so
load = func_logic.so
load = func_math.so
load = func_module.so
load = func_periodic_hook.soload = func_pitchshift.so
load = func_pjsip_aor.so
load = func_pjsip_contact.so
load = func_presencestate.so
load = func_rand.so
load = func_realtime.so
load = func_sayfiles.so
load = func_scramble.so
load = func_shell.so
load = func_sprintf.soload = func_srv.so
load = func_sysinfo.so
load = func_talkdetect.so
load = func_timeout.so
load = func_uri.so
load = func_version.so
load = func_vmcount.so
load = func_volume.so
load = pbx_ael.so
load = pbx_loopback.so
load = pbx_realtime.soload = pbx_spool.so
load = res_aeap.so
load = res_ael_share.so
load = res_audiosocket.soload = res_clialiases.so
load = res_convert.so
load = res_fax.so load = res_fax_spandsp.so
load = res_format_attr_celt.so
load = res_format_attr_g729.so
load = res_format_attr_h263.so
load = res_format_attr_h264.so
load = res_format_attr_ilbc.so
load = res_http_post.soload = res_limit.so
load = res_manager_devicestate.so
load = res_manager_presencestate.so
load = res_mutestream.soload = res_mwi_devstate.so
load = res_parking.soload = res_phoneprov.so
load = res_pjsip_config_wizard.so
load = res_pjsip_dlg_options.so
load = res_pjsip_empty_info.so
load = res_pjsip_history.soload = res_pjsip_sips_contact.so
load = res_realtime.so
load = res_resolver_unbound.so
load = res_rtp_multicast.so
load = res_security_log.so
load = res_smdi.so
load = res_snmp.so
load = res_sorcery_memory_cache.so
load = res_speech.so
load = res_speech_aeap.so
load = res_srtp.so
load = res_stasis.so
load = res_stasis_answer.so
load = res_stasis_device_state.so
load = res_stasis_playback.so
load = res_stasis_recording.so
load = res_stasis_snoop.so
load = res_statsd.so
load = res_stun_monitor.soload = res_timing_dahdi.so
load = res_timing_pthread.so
load = res_tonedetect.so
Ваш набор модулей может быть меньше или больше. Я повыкидывал то, что мне точно не пригодится.
Вот и всё. Теперь будем канючить деньги на 24-портовый голосовой шлюз, что бы подключить удалённый офис. :)
Надеюсь мой опус поможет кому то не плясать по грабелькам.
Попозже может опишу, как я ставил VirtualBox на Ubuntu Server в консоли и настраивал проброс USB в гостевую систему из консоли. Это я делал для того, что бы подключить панасоник к компу с астериск, на комп поставить virtualBox, поставить на виртуалку W2K, и на W2K поставить maitenance console и настраивать панасоника не выходя из кабинета. Ибо заманался я бегать в другой корпус с ноутом, подстраивать мелочи всякие на панасе.
Меня приятно поразили консольные возможности VirtualBox'а.
Кстати, никто не знает, что за ошибка выскакивает на 2.10 - настройка АОН внутренних абонентов?