Представляю вам цикл статей по созданию собственного шлюза для отправки SMS-сообщений.
В первой части мы определим цели и некоторые аспекты использования своего шлюза, настроим программное обеспечение для отправки SMS с использованием USB-модемов, а также рассмотрим несколько интересных вариантов отправки
Начнем мы статью с вопроса – для чего отправлять SMS, ведь на дворе 2021 год? Да, мы уже привыкли к различным мессенджерам, уведомлениям в чат-боты, но SMS до сих пор обладает наиболее гарантированным уровнем доставки. Нет зависимости от наличия интернета и сообщение поступит даже в сети 2G и при слабом сигнале и на устройство без доступа к интернет. Таким образом, если планируется отправлять сообщения, которые гарантированно должны быть доставлены и критичны к времени доставки, то SMS – это возможно лучший выбор.
Под SMS-шлюзом мы понимаем программно-аппаратное устройство подключенное к сети сотового оператора и позволяющее производить автоматизированную отправку сообщений.
Где можно применять это решение?
Самое простое и очевидное применение – отправка уведомлений. Мы отслеживаем доступность различных сервисов и хотим знать о любых сбоях. Применение в системе умного дома позволит нам быть в курсе всех произошедших событиях. Да, многие IoT устройства умного дома оборудованы разъемом под сим-карту и могут сами отправлять SMS, но в этом случае на каждое устройство нужна отдельная сим-карта.
Мы можем проводить двухэтапную аутентификацию пользователей или производить валидацию введенного номера телефона. Регистрировать пользователей по номеру телефона, без необходимости создания логина и пароля. Отправлять сообщения о формировании заказа, отправке, получении, изменении баланса.
Но сообщения можно не только отправлять, их также можно получать и обрабатывать, что еще сильнее расширяет варианты применения. Все зависит только от вашей фантазии.
Стоит обратить особое внимание – так как мы рассматриваем в статье вариант создания шлюза, то это позволяет отправлять сообщения сразу со всех описанных сервисов используя всего одно устройство.
Плюсы и минусы собственного шлюза
Как и любое решение, собственный шлюз обладает рядом достоинств и недостатков.
Мы не будем рассматривать плюсы с точки зрения точного сравнения с платными сервисами ввиду разного уровня получаемой услуги. Я приведу наиболее явные и вы сможете решить на сколько каждый пункт критичен именно для вас.
Плюс
- Очень низкая цена за отправленное сообщение в районе 5 копеек за сообщение (при отправке 1000), против 2.65₽ на коммерческих шлюзах
Минусы
- Отсутствует возможность задать имя – в качестве отправителя будет номер телефона, а не «Baton.ru», например. Но есть способ как решить это красиво и мы рассмотрим это в статье.
- Отправка сообщения не чаще чем 1 раз в 10 секунд. Решается увеличением количества модемов.
- Нет защиты от сбоев как на аппаратном, так и программном уровне. Объективности ради стоит отметить, что платные шлюзы тоже примерно раз в неделю сообщают о проблемах с доставкой определенным операторам. Мой опыт использования такого шлюза показывает всего один сбой за более чем 12 месяцев.
Итак, мы определили, что нам ожидать от собственного шлюза и мы готовы начать.
Устанавливаем Gammu, подключаем модемы
В качестве аппаратного ядра системы я буду использовать Orange Pi PC с Armbian просто потому, что он у меня есть и ничем не занят. Свою версию вы можете сделать на основе RPi, компьютера/сервера на Linux и даже виртуальной машины с проброшенными внутрь USB-портами – это не имеет особого значения, главное мы будем использовать Linux.
Для общения с модемами я буду использовать Gammu – очень мощный продукт позволяет общаться не только с классическими модемами, но и использовать телефоны в качестве модемов. Также этот продукт избавит нас от необходимости самим формировать пакеты сообщений, считать их длины, составлять и отправлять АТ-команды и самое главное позволить отправлять сообщения в PDU-формате.
Итак, подключимся к серверу, обновим систему и установим gammu:
ssh root@<IP_вашего_сервера>
apt update
apt upgrade -y
apt install gammu -y
Теперь нужно подключить модемы к USB-портам. Я буду использовать два модема, чтобы нагляднее показать чем отличаются настройки. Подключаем и смотрим какие порты они заняли.
Следующей командой мы смотрим, какой модем сколькими портами обладаем. Среди этих портов будет только несколько (или один), через который можно отправлять сообщения. Остальные — это технические и нам не интересны.
На скрине выше видно, что установленный модем usb 5-1, Alcatel, имеет пять каналов. Теперь нам нужно определить какие из них используются для связи. Сделать это не сложно. Пишем в терминале:
screen /dev/ttyUSB1
В открывшемся окне вбиваем АТ и если в ответ получили ОК, то запоминаем этот порт – это то, что нужно. Выходим – CTRL+A затем D
Обратите внимание, что найдя один порт, все равно нужно проверить оставшиеся – ttyUSB2, ttyUSB3, и далее. Например, используемый мной Alcatel, имеет 2 независимых канала на ttyUSB4 и ttyUSB5, что позволяет одновременно отправлять два SMS-сообщения через один модем.
Настройка Gammu
Итак мы определились с портами и теперь нужно настроить Gammu. Есть утилита конфигурации gammu-config, но мы не будем ее использовать, а запишем сразу данные в конфигурационный файл.
nano ~/.gammurc
дописываем в нижней части файла данные конфигураций. Каждый блок [gammu] – это канал модема. [gammu] – это канал по умолчанию, [gammu1] – первый канал и т.д. Далее мы еще коснемся этого, когда будем отправлять сообщение. Итого я добавляю 3 доступных канала от двух своих модемов:
[gammu]
port = /dev/ttyUSB0
model = at
connection = at
synchronizetime = yes
logfile =
logformat = nothing
use_locking = yes
gammuloc =
[gammu1]
port = /dev/ttyUSB4
model = at
connection = at
synchronizetime = yes
logfile =
logformat = nothing
use_locking = yes
gammuloc =
[gammu2]
port = /dev/ttyUSB5
model = at
connection = at
synchronizetime = yes
logfile =
logformat = nothing
use_locking = yes
gammuloc =
Краткое описание настроек:
- model – тип модема и как gammu следует общаться с модемом, at – с помощью AT-команд
- connection = at – тип соединения. Подключаемся на скорости 9600
- use_locking – говорит gammu, что нужно блокировать доступ к модему на время работы с ним. Иначе возможны различные ошибки и сбои
Вид настроек в терминале
Проверка работы
Gammu настроена и теперь мы можем протестировать отправку сообщений.
Базовая команда для отправки сообщения на английском и всего с одного модема выглядит следующим образом:
gammu sendsms TEXT +70001234567 -text "Test message"
Теперь рассмотрим варианты поинтереснее с использованием дополнительных аргументов
Если в системе несколько модемов, то добавляем нужный порт аргументом "-s <номер_порта>". Мы затрагивали этот момент, когда заполняли настройки. Нумерация начинается с 0 и в нашем случае это промежуток 0-2.
gammu -s 1 sendsms TEXT +70001234567 -text "Test message"
Отправка сообщений в PDU-формате (кириллица, прочие языки и спецсимволы) – "-unicode"
gammu -s 1 sendsms TEXT +70001234567 -unicode -text "Тестовое сообщение"
Отправка сообщений в PDU-формате с автоматической разбивкой на несколько сообщений и последующей склейкой на телефоне – "-autolen 5". Данный аргумент подразумевает использование числа, хотя объективно оно ни на что не влияет, по крайней мере у меня работает одинаково при любом числе, поэтому я решил, что сообщения длиной больше 5 у меня не будет и использую это число
gammu -s 1 sendsms TEXT +70001234567 -unicode -autolen 5 -text "Тестовое сообщение"
Есть очень интересный аргумент, который полезен, если вы отправляете одноразовые коды – "-replacemessages 1". Суть его работы заключается в следующем – мы указываем телефону, что при получении сообщения он должен заменить сообщений с ID 1, если оно имеется в полученных на то, что поступило сейчас. Таким образом телефон автоматически затирает все ранее полученные сообщения и в переписке всегда отображается только последнее полученное. Единственное, решить стоит его использовать или нет, желательно в самом начале, чтобы всегда заменять ID 1
gammu -s 1 sendsms TEXT +70001234567 -unicode -autolen 5 -flash -replacemessages 1 -text "Тестовое сообщение"
А теперь, самый интересный, на мой взгляд аргумент – "-flash".
Сообщение отправленное с этим параметром отображается телефоном сразу во всплывающем окне. Проигнорировать его невозможно, т.к требуется решение абонента о сохранении или отклонении данного сообщения. Но самое главное – абонент не видит номер телефона отправителя в этом окне (помните это был один из минусов собственного шлюза). Таким образом, если мы используем шлюз для авторизации пользователей и отправки им кодов, то это решение позволяет сразу показать код без захода в программу «Сообщения». По получении звукового сигнала о входящем сообщении человек берет телефон, снимает блокировку и сразу видит его на экране. Если абонент нажмет на «Отмена», то сообщение не будет сохранено в памяти телефона. Отправляем сообщение и смотрим как оно выглядит:
gammu -s 1 sendsms TEXT +70001234567 -unicode -autolen 5 -flash -replacemessages 1 -text "Тестовое сообщение"
Всё!
В следующей статье
В этой части статьи мы настроили отправку сообщений, но оно происходит вручную. Во второй части статьи мы напишем небольшое API (на PHP) для получения запросов по http, сохранении их в базу данных и автоматической отправке через активный шлюз и не только …
Автор: Дмитрий