Кирилл Золотавин
05.11.2019
10594

Установка и настройка 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 шлюза:

  1. Звонки из Telegram на внутренний номер Asterisk
  2. Звонки из Asterisk пользователю Telegram по никнейму или номеру телефона
Все описанные действия в статье необходимо выполнять от имени суперпользователя (root). Установка и настройка производилась на предустановленной системе CentOS 7 + Asterisk 13 + FreePBX 13.

При написании статьи так же использовались следующие библиотеки и программные продукты с открытым исходным кодом:

  1. Кроссплатформенная библиотека для построения клиентов Telegram — <td-master.zip>
  2. Библиотека для организации PJSIP медиа стека — <pjproject-master.zip>
  3. Библиотека для логирования — <spdlog-1.x.zip>
  4. SIP шлюз для Telegram – <tg2sip-master.zip>
  5. Скрипт установки кроссплатформенной системы автоматизации сборки программного обеспечения из исходного кода Cmake — <cmake-3.9.6-Linux-x86_64.sh>
  6. Кодек 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/

WEB панель FreePBX.
WEB панель FreePBX.

2. Пройдём авторизацию во FreePBX, нажмём «FreePBX Administration», введем «username и password» и нажмём «Continue»

 Авторизация во FreePBX.
Авторизация во FreePBX.

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
Добавление SIP транка без регистрации
Добавление SIP транка без регистрации
Добавление SIP транка без регистрации
Добавление SIP транка без регистрации
Добавление SIP транка без регистрации
Добавление SIP транка без регистрации

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/+7XXXXXXXXXX@192.168.1.231:5062.

Добавление Custom внутреннего номера.
Добавление Custom внутреннего номера.
Добавление Custom внуреннего номера.
Добавление Custom внутреннего номера.
Добавление Custom внутреннего номера.
Добавление Custom внутреннего номера.

5. Для взаимодействия с Telegram необходимо выполнить регистрацию приложения и получить APP ID и API HASH, для этого перейдем на страницу https://my.telegram.org/auth и пройти авторизацию с использование мобильного номера

Авторизация в Telegram.
Авторизация в Telegram.

По смс или на авторизованный клиент Telegram-а придет сообщение с кодом авторизации, скопируем его и введем на странице авторизации. После успешного прохождения авторизации нам станет доступен раздел «API development tools», перейдем в него

Код подтверждения авторизации
Код подтверждения авторизации
Личный кабинет Telegram
Личный кабинет Telegram

Для регистрации приложения необходимо заполнить следующие поля:

1) App title – название приложения
2) Short name – упрощенное наименование приложения
3) URL – ссылка на сайт проекта
4) Platform – платформа создаваемого приложения, т.к. наше приложение не попадает не под один из критериев то выберем Other
5) Description – описание создаваемого приложения

Регистрация приложения Telegram
Регистрация приложения Telegram

SIP2TG_13.

После успешного заполнения формы система сгенерирует автоматически необходимые значения  APP ID и API HASH, скопируем данные значения для последующей настройки.

APP ID и API HASH
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
Установка Cmake
Установка Cmake

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 v1.2.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
Сборка и установка Tdlib
Сборка и установка Tdlib
Сборка и установка Tdlib
Сборка и установка Tdlib
Сборка и установка Tdlib
Сборка и установка Tdlib

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
Сборка и установка библиотеки для организации PJSIP медиа стека «PJProject»
Сборка и установка библиотеки для организации PJSIP медиа стека «PJProject»
Сборка и установка библиотеки для организации PJSIP медиа стека «PJProject»
Сборка и установка библиотеки для организации PJSIP медиа стека «PJProject»
Сборка и установка библиотеки для организации PJSIP медиа стека «PJProject»
Сборка и установка библиотеки для организации PJSIP медиа стека «PJProject»

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
Сборка и установка библиотеки для организации логирования SDPlog
Сборка и установка библиотеки для организации логирования SDPlog
Сборка и установка библиотеки для организации логирования SDPlog
Сборка и установка библиотеки для организации логирования SDPlog
Сборка и установка библиотеки для организации логирования SDPlog
Сборка и установка библиотеки для организации логирования SDPlog

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
Сборка и установка Tg2SIP
Сборка и установка Tg2SIP
Сборка и установка Tg2SIP
Сборка и установка Tg2SIP
Сборка и установка Tg2SIP
Сборка и установка Tg2SIP

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:telegram@192.168.1.231
callback_uri=sip:telegram@192.168.1.231: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

где ключевые параметры для изменения:

  1. logging — уровни логирования(0-трасировка  2-информационные  4-ошибки   6-отключено 1-отладка  3-warn  5-критические)
  2. port — порт который будет слушать шлюз, должен быть отличным от порта Asterisk, в примере данной статьи используем 5062 порт
  3. id_uri — SIP ID, строка должна иметь вид: SIP_ID@IP_Asterisk
  4. callback_uri – uri строка для организации входящего звонка на Asterisk(sip:EXTEN@IP_Asterisk:Port_Asterisk)
  5. api_id – ID зарегистрированного приложения(п.5 данной статьи)
  6. api_hash — HASH зарегистрированного приложения(п.5 данной статьи)
  7. use_proxy – использование прокси для работы клиентской части Telegram клиента в SIP шлюзе, может принимать два значения «true» или «false»
  8. proxy_address – адрес прокси сервера
  9. proxy_port — порт прокси сервера
  10. proxy_username — имя пользователя прокси
  11. proxy_password — пароль пользователя прокси
Настройка SIP2TG шлюза
Настройка SIP2TG шлюза

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
Скачивание кодека OPUS

Приведем конфигурационный файл к виду:

[opus]
type=opus
fec=yes
packet_loss=10
dtx=yes
cbr=yes
bitrate=48000
complexity=8
max_playback_rate=48000
Настройка кодека OPUS
Настройка кодека OPUS

Выполним подключение кодека:

# asterisk -rvvvv
# core restart now
# module load codec_opus.so
# module load res_format_attr_opus.so
Подключение кодека OPUS
Подключение кодека OPUS

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
Генерация базы для клиента Telegram
Генерация базы для клиента Telegram
 Запуск SIP шлюза для Telegram
Запуск SIP шлюза для Telegram

17. Звонок с Telegram на внутренний номер

Звонок с Telegram на внутренний номер
Звонок с Telegram на внутренний номер
Звонок с Telegram на внутренний номер
Звонок с Telegram на внутренний номер

18. Звонок с внутреннего номера на кастом внутренний номер с закрепленным за ним никнеймом telegram пользователя

Звонок с внутреннего номера на Telegram
Звонок с внутреннего номера на Telegram
Звонок с внутреннего номера на Telegram
Звонок с внутреннего номера на Telegram
Подписаться
Уведомить о
guest
4 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
emm
emm
07.01.2020 02:40

very helpful, many thanks!

Andr
Andr
04.05.2020 22:00

Завис с ./gen_db после ввода номера нет строки с указанием кода

Кирилл
Кирилл
06.05.2020 11:48
Ответить на  Andr

Нет подключения к серверу Telegram…. Рекомендуется использовать рабочий прокси.

Павел
Павел
01.08.2020 14:38

при попытке совершить звонок на телеграм выдаёт
[pjsip][error] Request verification failed: Not Acceptable Here [status=170488]

Warning: 399 8dd4fa48ce4c «No suitable codec for remote offer (PJMEDIA_SDPNEG_NOANSCODEC)»

Остались вопросы?

Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.