Skip to content

Latest commit

 

History

History
179 lines (126 loc) · 15 KB

readme_ru.md

File metadata and controls

179 lines (126 loc) · 15 KB

SMS-сервер для отправки сообщений с помощью GSM-модема

Данное приложение позволяет вам отправлять текстовые SMS и flash-сообщения с вашего сервера с подключенным GSM-модемом получателям по номеру телефона. Приложение также записывает отправленные сообщения и результаты, и выводит их в консоль в красивом и удобном виде. Приложение написано на JavaScript с помощью NodeJS и фреймворка Express, а также использует библиотеку serialport-gsm для доступа к подключенным USB-устройствам через NodeJS. Приложение может использоваться как для монолитных приложений, так и в микросервисной архитектуре.

Пример работы

Это приложение позволяет легко отправить сообщение с вашего настроенного с этим приложением сервера с подключенным GSM-модемом. Для отправки сообщения вам нужно отправить POST-запрос в формате JSON из вашего приложения на ваш настроенный сервер. Пример запроса:


{
    "recipient": "+99362000000", // номер получателя (без пробелов, в международном формате)
    "message": "Hello, this SMS from sms_server application" // текст сообщения
}

Приложение получит и обработает этот запрос, получит доступ к модему и, если не обнаружит проблем с номером и модемом, отправит сообщение на указанный номер.

Настройка

Примечание: рекомендуется использовать новые поколения модемов, вставить SIM-карту с пополненным балансом и/или приобретенной подпиской на отправку (безлимитных) SMS от вашего оператора связи.

Предварительные требования

  • ОС Linux (рекомендуется Ubuntu (20/04 или выше), CentOS 8)
  • Установленная NodeJS версии не ниже 12.0.0
  • Подключенный к USB-порту GSM-модем с предоплаченной тарифной SIM-картой
  • Стандартные системные драйвера Linux для работы с USB-портами
  • IP-адрес (статический)

Подключение и определение модема

Перед настройкой вам нужно подключить GSM-модем с SIM-картой к любому доступному USB-порту на сервере. Затем вам нужно узнать адрес подключенного USB-порта командой:

ls /dev/ttyUSB*

Она покажет адреса подключенных USB-портов (например, /dev/ttyUSB0 или что-то подобное, вам нужно запомнить адрес порта, подключенного к USB-модему, он пригодится позже при настройке конфигурации приложения). Вы также можете использовать команду:

dmesg | grep tty

которая выведет системные сообщения о подключенных устройствах.

Инициализация и настройка проекта

Создание и настройка папки для проекта:

mkdir sms_server && cd sms_server

Загрузка приложения из стабильной ветки репозитория GitHub проекта:

git clone https://github.com/yunusmi/sms_server.git .

Установка зависимостей проекта:

npm install

Создание файла .env на основе шаблона .env.example для хранения конфигурации проекта:

cp .env.example .env && nano .env

В открывшемся файле вам нужно отредактировать следующие значения:

  • MODEM_PORT - адрес подключенного USB-порта (команда ls /dev/ttyUSB* показывает список подключенных портов, например, /dev/ttyUSB0, описанный в предыдущих шагах)
  • MODEM_MODE - режим работы модема. Может быть 'SMS' или 'PDU'. По умолчанию 'PDU'
  • MODEM_BAUD_RATE - скорость GSM модема в бодах (единициа измерения скорости модема). Каждая модель модема имеет свою собственную baud rate и они отличаются от производителя к производителю. Это зависит от производителя и обычно в модемах нет единого стандарта baud rate. Вы можете задать максимальное baud rate.. По умолчанию 115200
  • SMS_TYPE - тип отправляемого SMS. Может быть обычным текстовым сообщением или flash-сообщением. Эта переменная должна иметь логическое значение (true/false). False - если вы хотите, чтобы система отправляла обычные текстовые SMS-сообщения, true - если она должна отправлять flash-сообщения. По умолчанию false
  • APP_PORT - порт для приложения NodeJS (обычно 3000). По умолчанию 3000
  • APP_HOST - хост для приложения (обычно localhost). По умолчанию localhost
  • TIMEOUT - максимальное время (в миллисекундах) ожидания ответа от модема (из-за некоторых особенностей работы модемов некоторых производителей, ответ от них можно ожидать долго, так как они могут не выдавать ошибку, но при этом не отвечать или отвечать долго). Поэтому вам нужно указать максимальное допустимое время ожидания ответа от модема, по истечении которого программа вернет клиенту ошибку со статусом TimeOut. По умолчанию 30 000 мс. (30 секунд)

Запуск и использование

