Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:laboratory_iot:exp67 [2021/04/25 18:52] labuser29products:laboratory_iot:exp67 [2024/12/05 17:44] (текущий) labuser30
Строка 1: Строка 1:
 ===== Эксперимент 67. Отправка данных в интернет ===== ===== Эксперимент 67. Отправка данных в интернет =====
  
-Мы уже умеем подключаться к WiFi сети или создавать собственную точку доступа. Поднимать свой веб- сервер, чтобы принимать команды или сообщать данные. Например, наш [[products:laboratory_iot:exp65|WiFi- термометр]] является типичным устройством интернета вещей. Это датчик, к которому можно получить доступ через интернет. Этот датчик может находиться на другом конце света, может находиться в теплице, в автомобиле. Он может измерять температуру какого нибудь важного технологического оборудования, следить за соблюдением технологического процесса на производстве. Чтобы получить информацию с этого датчика к нему нужно обратиться. +Мы уже умеем подключаться к WiFi сети или создавать собственную точку доступа. Поднимать свой веб- сервер, чтобы принимать команды или сообщать данные. Например, наш [[products:laboratory_iot:exp65|WiFi-термометр]] является типичным устройством интернета вещей. Это датчик, к которому можно получить доступ через интернет. Этот датчик может находиться на другом конце света, может находиться в теплице, в автомобиле. Он может измерять температуру какого-нибудь важного технологического оборудования, следить за соблюдением технологического процесса на производстве. Чтобы получить информацию с этого датчика к нему нужно обратиться. 
  
 Теперь мы попробуем сделать наоборот. Пусть наш термометр сам обращается на сервер в интернете и передает на него свои данные о температуре. На сервере эти данные будут сохраняться и мы, или другие пользователи интернета, смогут выйти на сайт и посмотреть данные, которые были ранее переданы туда. Теперь мы попробуем сделать наоборот. Пусть наш термометр сам обращается на сервер в интернете и передает на него свои данные о температуре. На сервере эти данные будут сохраняться и мы, или другие пользователи интернета, смогут выйти на сайт и посмотреть данные, которые были ранее переданы туда.
  
-Для этих целей воспользуемся известным интернет- сервисом для хранения данных с устройств интернета вещей [[http://dweet.io/|dweet.io]]+Для этих целей воспользуемся известным интернет- сервисом для хранения данных с устройств интернета вещей [[http://dweet.io/|dweet.io]]. Для наших целей нам даже не придется регистрироваться на этом сервисе. Достаточно просто передать на него данные и сервис их запомнит. 
 + 
 +Для начала нам нужно просто научиться соединяться с интернет-сервисом и передавать туда хоть какие-то данные. Поэтому пока не будем собирать термометр, а ограничимся просто передачей константы. 
 + 
 +==== Программный код эксперимента ==== 
 +<file python Exp67.py[enable_line_numbers="2", start_line_numbers_at="1"]> 
 +from machine import Pin 
 +import network 
 +import gc 
 +import time 
 +import socket 
 + 
 +_init() 
 +gc.collect() 
 + 
 + 
 +wlan_id = "Имя WiFi сети" 
 +wlan_pass = "Пароль" 
 + 
 + 
 +wlan = network.WLAN(network.STA_IF) 
 +wlan.active(True) 
 +wlan.connect(wlan_id, wlan_pass) 
 +time.sleep(1) 
 + 
 + 
 +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> 
 + 
 +Первым делом нам необходимо подключиться к WiFi сети с доступом в интернет. После этого мы готовы к отправке данных. Для этого нам потребуется библиотека для работы с сокетами ''socket''. Сетевые сокеты — это интерфейс, который по сути представляет собой совокупность адреса в сети и используемого порта.  
 + 
 +<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).  
 +Вместо DEVICENAME нужно подставить свое имя устройства. Имя может быть любым, но желательно придумать уникальное. Такое, которое точно еще не использовано. Мы придумали PinLabIoTSensor010520. Вам необходимо придумать свое, например IvanovIvanSPBSensor123. 
 + 
 +После знака ''?'' передаются данные. В нашем случае это temp=TEMP, где ''temp'' это имя переменной, а ''TEMP'' это ее значение, которое необходимо заменить на реальное. 
 + 
 +Запишем имя нашего устройства и значение температуры в переменные для удобства дальнейшего их использования: 
 +<code python[enable_line_numbers="2", start_line_numbers_at="49"]> 
 +deviceName = 'PinLabIoTSensor010520' 
 +temp = 22.9 
 +</code> 
 + 
 +Теперь формируем адрес в интернете (URL), по которому мы будем обращаться с параметрами, которые мы будем передавать: 
 +<code python[enable_line_numbers="2", start_line_numbers_at="52"]> 
 +data = http_get('http://dweet.io/dweet/for/' + deviceName + '?temp=' + str(temp)) 
 +</code> 
 + 
 +Функция ''http_get'' принимает два параметра: URL и порт (по умолчанию 80). Функция обращается по указанному адресу, получает ответ от сервера и возвращает его в качестве ответа. В нашем случае ответ не требуется, мы просто передаем данные. 
 + 
 +Код функции ''http_get'' достаточно сложен, он реализует формирование HTTP запроса и разбор HTTP ответа . Чтобы понять эту функцию необходимо разбираться в протоколе HTTP. Но это не обязательно для того, чтобы просто ей пользоваться. Главное понимать, что с ее помощью мы формируем запрос к серверу, расположенному по адресу url и получаем ответ. 
 + 
 +Запустим данную программу. Она отправит данные в интернет- сервис dweet.io. Чтобы посмотреть эти данные в сервисе необходимо перейти по ссылке вида http://dweet.io/follow/DEVICENAME, где ''DEVICENAME'' имя устройства, указанное в программе. В нашем случае это http://dweet.io/follow/PinLabIoTSensor010520 
 + 
 +{{ :products:esp-iot:2021-04-25_19-45-16.png?direct&600 |}} 
 + 
 + 
 +Видим имя нашей переменной ''temp'' и ее значение 22.9. Значит данные были успешно переданы в интернет.