Сегодня я хочу разобрать как удаленно взаимодействовать с телефонным аппаратом Yealink SIP-T31G, т.е. не заходить через браузер в Web-интерфейс телефона и выполнять функционал администрирования, а проделывать действия с консоли командной строки: либо с Windows системы, либо с Ubuntu системы:
Предварительные действия
Разъем Ethernet на телефоне подключаю в SwitchРабочим компьютером я также подключен в Switch
К примеру, мне нужно периодически перезагружать телефоны дабы они через AutoProvision подгрузили новые настройки, перезагружать, включать или отключать DND режим и т.д.
Шаг №1: Подключаюсь через Web—интерфейс к телефонному аппарату посредством браузера Google Chrome (к примеру, с Windows 10 Pro)
https://IP&DNS - login&pass -
дефолтная авторизация
Логин: adminПароль: admin
и нажимаю "Логин"
Шаг №2: Отключаю проверку сертификата:
https://IP&DNS - login&pass - Безопасность - Доверенные сертификаты -
Принимать только доверенные сертификаты: вместо "Включено" изменяю на "Отключено"
и нажимаю "Сохранить"
Шаг №3: Разрешаю перезагружать телефоне если по телефону идет разговор:
https://IP&DNS - login&pass - Функции - Основные параметры -
Перезагружать в разговоре: по умолчанию Отключено, ставлю Включено
Шаг №4: Разрешаю определенному адресу взаимодействовать с данным аппаратом:
https://IP&DNS - login&pass - Функции - Контроль подключений -
IP-адреса для отправки Action URI: указываю подсеть 192.168.9.128Управление CSTA: включено
и нажимаю "Сохранить", телефон уйдет в перезагрузку
Шаг №5: Инициирую подключение к телефонному аппарату из 192.168.9.0/24 сети, например, на включение DND режима:
aollo@srv-tablo:~$ curl -v --insecure https://admin:admin@192.168.7.55/servlet?key=DNDOn
* Trying 192.168.7.55...
* TCP_NODELAY set
* Connected to 192.168.7.55 (192.168.7.55) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (OUT), TLS change cipher, Client hello (1):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Unknown (8):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS Unknown, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server did not agree to a protocol
* Server certificate:
* subject: C=CN; ST=Fujian; L=Xiamen; O=Yealink Network Technology Co.,Ltd.; OU=Yealink Equipment; CN=249ad82182f3; serialNumber=ffffffff-ffff-ffff-fff0-249ad82182f3; emailAddress=support@yealink.com
* start date: Sep 3 05:30:46 2022 GMT
* expire date: Aug 31 05:30:46 2032 GMT
* issuer: C=CN; ST=Fujian; L=Xiamen; O=Yealink Network Technology Co.,Ltd.; OU=yealink.com; CN=Yealink Manufacturing CA; emailAddress=support@yealink.com
* SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
* Server auth using Basic with user 'admin'
* TLSv1.3 (OUT), TLS Unknown, Unknown (23):
> GET /servlet?key=DNDOn HTTP/1.1
> Host: 192.168.7.55
> Authorization: Basic YWRtaW46YWRtaW4=
> User-Agent: curl/7.58.0
> Accept: */*
>
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS Unknown, Unknown (23):
< HTTP/1.1 200 OK
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< X-Content-Type-Options: nosniff
< Content-Type: text/html
< Content-Length: 58
< Date: Wed, 17 Nov 2021 00:01:53 GMT
<
* TLSv1.3 (IN), TLS Unknown, Unknown (23):
<html>
<body>
<div id="_RES_INFO_"></div>
</body>
* Connection #0 to host 192.168.7.55 left intact
</html>aollo@srv-tablo:~$
после чего на телефоне появляется сообщение вида:

нажимаю "ОК" и отправленная команда включения режима DND активируется:

Отключаю DND-режим:
aollo@srv-tablo:~$ curl --insecure https://admin:admin@192.168.7.55/servlet?key=DNDOff
<html>
<body>
<div id="_RES_INFO_"></div>
</body>
</html>aollo@srv-tablo:~$
Если на телефоне указать несколько IP—адресов (запросы с которых будет разрешено обрабатывать телефону):
IP-адреса для отправки Action URI: 192.168.9.128,192.168.9.126
то при отправке с другого IP-адреса команды на телефоне также будет сообщение "Разрешить удаленный контроль? Да/Нет"
На заметку: Также в этом поле "IP-адреса для отправки Action URI:" можно указать значение Any, и тогда телефон будет принимать все GET-запросы с любых IP-адресов, но опять же с уведомление на телефоне. Если же оставить это поле пустым, телефону будет запрещено принимать запросы HTTP GET
На заметку: Важно: при первом запросе с любого уникального разрешенного IP-адреса на экране телефона появится сообщение "Разрешить удаленный контроль?". Необходимо предоставить разрешение, нажав клавишу ОК.

В дальнейшем при запросах c этого же адреса сообщения появляться не будут, а запросы будут выполняться моментально
Шаг №6: Отключить сообщение "Разрешить удаленный контроль?" на дисплее телефона.
Для отключения сообщения нужно скачать текущий конфигурационный файл
https://IP&DNS - login&pass - Настройки - Конфигурация - (Конфигурационный файл .cfg)
- Экспорт конфигурационного файла: выбираю
"Все настройки"и нажимаю"Экспорт"
скачивается файл (у меня на Windows 10 Pro) по адресу: C:\Users\aollo\Downloads\249ad82182f3-all.cfg
открываю данный конфигурационный файл через редактор Notepad++
#!version:1.0.0.1
### This file is the exported MAC-all.cfg.
action_url.show_msgbox = 1
features.action_uri_limit_ip = any
features.reboot_in_talk_enable = 1
### Static Configuration ###
static.security.trust_certificates = 0
### вношу ниже указанную строку
### 0 - выключено, 1 - включено
features.show_action_uri_option = 0
после сохраняю изменения в конфигурационном файле.
Шаг №7: Импортирую измененный конфигурационный файл в телефон:
https://IP&DNS - login&pass - Настройки - Конфигурация — (Конфигурационный файл .cfg) Импорт конфигурационного файла — нажимаю "Обзор" — указываю C:\Users\aollo\Downloads\249ad82182f3-all.cfg и нажимаю "Открыть", а затем "Импорт" - OK
На заметку: файл 249ad82182f3-all.cfg есть как MAC-адрес телефона: Статус - (Общие)
MAC-адрес: 24:9A:D8:21:82:F3
Отправляю команду включения DND-режима:
aollo@srv-tablo:~$ curl --insecure https://admin:admin@192.168.7.55/servlet?key=DNDOn
<html>
<body>
<div id="_RES_INFO_"></div>
</body>
</html>aollo@srv-tablo:~$
и на дисплее телефона отображается иконка, что режим DND-включен.
Получается, что лучше все телефоны подключиться к системе Autoprovision "Настройка AutoProvision for Yealink" и уже для каждого телефонного аппарата предопределить данный параметр и телефоны сами его подтянут.
На заметку: Если отключить уведомление на телефонном аппарате, то это может негативно сказаться на безопасности, но я бы поспорил на этот счет, т.е. я в организации указываю не any, а только с определенных IP адресов могу инициировать подключение, использую https и нормальный логин и пароль.
Шаг №8: Но вы не только можете включать и выключать DND режим, есть еще команды, к примеру:
aollo@srv-tablo:~$ curl --insecure https://admin:admin@192.168.7.55/servlet?key=Reboot
<html>
<body>
<div id="_RES_INFO_"></div>
</body>
</html>aollo@srv-tablo:~$
Примеры полезных команд и сценарии их применения:
Команда: http://192.168.7.55/servlet?key=Reboot
Действие: перезагрузка устройства. С помощью сервера можно настроить перезагрузку по расписанию.
Команда: http://192.168.7.55/screencapture
Действие: снимок экрана. Позволяет администратору просматривать состояние экрана телефона сотрудника.
Команда: http://192.168.7.55/servlet?key=DNDOff
Действие: отключение функции «Не беспокоить».
Команда: http://192.168.7.55/servlet?key=number=1006
Действие: совершение исходящего вызова с телефона. Аналогично вызову из веб-интерфейса телефона.
Команда: http://192.168.7.55/servlet?key=AutoP
Действие: форсированный запуск процедуры автопровижининга.
Команда: http://192.168.7.55/servlet?phonecfg=set[&features.usb_call_recording.enable=1][& features.auto_recording.enable=1]
Действие: внесение изменений в конфигурацию телефона. Позволяет администратору менять параметры настройки телефона.
Команда: http://192.168.7.55/servlet?key=AlwaysFwdOn=79123456789
Действие: установка переадресации по неответу на указанный номер.
Дополнительно: таблица команд
| Команда | Значение | Действие |
| key= | OK | Нажатие клавиши «ОК» |
| ENTER | Нажатие softkey-клавиши «Enter/Вход» | |
| SPEAKER | Переключиться на громкую связь | |
| F_TRANSFER | Трансфер вызова | |
| VOLUME_UP | Увеличить громкость | |
| VOLUME_DOWN | Уменьшить громкость | |
| MUTE | Отключить микрофон | |
| F_HOLD | Удержание вызова | |
| HOLD | Удержание вызова | |
| F_CONFERENCE | Конференц-вызов | |
| Cancel/CANCEL | Отменить действие, завершить вызов | |
| X | Отменить действие, завершить вызов | |
| 0-9/*/# | Нажатие клавиши номеронабирателя | |
| L1-LX | Активация DSS-клавиши X | |
| LX_LONGPRESS | Длительное нажатие DSS-клавиши X | |
| F1-F4 | Нажатие softkey-клавиши 1-4 | |
| MSG | Вызов меню электронной почты | |
| HEADSET | Переключиться на гарнитуру | |
| RD | Повторный набор | |
| UP/DOWN/LEFT/RIGHT | Клавиши навигации «Вверх/Вниз/Влево/Вправо» | |
| BACK_IDLE | Возврат на экран ожидания | |
| Reboot | Перезагрузка устройства | |
| AutoP | Запуск автопровижининга | |
| DNDOn | Активация DND | |
| DNDOff | Отключение DND | |
| number=xxx&outgoing_uri=y | Набор номера xxx | |
| OFFHOOK | Поднять трубку | |
| ONHOOK | Положить трубку | |
| ANSWER/ASW/Asw | Ответить на вызов | |
| Reset | Сбросить настройки телефона | |
| ATrans=xxx | Сопроводительный трансфер на номер xxx | |
| BTrans=xxx | Слепой трансфер на номер xxx | |
| ATrans=callid_A@callid_B | Соединить 2 активных вызова и покинуть оба разговора | |
| CallWaitingOn | Включить функцию ожидания вызова | |
| CallWaitingOff | Отключить функцию ожидания вызова | |
| CALLEND/CallEnd | Завершить вызов | |
| SPLIT | Разбить конференц-вызов на отдельные вызовы | |
| SWAP | Переключить активный вызов (предыдущий активный вызов будет поставлен на удержание) | |
| ASW/CANCEL/HOLD/UNHOLD:xxx | Ответить/Завершить/Удержать/Вернуть вызов (xxx — Call ID вызова) | |
| AlwaysFwdOn/BusyFwdOn/NoAnswFwdOn=xxx=n | Активация переадресации на номер xxx | |
| AlwaysFwdOff/BusyFwdOff/NoAnswFwdOff | Деактивация переадресации на номер xxx | |
| n/a | screencapture | Сделать скриншот экрана |
| screencapture/download | Сделать скриншот экрана и скачать его | |
| phonecfg=get[&accounts=x][&dnd=x][&fw=x] | Получить информацию об аккаунтах, статусе DND, получить конфиг, где x — цифра 0 (не получать) или цифра 1 (получить) | |
| phonecfg=set[&параметр конфигурации=значение] | Установить параметр конфигурации (можно указать несколько параметров) | |
| phonecfg=get[&параметр конфигурации] | Получить значение параметра конфигурации (можно указать несколько параметров) |
Итого, отлично что я задался целью разобрать как удаленно взаимодействовать с телефонными аппаратами, благо телефоны Yealink поддерживают такой функционал. Заметка будет дополняться.
На этом у меня всё, с уважением автор блога Олло Александр aka ekzorchik.