Віримо в перемогу ЗСУ!
Працюємо з 09:00 до 18:00 Пн-Сб

Постановка задачі.

В цьому проекті подивимося на практичний приклад відправлення http get запиту за допомогою любительського GSM-модуля. Активація GPRS модуля та відправлення запиту по TCP буде відбуватись по натисканню на кнопку.

Для чого нам потрібні HTTP-запити через GPRS?

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

Так от, стосовно любительських мікроконтролерних проектів такі запити теж можуть бути вельми корисними. Уявіть, що в нас є деякий сайт в інтернеті. На цьому сайті ми можемо створити скрипт мовою PHP, який ми вставимо у текстовий файл та назвемо x.php. Під час звертання до цього файлу ззовні, наш скрипт буде виконувати операції, які ми в нього заклали.

Які ж це можуть бути операції: відправлення електронного листа (деякі мобільні оператори дозволяють через емейл відправляти sms); запис у текстовому файлі на сервері сайту; запис у базі даних на сервері сайту; внесення змін у запис бази даних; відіслати повідомлення у скайп; прийняти та зберегти фото... 

Можливість відправлення емейлу може бути цікавою для охоронної сигналізації та для довгоперіодичних повідомлень від контролера, наприклад "Полій мене, з любов'ю твій фікус".

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


Зберігання знімків з фотокамери корисно для охоронної сигналізації та для віддаленої візуальної оцінки ситуації на об'єкті, що представляє для нас цікавість.

Як працює HTTP-запит?

HTTP запит працює доволі просто - якщо відправимо нашому серверу в інтернеті набір інформації з попередньо визначеним синтаксисом, то він пришле нам у відповідь дані, які ми від нього запросили. Наприклад, говоримо йому: "сервер з доменом geekmatic.in.ua, пришли нам будь-ласка вміст веб-сторінки RF_radio_modul". Та він присилає нам гору текстової інформації, котру містить ця сторінка.

Але завантаження в контролер якоїсь веб-сторінки повністю нам буде цікавим тільки хіба що для парсингу даних з чужих сайтів. Таким чином ми можемо наприклад збирати дані про прогноз погоди з погодного сайту та виводити собі на LCD-екранчик.

А саме цікаве для нас в HTTP запиті ховається у можливості, при звертанні до веб-сторінки на нашому сервері, передати їй набір значень для змінних. Синтаксично це виглядає приблизно так

http://geekmatic.in.ua/sensors?sort=pd.name&order=ASC

Це так званий запит "GET". В ньому сторінці sensors ми передаємо значення змінної sort, що дорівнює "pd.name" та змінної order, що дорівнює "ASC". Таким же чином ми можемо передати наприклад значення змінної temperatura=32 або vlazhnost=60. Максимальна довжина тексту такого запиту обмежена налаштованою на сервері цифрою - зазвичай кілька тисяч байт, але через GPRS краще передавати GET-запити по-коротше. Даний модуль здатний передати 2000 байт. Для довгих запитів та для передачі файлів, у тому числі і фотографій, використовують POST запит, який не сильно відрізняється синтаксисом. У цьому проекті ми зупинимося поки-що тільки на GET запитах через GPRS.

Синтаксис стандартного GET запиту виглядає так

GET /page.php HTTP/1.1

або з передаваними даними

GET /sensors?sort=pd.name&order=ASC HTTP/1.1

В цьому проекті ми передамо HTTP GET запит зі зверненням до сторінки x.php на сервері geekmatic.in.ua. Моя сторінка, при звертанні до неї, відправить емейл на мою електронну скриньку та смс на мобільний (в оператора київстар можна активувати відповідну платну можливість приймати емейли на смс).

Файл x.php містить наступний скрипт:

Запит прийнято
<? mail("evgeniy@sautcom.kiev.ua", "Datchik dveri", "ALARM Khreschatik st. 1");  mail("38097XXXXXXX@sms.kyivstar.net", "Datchik dveri", "ALARM Khreschatik st. 1"); тут відправка смс через емейл
?>

При вдалому запиті до цього файлу, сервер поверне нам фразу "Запит прийнято" та відішле два електронних листа.

Що знадобиться для проекту?

Для проекту нам знадобиться GSM-модуль, на основі мікросхеми NEOWAY M590


Плата контролера Arduino UNO, а також джерело живлення 5 В (я використовував 5 В перетворювача USB 2.0 в TTL UART) та міні кнопка. Якщо підживити GPRS-модуль від виводу 5 В Arduino UNO, йому не буде вистачати потужності та він буде увесь час перезавантажуватись.

Схема підключення GSM GPRS модуля M590 до контролера Arduino UNO

Схема підключення показана на наступній картинці. Ваш GPRS модуль може відрізнятися від використаного в проекті. Тому знайдіть у документації відповідні позначення виводів та з'єднайте їх за схемою.


