Привіт друзі! Ми з кожним разом знаємо все більш цікаві застосування GSM-модуля SIM800. На цей раз навчимося, як робити HTML GET запити через зв'язок GPRS. Я покажу приклад простого скетчу з GET-запитом до безкоштовного налагоджувального сайту. Перевіримо стандартні можливості GPRS-модуля під час роботи з протоколом HTTPS. Отримаємо точний час із інтернету через запити до відповідного API. А також надішлемо запити до погодного API і дізнаємося з даних глобального інтернету, яка в мене зараз температура та вологість повітря на вулиці.
Підпишіться на мій канал прямо зараз, щоб не пропустити цікавих випусків у майбутньому і підтримайте мої старання лайком.
Як завжди використовуємо в'язку Arduino NANO плюс SIM800L. І для зручності монтажу я встановив їх у свій шилд. Він забезпечує живлення 4,2 для GSM-модуля, а так само узгодження логічних сигналів 3,3 на 5В.
Але ви можете виконати монтаж і за своїм, згідно з цією схемою. Детальніше опис схеми можна переглянути у перших двох відео на цю тему.


Рекомендації виробника SIM800 для організації HTTP-запитів представлені в наступному PDF-файлі.
Це інструкція для різних моделей GSM-мікросхем. Останнє оновлення тут робили 2020 року. Але прошивка нашого модуля востаннє оновлювалася десь у 2016 році. Тому нові функції можуть не працювати.
Тут зібрані рекомендації щодо використання GET, POST та HEAD – запитів на HTTP-протоколі. Також описана робота з FTP-протоколом.
Для реалізації поставлених завдань нам знадобляться наступні набори команд.
На основі програми з попереднього відео я накидав наступні рядки відповідно до рекомендованих наборів команд. Тут у вас може відрізнятись лише назва APN вашого GPRS-оператора. У мене ця назва - "Internet".
#include <SoftwareSerial.h>
SoftwareSerial SIM800serial (2, 3);
#define OK 1
#define NOTOK 2
#define TIMEOUT 3
String txt;
void setup() {
pinMode(5, OUTPUT);
digitalWrite(5, HIGH); //SIM800 ON only for this module
Serial.begin(9600);
SIM800serial.begin(9600);
delay(5000);
SIM800command("AT", "OK", "ERROR", 500, 5);
}
void loop() {
SIM800command("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"", "OK", "ERROR", 2000, 1); //Set bearer parameters
SIM800command("AT+SAPBR=3,1,\"APN\",\"internet\"", "OK", "ERROR", 2000, 1); //Set bearer parameters
SIM800command("AT+SAPBR=1,1", "OK", "ERROR", 5000, 1); //To open a GPRS context
SIM800command("AT+SAPBR=2,1", "OK", "ERROR", 5000, 1); ///To query the GPRS context
SIM800command("AT+HTTPINIT", "OK", "ERROR", 30000, 1); //Initialize HTTP Service
SIM800command("AT+HTTPPARA=\"CID\",1", "OK", "ERROR", 10000, 1); //Bearer profile identifier
//SIM800command("AT+HTTPPARA=\"URL\",\"httpbin.org/get?humidity=54.03&temp=32.76\"", "OK", "ERROR", 20000, 1);//HTTP client URL
//SIM800command("AT+HTTPPARA=\"URL\",\"worldtimeapi.org/api/timezone/Europe/Kyiv\"", "OK", "ERROR", 20000, 1);//HTTP client URL
SIM800command("AT+HTTPPARA=\"URL\",\"api.openweathermap.org/data/2.5/weather?lat=50.45&lon=30.52&units=metric&appid=ce8fddffd4e813706d35881313af380c\"", "OK", "ERROR", 20000, 1); //HTTP client URL
SIM800command("AT+HTTPPARA=\"REDIR\",1", "OK", "ERROR", 5000, 1); //Set the redirection
SIM800command("AT+HTTPSSL=1", "OK", "ERROR", 5000, 1); //Enable SSL function
SIM800command("AT+HTTPACTION=0", "0,200,", "ERROR", 20000, 1); //HTTP Method 0-GET; 1-POST; 2-HEAD
SIM800command("AT+HTTPREAD", "HTTPREAD", "ERROR", 20000, 1); //Read the HTTP Server Response
SIM800command("AT+HTTPTERM", "HTTPTERM", "ERROR", 20000, 1); //Terminate HTTP Service
SIM800command("AT+SAPBR=0,1", "+SAPBR:", "ERROR", 2000, 1); //Close bearer
delay(10000);
}
byte SIM800command(String command, String response1, String response2, uint16_t timeOut, uint16_t repetitions) {
byte returnValue = NOTOK;
byte countt = 0;
while (countt < repetitions && returnValue != OK) {
SIM800serial.println(command);
if (SIM800waitFor(response1, response2, timeOut) == OK) {
returnValue = OK;
} else {returnValue = NOTOK;}
countt++;
}
return returnValue;
}
byte SIM800waitFor(String response1, String response2, uint16_t timeOut) {
uint16_t entry = 0;
uint16_t count = 0;
String reply = SIM800read();
byte retVal = 99;
do {
reply = SIM800read();
delay(1);
entry ++;
} while ((reply.indexOf(response1) + reply.indexOf(response2) == -2) && entry < timeOut );
if (entry >= timeOut) {
retVal = TIMEOUT;
} else {
if (reply.indexOf(response1) + reply.indexOf(response2) > -2) retVal = OK;
else retVal = NOTOK;
}
return retVal;
}
String SIM800read() {
String reply = "";
if (SIM800serial.available()) {
reply = SIM800serial.readString();
}
if (reply!=""){
Serial.print("Reply: ");
Serial.println(reply);
txt = reply;
}
return reply;
}
У команді HTTPPARA URL потрібно писати посилання на конкретний сайт із усіма атрибутами GET-запиту. Сюди передаються дані, які ви бажаєте передати на WEB-сервер.
Команда HTTPACTION надсилає запит і повертає код відповіді сервера.
Команда HTTPREAD повертає відповідь сервера як тексту HTML, чи JSON, чи інших.
Давайте покажу перший сайт, з яким ми обміняємося даними. Це найпростіший безкоштовний тестовий сайт. Тут ми в адресному рядку вводимо дві змінні, що нібито передають значення вологості та температури. У відповідь на запит отримуємо текстову відповідь у вигляді структури JSON, на початку якої бачимо наші передані змінні. Це дуже зручний спосіб для налагодження HTML запитів під час роботи з SIM800.
Завантажую скетч із цим HTTP-запитом у контролер Arduino Nano.
Запускаю монітор порту.
Команда AT+SAPBR повернула IP адресу нашого пристрою у глобальному інтернеті – отже, підключення має працювати.
HTTPACTION повернуло код 200, який означає вдалий обмін даними із сервером. Тут цифра 331 означає розмір відповіді сервера в байтах.
За командою HTTPREAD отримуємо вміст відповіді. Тут наші тестові змінні з вологістю та температурою. А також службові дані HTTP. У параметрі url бачимо заголовок http. А якщо нам потрібно зробити запит до сайту із заголовком https, тобто з SSL-шифруванням, який ігнорує запити без SSL-шифрування. Для цього розробники SIM800 передбачили кілька інструментів, два основні з яких хочу вам показати.
Розкоментуємо два рядки скетчу. Команда HTTPSSL=1 активує SSL. І всі запити будуть виконуватись із заголовком HTTPS. Якщо вставити нуль, функцію SSL буде вимкнено.
А команда HTTPPARA REDIR встановлює дозвіл редиректу під час запитів. Воно необхідне, наприклад, для запитів до google-макросів.
Завантажую скетч до Nano.
Замість IP нулі - значить, підключення поки не вдалося.
І запит HTTPACTION повернув помилку 601. Чекаємо на наступну спробу.
IP отримали.
Редирект та SSL активовані.
Сервер радісно видав код 200 та 332 байти з даними.
А найголовніше, що, судячи з рядка url, ми звернулися до сервера через https, що потрібно перевірити. Так ми навчилися робити HTTP-запити до глобального налагоджувального інтернет-сайту за допомогою Arduino та SIM800. Тепер пропоную потренуватись отримувати час інтернету за допомогою API.
Ось приклад запиту в браузері для доступу до API, яке повертає структуру JSON з датою та часом за заданим регіоном.
Тепер я у скетчі розкоментую цей запит та оновлю програму у контролері. Функція SSL залишається активною.
При першій спробі IP адреса ми не отримуємо і запит не надсилається.
При другій спробі IP адресу отримуємо, але сервер спустився помилкою 606. Це означає проблему з SSL.
Тепер закоментую активацію SSL і дозвіл на редирект, і завантажу нову програму в контролер.
З другої спроби запит обробляється успішно, отримуємо код 200 і з сервера прилітають точні дата і час. Причому клієнтський IP з відповіді сервера не співпадає з тим, що нам нібито привласнив GPRS оператор, але нам це не важливо. Головне, що ми вже навчили свою SIM800 дізнаватися про час Інтернету за допомогою WEB сервісу.
Тепер пропоную протестувати роботу з погодним API. Вам потрібно зареєструватися на цьому сайті та отримати ключ доступу. Також я попередньо дізнався приблизні географічні координати свого міста. Це легко гуглиться для будь-якого великого населеного пункту планети. У запит потрібно вставити довготу та широту координати, ключ доступу, одиниці вимірів – я вибрав метричну систему.
Перевіримо цей запит у браузері.
API повертає температуру повітря та відносну вологість. Також безліч інших метео-даних.
Все згідно з координатою мого міста.
Розкоментую погодний запит та активую SSL з можливістю редиректу. Завантажу скетч у контролер.
З першого разу отримуємо ІР. Це хороший знак.
Сервер повернув код 200 та 498 байт даних.
Тут є температура -11 градусів. Так, у мене зараз справжня зима та холодно.
А ось і відносна вологість повітря. Все як у браузері.
Кожен із протестованих запитів згідно скетчу активуватиметься через кожні 10 секунд. Ваше завдання – продовжити розвиток цього скетчу під свої завдання. Щоб запит запускався лише тоді, коли це потрібно.
Якщо набереться достатньо передплат і лайків, то змонтую відео про те, як за допомогою SIM800 надсилати дані з датчиків у таблиці на сайт google spreadsheets. І автоматично накопичувати там ці дані.
Деякі сайти з HTTPS можуть ігнорувати запити з будь-яких причин - або версія протоколу SSL SIM800 може бути застарілою або потрібно підвантажувати файл клієнтського сертифіката. Цю проблему можна діагностувати за кодом відповіді сервера. Якщо надходить код 605 або 606, серверу не подобається ваш запит щодо SSL. Тоді раджу почитати PDF під назвою SIM800 Series SSL Application Note.
Як ви помітили, HTTP-запити через GPRS досить просто організовуються. Бувають невдалі спроби, але їх можна діагностувати та запускати повторну спробу. GET-запитом можна, як зчитувати дані відкритих API, або вміст веб-сторінок, так і відправляти дані датчиків на свій сайт, і отримувати команди та налаштування з свого сайту в контролер.
Текст програми, як завжди, буде викладений на сайті. Шилди можна замовити глобально на сайті www.etsy.com або в Україні на geekmatic.in.ua Посилання під відео. Також буду радий вашим питанням у коментарях!
Бажаю вам вдалих експериментів та розвитку. Підтримуйте мій канал і до швидкої зустрічі!
Arduino - що це таке?
Arduino це недорога, доступна для покупки електронна плата з мікроконтролером та виводами входів-вих..
ESP32 та Telegram-бот: віддалене керування через інтернет
ESP32 та Telegram-бот: віддалене керування через інтернет Мікроконтролер ESP32 має вбудований W..
Модуль павербанка 4,2В на 2 USB виходи
До цього модуля потрібно тільки підключити літій-іонний акумулятор 3,7-4,2В, закрити в корпус і гото..
133.25грн.
Ніжки для лазерного гравера CNC 4 шт. с кріпленням
Ніжки з МДФ для побудови CNC лазерного гравера. Виконують роль власне ніжок, а також повноцінного кр..
179.78грн.
Шестерня для зубчатого ременю на 60 зубців під вісь 8 мм
Використовується для передачі та редукції обертаючого моменту від двигуна до вісі 8 ммКількість зубц..
148.24грн.





