Взаимодействие АТС Panasonic KX-TDE с ПК - протокол CSTA.

Заинтересовался я получением информации о звонках с АТС Panasonic, да ещё под Linux. Есть множество программ для этого, но они работают только под Windows по TAPI. Сама станция взаимодействует с ПК по протоколу CSTA. Для перевода CSTA в TAPI и обратно Panasonic предоставляет TSP драйвер. Поискав информацию в интернете, обнаружил презентацию CSTA от Panasonic и примеры CSTA. Про команды и параметры CSTA можно прочитать в "Panasonic PBX CSTA Implementation Specification" часть 1, часть 2. Чтобы понять как это работает, я использовал сниффер Wireshark и наблюдал за обменом между АТС и TSP драйвером.

АТС по умолчанию принимает TCP соединение на IP 192.168.0.101, порт 33333. Какая либо авторизация отсутствует. Что позволяет любому, получившему доступ к сети, управлять станцией и получать информацию о звонках. Первые 2 байта TCP.DATA пакета содержат длину. Она не может превышать 240 байт. Далее эти 2 байта везде пропущены.

Из документации видно, что после установления соединения с АТС ей нужно послать пакет # A-ASSOCIATE Request :

60 23 80 02 07 80 A1 07 06 05 2B 0C 00 81 5A BE 14 28 12 06 07 2B 0C 00 82 1D 81 48 A0 07 A0 05 03 03 00 08 00

Этот пакет неизменный. В ответ станция пришлёт пакет подтверждения # A-ASSOCIATE Result:

61 2F 80 02 07 80 A1 07 06 05 2B 0C 00 81 5A A2 03 02 01 00 A3 05 A1 03 02 01 01 BE 14 28 12 06 07 2B 0C 00 82 1D 81 48 A0 07 A0 05 03 03 00 08 00

Если станция уже подключена к другому ПК, то в этом случае станция пришлёт пакет #reject-permanent:

61 19 80 02 07 80 A1 07 06 05 2B 0C 00 81 5A A2 03 02 01 01 A3 05 A1 03 02 01 01

и разорвёт соединение, т.к. принимает только одно активное соединение. После успешной "ассоциации" можно посылать пакеты с командами. Некоторые из них я опишу ниже. Один очень важный момент: Чтобы убедиться, что ПК на связи, АТС каждые 2 минуты посылает запрос # SystemStatus Request:

A1 0C 02 01 nn 02 02 00 D3 30 03 0A 01 02

где nn – байт с порядковым номером пакета.

ПК должен ответить на него пакетом # SystemStatus Responce:

A2 0B 02 01 nn 30 06 02 02 00 D3 05 00

Если этого не сделать, то немного подождав АТС пришлёт пакет окончания_связи и разорвёт соединение.

64 03 80 01 00

Теперь привожу виды пакетов, которые обратили на себя моё внимание.

Запрос списка CO (городских линий):

A1 16 02 02 00 E0 02 01 33 30 0D A4 0B A0 09 A4 07 A1 05 A0 03 0A 01 02

Запрос списка EXT (внутренних линий):

A1 16 02 02 06 02 02 01 33 30 0D A4 0B A0 09 A4 07 A1 05 A0 03 0A 01 05

MonitorStart Request (Ext111) — постановка линии (в данном случае номер '111') на мониторинг. После этого будут приходить пакеты изменения состояния этой линии.

A1 11 02 01 78 02 01 47 30 09 30 05 80 03 31 31 31 A0 00

Здесь в 14-ом байте количество символов номера. Далее сам номер в виде кодов символов.

Далее пример пакета с CallerID, приходящий при входящем звонке с городской линии:

A1 81 80 02 01 4A 02 01 15 30 78 55 04 01 11 00 12 A0 70 A4 6E 6B 11 30 0F 80 04 30 30 41 32 A1 07 30 05 80 03 31 31 31 63 07 30 05 80 03 31 31 31 61 0F 30 0D 80 0B 38 39 30 32 33 33 33 33 33 33 31 62 07 30 05 80 03 31 36 31 64 07 30 05 80 03 31 36 31 4E 01 02 0A 01 26 67 10 30 0E 86 0C 4E 38 39 30 32 33 33 33 33 33 33 31 68 0B 30 09 86 07 4E 35 39 37 37 37 37 65 08 30 06 81 04 01 31 00 15

