Files
site_aegisone/other/Yeastar_S20.md
T

542 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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) |