Кнопка підключається без будь-яких резисторів, так як ми її дискретний вхід підтягнемо внутрішнім резистором до плюса програмним способом. Arduino UNO можна живити й від USB-кабелю і тоді перетинка на вивід 5V не потрібна.

Не забуваємо підключити антену до модуля NEOWAY M590 та вставити в нього сімку GSM-оператора. При чому, якщо ви тільки-но її купили, то вона потребує активації роботи та можливо активації GPRS-інтернету. Краще всього її вставити у смартфон, що підтримує GPRS, та налаштувати зв'язок з інтернетом для цієї сім-карти. Тепер її сміливо можна вставляти у модуль M590 - усе повинно працювати.

Сам модуль ми не будемо увесь час тримати у робочому стані. Для економії енергії ми його будемо вмикати тільки при необхідності перед відправкою запиту на сайт.

Як відбувається процес передачі команд модулю від контролера для організації GET-запиту по GPRS?

Усі команди в модуль контролер буде передавати по програмному UART. Для цього ми з'єднали виводи RX та TX плати Arduino UNO з протилежними виводами TX та RX модуля M590.

GSM модуль керується наперед визначеним набором так званих АТ-команд. Самі прості з них ми випустимо тут із розгляду та зупинимося на командах, що стосуються безпосередньо TCP-протоколу, котрий і дозволить нам передавати та отримувати дані по GPRS, використовуючи HTTP GET запити.

Для початку необхідно подати команду підключення до оператора GPRS за його APN

AT+CGDCONT=1,"IP","www.ab.kyivstar.net"
відповіддю повинно бути OK

Далі подамо команду встановлення з'єднання за протоколом PPP

AT+XIIC=1
відповіддю повинно бути OK

Для перевірки отримання свого IP від оператора відішлемо

AT+XIIC?
відповіддю повинний бути не нульовий айпішник +XIIC:    1, 10.43.55.122

Далі пишемо IP сайту, котрий необхідно визначити за допомогою спеціальних веб-сервісів в інтернеті, та номер порту - 80.

AT+TCPSETUP=1,185.68.16.25,80

Встановлюємо з'єднання з сервером сайту та призначаємо цьому з'єднанню номер 1 (для даного модуля одночасних з'єднань може бути цілих два, під номером 0 або 1). Іще сюду необхідно увести довжину запиту, що передається, в байтах

AT+TCPSEND=1, 60
відповіддю буде >

Тільки тепер в нас з'являється можливість передати тіло самого запиту

GET /x.php HTTP/1.1\r\nHost: geekmatic.in.ua\r\n\r\n
Сервер повинний відповісти +TCPRECV та текст "Запит прийнято" з нашого PHP скрипта у файлі x.php

Завантаження програми в контролер

Наша програма повинна, по натисканню нами на кнопку, активувати GSM модуль подачею короткочасного сигналу на вхід BOOT, почекати ініціалізацію модуля в мережі оператора, подати АТ-команди щодо передачі HTTP-запиту на сайт, почекати відповідь від сервера та деактивувати GPRS модуль подачею сигналу на вхід BOOT.

Готовий текст програми для Arduino UNO виглядає наступним чином

#include <SoftwareSerial.h>
SoftwareSerial mySerial(6, 5); // RX, TX номери пінів Arduino UNO для підключення до модуля GSM NEOWAY M590
int buttonState = 0;
int lastButtonState = 0;
int knopka = 2; //номер піну для підключення кнопки, котра повинна замикати цей пін на нуль живлення
int bootGSM = 3; // номер піну для увімкнення модуля GSM void setup() { mySerial.begin(115200);
  Serial.begin(9600);
  pinMode(knopka, INPUT_PULLUP); //ініціалізація дискретного входу для кнопки та внутрішня підтяжка його на плюс живлення
  pinMode(bootGSM, OUTPUT); //вихідний пін для увімкнення/вимкнення GSM модуля
  
  digitalWrite(bootGSM, HIGH); //високий рівень на вхід BOOT модуля GSM для його вимкнення
}
void loop() {
  buttonState = digitalRead(knopka); //стан кнопки в даний момент
  
  if (buttonState < lastButtonState){ //якщо кнопка поміняла своє значення з одиниці на нуль
    digitalWrite(bootGSM, LOW); //увімкнути GSM модуль
    delay(500);
    digitalWrite(bootGSM, HIGH);
    delay(1000);
    sendAtCmd("ATE0", "+PBREADY", "", 30); //очікуємо ініціалізацію модуля
    sendAtCmd("AT+XISP=0", "OK", "ERROR", 1); 
    sendAtCmd("AT+CGDCONT=1,\"IP\",\"www.ab.kyivstar.net\"", "OK", "", 2); //підключаємося до оператора GPRS по його APN
    sendAtCmd("AT+XIIC=1", "OK", "", 1);
    sendAtCmd("AT+XIIC?", "OK", "+XIIC:    0, 0.0.0.0", 1); //перевіряємо отримання IP від оператора
    sendAtCmd("AT+TCPSETUP=1,185.68.17.25,80", "OK", "Error", 5); //сюди пишемо IP сайту (за ім'ям домену не вийде)
    String q = "GET /x.php HTTP/1.1\r\nHost: geekmatic.in.ua\r\n\r\n"; //тут уводимо шлях до необхідного файлу на web-сервері, а також уводимо ім'я домену сайту
    sendAtCmd("AT+TCPSEND=1," + String(q.length(), DEC), ">", "", 5);
    sendAtCmd(q + 0x0d, "+TCPRECV", "", 10); //відправлення запиту та очікування відповіді від сервера
    Serial.println(q);
    
    sendAtCmd("AT+TCPCLOSE=1", "OK", "Error", 1); //закриваємо TCP з'єднання номер 1
    
    digitalWrite(bootGSM, LOW); //вимкнути GSM модуль
    delay(500);
    digitalWrite(bootGSM, HIGH);
  }
  lastButtonState = buttonState;
  delay(50);
} //функція відправлення AT-команди в модем та діагностика відповіді
bool sendAtCmd(String at_send, String ok_answer, String err_answer, uint32_t wait_sec) {
  Serial.print("sendAtCmd(");
  Serial.print(at_send); 
  Serial.println(")");
  uint32_t exit_ms = millis() + wait_sec * 1000;
  String answer;
  ok_answer.toUpperCase();
  err_answer.toUpperCase();
  if (at_send != "") {
    mySerial.println(at_send);
  }
  answer = "";
  while (millis() < exit_ms) 
  {
    while (mySerial.available())
      answer += (char)mySerial.read();
  }
    Serial.println(answer);
    if (answer != "") {
      if (err_answer != "" && (answer.indexOf(err_answer) > -1)) {
        Serial.println("AT_ERR");
        return false;
      }
      else if (answer.indexOf(ok_answer) > -1) {
        Serial.println("AT_OK");
        return true;
      }
    }
  Serial.println("AT_TIMEOUT");
  return false;
}

