Установка и настройка SIP шлюза для Telegram
Telegram — кроссплатформенный мессенджер, позволяющий обмениваться сообщениями и медиафайлами многих форматов. Так же данный мессенджер позволяет осуществлять аудио звонки между пользователями Telegram, благодаря разработки с открытым исходным кодом https://github.com/Infactum/tg2sip появилась возможность взаимодействия между Asterisk и Telegram по SIP протоколу. В рамках данной статьи будет рассмотрено как выполнить установку и настройку SIP шлюза для Telegram. Возможности […]
Telegram — кроссплатформенный мессенджер, позволяющий обмениваться сообщениями и медиафайлами многих форматов. Так же данный мессенджер позволяет осуществлять аудио звонки между пользователями Telegram, благодаря разработки с открытым исходным кодом https://github.com/Infactum/tg2sip появилась возможность взаимодействия между Asterisk и Telegram по SIP протоколу.
В рамках данной статьи будет рассмотрено как выполнить установку и настройку SIP шлюза для Telegram. Возможности SIP шлюза:
- Звонки из Telegram на внутренний номер Asterisk
- Звонки из Asterisk пользователю Telegram по никнейму или номеру телефона
При написании статьи так же использовались следующие библиотеки и программные продукты с открытым исходным кодом:
- Кроссплатформенная библиотека для построения клиентов Telegram — <td-master.zip>
- Библиотека для организации PJSIP медиа стека — <pjproject-master.zip>
- Библиотека для логирования — <spdlog-1.x.zip>
- SIP шлюз для Telegram – <tg2sip-master.zip>
- Скрипт установки кроссплатформенной системы автоматизации сборки программного обеспечения из исходного кода Cmake — <cmake-3.9.6-Linux-x86_64.sh>
- Кодек OPUS – <codec_opus-13.0_current-x86_64.tar.gz>
Инструкция:
1. Перейдём в WEB панель управления FreePBX через интернет обозреватель(Opera, Firefox, Google Chrome, Yandex Browser….) по ссылке вида: http://IP_адрес_сервера_Asterisk/ В примере ссылка имеет вид: http://192.168.1.231/
2. Пройдём авторизацию во FreePBX, нажмём «FreePBX Administration», введем «username и password» и нажмём «Continue»
3. Перейдем в меню Connectivity → Trunks → Add Trunk(SIP) и заполним ключевые параметры транка:
1) Trunk Name – наименование транка на вкладке General
2) Trunk Name — наименование sip пира на вкладке «sip Settings»
3) PEER Details – параметры транка. В примере SIP шлюз будет установлен на тот же сервер, что и Asterisk(т.е. локально), IP сервера 192.168.1.231 и порт шлюза должен быть отличным от используемого порта в Asterisk(в примере 5062)
[telegram]
deny=0.0.0.0/0.0.0.0
type=peer
qualify=yes
permit=192.168.1.231/255.255.255.255
host=192.168.1.231
port=5062
fromdomain=192.168.1.231
nat=no
insecure=port,invite
canreinvite=no
dtmfmode=rfc2833
disallow=all
allow=opus
context=from-inbound-telegram
4. Для возможности звонков на telegram с использованием коротких внутренних номеров, рассмотрим вариант создания Custom номеров, для этого перейдем в меню Applications → Extensions → Add Extension → Add New Custom Extension и заполним ключевые параметры:
1) User Extension
– короткий
внутренний номер, на вкладке General.
2) Display Name – имя внутреннего номера,
на вкладке General.
3)
Dial – строка вызываемого номера, на вкладке
Advanced. Для
звонка по никнейму должна иметь вид: SIP/tg#<ник>@192.168.1.231:5062. Для звонка по номеру мобильного
должна иметь вид: SIP/[email protected]:5062.
5. Для взаимодействия с Telegram необходимо выполнить регистрацию приложения и получить APP ID и API HASH, для этого перейдем на страницу https://my.telegram.org/auth и пройти авторизацию с использование мобильного номера
По смс или на авторизованный клиент Telegram-а придет сообщение с кодом авторизации, скопируем его и введем на странице авторизации. После успешного прохождения авторизации нам станет доступен раздел «API development tools», перейдем в него
Для регистрации приложения необходимо заполнить следующие поля:
1) App title – название приложения
2) Short name – упрощенное наименование приложения
3) URL – ссылка на сайт проекта
4) Platform – платформа создаваемого приложения, т.к. наше приложение не попадает не под один из критериев то выберем Other
5) Description – описание создаваемого приложения
SIP2TG_13.
После успешного заполнения формы система сгенерирует автоматически необходимые значения APP ID и API HASH, скопируем данные значения для последующей настройки.
6. Выполним подключение по SSH к серверу IP АТС Asterisk. В зависимости от используемой системы(Windows, Linux, MacOS), подключение по SSH можно выполнить с использованием различного дополнительного программного обеспечения(Putty), либо системного терминала.
7. Прежде чем приступить к установке шлюза, нам необходимо выполнить установку ряда зависимостей, для этого в SSH консоли на сервере Asterisk выполним команды:
# yum -y install centos-release-scl yum-utils
# yum-config-manager --enable rhel-server-rhscl-7-rpms
# yum install -y devtoolset-7-gcc devtoolset-7-gcc-c++
# set -xe
# yum install -y make git wget zlib-devel openssl-devel gperf pkgconfig ccache gperf unzip libpng-devel libjpeg-devel epel-release
# yum install -y opus-devel patchelf
8. Для сборки из исходников ряда зависимостей и SIP шлюза для Telegram, потребуется кроссплатформенная система автоматизации сборки программного обеспечения из исходного кода Cmake 3.9.6, для установки Cmake в SSH консоли на сервере Asterisk выполним команды:
# cd /usr/src/
# wget https://cmake.org/files/v3.9/cmake-3.9.6-Linux-x86_64.sh
# sh cmake-3.9.6-Linux-x86_64.sh --prefix=/usr --exclude-subdir
9. Одной из необходимых зависимостей является кроссплатформенная библиотека для построения клиентов Telegram «Tdlib», приступим к её сборке и установке, для этого в SSH консоли на сервере Asterisk выполним команды:
# cd /usr/src/
# wget https://github.com/Infactum/tg2sip/raw/master/buildenv/tdlib_header.patch
# wget https://github.com/Infactum/tg2sip/raw/master/buildenv/tdlib_threadname.patch
# source /opt/rh/devtoolset-7/enable
# git clone https://github.com/tdlib/td.git
# cd td
# git reset --hard a53cb30e99f937cfd64e0266fa558785a184a553
# git apply /usr/src/tdlib_header.patch
# git apply /usr/src/tdlib_threadname.patch
# mkdir build
# cd build
# cmake -DCMAKE_BUILD_TYPE=Release ..
# cmake --build . --target install
10. Так же необходимой зависимостью является библиотека для организации PJSIP медиа стека «PJProject», приступим к её сборке и установке, для этого в SSH консоли на сервере Asterisk выполним команды:
# cd /usr/src/
# wget https://github.com/Infactum/tg2sip/raw/master/buildenv/config_site.h
# source /opt/rh/devtoolset-7/enable
# git clone https://github.com/pjsip/pjproject.git
# cd pjproject
# git reset --hard 2.9
# cp /usr/src/config_site.h pjlib/include/pj
# ./configure --disable-sound CFLAGS="-O3 -DNDEBUG"
# make dep && make && make install
11. Последней необходимой зависимостью является библиотека для организации логирования в C++ SPDlog, приступим к её сборке и установке, для этого в SSH консоли на сервере Asterisk выполним команды:
# cd /usr/src/
# source /opt/rh/devtoolset-7/enable
# git clone -n https://github.com/gabime/spdlog.git
# cd spdlog
# git checkout tags/v0.17.0
# mkdir build
# cd build
# cmake -DCMAKE_BUILD_TYPE=Release -DSPDLOG_BUILD_EXAMPLES=OFF -DSPDLOG_BUILD_TESTING=OFF ..
# cmake --build . --target install
12. Успешно завершив сборку и установку всех вышеописанных зависимостей, приступим к сборке и установке SIP шлюза для Telegram, для этого в SSH консоли на сервере Asterisk выполним команды:
# cd /usr/src/
# git clone https://github.com/Infactum/tg2sip.git
# cd tg2sip
# mkdir build
# cd build
# export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig && cmake -DCMAKE_BUILD_TYPE=Release -DUSE_SYSTEM_CIMG=0 ..
# cmake --build .
# mkdir /opt/tg2sip
# cp -vr tg2sip /opt/tg2sip/
# cp -vr gen_db /opt/tg2sip/
# cp -vr settings.ini /opt/tg2sip/
# chmod +x /opt/tg2sip/tg2sip
# chmod +x /opt/tg2sip/gen_db
13. Успешно выполнив сборку и установку SIP шлюза для Telegram, приступим к его настройке, для этого в SSH консоли на сервере Asterisk выполним команду:
# nano /opt/tg2sip/settings.ini
И приведем конфигурационный файл к виду:
[logging]
core=1
tgvoip=5
pjsip=2
sip_messages=true
console_min_level=0
file_min_level=0
;tdlib=3
[sip]
public_address=0.0.0.0
;stun_server=
port=5062
;port_range=0
id_uri=sip:[email protected]
callback_uri=sip:[email protected]:5060
raw_pcm=false
;thread_count=1
[telegram]
api_id=XXXXXXX
api_hash=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
system_language_code=ru-RU
;device_model=PC
;system_version=Linux
;application_version=1.0
;database_folder=
;udp_p2p=false
;udp_reflector=true
;enable_aec=false
;enable_ns=false
;enable_agc=false
use_proxy=true
proxy_address=
proxy_port=
proxy_username=
proxy_password=
;use_voip_proxy=false
;voip_proxy_address=
;voip_proxy_port=0
;voip_proxy_username=
;voip_proxy_password=
[other]
;extra_wait_time=30
;peer_flood_time=86400
где ключевые параметры для изменения:
- logging — уровни логирования(0-трасировка 2-информационные 4-ошибки 6-отключено 1-отладка 3-warn 5-критические)
- port — порт который будет слушать шлюз, должен быть отличным от порта Asterisk, в примере данной статьи используем 5062 порт
- id_uri — SIP ID, строка должна иметь вид: SIP_ID@IP_Asterisk
- callback_uri – uri строка для организации входящего звонка на Asterisk(sip:EXTEN@IP_Asterisk:Port_Asterisk)
- api_id – ID зарегистрированного приложения(п.5 данной статьи)
- api_hash — HASH зарегистрированного приложения(п.5 данной статьи)
- use_proxy – использование прокси для работы клиентской части Telegram клиента в SIP шлюзе, может принимать два значения «true» или «false»
- proxy_address – адрес прокси сервера
- proxy_port — порт прокси сервера
- proxy_username — имя пользователя прокси
- proxy_password — пароль пользователя прокси
14. Для корректного прохождения голоса потребуется установка OPUS кодека, для этого в SSH консоли на сервере Asterisk выполним команды:
# cd /usr/src
# wget http://downloads.digium.com/pub/telephony/codec_opus/asterisk-13.0/x86-64/codec_opus-13.0_current-x86_64.tar.gz
# tar -xzf codec_opus-13.0_current-x86_64.tar.gz
# cd codec_opus-13.0_1.3.0-x86_64
# cp -vr codec_opus.so /usr/lib64/asterisk/modules/
# cp -vr codec_opus_config-en_US.xml /var/lib/asterisk/documentation/thirdparty
# nano /etc/asterisk/codecs.conf
Приведем конфигурационный файл к виду:
[opus]
type=opus
fec=yes
packet_loss=10
dtx=yes
cbr=yes
bitrate=48000
complexity=8
max_playback_rate=48000
Выполним подключение кодека:
# asterisk -rvvvv
# core restart now
# module load codec_opus.so
# module load res_format_attr_opus.so
15. Т.к. SIP шлюз не позволяет в строку callback_uri подставлять разные внутренние номера, то для удобства созвона с нужным внутренним номером направим входящий звонок для экстена telegram в контекст быстрого голосового набора рассмотренного в статье
# nano /etc/asterisk/extensions_custom.conf
Добавим контекст вида:
[from-inbound-telegram]
exten => telegram,1,Noop(Call Telegram)
same => n,Set(CHANNEL(language)=ru)
same => n,AGI(agi://localhost:3000)
same => n,GotoIf($[${RECOGNITION_RESULT}=SUCCESS]?:from-internal,101,1)
same => n,Dial(${RECOGNITION_TARGET})
16. На этом установка и подготовка завершены, выполним запуск SIP шлюза. Для первого раза единожды необходимо будет запустить gen_db для заведения базы необходимой созданному клиенту Telegram, для этого в SSH консоли на сервере Asterisk выполним команды:
# cd /opt/tg2sip/
# ./gen_db
# ./tg2sip
17. Звонок с Telegram на внутренний номер
18. Звонок с внутреннего номера на кастом внутренний номер с закрепленным за ним никнеймом telegram пользователя
Остались вопросы?
Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
VoIP оборудование
ближайшие курсы
Новые статьи
10 доводов в пользу Asterisk
Распространяется бесплатно.
Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.
Безопасен в использовании.
Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.
Надежен в эксплуатации.
Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.
Гибкий в настройке.
Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.
Имеет огромный функционал.
Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.
Интегрируется с любыми системами.
То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.
Позволяет телефонизировать офис за считанные часы.
В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.
Отличная масштабируемость.
Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.
Повышает управляемость бизнеса.
Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.
Снижает расходы на связь.
Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.
very helpful, many thanks!
А как бы так сделать что бы любой кто имеет номер телеграмма мог позвонить на один из внутренних номеров АТС
Завис с ./gen_db после ввода номера нет строки с указанием кода
Нет подключения к серверу Telegram…. Рекомендуется использовать рабочий прокси.
Какие адреса и порты нужно открывать на прокси сервере?
А можно расписать конфиг со стороны астера?
куда нужно писать сертификаты? пишет ошибку
[pjsip][error] Request verification failed: Not Acceptable Here [status=170488]
можете подсказать с tg2sip, пытаюсь звонить на sip:[email protected] — звонок вообще не идёт мне подсказали попробовать без domain.ru — получилось звонок идёт но при попытке поднять трубку всё обрывается, входящие(в телеграм) не принимаются — пишет телефон не в сети(
с @siptg / @siptg_bot всё получилось без проблем
+ не понятно как указать пароль
Доброго дня. вылетает такая ошибка [06:46:18.653][t:7189][p:7186][pjsip][error] Request verification failed: Not Acceptable Here [status=170488]
при попытке совершить звонок на телеграм выдаёт
[pjsip][error] Request verification failed: Not Acceptable Here [status=170488]
Warning: 399 8dd4fa48ce4c «No suitable codec for remote offer (PJMEDIA_SDPNEG_NOANSCODEC)»
У меня такая же проблема … Вам удалось ее решить?
Таже хрень. Не работает. На кодек ругается чота.
Видел такую проблему, оказалось что кодек Opus был отключен в PJSIP, которую использует tg2sip и (в зависимости от конфигурации) Астериск
Есть ли готовый docker контейнер с asterisk + pjsip + opus?
обновите статью. Она не рабочая поскольку вышло обновление
Прикручивал всё к FreePBX 15 и при ВХОДЯЩИМ звонке из телеграма звнок не попадает в контекст from-inbound-telegram. ловить приходится в from-sip-external. Не знаю как его отправить в кастомный контекст.
Может кто сказать, звоню через телеграм к себе на номер, перенаправляется на внутренний, все нормально, когда пытаюсь позвонить со внутреннего на номер друга(исходящий маршрут создал), звонок висит, висит, а потом говорит номер «Не доступен», и потом сбрасывается, но после этого на телеграм к нему звонок доходит. Весь интернет обшарил. Ничего внятного не могу найти. Вот лог астера:
chan_sip.c:4068 retrans_pkt: Retransmission timeout reached on transmission [email protected] for seqno 102 (Critical Request) — See https://wiki.asterisk.org/wiki/display/AST/SIP+Retransmissions
Packet timed out after 6400ms with no response
[2020-10-08 05:21:32] WARNING[11774]: chan_sip.c:4092 retrans_pkt: Hanging up call [email protected] — no reply to our critical packet (see https://wiki.asterisk.org/wiki/display/AST/SIP+Retransmissions).
после команды git apply /usr/src/tdlib_header.patch окно putty вырубается(закрывается), куда копать?
ответил выше или ниже)
Доброго дня, а как можно сделать автозапуск и работу в фоне(тобишь всегда) шлюза tg2sip А то держать постоянно открытую консоль как то не айс. Решение искал так и не нашел(
Добрый день, можно сделать автозапуск через systemd.
Небольшой апдейд на 18.01.21 Система freepbx последняя на данный момент Стоит перепроверить установку пакета ccache после установки всех зависимостей yum install ccache Здесь сменилась версия с 3.9 на 3.18.0 # cd /usr/src/ # wget https://cmake.org/files/v3.18/cmake-3.18.0-Linux-x86_64.sh # sh cmake-3.18.0-Linux-x86_64.sh —prefix=/usr —exclude-subdir Здесь так же сменилась версия с 1.2 на 1.6: # cd /usr/src/ # wget https://github.com/Infactum/tg2sip/raw/master/buildenv/tdlib_header.patch # wget https://github.com/Infactum/tg2sip/raw/master/buildenv/tdlib_threadname.patch # source /opt/rh/devtoolset-7/enable # git clone https://github.com/tdlib/td.git # cd td # git reset —hard v1.6.0 # git apply /usr/src/tdlib_header.patch # git apply /usr/src/tdlib_threadname.patch # mkdir build # cd build # cmake -DCMAKE_BUILD_TYPE=Release .. # cmake —build . —target install Кодек OPUS в… Подробнее »
Возможно ли вытащить CallerID из звонков Telegram -> SIP?
вот кусок диалплана, который поможет в вашем вопросе:
same => n,Verbose(X-TG-ID: ${SIP_HEADER(X-TG-ID)})
same => n,Verbose(X-TG-FirstName: ${SIP_HEADER(X-TG-FirstName)})
same => n,Verbose(X-TG-LastName: ${SIP_HEADER(X-TG-LastName)})
same => n,Verbose(X-TG-Username: ${SIP_HEADER(X-TG-Username)})
same => n,Verbose(X-TG-Phone: ${SIP_HEADER(X-TG-Phone)})
https://github.com/Nurmukhamed/docker-centos7-tg2sip-rpms
Если вам нужны rpms, то можете посмотреть в этом репозитории.
[root@ats src]# source /opt/rh/devtoolset-7/enable
[root@ats src]# git clone https://github.com/tdlib/td.git
fatal: destination path ‘td’ already exists and is not an empty directory.
[root@ats src]# cd td
[root@ats td]# git reset —hard v1.6.0
fatal: ambiguous argument ‘—hard’: unknown revision or path not in the working tree.
Use ‘—‘ to separate paths from revisions, like this:
‘git <command> [<revision>…] — [<file>…]’
[root@ats td]# git reset —hard v1.6.0
HEAD is now at 278c7ac Increase version to 1.6.0.
[root@ats td]# git apply /usr/src/tdlib_header.patch
error: patch failed: td/telegram/Td.cpp:4419
error: td/telegram/Td.cpp: patch does not apply
[root@ats td]#
Подскажите что не так?
Добрый день, подскажите какие зависимости нужно подправить ?
Таже самая ошибка. Как решить?
Tutorial is awesome I was ablet to setup. Only problem how to keep running this file ? Like how to run it from boot ? I tried to setup as service but no luck. Can you explain little bit about this ?
Thank you very much.
Need new version of tg2sip !!!
./gen_db
Enter phone number: +7…..
Error: error {
code = 406
message = «UPDATE_APP_TO_LOGIN»
}
Hi,
when I make a call I get this error :
[pjsip] [error] Request verification failed: Not Acceptable Here [status=170488]