Статьи

Приймаємо і відправляємо СМС за допомогою GSM-модему

  1. Зміст статті СМС - технологія не нова, але вона все ще широко поширена. За допомогою копійчаного...
  2. Gammu і Gammu SMS Daemon
  3. Інтернет-шлюзи СМС

Зміст статті

СМС - технологія не нова, але вона все ще широко поширена. За допомогою копійчаного GSM-модему можна приймати і відправляти повідомлення в своє задоволення. Потрібно всього лише вивчити систему його команд або встановити софт, який дозволить обійтися без цього.

Давно обіцяний «інтернет речей» не так далекий, як може здатися. Правда, футуристичні статті, які малюють напхану датчиками техніку, рідко стосуються одного важливого питання: яким чином інформація з цих датчиків досягає сервера? Якщо вони знаходяться в будинку - це одна справа. А якщо датчики встановлені, скажімо, на вантажному автомобілі або взагалі в чистому полі? Відповідь є: найчастіше інформацію з датчиків збирає спеціальний контролер, який потім передає її на сервер по СМС. Тут, втім, виникає інше питання: як побудувати сервер, здатний взаємодіяти з такими пристроями?

СМС і набір команд Hayes

Сучасна мобільний зв'язок тільки здається річчю в собі. Якщо дивитися на неї з вірною точки зору, швидко з'ясовується, що у наворочених смартфонів чимало спільного зі старенькими «Кур'єр» і «Спортстер». І ті й інші підтримують так званий набір команд Hayes.

Ветерани індустрії пам'ятають хитромудрі ініціалізацій рядки, які доводилося згодовувати модему перед підключенням до BBS або вузлу Фідо. Кожна така рядок - це примітивна програма, складена з команд Hayes для настройки модему.

Модем Hayes Smartmodem, для якого в 1981 році була розроблена система команд Hayes, розвивав швидкість до 300 Бод

Модеми, для яких була розроблена перша версія набору команд Hayes, не відрізнялися багатими можливостями. Крім настроювальних команд, були команди, які дозволяли набирати телефонні номери, встановлювати з'єднання, а потім вішати трубку.

За минулі з тих пір тридцять п'ять років багато що змінилося. Розширений набір команд, який використовується сьогодні, фактично можна розглядати як своєрідний програмний інтерфейс (API), за допомогою якого можна керувати мобільним телефоном.

Яким чином це зробити? Спочатку необхідно підключити GSM-пристрій до комп'ютера. Для автоматичного обміну СМС зручніше взяти не смартфон, а стільниковий модем: він не потребує у зломі, дешевше коштує і не вимагає проводів. Підійде звичайний 3G-модем, куплений в найближчому салоні зв'язку за тисячу рублів.

Підійде звичайний 3G-модем, куплений в найближчому салоні зв'язку за тисячу рублів

Перед використанням модема або смартфона на комп'ютер повинні бути встановлені необхідні драйвери. А ось софт для виходу в інтернет, який часто додається до модемів, для нашої задачі не тільки не потрібно, але навіть шкідливий. Якщо він захопить доступ до пристрою, ми не зможемо до нього достукатися. Замість цього нам буде потрібно UNIX-сумісна ОС і мінімальне вміння роботи з командним рядком.

Насамперед наш шлях лежить в каталог / dev /. Десь в його надрах ховається файл підключеного пристрою. Говорить ім'я допоможе ідентифікувати його якщо не безпосередньо, то методом виключення. 4G-модем «Мегафон M100-4», використаний автором для дослідів, виявився на шляху /dev/tty.HUAWEIMobile-Pcui. Спробуємо зв'язатися з ним за допомогою утиліти screen.

screen /dev/tty.HUAWEIMobile-Pcui

Тепер можна дізнатися, що ж ми знайшли. Для отримання інформації про пристрій служить команда ATI. Відповідь слід негайно:

ATI Manufacturer: huawei Model: E3276 Revision: 21.260.03.00.209 IMEI: 866991010472747 + GCAP: + CGSM, + DS, + ES OK

