ProIT: медіа для профі в IT
7 хв.

Програмна відправка SMS в домашніх умовах

author avatar Віталій Ричок
Senior Software Developer

Оскільки програмуванням та колупанням електронних апаратів я не тільки заробляю на хліб, а ще й розважаюся, то проситиму читачів оцінювати писанину нижче як «перебирання заліза в гаражі після роботи». Ринково-комерційного потенціалу тут небагато. Також зазначу про всяк випадок, що знаю про існування сервісів, які пропонують API для відправки SMS, – прямо зараз займаюся інтеграцією з одним із них, про що можливо також напишу. От тільки ж то не спортивно і взагалі it’s not fun.

Загалом рішення не є досконалим і не було «обкатане» як слід для використання в «бойових умовах» (звучить смішно за поточних обставин, еге). У мене воно працювало трохи більше ніж місяць, слало SMS невеликими кількостями, аж поки в чергу на відправлення не стало 500 з копійками SMS. Правильно буде сказати, що це просто вдалий Proof of Concept (POC).

Нижче докладно описано кожен крок реалізації. Читач має змогу відтворити те саме у себе, якщо є час і натхнення. Отже, вйо до прочитання історії з відкритим фіналом, бо є ще що підкручувати та покращувати, а то і взагалі можна закинути все те куди подалі й скористатися API перевіреного сервісу.

ПРОЛОГ

Для написання цього тексту, а до того для створення стенду, який реально працює, я змушений був дослідити інтернет. З невипадкових джерел озвучити на публіку я можу хіба офіційний сайт виробника мережевого обладнання Mikrotik. Там є вся необхідна інформація.

1. Вибір модема, мобільного оператора і пристрою для керування модемом

Модем (GSM, 3G, LTE, etc). Потрібен для того, щоб підключитися до мережі мобільного оператора, маючи на руках SIM-картку. Важко описати, якими критеріями я керувався при виборі модема. Скажімо, вектор пошуку мені задав кум, а далі я підбирав навмання. Вибір зупинив на такому варіанті – 3G модем Huawei E173S-2. Де купував, певно, не можна писати, щоб не було розцінено як несанкціонована реклама (ага, модель – не реклама, а де купував – реклама). Обійшлася покупка в районі 1000 грн.

Мобільний оператор. Насправді не важливо, якого оператора ви оберете. Саме головне при виборі – впорядкувати ваші з ним відносини таким чином, щоб у нього не виникали претензії до вас стосовно способу використання його мереж.

ВАЖЛИВО! Спочатку я підключив придбану картку до телефона й перевірив, чи можна з неї телефонувати та відправляти SMS. У пригоді став старий смартфон із побитим екраном. Також на смартфон встановив спеціальний мобільний застосунок для моніторингу балансу і керування тарифами та послугами. Потім картка просто виймається з телефона, вставляється у модем, а застосунок продовжує працювати на телефоні без SIM. Рагульно? Так. Але це працює.

ВАЖЛИВО! Якщо виникнуть плани розіслати багато SMS, то дуже важливо обрати правильний тариф мобільного оператора або будь-яким іншим чином розповісти йому, що ви збираєтеся використовувати рішення саме для роботи.

Я обрав звичайний пакет із найдешевшим тарифом і додаткову послугу із багатьма SMS. У результаті оператор просто заблокував мою SIM-картку, коли в один прекрасний день сталася розсилка не 2-5 SMS за добу, а більш ніж 500 протягом 50 хв по 10 SMS за хвилину (так була налаштована моя програма для відправки – блоками по 10 штук кожну хвилину).

Історія закінчилася хепі-ендом – я написав заяву в жанрі «Був неправий, дурний і недалекоглядний, більше така ганебна поведінка з мого боку не повториться» і SIM-картку розлочили.

Пристрій, що буде керувати модемом. Обирати не випало, бо вже маю парочку роутерів Mikrotik hAP AC2, один із яких роздає дітям інтернет для віддаленого навчання та ютубу, а на іншому я тренуюся робити непристойні адмінські речі (точніше, просто пробую повторити щось цікаве з інтернету, бо не є професійним сисадміном і маю до того лише дотичне відношення). Дуже непогана штука, але трішки задорога – «затягне» в районі 2000-3000 грн.

Виявилося, що цей роутер здатен керувати модемом і має API для допитливих програмістів, а от програмування набагато ближче мені, аніж мережі чи їх адміністрування. Наявність цього роутера та його можливості й стали причиною проведення POC.

Offtopic. За власними суб’єктивними непрофесійними враженнями, обладнання Mikrotik за співвідношенням ціна-якість займає сутінкову зону між серйозним мережевим обладнанням і ширпотребом для дому.

2. Збираємо все до купи й налаштовуємо відправку SMS із роутера

Ось так виглядають деталі окремо й зібрані докупи. Були певні проблеми з кришкою на модемі – знімати її не дуже зручно. Також варто бути обережним із розміщенням SIM-картки у гнізді. Там немає ніяких обмежень над контактами, можна засунути картку далеко всередину і все, фініта ля комедія. Модем підключаємо в роз’єм USB на роутері. Тепер ми готові до налаштування міцного і тривалого союзу роутера з модемом.

Переходимо до налаштування роутера. Тут я припускаю, що читач хоча б на базовому рівні знайомий із роутером Mikrotik. Або ж розбереться самостійно, як до нього підключатися і змінювати налаштування. Є кілька варіантів, як можна «потрапити на роутер». Через браузер або ж за допомогою програми winbox, яка легко завантажується із сайту Mikrotik.

