Это старая версия документа!


Эксперимент 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))