Цінним відкриттям, що під личиною модему «Мегафон М100-4» ховається Huawei E3276, ситий не будеш. Пора звернутися до більш цікавим завданням. За допомогою команд Hayes можна ввести пін-код (AT + CPIN = "0000"), з'ясувати силу сигналу (AT + CSQ) або набрати один із службових номерів - наприклад, дізнатися баланс (ATD 102 #, де 102 # - це номер) .

Більшість пристроїв приймають команди в одному з двох режимів. За замовчуванням, як правило, перебуває в режимі PDU (Protocol Data Unit), який вимагає вказувати аргументи в цифровій формі. Щоб не розучувати ще один шифр, краще перейти в текстовий режим. Для цього служить команда AT + CMGF = 1 (нульове значення поверне пристрій в режим PDU).

Наступне налаштування, про яку слід подбати, - це режим кодування. Справа в тому, що текстові повідомлення можуть бути складені тільки з цифр, латинських букв і розділових знаків. Символи, які не входять до класичну семібітную таблицю ASCII, не підтримуються.

Для пересилання повідомлень, які написані на алфавітах, що не вмістилися в ASCII, придуманий обхідний шлях: текст переводять в кодування UTF-16, а потім замінюють кожен символ чотиризначним шістнадцятковим кодом.

Чи підтримує наше пристрій цей спосіб? Це можна перевірити за допомогою команди AT + CSCS =?

AT + CSCS =? + CSCS: ( "IRA", "UCS2", "GSM")

Відповідь модему містить список підтримуваних режимів кодування. Режим GSM тут відповідає чистому семібітному ASCII. IRA нам теж не допоможе - це так званий International Reference Alphabet, маловідома міжнародна різновид ASCII. А ось UCS2, один з ранніх варіантів UTF-16, - це саме те, що потрібно. Варто зауважити, що іноді підходящий варіант, що має на увазі заміну символів Unicode шестнадцатерічнимі цифрами, називається HEX, - все залежить від моделі і виробника.

Тепер слід активувати потрібний режим:

AT + CSCS = "UCS2"

У деяких випадках для роботи з кирилицею може знадобитися настройка DCS - схеми кодування даних. Для цього служить команда AT + CSMP. Значення четвертого аргументу має дорівнювати восьми:

AT + CSMP = 1,167,0,8

Є два основних способи відправки текстових повідомлень за допомогою команд Hayes. Перший реалізує команда AT + CMGS. Щоб відправити повідомлення, потрібно дати їй номер телефону абонента і натиснути Enter. Все, що буде введено далі, розглядається як текст повідомлення. Закінчити введення тексту можна за допомогою комбінації клавіш Ctrl + z.

AT + CMGS = "+ 79295556924" Privet!

Перед відправкою повідомлення російською мовою доведеться подбати про його перекодуванні. Це можна зробити за допомогою будь-якого скриптового мови. Ось, наприклад, варіант на Python:

'' .Join ( '% 04X'% ord (c) for c in u'Прівет ')' 041F04400438043204350442 '& amp; lt

Тепер можна відправляти:

AT + CMGS = "+ 79295556924" 041F04400438043204350442

Другий спосіб складається з двох кроків. Перший крок вимагатиме команди AT + CMGW. Вона дуже схожа на AT + CMGS, але не відправляє повідомлення, а зберігає його в пам'яті SIM-карти. На другому кроці збережену СМС відправляє інша команда - AT + CMGS. Щоб відправити повідомлення, потрібно знати його номер. Наприклад, команда відправки заархівовану під номером 12 виглядає так:

AT + CMGS = 12

Цей спосіб зручний у тих випадках, коли один і той же текст потрібно доставити кільком адресатам. Замість того щоб кожен раз передавати його пристрою, досить один раз зберегти повідомлення в пам'яті, а потім вказувати модему лише його індекс і номер одержувача.

AT + CMGS = 12, "+ 79295556924" AT + CMGS = 12, "+ 79295556925" AT + CMGS = 12, "+ 79295556926"

Команда видалення повідомлення теж приймає на вході його номер:

AT + CMGD = 3

Покінчивши з відправкою, займемося прийомом. Пристрій самостійно приймає і зберігає текстові повідомлення, тому завдання зводиться до вилучення СМС з пам'яті SIM-карти.