Завантажуємо даний скрипт у контролер з поправкою на свій сайт та IP сервера.

Тестуємо відправлення GET запиту по GPRS

Підключаємо усе згідно схеми та натискаємо на кнопку. При цьому спостерігаємо як блимає світлодіод на модемі M590 під час його увімкнення.

Якщо увімкнути Монітор порта Arduino IDE, то можна спостерігати послідовність повідомлень від контролера та мати уяву про бурхливе спілкування між нашими чудо-платами.

При вдалому виконанні усіх директив контролера модулем GSM, у Моніторі порта отримаємо відповідь від сервера. Якщо ви просто звернулися до якоїсь веб-сторінки в інтернеті, то отримаєте у відповідь увесь текст сторінки у HTML-форматі. А я в результаті отримав відповідь "Запит прийнято" і тут же отримав емейл зі свого сайту та смс на мобілку. При повторному натисканні на кнопку запит повинний повторитися.

Висновки

Я давно хотів навчитися користуватись GPRS через GSM модем. Коли усе нарешті склалося та вийшло, я зрозумів, що не так усе і складно - просто ніхто не хоче ділитися інфою та публікувати правильний синтаксис в інтернеті.

На практиці HTTP запит вийшов такою ж надійною та не менш корисною штукою ніж SMS. Одразу в умі виникають безліч задумів по застосуванню цієї фічі. Хотілося би зібрати GPRS GPS-трекер для автівки та збирати дані про її пригоди на веб-сторінку.

GPRS при пересиланні невеликих об'ємів даних виходить на багато дешевше ніж SMS. UDP запитам та FTP я поки-що не бачу дієвого застосування. Хочеться спробувати відіслати фото з камери, використовуючи HTTP POST запит, але можливо краще одразу починати гратись з більш продвинутими GSM-модулями, такими як A6C.

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
3-осьовий акселерометр ADXL346Z

3-осьовий акселерометр ADXL346Z

Акселерометр - це датчик прискорення. Даний датчик вимірює статичне (гравітацію - нахил до земної пл..

160.78грн.

Модуль стабілізатора напруги 3,3 В

Модуль стабілізатора напруги 3,3 В

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

17.86грн.

Налаштування струму драйвера A4988

Налаштування струму драйвера A4988

Мікросхеми - драйвера крокових двигунів такі, як A4988, відрізняються від звичайних H-мостів, або по..

Блок живлення 12В 3А 36Вт

Блок живлення 12В 3А 36Вт

Блок живлення 12В 3А 36ВтНа вхід можна подавати змінну напругу в діапазоні 100...240ВДобре підходить..

284.20грн.

Лінійка розробника друкованих плат PCB

Лінійка розробника друкованих плат PCB

Лінійка PCB для наглядного представлення розмірів посадкових місць різних стандартів поверхневого мо..

62.36грн.