===== Эксперимент 67. Отправка данных в интернет =====
Мы уже умеем подключаться к WiFi сети или создавать собственную точку доступа. Поднимать свой веб- сервер, чтобы принимать команды или сообщать данные. Например, наш [[products:laboratory_iot:exp65|WiFi-термометр]] является типичным устройством интернета вещей. Это датчик, к которому можно получить доступ через интернет. Этот датчик может находиться на другом конце света, может находиться в теплице, в автомобиле. Он может измерять температуру какого-нибудь важного технологического оборудования, следить за соблюдением технологического процесса на производстве. Чтобы получить информацию с этого датчика к нему нужно обратиться.
Теперь мы попробуем сделать наоборот. Пусть наш термометр сам обращается на сервер в интернете и передает на него свои данные о температуре. На сервере эти данные будут сохраняться и мы, или другие пользователи интернета, смогут выйти на сайт и посмотреть данные, которые были ранее переданы туда.
Для этих целей воспользуемся известным интернет- сервисом для хранения данных с устройств интернета вещей [[http://dweet.io/|dweet.io]]. Для наших целей нам даже не придется регистрироваться на этом сервисе. Достаточно просто передать на него данные и сервис их запомнит.
Для начала нам нужно просто научиться соединяться с интернет-сервисом и передавать туда хоть какие-то данные. Поэтому пока не будем собирать термометр, а ограничимся просто передачей константы.
==== Программный код эксперимента ====
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))
Первым делом нам необходимо подключиться к WiFi сети с доступом в интернет. После этого мы готовы к отправке данных. Для этого нам потребуется библиотека для работы с сокетами ''socket''. Сетевые сокеты — это интерфейс, который по сути представляет собой совокупность адреса в сети и используемого порта.
[[https://lecturesnet.readthedocs.io/net/low-level/ipc/socket/intro.html|Подробнее о сокетах]]
Чтобы передать данные на сервер нам нужно знать его адрес и порт. В нашем случае адрес http://dweet.io/dweet/for/DEVICENAME?temp=TEMP а порт 80 (стандартный порт для протокола HTTP).
Вместо DEVICENAME нужно подставить свое имя устройства. Имя может быть любым, но желательно придумать уникальное. Такое, которое точно еще не использовано. Мы придумали PinLabIoTSensor010520. Вам необходимо придумать свое, например IvanovIvanSPBSensor123.
После знака ''?'' передаются данные. В нашем случае это temp=TEMP, где ''temp'' это имя переменной, а ''TEMP'' это ее значение, которое необходимо заменить на реальное.
Запишем имя нашего устройства и значение температуры в переменные для удобства дальнейшего их использования:
deviceName = 'PinLabIoTSensor010520'
temp = 22.9
Теперь формируем адрес в интернете (URL), по которому мы будем обращаться с параметрами, которые мы будем передавать:
data = http_get('http://dweet.io/dweet/for/' + deviceName + '?temp=' + str(temp))
Функция ''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. Значит данные были успешно переданы в интернет.