Повідомлення зберігаються в кількох папках з різним призначенням. Повний список видасть команда AT + CMGL =?

AT + CMGL =? + CMGL: ( "REC UNREAD", "REC READ", "STO UNSENT", "STO SENT", "ALL")

Сенс папок зрозумілий за їх назвами: одна з них містить прочитані СМС, інша - непрочитані, дві інші - відправлені і невідправлені. Нарешті, остання називається ALL і дозволяє побачити всі повідомлення без фільтрації по папках. Цим теж займається команда AT + CMGL.

AT + CMGL = "ALL" + CMGL: 1, "REC READ", "004200650065006C0069006E0065" ,, "09/12 / 18,19: 21: 01 + 12" 041204300448002004310430043B0430043D04410020043C0435043D043504350020003100350020044004430431002E002000AB04170432043E043D043E043A0020043704300020044104470435044200200441043E04310435044104350434043D0438043A043000BB002E00200418043D0444043E0020003000360034003000310032 + CMGL: 2, "REC READ", "002B00370039003000330033003300330032003700330038 ",," 09/12 / 18,20: 13: 16 + 12 "041F043804410430043B002E002004270442043E0020043C0435043D044F00200443043204350437043B04380020043A044304340430002D0442043E002004380020043D04350020043E0442043F04430441043A0430044E0442002E

Шестнадцатерічнимі цифрами закодований не тільки текст повідомлення, а й ім'я відправника. Спробуємо розшифрувати перше повідомлення. Тут знову допоможе Python:

def decode_sms (txt): ... print '' .join (unichr (int (txt [i: i + 4], 16)) for i in range (0, len (txt), 4)) decode_sms ( '004200650065006C0069006E0065 ') Beeline decode_sms (\' 041204300448002004310430043B0430043D04410020043C0435043D043504350020003100350020044004430431002E002000AB04170432043E043D043E043A0020043704300020044104470435044200200441043E04310435044104350434043D0438043A043000BB002E00200418043D0444043E0020003000360034003000310032 ') Ваш баланс менше 15 руб. «Дзвінок за рахунок співрозмовника». інфо 064012

Час від часу діалог з модемом переривається повідомленнями, які являють собою не відповіді на введені команди, а повідомлення про зовнішні події. Модеми використовують код + CMTI, щоб повідомити про надходження нового повідомлення, а код + CDSI повідомляє про статус відправляється СМС.

Gammu і Gammu SMS Daemon

До сих пір ми спілкувалися з модемом в інтерактивному режимі за допомогою терміналу. На практиці це взаємодія має бути повністю автоматизовано. Це не проблема: відкрити файл /dev/tty.HUAWEIMobile-Pcui програмно нітрохи не важче, ніж будь-який інший. Труднощі може складатися в іншому. Якщо планується підтримувати більше однієї моделі модему, доведеться розбиратися в особливостях і примхах кожної.

Безпосереднє управління за допомогою команд Hayes - це хороший варіант, коли модем один, його модель відома, тонкощі нікого не хвилюють, а вся взаємодія можна описати парою-трійкою рядків коду. Коли запити вище, варто звернути увагу на одне з готових засобів для роботи з телефонами та модемами.

В цьому випадку може підійти набір утиліт командного рядка Gammu - розвиток відомого в минулому проекту Gnokii, який позбувся, на жаль, застарілої орієнтації на продукцію Nokia. Список підтримуваних Gammu телефонів і GSM-модемів не обмежується пристроями одного виробника. У ньому, втім, все ж є прогалини, тому питаннями сумісності краще потурбуватися заздалегідь.

Gammu дозволяє витягувати списки прийнятих і ініційованих дзвінків, відкривати телефонні з'єднання і управляти ними, переглядати телефонні книги, вивчати інформацію про телефон і мережі і багато іншого, аж до роботи з вбудованим FM-приймачем. Зрозуміло, прийом і відправка СМС і MMС теж входить в список умінь цієї програми.

Для установки Gammu під OS X слід скористатися командою brew install gammu (потрібно пакетний менеджер brew). Під Linux допоможе apt-get install gammu gammu-smsd або її еквівалент для іншого пакетного менеджера. Користувачам Windows доведеться відшукати і завантажити інсталятор на сайті проекту .

