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

Установка и настройка 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
 
avatar
  Подписаться  
Уведомление о

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

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

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

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

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

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices