15.06.2024 | 20 минут чтения

Asterisk 18 и FreePBX 16

Как отправить SMS в Telegram через GoIP шлюз
GoIP - шлюзы GSM для работы с Asterisk и SIP. Это простое устройство, которое позволяет выполнять звонки с IP-АТС на мобильные телефоны и в обратном порядке, трансформируя GSM сигнал. С помощью GoIP можно реализовать как входящий, так и исходящий траффик звонков между сетями GSM и VoIP.

Установить Asterisk и FreePBX можно по нашим инструкциям для Rocky Linux 9 и Debian 12
Настройку будем производить на VDS/VPS сервере с выделенным IP адресом, на котором установлен Asterisk.
GoIP шлюз установлен в офисе или дома и имеет выход в интернет через NAT с динамическим ip адресом.
  • Шлюзы GoIP умеют отправлять СМСки по SIP протоколу. Т.е. с помощью обычного любого Asterisk или FreePBX.
    Без SMS сервера, без PHP / Python скриптов и без Email адресов
Отметим, что мы будем решать сразу несколько задач.
  • Отправка смс в группу Телеграмм
  • Отправка смс на внутренний SIP номер клиента ( в нашем случае это номер 100)
  • Отправка смс на web сервис, по запросу клиента
Если вам что-то из этого не нужно. То просто пропустите некоторые пункты в инструкции. А в файлах конфига, удалите или закомментируйте соответствующие строки.
Настройка на стороне GoIP шлюза
Заходим на шлюз. Стандартные логин и пароль admin/admin. Сразу попадаем на стартовую страницу, где можно посмотреть статус установленных симкарт.
Обратите вниманием на третий столбец. Чтобы активировать новую установленную симку, необходимо нажать на "N"
GoIP шлюз Status Sammury
Status -
Summary
Раздел Status - General содержит общую информацию о прошивке, настройках сети, серийном номере и модели используемого GoIP шлюза.
Раздел Status - SIM, содержит более подробную информацию о самих сим-картах.

После того, как ознакомились с общей информацией о шлюзе, переходим к настройкам. Открываем раздел Configurations.
И сразу первый раздел - это Preferences. Тут выбираем язык интерфейса задаем часовой пояс и выключаем IVR и прочие дополнительные функции.
Часовой пояс, если нет настроек для Росси, можно выбрать - Чехословакия.
GoIP шлюз настройка Preferences
Configurations -
Preferences
У нас будет один транк с Asterisk для всех сим-карт. В следующем разделе Config Mode выбираем Single Server Mode. В этом режиме используется только одна SIP регистрация.
Также устанавливаем Routing Prefix для каждой сим-карты. Если этот параметр установлен, соответствующий канал (линия) используется только для набора телефонного номера с соответствующим префиксом маршрутизации.

  • Authentication ID: Это Username на Asterisk
  • Password: Соответствует полю Secret
  • SIP Proxy: IP сервера Asterisk
  • Sip Registrar Server: IP сервера Asterisk
  • Phone Number: Username на сервере Asterisk
  • Display Name: Username на сервере Asterisk
По окончании, не забываем сохранить настройки и нажать Save Changes
GoIP шлюз настройка Basic VoIP
Config Mode -
Basic VoIP
Раздел Advance VOIP приведем на скрине без описания. Тут нет никаких особых настроек.
GoIP шлюз настройка Advance VOIP
Config Mode -
Advance VOIP
В следующем разделе Media указываем диапазон RTP  портов. На Asterisk он должен соответствовать.
GoIP шлюз настройка Media
Config Mode -
Media
Теперь переходим к настройке исходящих звонков. Устанавливаем значения как на скриншотах ниже.
GoIP шлюз настройка Call Out
Config Mode -
Call Out
GoIP шлюз настройка Call Out Auth
Config Mode -
Call Out Auth
Переходим к следующему разделу Call In, входящая логика обработки вызовов. Определим префикс для всех сим-карт, который будет дальше передаваться на Asteris как DID номер.
В качестве префикса будем использовать 01332 и далее две цифры определяющие слот для сим-карты. Таким образом получится 0133201, 0133202......0133232
CID Forward Mode: выставляем Use CID as SIP Caller
GoIP шлюз настройка Call In
Config Mode -
Call In
GoIP шлюз настройка Call In Auth
Config Mode -
Call In Auth
Следующие разделы SIM и SIM Forward. Устанавливаем значения как на скриншотах
GoIP шлюз настройка SIM
Config Mode -
SIM
GoIP шлюз настройка SIM Forward
Config Mode -
SIM Forward
Теперь переходим к ключевым настройкам - раздел SMS
SMS to VoIP - Disable. Этот параметр применяет сразу ко всем линиям и определяет, как устройство обрабатывает полученные SMS-сообщения.
Get Destination Nunumber From - Message body.
SMS To VoIP - тут прописываем для каждой линии свой номер сим-карты, чтобы потом в Asterisk и в Telegram можно было видеть на какую сим-карту и на какой номер пришло смс.