Робота з Gammu починається з налаштування. Найпростіше це зробити за допомогою утиліти, яка запускається командою gammu-config. Вона поцікавиться «портом» (в нашому випадку сюди потрапляє вже знайомий шлях /dev/tty.HUAWEIMobile-Pcui), типом і швидкістю з'єднання, моделлю (якщо нічого такого немає, варто вибрати at - в цей тип входить будь-який пристрій, що підтримує набір команд Hayes) і запросить кілька менш цікавих деталей. Введена інформація буде збережена в настроювальному файлі ~ / .gammurc, який при необхідності можна відредагувати в будь-якому текстовому редакторі.

Налаштування Gammu

Тут теж можливі проблеми з кодуваннями, але їх рішення простіше і прямолінійніше. Щоб російську мову не викликав у Gammu паніки, в системі повинна бути вірно налаштована локаль і мову. Для цього в OS X і Linux варто додати в ініціалізації файл (наприклад, ~ / .bash_profile) такі рядки:

export LC_ALL = en_US.UTF-8 export LANG = en_US.UTF-8

Далі буде простіше. Для відправки повідомлення служить команда gammu sendsms TEXT <номер телефону>. Сам текст повідомлення потрібно направити команді за механізмом pipes. Це спрощує відправку по СМС тексту, який є результатом роботи іншої програми.

echo "Привіт" | gammu sendsms TEXT +79295556924

У Gammu передбачено кілька способів читання повідомлень, але для того, щоб розглянути їх усі, тут просто немає місця. Обмежимося однієї, найпростішої командою. Вона виводить всі СМС, що зберігаються в пам'яті пристрою.

gammu getallsms Location 1, folder "Inbox", SIM memory, Inbox folder SMS message SMSC number: "+79037333332" Sent: Fri Dec 18 21:17:17 2009 +0300 Coding: Unicode (no compression) Remote number: "Beeline" Status: Read User Data Header: Concatenated (linked) message, ID (16 bit) 8444, part 1 of 2 Загальний час Ваших розмов 4 хв.

Нерідко замість виконання команди Gammu скаржиться на проблеми. Помилка «Error opening device. Unknown, busy or no permissions »може свідчити про те, що з'єднання з модемом захопила якась інша програма. Можливий і інший варіант: GSM-модеми, як виявилося, не відрізняються міцними нервами і під градом команд схильні виснути. Щоб привести їх до тями, пристрій доводиться витягувати з порту USB і потім встромляти знову.

Ще один важливий компонент Gammu - це SMS Daemon, програма, яка одним махом вирішує три чверті завдання побудови сервера для взаємодії з СМС. SMS Daemon працює у фоновому режимі, підтримує контакт з модемом і при отриманні повідомлення виконує задані дії. До слова, з перезавантаженням підвішеному модему він теж справляється.

Налаштування SMS Daemon - щодо складне завдання, що вимагає ручного редагування настроечного файлу. У ньому повинен з'явитися блок [smsd], який містить налаштування сервісу зберігання СМС і, якщо це необхідно, що задає шлях до обробника одержуваних повідомлень.

Сервіс зберігання СМС найцінніше. SMS Daemon здатний автоматично записувати отримані повідомлення в базу даних (підтримуються серед іншого SQLite, MySQL, PostgreSQL і MS SQL) або складати в вигляді файлів в спеціальну папку.

Оброблювач є програмою або скрипт користувача, автоматично запускається після прийому повідомлення. Інформація передається обробнику через змінні оточення. Мінлива SMS_MESSAGES містить число отриманих повідомлень, значення SMS_1_NUMBER відповідає телефонним номером відправника, а SMS_1_TEXT - тексту повідомлення.

SMS Daemon можна використовувати і для відправки повідомлень, хоча це дещо вибивається з кола його обов'язків. Це робиться за допомогою команди gammu-smsd-inject, що діє в точності як gammu send-sms.

echo "Привіт" | gammu-smsd-inject TEXT +79295556924

Інтернет-шлюзи СМС