Основные коды пакета: 61 - CallingDeviceID (кто звонит), 62 - CalledDeviceID (кому звонят), 63 - SubjectDeviceID (отслеживаемая линия), 64 - RedirectionDevice (номер, с которого перенаправлено), "4E 01" - LocalConnectionState - тип состояния линии, следующий байт означает: 0 - null - свободный, 1 - initiated - начало звонка, 2 - alerting - вызов, 3 - connected - соединение установлено, 4 - hold - на удержании, 5 - queued - в очереди, 6 - fail - связи нет.

Сигнатура (уникальная последовательность байт), по которой отбирается этот пакет: «4E 01 02 0A 01 26» - localConnectionInfo=allerting, cause=distributed. Для звонка с внутреннего номера сигнатура будет «4E 01 02 0A 01 16» - localConnectionInfo=alerting, cause=newCall. А сам номер звонящего находится после «61 0F 30 0D 80 0B», здесь каждый второй байт — длина следующего вложенного блока, а 0В — длина самого номера 11 символов (номер: 89023333331). Если номер "не определён", то после байта "61" будет стоять "02".

На основании этих исследований написан скрипт на perl, выводящий CallerID при звонке на определённый диапазон номеров (101-156). Он работает и под Windows, если отключить TSP драйвер (и установить strawberry perl)

Данные в пакетах закодированы протоколом CSTA(III) (ASN.1 ber). Их декодирование процесс довольно сложный. Использовал пробную версию CSTADLL. Пример декодированных пакетов.

После изучения ASN.1 был написан монитор-декодер сообщений TDE. Для его использования нужно установить дополнительный модуль perl Convert::ASN1 (скопировать папку \Convert-ASN1-0.27\lib\Convert\ в \strawberry\perl\lib\) и скачать (неполную) грамматику kxtde.asn.

Получать информацию с АТС можно в 2-х режимах. Первый - monitoring (Скрипт). Каждую линию однократно ставим на мониторинг, и при изменении её состояния АТС автоматически будет присылать информацию об этом событии со всеми подробностями. Недостаток в том, что не отображается состояние линий на момент запуска. Второй режим - snapshot (снимок). Посылаем запросы состояния линий и тут же получаем результат. Но однократно. Через короткий промежуток времени запросы нужно повторять, т.к. информация о состоянии линий актуальна только на момент получения ответа от АТС. И эта информация довольна скудна по сравнению с первым режимом. Присылается всего 3 параметра: CallID, DeviceID, CallState. Этот режим больше подходит для связистов и админов. Скрипт snapshot получает все EXT и CO с АТС, и каждую секунду запрашивает и отображает их состояние. Ещё считает количество занятых CO.

Ещё один полезный для связистов скрипт проговаривает номер, с которого звонят. Для его работы нужно записать в АТС OGM с номерами от '1' до '10' (через Утилиты-Передача файла сообщения с ПК на УАТС). Файлы сообщений в архиве. Предварительно надо вывести из обcлуживания SVM (Maintenance Console п.1.1-Свойство SVM). Ещё необходимо в АТС создать ICD (Группа распределения входящих вызовов п.3.5.1), или использовать ненужный. Его нужно прописать в скрипте в $number. И не забудьте про модуль perl Convert::ASN1 и грамматику kxtde.asn.

Следующий скрипт делает обзвон внутренних абонентов автоинформатором ICD. Вернее это их телефоны звонят на автоинформатор :) Спикерфоны системных телефонов включаются сразу, а на аналоговые идёт звонок в течении 15 секунд. После взятия трубки, происходит соединение с автоинформатором. В скрипте нужно указать номер ICD в процедуре makeCall, и создать список номеров в @devices.

Ещё один скрипт полезен для тех, у кого нет персонального входящего городского номера, но есть выход в город. Скрипт записывает в файл исходящие звонки в город: вызываемый городской номер и внутренний номер, с которого был вызов. Потом если человек перезванивает в компанию по определившемуся номеру, скрипт автоматом соединяет его с тем внутренним номером, с которого ему звонили. Если номера нет в файле, то соединение с оператором или разрыв соединения. Параметры настроек в начале файла.

Для станций TDA c подключением по USB есть статья c программой на Си. Переделал её для подключения по LAN. (tde.c)

Кстати, у АТС есть функция SMDR. По умолчанию она ведёт историю звонков постфактум. Но если в Maintenance Console п.11.1 вкладка "Опции SMDR" в параметре "Код состояния CR" выбрать "Печатать", то в SMDR будет выводиться запись о входящем звонке в момент поступления оного (в поле CD будет СR). Т.о. можно не использовать CSTA или TAPI, если нужен только СallerID.(Скрипт)

Сyr
thinclient@ya.ru
обновлено: 27.10.2015