Перед использованием вам нужно установить диспетчер процессов. Диспетчер процессов позволяет отслеживать и изучать логи и производительность приложения в режиме реального времени, а также перезагружать его в случае ошибок. Рекомендуется использовать pm2. Для установки pm2 вам нужно ввести команду:

npm install pm2

затем вы можете запустить приложение, введя команду:

pm2 start ./src/app.js

Приложение запустится на порту и хосте, указанных в файле .env.

Для мониторинга работы приложения в режиме реального времени вам нужно ввести команду:

pm2 monit

Для отправки сообщения вам нужно отправить POST-запрос в формате JSON из вашего Web, BackEnd-приложения (можно также через эмулятор отправки запросов Postman) на адрес
http://YOUR_SMS_CONFIGURED_SERVER_ADDRESS:APP_PORT/send-sms. Пример запроса:


{
    "recipient": "+99362000000", // номер получателя (без пробелов, в международном формате)
    "message": "Hello, this SMS from sms_server application" // текст сообщения
}

только вместо +99362000000 введите свой номер телефона

Приложение вернет ответ в формате JSON с информацией об отправке сообщения. Пример ответа:


{
    "success": true,
    "message": "Message successfully has sent to +99362000000"
}

Также можно отправить запрос из терминала системы (если curl установлен), откройте новое окно терминала и введите команду:


    curl -X POST http://127.0.0.1:APP_PORT/send-sms -H "Content-Type: application/json" -d '{"recipient": "+99362000000", "message": "Hello, this SMS from sms_server application"}'

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


[2021-12-15 16:15:23] [INFO] New request: +99362000000 - Hello, this SMS from sms_server application
[2021-12-15 16:15:23] [INFO] Start sending SMS to +99362000000
[2021-12-15 16:15:24] [INFO] Message successfully has sent to +99362000000

Тестирование нагрузки

Для тестирования нагрузки на отправку SMS, скорость и работоспособность GSM-модема, есть отдельный роут (POST запрос на /check-speed), который принимает 3 параметра: count - количество циклов отправки, recipient - номер телефона получателя, message - текст сообщения. Пример запроса в терминале с использованием curl:


    curl -X POST http://127.0.0.1:3000/check-speed -H "Content-Type: application/json" -d '{"recipient": "+99300000000", "message": "Test SMS message to check speed of GSM modem", "count": 100}'

После этого, в консоли терминала можно увидеть вывод о начале тестирования:


[22:41:30.037] INFO (127282): --------------------------------
[22:41:30.037] INFO (127282): New request: +99300000000 - Test SMS message to check speed of GSM modem
[22:41:30.037] INFO (127282): Start testing
[22:41:30.037] INFO (127282): Count of SMS: 100, message: Test SMS message to check speed of GSM modem, recipient number: +99300000000
[22:41:30.038] INFO (127282): Start sending SMS to +99300000000

Затем, сервер начнет отправку SMS на указанный номер, с текстом указанным в теле message указанное количество раз. В это время можно наблюдать вывод в консоль логи, будь то ошибки или успешные отправки. После окончания проверки, вы получите вывод с результатами:


[22:42:08.057] INFO (127282): Test completed successfully
[22:42:08.057] INFO (127282): Sent 100 SMS messages in 36326 ms
[22:42:08.057] INFO (127282): Speed: 3 SMS/s
[22:42:08.058] INFO (127282): Success: 99
[22:42:08.058] INFO (127282): Failure: 1

То же самое можно сделать, если отправить POST запрос на тот же IP адрес и порт, с тем же телом запроса в Postman или в любом другом эмуляторе запросов:


    {
      "recipient": "+99300000000",
      "message": "Test SMS message to check speed of GSM modem",
      "count": 100
    }

Логирование в текст и отладка ошибок

Для клиентских приложений ответ от сервера, будь то ошибки или успешные отправки, будет содержать короткие ответы. Для более подробного изучения ошибок или отслеживания статусов ответов от сервера предусмотрено запись в текстовый файл и вывод в консоль терминала. Все записи логов хранятся в каталоге src/logs. Каждый день, система создаст записи логов для этого дня и сохранит их в том же каталоге. Имя файла лога начинается с текущей даты и заканчивается на _log.txt

В записях логов status - статус отправки сообщения, message - текстовое описание статуса, data - все данные об отправленном сообщении, включая номер получателя, текст сообщения и ссылку на сообщение в модеме.

Заключение

Этот проект распространяется под лицензией MIT. Вы можете использовать весь код этого проекта на своих проектах бесплатно.

Если вам нужна моя помощь или консультация, вы можете связаться со мной по электронной почте: contact@yunus-mil.ru