Є й інший, більш радикальний спосіб позбутися від необхідності няньчитися з примхливими залізяччям, а саме: перекласти всі турботи на плечі спеціально навчених людей і платити їм, щоб вони страждали за тебе. Найбільший міжнародний сервіс такого роду називається Twillio. У Росії автоматизований прийом і передачу текстових повідомлень можна налагодити за допомогою сервісу «SMS-центр» .

Для відправки повідомлень через smsc.ru служить простий програмний інтерфейс в стилі REST. Всі необхідні параметри передаються сервісу у вигляді запиту щодо GET або POST, а той повертає результати його обробки. Ось приклад команди, що вимагає відправити по телефону 79299999994 текст «Привіт», переданий в кодуванні UTF-8, і повідомити про результати в форматі JSON (fmt = 3).

http://smsc.ru/sys/send.php?login=&amp;psw=&amp;phones=79299999994&amp;mes=Привет test & amp; charset = utf-8 & amp; fmt = 3

Додавання до цього запиту аргументу cost = 1 змусить сервіс підрахувати вартість відправки такого повідомлення (відправлення при цьому не відбудеться). А аргумент flash = 1 надає звичайному текстового повідомлення видовищності: воно буде продемонстровано одержувачу негайно, в якому б додатку він не знаходився і чим би не займався.

Деякі тонкощі є і тут. По-перше, пароль. Щоб не ганяти його по інтернету в відкриту, краще замінити пароль хешем MD5. «SMS-центр» допускає такий варіант. По-друге, Sender-ID. Оператори недовірливо ставляться до повідомлень безіменних відправників і раз у раз відмовляються їх доставляти. Цю проблему можна вирішити, скориставшись підписом Sender-ID, яка належить «SMS-центру», або зареєструвавши свою власну.

Для прийому СМС в сервісі пропонує два шляхи: Push і Pull. У першому випадку користувач може час від часу сам запитувати прийшли повідомлення у сервісу. Принцип той же, що і при відправці:

http://smsc.ru/sys/get.php?get_answers=1&amp;login=&amp;psw=&amp;charset=utf-8&amp;fmt=3 [{ "id": 20032761, "received": "21.03. 2015 12:03:58 "," phone ":" 79299999994 "," message ":" Привіт "," to_phone ":" 79684455555 "," sent ":" 21.03.2015 12:02:34 "}]

Щоб не завантажувати кожен раз всі повідомлення від початку часів, до запиту можна додати аргумент after_id і передавати в ньому ідентифікаційний номер останнього отриманого СМС.

У другому випадку можна доручити «SMS-центру» при отриманні повідомлень самостійно повідомляти про це веб-сервіс користувача. Для цього на ньому повинен бути реалізований відповідний обробник інформації. Виглядати він може, наприклад, так:

@ App.route ( '/ sms') def smsc_receiver (): phone_from = request.args [ 'phone'] phone_to = request.args [ 'to'] text = request.args [ 'mes'] return process_sms (phone_from, phone_to, text)

Наостанок варто згадати, що далеко не всяка автоматизована розсилка СМС легальна. Згідно із законом, відправник рекламних повідомлень повинен заручитися згодою одержувача і бути готовим доводити свою правоту. Абонент, який не хоче отримувати СМС, повинен бути негайно виключений зі списків розсилки. Крім того, є довгий список заборонених тем. Від порно, наркотиків, тероризму та інших передбачуваних речей краще триматися подалі. В іншому випадку можна нарватися на блокування телефонного номера, штрафи, а то і дещо гірше. Тобі це треба?

Правда, футуристичні статті, які малюють напхану датчиками техніку, рідко стосуються одного важливого питання: яким чином інформація з цих датчиків досягає сервера?
А якщо датчики встановлені, скажімо, на вантажному автомобілі або взагалі в чистому полі?
Тут, втім, виникає інше питання: як побудувати сервер, здатний взаємодіяти з такими пристроями?
Яким чином це зробити?
Чи підтримує наше пристрій цей спосіб?
Це можна перевірити за допомогою команди AT + CSCS =?
AT + CSCS =?
Повний список видасть команда AT + CMGL =?
AT + CMGL =?
Php?

Новости