Эксперимент 69. Получение данных с интернет- сервиса

Устройства интернета- вещей не только отправляют данные в интернет, но и получают их оттуда. В интернете есть ресурсы, предназначенные для получения информации человеком- обычныйе сайты. Но кроме того, есть интернет- ресурсы для получения данных другими программами — веб-сервисы. Их главное отличие от обычного сайта в том, что они предоставляют данные в удобном для программ виде, без излишеств. Без визуального оформления, только чистые данные в определенном формате. Форматы предоставления данных могут быть разными.

Попробуем поработать с веб- сервисом. Для получения погодных данных хорошо подходит веб- сервис weatherbit.io. Основные данные о погоде данный сервис предоставляет бесплатно до 500 запросов в сутки, но необходимо пройти простую процедуру регистрации.

Регистрация происходит на странице https://www.weatherbit.io/account/create

Вводим в поле Username логин, например pinlab. В поле Password пароль, который нужно придумать. Например 123456789. В поле Re-Enter Password for Verification вводим тот же пароль еще раз. В поле E-mail вводим адрес электронной почты.

Устанавливаем галочку I accept the Terms and Conditions and the Privacy Policy, которой мы подтверждаем согласие с условиями предоставления сервиса. По желанию можно убрать галочку Send me updates via email, чтобы не получать писем от этого сервиса.

Ставим галочку Я не робот и нажимаем на кнопку Submit.

Если форма заполнена правильно, то увидим сообщение Thank you for registering! You may now login to your account, and access your API Key!, которое сообщает нам, что регистрация пройдена. На этой странице вводим логин и пароль чтобы авторизоваться в сервисе.

После авторизации в сервисе мы попадаем на страницу, где необходимо предоставить немного дополнительной информации. Заполнить ее можно согласно картинке ниже.

  • Company Name/Organization — название организации, можно не заполнять или поставить минус
  • First Name*, Last Name* — имя и фамилия, можно вписать любые
  • Country — страна, можно не заполнять или выбрать RU - Russian Federation
  • API Tier* — тарифный план сервиса, обязательно нужно выбрать Free (бесплатный)
  • API Usage Purpose* — для чего мы будем использовать сервис, нужно выбрать Personal Use (для собственного использования)

После заполнения формы нажимаем на кнопку Proceed to Dashboard. После этого открывается страница с ключом доступа

В нашем случае наш ключ доступа это 341182dee74d4049a0dc5470919e39fa, он будет другим. Этот ключ самое важное, то для чего мы проходили регистрацию. Этот ключ нужно будет использовать в каждом запросе к сервису.

Схема эксперимента

Схема отсутствует.

Программный код эксперимента

Exp69.py
  1. from machine import Pin
  2. import network
  3. import gc
  4. import time
  5. import socket
  6. import json
  7.  
  8. _init()
  9. gc.collect()
  10.  
  11.  
  12. wlan_id = "WiFi_name"
  13. wlan_pass = "WiFi_pass"
  14.  
  15.  
  16. wlan = network.WLAN(network.STA_IF)
  17. wlan.active(True)
  18. wlan.connect(wlan_id, wlan_pass)
  19. time.sleep(1)
  20.  
  21.  
  22. while wlan.isconnected() == False:
  23. pass
  24.  
  25. print('Device IP:', wlan.ifconfig()[0])
  26.  
  27.  
  28.  
  29. def http_get(url, port=80):
  30. _, _, host, path = url.split('/', 3)
  31. addr = socket.getaddrinfo(host, port)[0][-1]
  32.  
  33. s = socket.socket()
  34. s.connect(addr)
  35. s.send(bytes('GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n' % (path, host), 'utf8'))
  36.  
  37. text = ''
  38.  
  39. while True:
  40. data = s.recv(100)
  41. if data:
  42. text += str(data, 'utf8')
  43. pass
  44. else:
  45. a = text.split('\r\n\r\n', 2)[1]
  46. return a
  47. break
  48.  
  49.  
  50. apiKey = 'YourApiKey'
  51. cityName = 'Moscow,RU'
  52.  
  53. json_data = http_get('http://api.weatherbit.io/v2.0/current?city=' + cityName + '&key=' + apiKey)
  54. data = json.loads(json_data)
  55. print(data)
  56. print(data['data'][0]['temp'])

