Устройства интернета-вещей не только отправляют данные в интернет, но и получают их оттуда. В интернете есть ресурсы, предназначенные для получения информации человеком — обычные сайты. Но кроме того, есть интернет-ресурсы для получения данных другими программами — веб-сервисы. Их главное отличие от обычного сайта в том, что они предоставляют данные в удобном для программ виде, без излишеств. Без визуального оформления, только чистые данные в определенном формате. Форматы предоставления данных могут быть разными.
Попробуем поработать с веб-сервисом. Для получения погодных данных хорошо подходит веб-сервис 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.
Если выводится сообщение Signup blocked due to suspected spam. If you are a human, please use another VPN / IP address. нужно попробовать включить VPN.
Если форма заполнена правильно, то увидим сообщение Thank you for registering! You may now login to your account, and access your API Key!, которое сообщает нам, что регистрация пройдена. На этой странице вводим логин и пароль чтобы авторизоваться в сервисе.
После авторизации в сервисе мы попадаем на страницу, где необходимо предоставить немного дополнительной информации. Заполнить ее можно согласно картинке ниже.
После заполнения формы нажимаем на кнопку Proceed to Dashboard. После этого открывается страница с ключом доступа
В нашем случае наш ключ доступа это 341182dee74d4049a0dc5470919e39fa, он будет другим. Этот ключ самое важное, то для чего мы проходили регистрацию. Этот ключ нужно будет использовать в каждом запросе к сервису.
Схема отсутствует.
from machine import Pin import network import gc import time import socket import json _init() gc.collect() wlan_id = "WiFi_name" wlan_pass = "WiFi_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 apiKey = 'YourApiKey' cityName = 'Moscow,RU' json_data = http_get('http://api.weatherbit.io/v2.0/current?city=' + cityName + '&key=' + apiKey) data = json.loads(json_data) print(data) print(data['data'][0]['temp'])
В коде необходимо заменить
Нужно заменить имя сети и пароль на свои
wlan_id = "WiFi_name" wlan_pass = "WiFi_pass"
Создаем объект сетевого интерфейса, активируем его, подключаемся к беспроводной сети и ждем соединения секунду.
wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect(wlan_id, wlan_pass) time.sleep(1)
Проверяем установилось ли соединение с беспроводной сетью до тех пор, пока оно не будет установлено
while wlan.isconnected() == False: pass
Выводим IP адрес, который получил наш микроконтроллер при подключении к Wi-Fi сети
print('Device IP:', wlan.ifconfig()[0])
Функция http_get предназначена для формирования запроса к веб-серверу. В качестве параметров она принимает адрес веб страницы (url) и порт (по умолчанию 80, стандартный для веб-страниц). Функция возвращает данные, полученные от веб сервиса.
Здесь необходимо ввести свой ключ доступа к сервису weatherbit.io, который был получен после регистрации. Moscow,RU - это название города, по которому мы хотим получить погодные данные. В нашем случае это Москва. Названия для других городов можно получить на сайте сервиса https://www.weatherbit.io/api
apiKey = 'YourApiKey' cityName = 'Moscow,RU'
Отправляем запрос сервису на предоставления данный о текущей погоде
json_data = http_get('http://api.weatherbit.io/v2.0/current?city=' + cityName + '&key=' + apiKey)
Запрос отправляется на сервер сервиса, и он высылает ответ, который мы получаем в переменной json_data
. Ответ от этого сервиса приходит в формате JSON.
В переменной json_data
мы получили просто текстовую строку в формате JSON в которой находится информация. Чтобы мы могли работать с ней как с данными нам необходимо преобразовать ее в структуру данных Python.
data = json.loads(json_data)
Теперь в переменной data
находится структура данных к которой мы можем обращаться. Выведем ее в терминал, чтобы посмотреть что в ней находится
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}]}
Это и есть данные, полученные от сервиса. В них много различных параметров, даже больше, чем нам будет нужно. Попробуем выбрать из них температуру и вывести ее в терминал
print(data['data'][0]['temp'])
В нашем случае выводится 23.9
Таким образом мы только что запросили данные о текущей погоде в городе Москва у интернет-сервиса weatherbit.io
Подробное описание данных, которые возвращает сервис можно почитать на странице документации