Я користуюся winbox. Програма орієнтована на операційну систему Windows, тому необхідно поставити щось типу Wine, щоб пускати winbox на Linux-ах.

Підключаємо модем в USB-порт роутера, заходимо в налаштування роутера і відкриваємо меню Interfaces (червона стрілка № 1). Якщо не сталося форс-мажорів, то у списку інтерфейсів повинен з’явитися інтерфейс ppp-out1 (червона стрілка № 2). Якщо після підключення цей інтерфейс знаходиться у стані disabled (сіренький у списку і хрестик зліва біля інтерфейсу), то його варто перевести у стан enabled. Для цього виділяємо інтерфейс і натискаємо блакитну галочку зверху списку (червона стрілка № 3).

Далі ми повинні прибрати декілька галочок у налаштуваннях інтерфейсу ppp-out1. Це варто зробити на всяк випадок, щоб не мати раптових конфузів із доступом роутера в інтернет. Клікаємо лівою кнопкою миші двічі на ppp-out1 у списку, щоб відкрити віконце властивостей інтерфейсу. Прибираємо дві галочки, на які показують червоні стрілки, і натискаємо кнопку Apply справа на віконці.

Далі нам необхідно включити API на роутері. Обираємо пункт меню IP -> Services (червона стрілка № 1). Відкриється віконце зі списком сервісів, через які можна мати взаємодію з роутером. У списку знаходимо елемент api (червона стрілка № 2). Аналогічно, як і зі списком інтерфейсів, сіренький елемент – значить disabled. Переводимо api в стан enabled – синя галочка зверху списку. Порт, на якому буде відкрито API, обираємо на власний смак. Для цього двічі клікаємо у списку на api й у віконці властивостей сервісу задаємо потрібний порт.

Перевірка відправлення SMS. Відкриваємо пункт меню Tools -> SMS (червона стрілка № 1). На віконці, що відкрилося, знаходимо у правому нижньому кутку кнопку Send SMS (червона стрілка № 2) і натискаємо її.

Відкриється ще одне віконце. Звертаємо увагу на такі налаштування:

- Type=Serial.
- Port=usb1 – порт, куди було включено модем.
- Channel=0 – тут необхідно підібрати правильний варіант, спробуйте значення 0-3.

Набираємо довільний текст у полі Message, номер телефону у полі Phone Number, значення 0 у полі Channel і натискаємо кнопку Send Message. Phone Number я б рекомендував використовувати той, до телефону з яким «дотягнутися зовсім неважко» (с) Митець.

Якщо Channel було обрано правильно, то прийде SMS. Якщо ж SMS не було доставлено чи роутер викинув віконце з помилкою, то пробуємо інше значення для поля Channel. Ще буває корисно заглянути в логи роутера (зліва у вертикальному меню на winbox є однойменний пункт Log). Після першого вдалого тесту занотовуємо десь значення Channel і Port.

3. Відправлення SMS через API роутера

В архіві до статті (Sms.zip) можна знайти вихідний код на C# консольної програми для відправки SMS. Цей код орієнтований на .NET Core 6.0 і може бути зібраний як під Windows, так і під Linux.

Звісно, цей простий проєкт не є тим рішенням, яке одного прекрасного дня розіслало декілька сотень SMS, за що оператор заблокував мою тестову SIM-картку. Він був спеціально створений для цієї статті за допомогою Visual Studio 2022 Community Edition. Для внесення змін і запуску також можна використати Visual Studio Code. Або ж прямо з консолі.

Перед запуском відкриваємо файл Program.cs і змінюємо рядки 4-10 відповідно до ваших умов. Про settings.SmsPort і settings.SmsChannel писалося вище – правильні значення ми запам’ятали, коли експериментували із відправкою SMS безпосередньо з роутера. Всі інші сеттінги начебто інтуїтивно зрозумілі.

ВАЖЛИВО! Припускаю, що читач обізнаний, що таке IP-адреса, як облаштована його локальна мережа і яку IP-адресу має його роутер. Окремо хочу звернути увагу на один із параметрів – settings.IsNewAPI. Починаючи з певної версії RouterOS (операційна система, яка керує залізом Mikrotik), розробники змінили спосіб логіну до API роутера. Можливо, потрібно буде підібрати значення settings.IsNewAPI.

Код у файлі Mikrotik.cs базується на прикладі, який доступний на сайті Mikrotik, але трішки модифікований. Змінюємо налаштування у файлі Program.cs і пробуємо запускати.

ЕПІЛОГ

З невирішених і потенційних проблем маємо такі:

- Після блокування картки я так і не дізнався, що мої SMS перестали відправлятися, бо роутер без проблем «ковтав» кожен виклик API й не сигналізував, що насправді SMS нікуди не йдуть. Очевидно, модем доповідав роутеру, що при відправленні SMS проблем не сталося, а роутер той оманливий success транслював мені у програму.

- Не досліджувалася змога отримувати підтвердження, що SMS «долетіла» на пристрій адресата, якщо відправилася без помилок. Не виключено, що така можливість є. Можливо, з іншим модемом.

- Не реалізовано моніторинг стану SIM-картки. Можна легко пропустити момент, коли гроші на картці закінчаться і SMS не підуть за призначенням.

Приєднатися до company logo
Продовжуючи, ти погоджуєшся з умовами Публічної оферти та Політикою конфіденційності.