Загрузка данных
Чат с Gemini
Короче у меня есть ноут на линуксе debian 13
И телефон Redmi 9
Как мне виртуальную АТС сделать из неё
Сделать полноценную виртуальную АТС на связке Debian 13 и Redmi 9 вполне реально. Основная идея в том, чтобы Debian работал как сервер АТС (принимал, распределял звонки, крутил голосовое меню), а Redmi 9 выступал в роли GSM-шлюза (принимал и совершал звонки через вашу SIM-карту) или просто подключался как SIP-клиент (внутренний номер).
Вот подробный план, как это реализовать.
Архитектура системы
[ Входящий звонок / GSM ]
│
▼
┌─────────────┐
│ Redmi 9 │ (GSM-шлюз / Приложение SMS&Calls)
└──────┬──────┘
│ IP-сеть (Wi-Fi / LAN)
▼
┌─────────────┐
│ Debian 13 │ (Asterisk / FreePBX — Сервер АТС)
└──────┬──────┘
│
┌─────────┴─────────┐
▼ ▼
[IP-телефон / [Софтфон на ПК /
Софтфон на Android] Telegram-бот]
Шаг 1. Развертывание АТС на Debian 13
Для Debian 13 (Trixie) есть два основных варианта:
Asterisk (чистый) — мощно, гибко, легковесно, консольно.
FreePBX / VitalPBX (в Docker) — графический веб-интерфейс, проще настраивать мышкой.
Вариант A: Чистый Asterisk (Быстрый старт)
Установите Asterisk из репозиториев Debian:
Bash
sudo apt update
sudo apt install asterisk -y
После установки службы Asterisk запускаются автоматически. Все основные конфиги лежат в /etc/asterisk/ (sip.conf / pjsip.conf для номеров и extensions.conf для логики звонков).
Шаг 2. Превращение Redmi 9 в GSM-шлюз
Чтобы АТС могла звонить через мобильную сеть Redmi 9, нужно связать телефон и Asterisk. Для этого есть три проверенных способа:
Способ 1. Приложение Trunkan (Самый простой)
Как работает: На Redmi 9 устанавливается приложение (Trunkan или аналогичные Android SIP Gateway), которое регистрирует SIM-карту как SIP-транк на вашем Asterisk.
Плюсы: Не нужен Root, поднимается за 10 минут.
Минусы: Работает по Wi-Fi (нужен стабильный сигнал).
Способ 2. Termux + chan_dongle / Asterisk на самом Android
Как работает: В Termux запускается локальный Asterisk или специфический софт для проброса аудио и AT-команд модема MediaTek (Helio G80 в Redmi 9).
Плюсы: Высокая надежность.
Минусы: Требуются Root-права на Redmi 9 и глубокая настройка.
Способ 3. Проброс через USB-модем (Альтернатива)
Если Redmi 9 сложен в настройке как шлюз, часто проще купить USB-свисток (например, Huawei E173/E1550 за копейки), прошить его в режим «только модем» с поддержкой голоса и вставить прямо в ноутбук с Debian, используя модуль chan_dongle. А Redmi 9 использовать как внутренний SIP-телефон.
Шаг 3. Базовая настройка логики (Пример PJSIP + Extensions)
Создаем внутренние номера и привязываем логику в Asterisk.
1. Настройка участников в /etc/asterisk/pjsip.conf:
Ini, TOML
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
; Шаблон для внутренних номеров
[endpoint-template](!)
type=endpoint
context=from-internal
disallow=all
allow=ulaw,alaw,g722
; Номер 101 (например, Redmi 9 как внутренний SIP-клиент)
[101](endpoint-template)
auth=auth101
aors=101
[auth101]
type=auth
auth_type=userpass
password=SuperSecretPass101
username=101
[101]
type=aor
max_contacts=1
; Номер 102 (ноутбук или второй софтфон)
[102](endpoint-template)
auth=auth102
aors=102
[auth102]
type=auth
auth_type=userpass
password=SuperSecretPass102
username=102
[102]
type=aor
max_contacts=1
2. Настройка маршрутизации в /etc/asterisk/extensions.conf:
Ini, TOML
[from-internal]
; Звонок с 101 на 102 и наоборот
exten => _1XX,1,Dial(PJSIP/${EXTEN})
exten => _1XX,n,Hangup()
; Пример Голосового меню (IVR) при звонке на 900
exten => 900,1,Answer()
exten => 900,2,Background(welcome-prompt) ; Приветствие
exten => 900,3,WaitExten(5)
exten => 1,1,Dial(PJSIP/101) ; Нажмите 1 для связи с 101
exten => 2,1,Dial(PJSIP/102) ; Нажмите 2 для связи с 102
Перезапустите Asterisk для применения конфигов:
Bash
sudo systemctl restart asterisk
Шаг 4. Подключение клиентов
На Redmi 9 (если используете его как внутренний номер):
Установите SIP-клиент (например, Linphone, Grandstream Wave или Zoiper).
Укажите IP-адрес ноутбука с Debian, логин 101 и пароль SuperSecretPass101.
На Debian / другом ПК:
Установите Linphone или Blink (sudo apt install linphone).
Подключитесь под номером 102.
Что из этого разберем подробнее?
Настроить Redmi 9 как GSM-шлюз для входящих/исходящих
Развернуть FreePBX в Docker на Debian 13
Сконфигурировать голосовое меню (IVR) и запись звонков
Я посмотрел и не нашел Trunkan нашел только Sip gateway и он с рутом а на Redmi 9 очень сложно рут Magisk получить
Да, получить Root на Redmi 9 (особенно с процессором MediaTek MT6769V/Helio G80) — это та ещё головная боль из-за разблокировки загрузчика Xiaomi и риска окирпичить девайс при прошивке boot.img.
Без Root-прав и сложных манипуляций превратить сам телефон Android в полноценный аппаратный GSM-шлюз (который пробрасывает голос в цифре прямо в Asterisk) стандартными средствами не получится — система Android из соображений безопасности наглухо блокирует доступ сторонним приложениям к сырому аудиопотоку сотового вызова (Voice Call Audio Stream).
Однако есть несколько отличных альтернативных путей без необходимости получать Root:
Вариант 1. Использовать USB 3G/4G модем (Самый надежный и дешевый)
Вместо того чтобы мучить Redmi 9, проще использовать классический USB-модем («свисток»), подключенный прямо в ноутбук с Debian 13.
Что нужно: Старый USB-модем с поддержкой голоса (например, Huawei E171, E173, E1550, E1750 — на авито/вторичке стоят символические 200–500 рублей) + SIM-карта.
Как работает:
Переводите модем в режим «только модем» (через AT-команды AT^U2DIAG=0).
В Debian 13 устанавливаете модуль asterisk-chan-dongle (или собираете под PJSIP/chan_dongle).
Asterisk напрямую управляет SIM-картой через USB: принимает звонки, передаёт чистый звук и отправляет/принимает SMS.
А Redmi 9? Redmi 9 в этой схеме станет удобным мобильным SIP-телефоном (софтфоном). Ставите на него Linphone или Zoiper, подключаетесь по Wi-Fi/VPN к ноутбуку и принимаете звонки с АТС.
Вариант 2. Приложения без Root (С ограничением или через SIP-транк)
Если вы хотите использовать именно SIM-карту внутри Redmi 9, есть рабочие приложения без Root, но со своими нюансами:
1. PAXW-GATEWAY / Android Call Gateway
Существуют специализированные корпоративные сервисы/софты (например, OctoPus, IP2GSM, Android SIP Gateway от разных разработчиков), которые работают без Root.
Как это работает: На телефон ставится APK, создающий локальный SIP-сервер.
Ограничения Android: На Android 10/11/12+ без Root входящий звонок переадресуется на SIP через задержку или конференц-вызов, а качество звука зависит от API производителя (на MIUI/HyperOS часто режется микрофон).
2. SIP-АТС оператора (Виртуальный шлюз)
Если ваша SIM-карта от крупного оператора (МТС, МегаФон, Билайн, T2), у них есть услуга «Виртуальная АТС» / «Multifon» / «SIP-транк».
Как работает: Вы подключаете услугу, оператор даёт вам логин и пароль от SIP-транка для вашего мобильного номера.
Результат: Звонки с вашей SIM-карты идут сразу в ваш Asterisk на Debian через интернет. Телефон Redmi 9 вообще не участвует в обработке звонка как железка (или используется просто как софтфон).
Вариант 3. Использовать Redmi 9 как телефон оператора (Call Forwarding / Telegram-бот)
Если цель — не пропустить звонок и распределить его по АТС:
Настраивается переадресация с сотового номера Redmi 9 на виртуальный номер (SIP-номер, купленный за ~100 руб/мес у Zadarma, Mango, Telphin и т.д.).
Входящий звонок прилетает на виртуальный номер → попадает в ваш Debian 13 Asterisk → Asterisk крутит меню / звонит на софтфоны на ПК и на тот же Redmi 9 по Wi-Fi.
Сравнение решений
Вариант Нужен Root? Сложность Надежность Затраты
USB-модем (chan_dongle) Нет Низкая Высокая ~300–500 ₽
SIP-транк от оператора Нет Очень низкая Идеальная По тарифу оператора
Софт-шлюз на Android Нет Средняя Средняя (MIUI глушит) Бесплатно
Magisk + Root на Redmi 9 Да Высокая (риск кирпича) Средняя Бесплатно
Каким путем пойдём дальше?
Разбрать настройку Asterisk + USB 3G/4G модем (chan_dongle)
Настроить Redmi 9 как SIP-софтфон (Linphone/Zoiper)
Настроить переадресацию и входящий SIP-транк
А Bluetooth
Идея 연결ить Redmi 9 к ноутбуку по Bluetooth выглядит логично: использовать телефон как Bluetooth-гарнитуру (Hands-Free Profile / HFP) для сервера АТС.
Однако у этого варианта есть очень серьезные технические «подводные камни», о которых нужно знать заранее.
Как это работает технически?
В Asterisk есть специальный модуль — chan_mobile.
GitHub
На ноутбуке с Debian 13 настраивается Bluetooth-адаптер (BlueZ).
Redmi 9 связывается с ноутбуком по Bluetooth в режиме Hands-Free.
Asterisk думает, что Ваш ноутбук — это Bluetooth-гарнитура.
При входящем звонке на SIM-карту Redmi 9 пробрасывает аудиопоток через Bluetooth в Asterisk, а Asterisk распределяет его по SIP-номерам.
Главные проблемы схемы через Bluetooth
GitHub
Нестабильность стека BlueZ 5 в Debian 13
Модуль chan_mobile разрабатывался очень давно (во времена BlueZ 4). Современные версии Linux (включая Debian 13) используют стек BlueZ 5, с которым chan_mobile работает крайне нестабильно: связь часто «отваливается», телефон перестает переподключаться после разрыва связи, а модуль Asterisk падает.
GitHub
Ужасное качество звука
Профиль Bluetooth Hands-Free (HFP/HSP) для передачи голоса использует узкополосный кодек (CVSD, 8 кГц), из-за чего звук будет как «из бочки», с высокой задержкой и эхо.
Bluetooth-чипсет ноутбука
Не все встроенные Bluetooth-адаптеры в ноутбуках умеют корректно эмулировать профиль Hands-Free Gateway. Часто требуется отдельный «правильный» USB Bluetooth-свисток (например, на чипсете CSR).
Инструкция: Как попробовать (если хочется поэкспериментировать)
Если вы всё же хотите протестировать этот вариант на Debian 13, пошаговый план выглядит так:
1. Подготовка Bluetooth в Debian
Random kit
Установите необходимые утилиты:
Bash
sudo apt update
sudo apt install bluetooth bluez bluez-tools -y
Включите Bluetooth и спарьте Redmi 9 через консольный менеджер bluetoothctl:
Bash
bluetoothctl
Внутри консоли bluetoothctl:
Plaintext
power on
agent on
default-agent
scan on
(Найдите MAC-адрес вашего Redmi 9, например: XX:XX:XX:XX:XX:XX)
Plaintext
pair XX:XX:XX:XX:XX:XX
trust XX:XX:XX:XX:XX:XX
connect XX:XX:XX:XX:XX:XX
exit
2. Настройка Asterisk (chan_mobile)
Создайте или отредактируйте файл /etc/asterisk/chan_mobile.conf:
hotkey404
Ini, TOML
[general]
interval=30
; Ваш Bluetooth-адаптер в ноутбуке (MAC-адрес ноута)
[adapter]
id=debian_bt
address=YY:YY:YY:YY:YY:YY ; Узнать через hciconfig или bluetoothctl list
; Ваш телефон Redmi 9
[redmi9]
address=XX:XX:XX:XX:XX:XX ; MAC-адрес Redmi 9
port=3 ; Порт RFCOMM / HFP (обычно 3 или 4)
context=from-mobile
adapter=debian_bt
group=1
3. Маршрутизация звонков в extensions.conf
Добавьте правила в /etc/asterisk/extensions.conf:
hotkey404
Ini, TOML
; Входящие звонки с Redmi 9 через Bluetooth
[from-mobile]
exten => s,1,NoOp(Входящий вызов с SIM-карты Redmi 9)
exten => s,n,Dial(PJSIP/101,30) ; Звоним на ваш софтфон 101
exten => s,n,Hangup()
; Исходящие звонки через SIM-карту Redmi 9
[from-internal]
exten => _NXXNXXXXXX,1,Dial(Mobile/redmi9/${EXTEN})
exten => _NXXNXXXXXX,n,Hangup()
Итог
Запустить связку через Bluetooth можно, но для рабочей/стабильной АТС этот вариант практически не подходит — соединение Bluetooth на Android часто «засыпает» для экономии энергии, и входящие звонки просто перестанут доходить до Asterisk.
Если вам нужна надежная работа:
Лучшее железное решение без Root — USB 3G/4G модем за ~300 рублей, включенный прямо в ноутбук с Debian.
Лучшее софтовое решение без лишнего железа — SIP-транк от вашего сотового оператора (звонки идут через интернет напрямую в Asterisk, минуя ограничения Android).
А как asterisk через веб настроить
Управлять Asterisk через текстовые конфиги бывает тяжело, особенно когда нужно быстро настраивать голосовые меню (IVR), внутренние номера и маршруты. Для этого существуют графические веб-интерфейсы.
Для Debian 13 (и вообще для Linux) есть два основных варианта развертывания веб-панели:
Вариант 1. FreePBX в Docker (Самый популярный и мощный)
Устанавливать FreePBX напрямую на чистый Debian 13 "из исходников" — это сущий ад из-за конфликтов версий PHP (в Debian 13 идёт свежий PHP, а FreePBX завязан на более старые версии). Поэтому лучший способ запустить FreePBX на Debian 13 — это Docker.
Шаг 1. Установите Docker и Docker Compose
Bash
sudo apt update
sudo apt install -y docker.io docker-compose-plugin
sudo systemctl enable --now docker
Шаг 2. Создайте файл docker-compose.yml
Создайте отдельную папку и файл конфигурации:
Bash
mkdir ~/freepbx && cd ~/freepbx
nano docker-compose.yml
Вставьте следующее содержимое (используем проверенный образ FreePBX + Asterisk):
YAML
services:
freepbx:
image: tiredofit/freepbx:latest
container_name: freepbx
network_mode: host
environment:
- TIMEZONE=Europe/Moscow
- ENABLE_FAIL2BAN=FALSE
volumes:
- ./certs:/certs
- ./data:/data
- ./logs:/var/log/asterisk
restart: always
Шаг 3. Запустите веб-панель
Bash
sudo docker compose up -d
Загрузка и запуск займут пару минут. После этого откройте браузер и перейдите по адресу вашего ноутбука:
http://<IP_АДРЕС_ДЕБИАНА> (например, [http://192.168.1.50](http://192.168.1.50)).
Вам предложит создать учетную запись администратора FreePBX, после чего вы попадете в полноценную веб-панель управления АТС.
Вариант 2. VitalPBX (Красивый современный интерфейс)
Если FreePBX кажется слишком громоздким, VitalPBX — отличная альтернатива с очень удобным и современным интерфейсом.
Обычно VitalPBX устанавливается через готовый скрипт или Docker.
Запуск VitalPBX в Docker:
Bash
sudo docker run -d \
--name vitalpbx \
--net=host \
--privileged \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
vitalpbx/vitalpbx:latest
После запуска панель будет доступна по адресу https://<IP_АДРЕС_ДЕБИАНА>.
Вариант 3. Легковесный встроенный GUI (Asterisk-GUI / FreePBX Lite)
Если не хочется ставиь Docker и нужен супер-легкий интерфейс чисто для создания внутренних номеров:
Можно использовать PBXinaFlash / RasPBX компоненты или сторонние простые веб-панели на Python/PHP (например, Asterisk WebGUI), но они предоставляют синтаксический сахар над файлами конфигурации и имеют ограниченный функционал по сравнению с FreePBX.
Что делать дальше в веб-интерфейсе FreePBX?
Создать внутренние номера (Extensions):
Перейдите в Applications → Extensions.
Нажмите Add Extension → Add New PJSIP Extension.
Укажите номер (например, 101) и пароль (Secret).
Подключить Redmi 9:
Откройте на Redmi 9 приложение софтфон (Linphone / Zoiper).
Введите IP-адрес ноутбука, номер 101 и заданный пароль.
Настроить входящую/исходящую связь (Trunks):
Перейдите в Connectivity → Trunks и добавьте ваш USB-модем или учетную запись внешнего SIP-провайдера.
С чем помогу дальше?
Помочь настроить внутренние номера и софтфон в FreePBX
Настроить голосовое меню (IVR) через веб-интерфейс
А как мне сделать чтобы
Идёт звонок на телефон
По ADB поднимается трубку
Воспроизводиться музыка в трубку
По окончанию звонок сбрасывается
Я тут морочился с Bluetooth в итоге понял
Пк с телефоном входят в сопряг и если позвонить то можно через ноут общаться и голос слышно будет
Но вот ситуация как подменить микрофон в системе для Bluetooth чтобы сама система не знала что микрофон был подменен и звук воспроизводился в трубку и физический микрофон вообще не было слышно
Ты докопался до самой сути работы Bluetooth HFP (Hands-Free Profile) на Linux!
Когда телефон подключен к ноутбуку как HFP-устройство, PulseAudio или PipeWire (звуковой сервер в Debian 13) создает две виртуальные сущности:
Bluetooth Sink (Динамик) — сюда прилетает звук из телефона (голос собеседника).
Bluetooth Source (Микрофон) — отсюда звук уходит в телефон (твой голос).
Твоя задача — подменить Bluetooth Source, чтобы в телефон шел не физический микрофон ноутбука, а аудиопоток из медиаплеера (файла с музыкой).
Вот готовое рабочее решение из двух частей: звуковая подмена в Linux и автоматизация через ADB.
ЧАСТЬ 1. Подмена микрофона в Debian 13 (PipeWire / PulseAudio)
В Debian 13 по умолчанию используется PipeWire (с прослойкой pipewire-pulse). Нам нужно создать виртуальный микрофон (Null Sink / Loopback) и направить в него аудиофайл.
Шаг 1. Создаем виртуальный аудиовыход (Null Sink)
Выполни в терминале Debian:
Bash
pactl load-module module-null-sink sink_name=VirtualMic sink_properties=device.description="Virtual_Microphone"
Это создаст виртуальную «колонку». Всё, что воспроизводится в VirtualMic, будет попадать на его же виртуальный «микрофон» (VirtualMic.monitor).
Шаг 2. Перенаправляем виртуальный микрофон в Bluetooth-передатчик
Узнай имя Bluetooth-источника (куда телефон ждет звук). Запусти:
Bash
pactl list sources short
Найди там устройство, содержащее bluez_output или bluez_input (например, bluez_output.XX_XX_XX_XX_XX_XX.1).
Свяжи виртуальный микрофон с Bluetooth-выходом:
Bash
pactl load-module module-loopback source=VirtualMic.monitor sink=bluez_output.XX_XX_XX_XX_XX_XX.1
(Замени bluez_output... на имя твоего Bluetooth-устройства из команды выше).
Шаг 3. Воспроизводим музыку в виртуальный микрофон
Теперь любой плеер (например, ffplay, mpv или paplay), который выводит звук в VirtualMic, будет играть прямо в телефонный звонок, а твой физический микрофон вообще не будет задействован:
Bash
paplay --device=VirtualMic /path/to/your/music.wav
ЧАСТЬ 2. Автоматизация процесса через ADB
Теперь соберем всё в единый Bash-скрипт. Скрипт будет:
Мониторить входящий звонок на Redmi 9 через ADB.
При вызове — автоматически «поднимать трубку» через ADB.
Проигрывать музыку в виртуальный микрофон Bluetooth.
По окончании музыки — сбрасывать звонок через ADB.
Готовый Bash-скрипт (auto_answer.sh)
Создай файл auto_answer.sh на ноутбуке:
Bash
#!/bin/bash
# Настройки
MUSIC_FILE="/home/user/music.wav" # Путь к твоему аудиофайлу (лучше WAV 8000Hz или 16000Hz)
BT_SINK="bluez_output.XX_XX_XX_XX_XX_XX.1" # Твой Bluetooth sink из Step 2
echo "[-] Подготовка виртуального микрофона..."
# Удаляем старые модули, если были
pactl unload-module module-null-sink 2>/dev/null
pactl unload-module module-loopback 2>/dev/null
# Создаем виртуальную петлю
pactl load-module module-null-sink sink_name=VirtualMic sink_properties=device.description="Virtual_Microphone"
pactl load-module module-loopback source=VirtualMic.monitor sink=$BT_SINK
echo "[*] Мониторинг входящих звонков через ADB..."
while true; do
# Проверяем состояние звонка через dumpsys telephony.registry
# State 1 = RINGING (Звонит)
RINGING=$(adb shell dumpsys telephony.registry | grep "mCallState" | head -n 1 | grep "1")
if [ -n "$RINGING" ]; then
echo "[+] Обнаружен входящий звонок!"
sleep 1 # Небольшая пауза перед ответом
# 1. Поднимаем трубку (KEYCODE_CALL)
echo "[+] Поднимаем трубку..."
adb shell input keyevent 5
sleep 1
# 2. Воспроизводим музыку в виртуальный микрофон
echo "[+] Воспроизведение музыки в линию..."
paplay --device=VirtualMic "$MUSIC_FILE"
# 3. Как только музыка закончилась — сбрасываем звонок (KEYCODE_ENDCALL)
echo "[+] Музыка окончена. Сбрасываем звонок..."
adb shell input keyevent 6
echo "[*] Возврат в режим ожидания..."
fi
sleep 1 # Проверка каждую секунду
done
Как это запустить:
Подключи Redmi 9 по USB (или ADB over Wi-Fi) и убедись, что ADB видит девайс (adb devices).
Сопряги Redmi 9 с ноутбуком по Bluetooth в режиме Hands-Free.
Узнай имя Bluetooth sink (pactl list sinks short) и впиши его в переменную BT_SINK в скрипте.
Сделай скрипт исполняемым и запусти:
Bash
chmod +x auto_answer.sh
./auto_answer.sh
Нюанс по качеству звука:
Так как Bluetooth HFP сжимает звук для голоса (кодек CVSD 8кГц), музыка будет звучать как "по радио / из старого телефона". Чтобы звук был максимально чистым, конвертируй аудиофайл заранее с помощью ffmpeg:
Bash
ffmpeg -i input.mp3 -ar 8000 -ac 1 music.wav
Хочешь доработать скрипт, чтобы он сбрасывал звонок, если собеседник повесит трубку раньше?
Да
Gemini – это ИИ. Он может ошибаться, в том числе давать неверную информацию о людях. Gemini и ваша конфиденциальностьОткроется в новом окне