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

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

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

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

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

Exp67.py
  1. from machine import Pin
  2. import network
  3. import gc
  4. import time
  5. import socket
  6.  
  7. _init()
  8. gc.collect()
  9.  
  10.  
  11. wlan_id = "Имя WiFi сети"
  12. wlan_pass = "Пароль"
  13.  
  14.  
  15. wlan = network.WLAN(network.STA_IF)
  16. wlan.active(True)
  17. wlan.connect(wlan_id, wlan_pass)
  18. time.sleep(1)
  19.  
  20.  
  21. while wlan.isconnected() == False:
  22. pass
  23.  
  24. print('Device IP:', wlan.ifconfig()[0])
  25.  
  26.  
  27.  
  28. def http_get(url, port=80):
  29. _, _, host, path = url.split('/', 3)
  30. addr = socket.getaddrinfo(host, port)[0][-1]
  31.  
  32. s = socket.socket()
  33. s.connect(addr)
  34. s.send(bytes('GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n' % (path, host), 'utf8'))
  35.  
  36. text = ''
  37.  
  38. while True:
  39. data = s.recv(100)
  40. if data:
  41. text += str(data, 'utf8')
  42. pass
  43. else:
  44. a = text.split('\r\n\r\n', 2)[1]
  45. return a
  46. break
  47.  
  48.  
  49. deviceName = 'PinLabIoTSensor010520'
  50. temp = 22.9
  51.  
  52. data = http_get('http://dweet.io/dweet/for/' + deviceName + '?temp=' + str(temp))

Первым делом нам необходимо подключиться к WiFi сети с доступом в интернет. После этого мы готовы к отправке данных. Для этого нам потребуется библиотека для работы с сокетами socket. Сетевые сокеты — это интерфейс, который по сути представляет собой совокупность адреса в сети и используемого порта.

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

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

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

  1. deviceName = 'PinLabIoTSensor010520'
  2. temp = 22.9

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

  1. 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

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