В коде необходимо заменить

  • WiFi_name нужно заменить на имя WifI сети
  • WiFi_pass нужно заменить на пароль от нее
  • YourApiKey нужно заменить на ключ доступа, который мы получили в сервисе weatherbit.io после регистрации

Нужно заменить имя сети и пароль на свои

  1. wlan_id = "WiFi_name"
  2. wlan_pass = "WiFi_pass"

Создаем объект сетевого интерфейса, активируем его, подключаемся к беспроводной сети и ждем соединения секунду.

  1. wlan = network.WLAN(network.STA_IF)
  2. wlan.active(True)
  3. wlan.connect(wlan_id, wlan_pass)
  4. time.sleep(1)

Проверяем установилось ли соединение с беспроводной сетью до тех пор, пока оно не будет установлено

  1. while wlan.isconnected() == False:
  2. pass

Выводим IP адрес, который получил наш микроконтроллер при подключении к Wi-Fi сети

  1. print('Device IP:', wlan.ifconfig()[0])

Функция http_get предназначена для формирования запроса к веб- серверу. В качестве параметров она принимает адрес веб страницы (url) и порт (по умолчанию 80, стандартный для веб- страниц). Функция возвращает данные, полученные от веб сервиса.

Здесь необходимо ввести свой ключ доступа к сервису weatherbit.io, который был получен после регистрации. Moscow,RU - это название города, по которому мы хотим получить погодные данные. В нашем случае это Москва. Названия для других городов можно получить на сайте сервиса https://www.weatherbit.io/api

  1. apiKey = 'YourApiKey'
  2. cityName = 'Moscow,RU'

Отправляем запрос сервису на предоставления данный о текущей погоде

  1. json_data = http_get('http://api.weatherbit.io/v2.0/current?city=' + cityName + '&key=' + apiKey)

Запрос отправляется на сервер сервиса, и он высылает ответ, который мы получаем в переменной json_data. Ответ от этого сервиса приходит в формате JSON.

В переменной json_data мы получили просто текстовую строку в формате JSON в которой находится информация. Чтобы мы могли работать с ней как с данными нам необходимо преобразовать ее в структуру данных Python.

  1. data = json.loads(json_data)

Теперь в переменно data находится структура данных к которой мы можем обращаться. Выведем ее в терминал, чтобы посмотреть что в ней находится

  1. print(data)

В нашем случае выводится строка (в вашем случае данные будут другими так как запрос будет сделан в другое время и будет другая погода)

{'count': 1, 'data': [{'wind_cdir_full': 'south', 'weather': {'code': '804', 'icon': 'c04d', 'description': 'Overcast clouds'}, 'datetime': '2020-06-15:13', 'temp': 23.9, 'station': 'E8051', 'elev_angle': 39.93, 'app_temp': 23.4, 'state_code': '48', 'wind_dir': 183, 'last_ob_time': '2020-06-15T12:46:00', 'solar_rad': 125, 'sunrise': '00:43', 'slp': 1006.8, 'pod': 'd', 'vis': 5, 'pres': 992.6, 'wind_cdir': 'S', 'wind_spd': 1.34, 'ghi': 625.24, 'ts': 1592225160, 'snow': 0, 'uv': 6.73402, 'clouds': 100, 'city_name': 'Moscow', 'precip': 0, 'timezone': 'Europe/Moscow', 'country_code': 'RU', 'dni': 824.53, 'dhi': 102.47, 'sunset': '18:15', 'ob_time': '2020-06-15 12:46', 'h_angle': 40, 'dewpt': 8.7, 'aqi': 42, 'lat': 55.7522, 'rh': 38, 'lon': 37.6156}]}

Это и есть данные, полученные от сервиса. В них много различных параметров, даже больше, чем нам будет нужно. Попробуем выбрать из них температуру и вывести ее в терминал

  1. print(data['data'][0]['temp'])

В нашем случае выводится 23.9

Таким образом мы только что запросили данные о текущей погоде в городе Москва у интернет- сервиса weatherbit.io

Подробное описание данных, которые возвращает сервис можно почитать на странице документации