GoIP шлюз настройка SMS
Config Mode -
SMS
Настройка на стороне Telegram
Зарегистрируйте нового Telegram-бота. Для этого  отправьте "/newbot" @BotFather и следуйте дальнейшим  инструкциям. Для настройки потребуется токен, предоставленный @BotFather на последнем шаге.
Создание Telegram-бота
Если вы хотите отправлять персональные уведомления, вам необходимо получить идентификатор чата пользователя, которому бот должен отправлять сообщения.
Отправьте "/getid" на "@myidbot" в мессенджере Telegram.
Получить Telegram id пользователя
Отправьте "/start" боту, созданному ране. Если вы пропустите этот шаг, Telegram-бот не сможет отправлять Вам сообщения.
Так же можно можно открыть @BotFather, набрать /mybots. Выбрать только что созданного бота и нажать "Запустить"
Telegram запуск бота
Если вы хотите отправлять групповые уведомления, вам необходимо получить идентификатор группы, в которую бот должен отправлять сообщения. Чтобы сделать это:

Добавьте "@myidbot" и "@тут_имя_вашего_бота" в свою группу. Отправьте сообщение "/getgroupid@myidbot" в группу. В групповом чате отправьте "/start@тут_имя_вашего_бота".
Если вы пропустите этот шаг, Telegram-бот не сможет отправлять сообщения в группу.
Telegram запуск бота в группе
Настройка на стороне Asterisk и FreePBX
Шлюзы GoIP умеют отправлять СМСки по SIP протоколу. Т.е. с помощью Asterisk (FreePBX). И для этого не нужно настраивать SMS сервера, почтовый ящик или писать скрипты на bash или python.

Заходим на FreePBX. Открываем раздел Setting, далее Advanced Setting, ищем пункт SIP Channel Driver и выбираем both. Мы будем использовать драйвер канала и SIP и PJSIP.

FreePBX Sip channel driver
Настраиваем транк между АТС Asterisk (FreePBX ) и шлюзом GoIP.
Для этого заходим в Connectivity - Trunks и выбираем Add Trunk - Add SIP (chan_sip) Trunk
Во вкладке General пишем имя транка, (остальные пункты по умолчанию) и переходим в раздел:
Sip Setting - Outgoing

host=dynamic
username=<имя пользователя>
secret=<password>
type=friend
context=from-pstn
qualify=yes

FreePBX outgoing sip setting
Edit Trunk
Sip Setting - Incoming
USER Context
Чаще всего это имя или номер учетной записи, которые ожидает получить ваш провайдер.
Этот ПОЛЬЗОВАТЕЛЬСКИЙ контекст будет использоваться для определения приведенных ниже сведений о пользователе.

type=user
username=<имя пользователя>
secret=<password>
context=from-pstn
FreePBX incoming sip setting
Применяем настройки, подключаемся к asterisk и смотрим, что соединение установлено.
sip show peers
Asterisk sip show peers
Переходим в меню Admin-Config EDIT и редактируем файл sip_general_custom.conf
Нужно добавить такие строки (или делаем это через CLI)

textsupport=yes
accept_outofcall_message = yes 
outofcall_message_context = messages 
auth_message_requests = no  
Если какой нибудь сервис пришлет SMS, то в Астериске мы этот текст увидим в запросе INVITE в секции MESSAGE - Body
Чтобы из этого текста отделить нужное сообщение и в целом привести его к удобному и читаемому виду, необходимо внесем изменения в контексты диалплана.
Так же через Admin-Config EDIT или в CLI редактируем файл extensions_custom.conf
Добавляем в него следующие строки. Комментарии ниже по конфигу.

[messages]
exten => _.,1,NoOp(Inbound SMS dialplan invoked)
same => n,Set(_LINE=${CUT(CUT(MESSAGE(body),\),1),\(,2)})
same => n,Set(_FRM=${CUT(MESSAGE(body),\(,1)})
same => n,Set(_TEXT=${CUT(MESSAGE(body),\),2)})
same => n,NoOp(SMS received on the number: ${MESSAGE(to):4:11})

;Если нужна отправка в web
same => n,Set(response=${CURL(https://<адрес сервиса>,Port=${LINE}&NumberTo=${MESSAGE(to):4:12}&Text=${TEXT}&From=${FRM})})

;Если нужна отправка на SIP клиента с номером 100
same => n,Messagesend(pjsip:100,${MESSAGE(body):1:11})
same => n,NoOp(Send status is ${MESSAGE_SEND_STATUS})

;Если есть слово КОД то завершаем обработку. Если мы не хотим, чтобы в группу Телеграм приходили подобные смс, например от банков. 
same =>,n,ExecIf($["${TEXT}q" : "(^.+Код.+)"]?HangUp()
same => n,ExecIf($["${TEXT}q" : "(^.+код.+)"]?HangUp()

;Отправка в группу Телеграм всех смс, в которых нет слова КОД
same => n,Set(response=${CURL(https://api.telegram.org/<АПИ Телеграмм>/sendMessage,text=📱PORT:${LINE} ${MESSAGE(to):4:12}%0A%0A${URIENCODE(${TEXT})}%0A%0A от ${FRM}&chat_id=-1002009113877)})
same => n,HangUp()
В целом этого достаточно, чтобы SMS сообщения приходили в Телеграмм. Дальнейшие настройки необходимы уже для приема сообщений на SIP номер.
А так же иметь возможность звонить через установленные SIM карты.

Applications- Set CallerID
Добавляет возможность изменять идентификатор вызывающего абонента в потоке вызовов.
Нажимаем Добавить и прописываем настройки как на скрине
Asterisk sip show peers

Connectivity - Inbound Routes / Outbound Routes
Настраиваем возможность принимать использовать SIM  карты и для звонков
Asterisk sip show peers
Asterisk sip show peers
Asterisk sip show peers

А вот так выглядит SMS полученное в Telegram
Asterisk sip show peers