Данное приложение позволяет вам отправлять текстовые 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