# Yeastar S20 — Интеграция с AegisOne > Дата последнего обновления: 03.06.2026 --- ## 1. Подключение к АТС ### Сетевая схема ``` ┌─────────────────────┐ ┌──────────────────────────┐ │ Сервер AegisOne │ │ Локальная сеть (офис) │ │ 81.177.141.34 │ │ 192.168.1.0/24 │ │ │ │ │ │ ┌───────────────┐ │ VPN/ │ ┌──────────────────┐ │ │ │ py_service │──┼──port───┼──│ Yeastar S20 │ │ │ │ max_bot │ │ forward │ │ 192.168.1.150 │ │ │ └───────────────┘ │ │ │ │ │ │ │ │ │ WAN: │ │ │ │ │ │ 185.105.171.187 │ │ └─────────────────────┘ │ └──────────────────┘ │ └──────────────────────────┘ ``` ### IP-адреса и порты | Ресурс | Локальный IP | Белый IP | Порт (локал) | Порт (проброс) | Протокол | |--------|-------------|----------|-------------|----------------|----------| | **АТС (Web UI)** | 192.168.1.150 | 185.105.171.187 | 8088 | 45088 | HTTPS | | **AMI** | 192.168.1.150 | 185.105.171.187 | 5038 | 45038 | TCP | | **MySQL (CDR)** | 192.168.1.150 | 185.105.171.187 | 3306 | 43306 | TCP | | **FTP** | 192.168.1.150 | 185.105.171.187 | 21 | 45021 | TCP | | **SSH** | 192.168.1.150 | 185.105.171.187 | 8022 | — | TCP | ### Проброс портов (на роутере/ файрволе офиса) | Направление | Протокол | Внешний порт → Внутренний IP:порт | |-------------|----------|----------------------------------| | Internet → АТС | TCP | 45038 → 192.168.1.150:5038 (AMI) | | Internet → АТС | TCP | 45021 → 192.168.1.150:21 (FTP) | | Internet → АТС | TCP | 43306 → 192.168.1.150:3306 (MySQL) | | Internet → АТС | TCP | 45088 → 192.168.1.150:8088 (Web UI) | --- ## 2. Учётные данные и параметры устройства ### Параметры устройства (актуально на 03.06.2026) | Параметр | Значение | Источник | |----------|----------|----------| | Модель | Yeastar S20 | FTP `/support/tmp/deviceinfo.txt` | | Серийный номер | `3691C1453100` | FTP `/support/tmp/deviceinfo.txt` | | Прошивка (software) | `30.15.0.206` | FTP `/support/tmp/deviceinfo.txt` | | Железо (hardware) | V1.30 0005-0000 | FTP `/support/tmp/deviceinfo.txt` | | OEM | Yeastar S20 | FTP `/support/tmp/deviceinfo.txt` | | Asterisk | 13.7.0 | AMI `CoreSettings` | | AMI версия | 2.8.0 | AMI `CoreSettings` | | MySQL | 5.1.61 | MySQL greeting | | PBX Center | 1.24.2 | Web UI App Center | | SSH-сервер | dropbear 2019.78 | SSH banner (порт 8022) | | FTP-сервер | vsFTPd 3.0.2 | FTP banner (порт 21) | | CDR | Включён | AMI `CoreSettings` | | Max звонков | 10 | AMI `CoreSettings` | | REST API | Не поддерживается на S20 | Документация Yeastar | ### Web UI (админ-панель АТС) | Параметр | Значение | |----------|----------| | URL | `https://192.168.1.150:8088` (локально) или `https://185.105.171.187:45088` (интернет) | | Логин | `admin` | | Пароль | `.-SHGWa_12` | ### AMI (Asterisk Manager Interface) | Параметр | Значение | |----------|----------| | Хост | `192.168.1.150` (локально) или `81.177.141.34` (из сервера, через проброс) | | Порт | `5038` (проброс: `45038`) | | Логин | `1cuser` | | Пароль | `1csecret` | | Привилегии | Ограниченные (нет `Command`, `Originate`) | | Разрешённые IP | `81.177.141.34/255.255.255.255` + `192.168.1.0/255.255.255.0` | ### MySQL (доступ к CDR) | Параметр | Значение | |----------|----------| | Хост | `192.168.1.150` (локально) или через проброс `43306` | | Порт | `3306` (проброс: `43306`) | | Логин | `1cuser` | | Пароль | `1csecret` | | **ВАЖНО** | `charset='utf8'` (MySQL 5.1.61 не поддерживает `utf8mb4`!) | | БД | `cdr` | ### FTP (записи звонков) | Параметр | Значение | |----------|----------| | Порт | `21` (проброс: `45021`) | | Логин | `support` | | Пароль | `T4oQSU_?` | | Статус | ✅ **Работает!** | | Доступ | Корневая ФС (чroot), `/tmp` недоступен | Доступные каталоги через FTP: - `/sounds/record/` — звуки (пусто) - `/storage_share/mmc1` — симлинк → `/tmp/media/mmc1` (нерезолвящийся через FTP) - `/support/tmp/deviceinfo.txt` — **информация об устройстве** - `/support/` — системные файлы, bin - `/gui_backups/` — бэкапы - `/fax/`, `/www/`, `/var/`, `/etc/`, `/boot/`, `/cache/` — системные каталоги **Ограничение**: записи звонков в `/tmp/media/mmc1/autorecords/` **недоступны** — `/tmp` за пределами FTP-чroot. Для доступа к записям нужен SSH. ### SSH (файловая система) | Параметр | Значение | |----------|----------| | Порт | `8022` | | SSH-сервер | dropbear 2019.78 | | Пароль | `T4oQSU_?` | | Логин | **НЕ ИЗВЕСТЕН** | | Статус | ✅ Порт открыт, но логин не найден | | **Рекомендация** | Не использовать SSH — только MySQL + AMI | ### Хранилище данных (в Web UI) | Параметр | Значение | |----------|----------| | Имя файла | `share` | | Логин | `share` | | Пароль | `9tktYfM2` | | Назначение | Сетевая папка (симлинк `mmc1 -> /tmp/media/mmc1` в `/storage_share/`) | --- ## 3. Где найти информацию об АТС ### Серийный номер, модель, прошивка | Источник | Способ | |----------|--------| | **FTP** `/support/tmp/deviceinfo.txt` | Содержит: hardware, software, sn, product, oem | | **Web UI** `Dashboard` или `Settings > System > General > Preferences` | Отображается на главной странице | | **Web UI** `Settings > System > General > About` | Версия прошивки и модель | Содержимое `deviceinfo.txt`: ``` hardware: V1.30 0005-0000 software: 30.15.0.206 sn: 3691C1453100 product: Yeastar S20 oem: Yeastar S20 ``` ### Версия Asterisk и компонентов | Источник | Способ | |----------|--------| | **AMI** команда `CoreSettings` | AsteriskVersion, AMIversion, CoreCDRenabled | | **AMI** команда `ListCommands` | Список доступных AMI-команд с привилегиями | | **Web UI** `Settings > System > General > About` | Версия PBX Center, прошивки | ### Конфигурация (абоненты, очереди, транки) | Источник | Что даёт | |----------|----------| | **AMI** `QueueStatus` | Очереди, участники, стратегии | | **AMI** `VoicemailUsersList` | Абоненты, голосовая почта | | **AMI** `PJSIPQualify` | Статус SIP-абонента | | **MySQL** БД `cdr` | История звонков, абоненты (из CDR) | | **Web UI** `Extensions` | Список расширений | | **Web UI** `Trunks` | SIP-транки | | **Web UI** `Call Queue` | Очереди | ### Записи звонков | Источник | Способ | |----------|--------| | **MySQL** колонки `recordpath`, `monitorfile` | Путь и имя WAV-файла на PBX | | **Web UI** `CDR and Recordings` | Ручное скачивание через браузер | | **FTP** `/storage_share/mmc1` | Симлинк на `/tmp/media/mmc1` (нерезолвится через FTP) | | **SSH** порт 8022 | Прямой доступ к файловой системе (логин неизвестен) | --- ## 4. Абоненты и очереди ### Внутренние номера (расширения) | Номер | Назначение | |-------|-----------| | 1001 | Основной (Инженер) | | 1002 | Второй (Инженер) | | 1003 | Дополнительный | | 1000 | Тестовый | ### Очереди (Queue) | Номер очереди | Стратегия | Расширения | |---------------|-----------|------------| | 6700 | ringall | 1001, 1002 | | 6701 | rrmemory | 1001 | | 6702 | ringall | 1002 | ### Транки (линии) | Транк | Тип | Назначение | |-------|-----|-----------| | Mango | VoIP-провайдер | Исходящие/входящие через SIP | | Tele2 | VoIP-провайдер | Исходящие/входящие через SIP | | YSGSM | GSM-модуль | Исходящие через GSM-SIM | --- ## 5. База данных CDR ### Структура БД: `cdr`, таблицы: `cdr` (текущая) + `cdr_YYYYMM` (архивные). ### Колонки таблицы `cdr` | Колонка | Тип | Описание | |---------|-----|----------| | `id` | int | ID записи | | `datetime` | datetime | Дата и время звонка | | `clid` | varchar | Caller ID (кто звонит) | | `src` | varchar | Номер отправителя | | `dst` | varchar | Номер получателя | | `dcontext` | varchar | Контекст диалплана | | `srctrunk` | varchar | Транк отправителя | | `dstrunk` | varchar | Транк получателя | | `lastapp` | varchar | Последнее приложение (Dial, Queue, BackGround...) | | `lastdata` | varchar | Данные последнего приложения (номер, очередь) | | `duration` | int | Общая длительность (секунды) | | `billable` | int | Биллируемая длительность (секунды) | | `disposition` | varchar | Статус: ANSWERED, NO ANSWER, BUSY, VOICEMAIL, FAILED | | `calltype` | varchar | Тип: Inbound, Outbound, Internal | | `accountcode` | varchar | Код аккаунта | | `uniqueid` | varchar | Уникальный ID звонка | | `recordfile` | varchar | Имя файла записи (WAV) | | `recordpath` | varchar | Путь к записи на PBX | | `monitorfile` | varchar | Имя файла мониторинга | | `monitorpath` | varchar | Путь к мониторингу на PBX | | `extfield1-5` | varchar | Дополнительные поля | | `didnumber` | varchar | DID-номер (входящий номер) | | `srcchanurl` | varchar | SIP URL канала отправителя | | `dstchanurl` | varchar | SIP URL канала получателя | | `companycontact` | varchar | Имя контакта компании | | `personalcontact` | varchar | Имя личного контакта | | `contactnumber` | varchar | Контактный номер | ### Примеры запросов ```sql -- Все звонки за сегодня SELECT datetime, src, dst, duration, billable, disposition, calltype FROM cdr.cdr WHERE DATE(datetime) = CURDATE() ORDER BY datetime DESC; -- Звонки за конкретный месяц SELECT * FROM cdr.cdr_202606 ORDER BY datetime DESC; -- Входящие звонки на очередь 6700 SELECT datetime, src, dst, duration, disposition FROM cdr.cdr WHERE dst LIKE '6700%' AND calltype = 'Inbound' ORDER BY datetime DESC; -- Звонки с записями SELECT datetime, src, dst, duration, recordfile, recordpath FROM cdr.cdr WHERE recordfile != '' ORDER BY datetime DESC; -- Статистика по дням SELECT DATE(datetime) as day, COUNT(*) as calls, SUM(CASE WHEN disposition='ANSWERED' THEN 1 ELSE 0 END) as answered FROM cdr.cdr WHERE datetime >= DATE_SUB(NOW(), INTERVAL 30 DAY) GROUP BY DATE(datetime) ORDER BY day DESC; ``` ### Таблица `queue_log` Содержит логи событий очередей (поступление, ответ, ожидание, сброс). --- ## 6. Записи звонков ### Где хранятся На файловой системе PBX: `/tmp/media/mmc1/autorecords/YYYYMM/` Формат имени файла: ``` YYYYMMDDHHMMSS-UNIQUEID-SRC-DST-Direction.wav ``` Примеры из CDR: ``` 20260110164821-1768052891.15-1001-+79531116788-Outbound.wav 20260402105623-1775116571.13-1001-89531116788-Outbound.wav 20260512162645-1778592395.0-+79898250183-1001-Inbound.wav ``` ### Как получить 1. **Путь в CDR**: колонки `recordpath`, `monitorpath` (путь на PBX) 2. **FTP** (`support`/`T4oQSU_?`): записи **недоступны** — `/tmp` за пределами FTP-чroot 3. **SSH** (порт 8022, пароль `T4oQSU_?`, логин неизвестен): теоретически доступен, но логин не найден 4. **Web UI**: `CDR and Recordings` — ручное скачивание через браузер --- ## 7. AMI — Доступные команды ### Работает с 1cuser/1csecret | Команда | Описание | Статус | |---------|----------|--------| | `Ping` | Проверка соединения | ✅ | | `CoreStatus` | Статус ядра (uptime, кол-во звонков) | ✅ | | `CoreShowChannels` | Список активных каналов | ✅ | | `CoreSettings` | Настройки ядра (Asterisk, CDR) | ✅ | | `QueueStatus` | Статус очередей + участников | ✅ | | `VoicemailUsersList` | Список абонентов голосовой почты | ✅ | | `PJSIPQualify` | Пинг SIP-абонента | ✅ | | `Status` | Статус всех каналов | ✅ | | `ListCommands` | Список доступных команд | ✅ | ### Не работает (Permission denied) | Команда | Описание | |---------|----------| | `Command` | Выполнение CLI-команд (`cdr show` и т.д.) | | `Originate` | Исходящий звонок | | `ShowDialPlan` | Просмотр диалплана | | `Hangup` | Завершение звонка | | `Redirect` | Переадресация звонка | ### Real-time события При включённых `Events: On` AMI автоматически отправляет: - `Event: Cdr` — при завершении звонка (содержит CDR-данные) - `Event: Newchannel` — при начале звонка - `Event: Dial` — при наборе номера - `Event: Hangup` — при завершении --- ## 8. Пример подключения (Python) ### MySQL — запрос CDR ```python import pymysql conn = pymysql.connect( host="192.168.1.150", # или внешний IP через проброс port=3306, # или 43306 через проброс user="1cuser", password="1csecret", database="cdr", charset="utf8", # ВАЖНО: не utf8mb4! connect_timeout=5 ) cursor = conn.cursor() cursor.execute("SELECT * FROM cdr ORDER BY datetime DESC LIMIT 10") for row in cursor.fetchall(): print(row) conn.close() ``` ### AMI — real-time события ```python import socket import time def ami_connect(host, port, username, password): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) # Читаем приветствие greeting = sock.recv(4096).decode() # Логин login_msg = ( f"Action: Login\r\n" f"Username: {username}\r\n" f"Secret: {password}\r\n" f"Events: On\r\n" f"\r\n" ) sock.send(login_msg.encode()) time.sleep(1) response = sock.recv(16384).decode() return sock # Использование sock = ami_connect("192.168.1.150", 5038, "1cuser", "1csecret") # Слушаем события while True: data = sock.recv(16384).decode() if data: print(data) ``` ### AMI — из сервера (через проброс) ```python # Подключение через проброс портов с сервера sock = ami_connect("81.177.141.34", 45038, "1cuser", "1csecret") # Или напрямую (если сервер в локальной сети) sock = ami_connect("192.168.1.150", 5038, "1cuser", "1csecret") ``` --- ## 9. Схема интеграции с AegisOne ``` ┌──────────────────┐ MySQL:3306 ┌──────────────────┐ │ py_service │◄────────────────────│ Yeastar S20 │ │ (CDR polling) │ │ (cdr БД) │ │ │ AMI:5038 │ │ │ (real-time) │◄────────────────────│ (события) │ │ │ │ │ │ ┌──────────────┐ │ │ ┌──────────────┐ │ │ │ /service/ │ │ │ │ Записи WAV │ │ │ │ phone/ │ │ FTP:21 │ │ /tmp/media/ │ │ │ │ history │ │◄──(когда будет)────│ │ │ │ │ │ playback │ │ │ └──────────────┘ │ │ └──────────────┘ │ └──────────────────┘ └──────────────────┘ │ ▼ ┌──────────────────┐ │ max_bot │ │ (уведомления о │ │ пропущенных) │ └──────────────────┘ ``` --- ## 10. План интеграции (TODO) ### Фаза 1: CDR (готово к реализации) - [ ] Модель БД для хранения звонков - [ ] Периодический опрос MySQL (каждые 5 мин) - [ ] Страница истории звонков в сервисном портале - [ ] Фильтры: по дате, номеру, типу, статусу ### Фаза 2: Real-time - [ ] AMI-клиент для получения событий - [ ] Уведомления о пропущенных звонках (в max_bot) - [ ] Статус абонентов (online/offline) - [ ] Мониторинг очередей ### Фаза 3: Записи - [x] FTP логин найден: `support` / `T4oQSU_?` - [ ] FTP-чroot не даёт доступ к `/tmp/media/mmc1/autorecords/` — нужен SSH или другой способ - [ ] Разобраться с SSH-логином (пароль `T4oQSU_?` известен) - [ ] Скачивание записей - [ ] Плеер для прослушивания в портале ### Фаза 4: Управление - [ ] Исходящие звонки из портала (если AMI получит права) - [ ] Переключение звонков - [ ] Статистика и отчёты --- ## 11. Известные проблемы 1. **Записи звонков недоступны через FTP** — логин `support` работает, но `/tmp/media/mmc1/autorecords/` за пределами FTP-чroot. Нужен SSH (порт 8022, пароль `T4oQSU_?`, логин неизвестен) 2. **AMI ограниченные права** — на S20 нельзя расширить привилегии AMI-пользователя через Web UI. Доступны только readonly-команды 3. **REST API не поддерживается** — только для S50/S100/S300 4. **MySQL 5.1.61** — старая версия, не поддерживает `utf8mb4`. Использовать `charset='utf8'` 5. **Кириллица в CDR** — имена контактов отображаются в кодировке CP1251/garbage (проблема кодировки MySQL-клиента) --- ## 12. Ссылки - [Yeastar S-Series AMI Documentation](https://help.yeastar.com/en/s-series/topic/asterisk-manager-interface-ami.html) - [Yeastar Developer Guide](https://support.yeastar.com/hc/en-us/articles/235972668) - [Asterisk AMI Protocol](https://docs.asterisk.org/languages/en/Asterisk_18_Documentation/DAHDI_DAHDI_Hardware_Digium_Interface_Hardware/Administering/Asterisk_Manager_Interface_AMI/) --- ## 13. FTP — Структура каталогов ``` / (корень FTP, доступен как support) ├── boot/ ├── cache/ ├── etc/ ├── fax/ ├── ftp_media/ (пусто) ├── gui_backups/ ├── imageupdate/ ├── lost+found/ ├── rcstop/ ├── sounds/ │ ├── moh/ (музыка на удержании) │ └── record/ (пусто) ├── storage_share/ │ └── mmc1 → /tmp/media/mmc1 (симлинк, нерезолвящийся) ├── support/ │ ├── tmp/ │ │ ├── deviceinfo.txt ← ИНФОРМАЦИЯ ОБ УСТРОЙСТВЕ │ │ └── testsysmailbox.eml │ ├── autoptemplate/ │ ├── bin/ │ ├── customcfg/ │ └── fxotune/ ├── syslog/ ├── syslog_backup/ ├── tftpboot/ ├── var/ ├── webupload/ ├── www/ └── ysapps/ ``` ### Ключевые файлы | Путь | Содержимое | |------|-----------| | `/support/tmp/deviceinfo.txt` | Серийный номер, модель, прошивка | | `/support/tmp/testsysmailbox.eml` | Тестовый шаблон почты | | `/storage_share/mmc1` | Симлинк на записанные файлы (недоступен через FTP) |