Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:laboratory_iot:exp67 [2021/04/25 18:51] 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]]. Для наших целей нам даже не придется регистрироваться на этом сервисе. Достаточно просто передать на него данные и сервис их запомнит.
 +
 +Для начала нам нужно просто научиться соединяться с интернет-сервисом и передавать туда хоть какие-то данные. Поэтому пока не будем собирать термометр, а ограничимся просто передачей константы.
 +
 +==== Программный код эксперимента ====
 +<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. Значит данные были успешно переданы в интернет.