Освой MicroPython играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

M5Stack: Сеть

Модуль network
Модуль urequests
Класс Response

Изучим сетевые возможности платы M5Stack (ESP32).

Модуль network

Сетевые функции находятся в модуле network.


import network

Напишем пример сканирования WiFi-сетей. На устройстве уже должен быть прописан доступ к локальной WiFi-сети, мы не будем вводить данные, хотя можно добавить вызов дополнительных методов для этой цели.


from m5stack import lcd
import network

wifi = network.WLAN(network.STA_IF)
wifi.active(True)

wifilist = wifi.scan()

lcd.clear()

for i in wifilist:
    lcd.println(i[0].decode())

Если вызывать без decode(), то получили бы байтовый список следующего вида: [(b'MGTS_GPON_5897', b'\xcc{5\x88}V', 1, -63, 3, False), (b'kukuruza', b'\xbc\xee{\x7f\xd2L', 8, -66, 2, False), (b'MGTS_GPON_6D71', b'\xe4w#{\x04\xa6', 7, -69, 3, False), (b'MGTS_GPON_1D83', b'x\xb2\x13\xca\x84\xe0', 3, -70, 3, False), (b'MGTS_GPON_1836', b'\xe4w#z\x88D', 5, -77, 3, False), (b'MGTS_GPON_12C3', b'\xe4w#{\x08\x1e', 8, -80, 3, False), (b'Keenetic-7497', b'((]e%\n', 11, -81, 3, False)].


// REPL
print(str(wifi.scan()))

В нашем случае мы получим ответ в нормальном виде:


MGTS_GPON_5897
kukuruza
MGTS_GPON_6D71
...

Модуль urequests

Рассмотрим модуль urequests для сетевых запросов.

dir(urequests)
['__class__', '__name__', 'get', '__file__', 'put', 'usocket', 'Response', 'request', 'head', 'post', 'patch', 'delete']

При работе с модулем убедитесь, что устройство имеет доступ к сети, иначе будете получать ошибки.

Сначала импортируем модуль.


import urequests

Метод get()

Для начала попробуем использовать запрос HTTP GET. Для этого достаточно вызвать метод get() с указанием адреса (URL). Для эксперимента возьмём страницу "Справочника про котов" (http://user.alexanderklimov.ru/cats/).


import urequests

lcd.clear()

lcd.setCursor(0, 0)
response = urequests.get('http://user.alexanderklimov.ru/cats/')
lcd.print(str(type(response)))  # <class 'Response'>
response.close()

Класс Response

dir(response):
['__class__', '__init__', '__module__', '__qualname__', 'close', '__dict__', 'encoding', 'text', 'json', 'content', 'raw', '_cached', 'status_code', 'reason']

Как видим, метод возвращает объект класса Response.

Свойство text

Но нам интереснее получить содержимое страницы, а не название класса, поэтому вызываем свойство text.


...
lcd.print(str(type(response)))
print(response.text) # выводится содержимое страницы
print(type(response.text)) # <class 'str'>
response.close()

Свойство text() выводит полное содержимое страницы в строковом виде. Далее вам нужно самостоятельно распарсить строку и оставить только нужную информацию. Можно вызвать цепочку методов и свойств.


response = urequests.get('http://user.alexanderklimov.ru/cats/').text

Метод json()

Очень часто сайты предоставляют информацию в виде JSON. В этом случае нам не нужно получать сырой текст со всеми скобками и запятыми. Достаточно вызвать метод json(), который сделает всю работу за нас, возвратив нам словарь (dict). Для примера воспользуемся страницей http://jsonplaceholder.typicode.com/albums/1, которая возвращает страницу в следующем виде.


{
  "userId": 1,
  "id": 1,
  "title": "quidem molestiae enim"
}

Сделаем запрос и распарсим данные.


from m5stack import *
import urequests

lcd.clear()

lcd.setCursor(0, 0)
response = urequests.get('http://jsonplaceholder.typicode.com/albums/1')
parsed = response.json()
lcd.println(str(type(parsed)))
lcd.println(parsed["userId"])
lcd.println(parsed["id"])
lcd.println(parsed["title"])
response.close()

#Результат <class 'dict'> 1 1 quidem molestiae enim

Такой подход удобен для получения прогноза погоды, курса валют, расписания поездов и т.д.

Свойство content

Ответ можно также получить в виде байтов. Перепишем предыдущий пример с JSON.


from m5stack import *
import urequests

lcd.clear()

lcd.setCursor(0, 0)
response = urequests.get('http://jsonplaceholder.typicode.com/albums/1')
print(response.content) # b'{\n  "userId": 1,\n  "id": 1,\n  "title": "quidem molestiae enim"\n}'
print(type(response.content)) # <class 'bytes'>
response.close()

Свойства status_code и reason

Осталось рассмотреть два полезных свойства, которые оповещают об успешном (или не очень) выполнении запроса в числовом или байтовом виде.


from m5stack import *
import urequests

lcd.clear()

lcd.setCursor(0, 0)
response = urequests.get('http://user.alexanderklimov.ru/cats/')
lcd.println(str(response.status_code)) # 200
lcd.println(response.reason.decode())  # OK
response.close()

Свойство reason возвращает байтовую строку b'OK', поэтому понадобилось преобразование в строку через decode().

Реклама