Эксперимент 67. Отправка данных в интернет

Мы уже умеем подключаться к WiFi сети или создавать собственную точку доступа. Поднимать свой веб- сервер, чтобы принимать команды или сообщать данные. Например, наш WiFi-термометр является типичным устройством интернета вещей. Это датчик, к которому можно получить доступ через интернет. Этот датчик может находиться на другом конце света, может находиться в теплице, в автомобиле. Он может измерять температуру какого-нибудь важного технологического оборудования, следить за соблюдением технологического процесса на производстве. Чтобы получить информацию с этого датчика к нему нужно обратиться.

Теперь мы попробуем сделать наоборот. Пусть наш термометр сам обращается на сервер в интернете и передает на него свои данные о температуре. На сервере эти данные будут сохраняться и мы, или другие пользователи интернета, смогут выйти на сайт и посмотреть данные, которые были ранее переданы туда.

Для этих целей воспользуемся известным интернет- сервисом для хранения данных с устройств интернета вещей dweet.io. Для наших целей нам даже не придется регистрироваться на этом сервисе. Достаточно просто передать на него данные и сервис их запомнит.

Для начала нам нужно просто научиться соединяться с интернет-сервисом и передавать туда хоть какие-то данные. Поэтому пока не будем собирать термометр, а ограничимся просто передачей константы.

Программный код эксперимента

Exp67.ino
  1. #include <ESP8266WiFi.h>
  2. #include <WiFiClient.h>
  3. #include <ESP8266HTTPClient.h>
  4.  
  5. #define WIFI_NAME "Имя WiFi сети"
  6. #define WIFI_PASSWORD "Пароль"
  7.  
  8. void httpGet(String url) {
  9. WiFiClient client;
  10. HTTPClient http;
  11.  
  12. if (http.begin(client, url)) {
  13. Serial.print("[HTTP] GET\n");
  14. int httpCode = http.GET();
  15. if (httpCode > 0) {
  16. Serial.printf("[HTTP] GET code: %d\n", httpCode);
  17. if (httpCode == HTTP_CODE_OK) {
  18. String payload = http.getString();
  19. Serial.println(payload);
  20. } else {
  21. Serial.printf("[HTTP] GET failed, error: %s\n", http.errorToString(httpCode).c_str());
  22. }
  23. http.end();
  24. } else {
  25. Serial.println("[HTTP] Unable to connect");
  26. }
  27. }
  28. }
  29.  
  30. void setup() {
  31. Serial.begin(9600);
  32. Serial.println();
  33.  
  34. Serial.print("Connecting to WiFi");
  35. WiFi.mode(WIFI_STA);
  36. WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
  37. while (WiFi.status() != WL_CONNECTED) {
  38. Serial.print(".");
  39. delay(500);
  40. }
  41. Serial.println();
  42. Serial.println("WiFi connected");
  43. Serial.print("IP address: ");
  44. Serial.println(WiFi.localIP());
  45.  
  46. String device_name = "PinLabIoTSensor010520";
  47. float temp = 22.9;
  48.  
  49. httpGet("http://dweet.io/dweet/for/" + device_name + "?temp=" + String(temp));
  50. }
  51.  
  52. void loop() {
  53. }

Первым делом нам необходимо подключиться к WiFi сети с доступом в интернет. После этого мы готовы к отправке данных. Для этого нам потребуется библиотеки для работы WiFiClient и ESP8266HTTPClient

Чтобы передать данные на сервер нам нужно знать его адрес. В нашем случае адрес http://dweet.io/dweet/for/DEVICENAME?temp=TEMP. Вместо DEVICENAME нужно подставить свое имя устройства. Имя может быть любым, но желательно придумать уникальное. Такое, которое точно еще не использовано. Мы придумали PinLabIoTSensor010520. Вам необходимо придумать свое, например IvanovIvanSPBSensor123.

После знака ? передаются данные. В нашем случае это temp=TEMP, где temp это имя переменной, а TEMP это ее значение, которое необходимо заменить на реальное.

Запишем имя нашего устройства и значение температуры в переменные для удобства дальнейшего их использования:

  1. String device_name = "PinLabIoTSensor010520";
  2. float temp = 22.9;

Теперь формируем адрес в интернете (URL), по которому мы будем обращаться с параметрами, которые мы будем передавать:

  1. httpGet("http://dweet.io/dweet/for/" + device_name + "?temp=" + String(temp));

Функция http_get принимает один параметра URL. Функция обращается по указанному адресу, получает ответ от сервера и печатает ответ в последовательный порт.

Код функции http_get достаточно сложен, он реализует формирование HTTP запроса и разбор HTTP ответа . Чтобы понять эту функцию необходимо разбираться в протоколе HTTP. Но это не обязательно для того, чтобы просто ей пользоваться. Главное понимать, что с ее помощью мы формируем запрос к серверу, расположенному по адресу url и получаем ответ.

Запустим данную программу. Она отправит данные в интернет- сервис dweet.io. Чтобы посмотреть эти данные в сервисе необходимо перейти по ссылке вида http://dweet.io/follow/DEVICENAME, где DEVICENAME имя устройства, указанное в программе. В нашем случае это http://dweet.io/follow/PinLabIoTSensor010520

Видим имя нашей переменной temp и ее значение 22.9. Значит данные были успешно переданы в интернет.