Мы с каждым разом разбираем все более интересные применения 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 с возможностью редиректа. Загружу скетч в контроллер.
С первого раза получаем IP. Это хороший знак.
Сервер вернул код 200 и 498 байт данных.
Тут есть температура -11 градусов цельсия. Да, у меня сейчас настоящая зима и холодно.
А вот и относительная влажность воздуха. Всё как в браузере.
Каждый из протестированных запросов согласно скетчу будет активироваться через каждые 10 секунд. Ваша задача продолжить развитие этого скетча под свои задачи. Чтобы запрос запускался только тогда, когда вам это нужно.
Если наберется достаточно подписок и лайков, то смонтирую видео о том, как при помощи SIM800 отправлять данные с датчиков в таблицы на сайт google spreadsheets. И автоматически накапливать там эти данные.
Некоторые сайты с HTTPS могут игнорировать запросы по каким-либо причинам – или версия протокола SSL у SIM800 может быть устаревшей или потребуется подгружать файл клиентского сертификата. Эту проблему можно диагностировать по коду ответа сервера. Если приходит код 605 или 606, значит серверу не нравится ваш запрос относительно SSL. Тогда советую почитать pdf под названием SIM800 Series SSL Application Note.
Как вы могли заметить, HTTP-запросы через GPRS довольно просто организовываются. Бывают неудачные попытки, но их можно диагностировать и запускать повторную попытку. GET-запросом можно, как считывать данные открытых API, или содержимое веб-страниц, так и отправлять данные датчиков на свой сайт, и получать управляющие команды и настройки из своего сайта в контроллер.
Текст программы как всегда будет выложен на сайте. Шилды можно заказать глобально на сайте etsy.com или в Украине на geekmatic.in.ua Ссылки под видео. Так же буду рад вашим вопросам в комментариях!