Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp67 [2024/12/05 17:43] – создано labuser30products:laboratory_iot_c:exp67 [2024/12/16 15:00] (текущий) – [Программный код эксперимента] labuser30
Строка 9: Строка 9:
 Для начала нам нужно просто научиться соединяться с интернет-сервисом и передавать туда хоть какие-то данные. Поэтому пока не будем собирать термометр, а ограничимся просто передачей константы. Для начала нам нужно просто научиться соединяться с интернет-сервисом и передавать туда хоть какие-то данные. Поэтому пока не будем собирать термометр, а ограничимся просто передачей константы.
  
-<file python Exp67.py[enable_line_numbers="2", start_line_numbers_at="1"]> +==== Программный код эксперимента ==== 
-from machine import Pin +<file arduino Exp67.ino[enable_line_numbers="2", start_line_numbers_at="1"]> 
-import network +#include <ESP8266WiFi.h> 
-import gc +#include <WiFiClient.h> 
-import time +#include <ESP8266HTTPClient.h>
-import socket+
  
-_init() +#define WIFI_NAME     "Имя WiFi сети" 
-gc.collect()+#define WIFI_PASSWORD "Пароль"
  
 +void httpGet(String url) {
 +  WiFiClient client;
 +  HTTPClient http;
  
-wlan_id = "Имя WiFi сети+  if (http.begin(client, url)) {   
-wlan_pass = "Пароль"+    Serial.print("[HTTP] GET\n"); 
 +    int httpCode http.GET(); 
 +    if (httpCode > 0) { 
 +      Serial.printf("[HTTP] GET code: %d\n", httpCode); 
 +      if (httpCode == HTTP_CODE_OK) { 
 +        String payload = http.getString(); 
 +        Serial.println(payload); 
 +      } else { 
 +        Serial.printf("[HTTP] GET failed, error: %s\n", http.errorToString(httpCode).c_str()); 
 +      } 
 +      http.end(); 
 +    } else { 
 +      Serial.println("[HTTP] Unable to connect"); 
 +    } 
 +  } 
 +
 +  
 +void setup() { 
 +  Serial.begin(9600); 
 +  Serial.println(); 
 +   
 +  Serial.print("Connecting to WiFi");  
 +  WiFi.mode(WIFI_STA);                                          
 +  WiFi.begin(WIFI_NAME, WIFI_PASSWORD); 
 +  while (WiFi.status() !WL_CONNECTED) { 
 +    Serial.print("."); 
 +    delay(500); 
 +  } 
 +  Serial.println(); 
 +  Serial.println("WiFi connected"); 
 +  Serial.print("IP address: "); 
 +  Serial.println(WiFi.localIP());
  
 +  String device_name = "PinLabIoTSensor010520";
 +  float temp = 22.9;
  
-wlan = network.WLAN(network.STA_IF) +  httpGet("http://dweet.io/dweet/for/" + device_name + "?temp=" + String(temp)); 
-wlan.active(True) +}
-wlan.connect(wlan_id, wlan_pass+
-time.sleep(1)+
  
- +void loop() { 
-while wlan.isconnected() == False: +}
-    pass +
- +
-print('Device IP:', wlan.ifconfig()[0]) +
- +
- +
- +
-def http_get(url, port=80): +
-    _, _, host, path = url.split('/', 3) +
-    addr = socket.getaddrinfo(host, port)[0][-1] +
-     +
-    s = socket.socket() +
-    s.connect(addr) +
-    s.send(bytes('GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n' % (path, host), 'utf8')) +
- +
-    text = '' +
- +
-    while True: +
-        data = s.recv(100) +
-        if data: +
-            text += str(data, 'utf8'+
-            pass +
-        else: +
-            a = text.split('\r\n\r\n', 2)[1] +
-            return a +
-            break +
- +
- +
-deviceName = 'PinLabIoTSensor010520' +
-temp = 22.9 +
- +
-data = http_get('http://dweet.io/dweet/for/' + deviceName + '?temp=' + str(temp))+
 </file> </file>
  
-Первым делом нам необходимо подключиться к WiFi сети с доступом в интернет. После этого мы готовы к отправке данных. Для этого нам потребуется библиотека для работы с сокетами ''socket''. Сетевые сокеты — это интерфейс, который по сути представляет собой совокупность адреса в сети и используемого порта.  +Первым делом нам необходимо подключиться к WiFi сети с доступом в интернет. После этого мы готовы к отправке данных. Для этого нам потребуется библиотеки для работы ''WiFiClient'' и ''ESP8266HTTPClient'' 
- +
-<WRAP center round info 60%> +
-[[https://lecturesnet.readthedocs.io/net/low-level/ipc/socket/intro.html|Подробнее о сокетах]] +
-</WRAP>+
  
-Чтобы передать данные на сервер нам нужно знать его адрес и порт. В нашем случае адрес http://dweet.io/dweet/for/DEVICENAME?temp=TEMP а порт 80 (стандартный порт для протокола HTTP) +Чтобы передать данные на сервер нам нужно знать его адрес. В нашем случае адрес http://dweet.io/dweet/for/DEVICENAME?temp=TEMP. Вместо DEVICENAME нужно подставить свое имя устройства. Имя может быть любым, но желательно придумать уникальное. Такое, которое точно еще не использовано. Мы придумали PinLabIoTSensor010520. Вам необходимо придумать свое, например IvanovIvanSPBSensor123.
-Вместо DEVICENAME нужно подставить свое имя устройства. Имя может быть любым, но желательно придумать уникальное. Такое, которое точно еще не использовано. Мы придумали PinLabIoTSensor010520. Вам необходимо придумать свое, например IvanovIvanSPBSensor123.+
  
 После знака ''?'' передаются данные. В нашем случае это temp=TEMP, где ''temp'' это имя переменной, а ''TEMP'' это ее значение, которое необходимо заменить на реальное. После знака ''?'' передаются данные. В нашем случае это temp=TEMP, где ''temp'' это имя переменной, а ''TEMP'' это ее значение, которое необходимо заменить на реальное.
  
 Запишем имя нашего устройства и значение температуры в переменные для удобства дальнейшего их использования: Запишем имя нашего устройства и значение температуры в переменные для удобства дальнейшего их использования:
-<code python[enable_line_numbers="2", start_line_numbers_at="49"]> +<code python[enable_line_numbers="2", start_line_numbers_at="46"]> 
-deviceName 'PinLabIoTSensor010520' +  String device_name "PinLabIoTSensor010520"; 
-temp = 22.9+  float temp = 22.9;
 </code> </code>
  
 Теперь формируем адрес в интернете (URL), по которому мы будем обращаться с параметрами, которые мы будем передавать: Теперь формируем адрес в интернете (URL), по которому мы будем обращаться с параметрами, которые мы будем передавать:
-<code python[enable_line_numbers="2", start_line_numbers_at="52"]> +<code arduino[enable_line_numbers="2", start_line_numbers_at="49"]> 
-data = http_get('http://dweet.io/dweet/for/deviceName '?temp=str(temp))+  httpGet("http://dweet.io/dweet/for/device_name "?temp=String(temp));
 </code> </code>
  
-Функция ''http_get'' принимает два параметраURL и порт (по умолчанию 80). Функция обращается по указанному адресу, получает ответ от сервера и возвращает его в качестве ответа. В нашем случае ответ не требуется, мы просто передаем данные.+Функция ''http_get'' принимает один параметра URL. Функция обращается по указанному адресу, получает ответ от сервера и печатает ответ в последовательный порт.
  
 Код функции ''http_get'' достаточно сложен, он реализует формирование HTTP запроса и разбор HTTP ответа . Чтобы понять эту функцию необходимо разбираться в протоколе HTTP. Но это не обязательно для того, чтобы просто ей пользоваться. Главное понимать, что с ее помощью мы формируем запрос к серверу, расположенному по адресу url и получаем ответ. Код функции ''http_get'' достаточно сложен, он реализует формирование HTTP запроса и разбор HTTP ответа . Чтобы понять эту функцию необходимо разбираться в протоколе HTTP. Но это не обязательно для того, чтобы просто ей пользоваться. Главное понимать, что с ее помощью мы формируем запрос к серверу, расположенному по адресу url и получаем ответ.