MicroPython:Платы/ESP8266/Руководство по MicroPython для ESP8266/Сеть – TCP-сокеты: различия между версиями

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

(Новая страница: «{{MicroPython/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} <syntaxhighlight lang="python" enclose="div"> =С...»)
 
 
Строка 2: Строка 2:
 
{{Перевод от Сubewriter}}
 
{{Перевод от Сubewriter}}
 
{{Myagkij-редактор}}
 
{{Myagkij-редактор}}
 +
 +
=Сеть – TCP-сокеты<ref>[http://docs.micropython.org/en/latest/esp8266/tutorial/network_tcp.html docs.micropython.org - Network - TCP sockets]</ref>=
 +
 +
[[TCP-сокет]]ы – это строительные кирпичики большей части интернета. Благодаря этим [[сокет]]ам осуществляется надежный поток байтов между подключенными друг к другу сетевыми устройствами. В этой части руководства мы покажем несколько разных примеров использования этих [[TCP-сокет]]ов.
 +
 +
==Star Wars Asciimation==
 +
 +
Самое простое, что можно сделать – это загрузить данные из интернета. Мы воспользуемся для этого сервисом ''Star Wars Asciimation'', который можно найти на сайте [http://blinkenlights.nl/ blinkenlights.nl]. Он использует протокол ''TELNET'' на порте ''23'', чтобы передавать данные любому, кто к нему подключится. Его очень легко использовать, потому что он не требует аутентификации (вам не нужно будет писать имя или пароль) – вы можете сразу начинать загружать данные.
 +
 +
Во-первых, надо убедиться, есть ли у вас модуль socket:
  
 
<syntaxhighlight lang="python" enclose="div">
 
<syntaxhighlight lang="python" enclose="div">
 +
>>> import socket
 +
</syntaxhighlight>
 +
 +
Затем нужно узнать [[IP-адрес]] [[сервер]]а:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> addr_info = socket.getaddrinfo("towel.blinkenlights.nl", 23)
 +
</syntaxhighlight>
 +
 +
Функция getaddrinfo() вернет список адресов, но каждый адрес будет содержать избыточную и не нужную нам информацию. Нам лишь нужен первый корректный адрес, а затем лишь [[IP-адрес]] и порт сервера. Чтобы сделать это, впишите следующее:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> addr = addr_info[0][-1]
 +
</syntaxhighlight>
 +
 +
Если вписать addr_info и addr в командную строку, вы увидите, какая информация в них хранится.
 +
 +
При помощи [[IP-адрес]]а мы можем создать [[сокет]] и подключиться к серверу:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> s = socket.socket()
 +
>>> s.connect(addr)
 +
</syntaxhighlight>
 +
 +
Теперь, подключившись, мы можем загрузить и показать данные:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> while True:
 +
...    data = s.recv(500)
 +
...    print(str(data, 'utf8'), end='')
 +
...
 +
</syntaxhighlight>
 +
 +
Когда этот цикл будет выполнен, он должен начать показывать анимацию (чтобы прервать ее, нажмите {{клавиша|Ctrl}}+{{клавиша|C}}).
 +
 +
Вы также можете запустить этот же самый код на своем [[ПК]] при помощи обычного [[Python]] (если у вас есть желание попробовать его там).
 +
 +
==Запрос HTTP GET==
 +
 +
В этом примере мы покажем, как загрузить веб-страницу. Протокол [[HTTP]] использует ''порт 80'' и перед тем, как что-нибудь загрузить, вам надо будет отправить запрос [[GET]]. В этом запросе вам также надо будет указать страницу, которую нужно извлечь.
 +
 +
Давайте зададим функцию, способную загрузить и напечатать [[URL]]:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
def http_get(url):
 +
    import socket
 +
    _, _, host, path = url.split('/', 3)
 +
    addr = socket.getaddrinfo(host, 80)[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'))
 +
    while True:
 +
        data = s.recv(100)
 +
        if data:
 +
            print(str(data, 'utf8'), end='')
 +
        else:
 +
            break
 +
    s.close()
 +
</syntaxhighlight>
 +
 +
Затем попробуйте следующее:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
>>> http_get('http://micropython.org/ks/test.html')
 +
</syntaxhighlight>
 +
 +
В результате эта функция должна скачать веб-страницу и напечатать в консоли ее [[HTML-код]].
 +
 +
==Простой HTTP-сервер==
 +
 +
Код ниже создает простой [[HTTP-сервер]], обслуживающий одну веб-страницу, на которой содержится таблица с состояниями всех GPIO-контактов:
 +
 +
<syntaxhighlight lang="python" enclose="div">
 +
import machine
 +
pins = [machine.Pin(i, machine.Pin.IN) for i in (0, 2, 4, 5, 12, 13, 14, 15)]
 +
 +
html = """<!DOCTYPE html>
 +
<html>
 +
    <head> <title>ESP8266 Pins</title> </head>
 +
    <body> <h1>ESP8266 Pins</h1>
 +
        <table border="1"> <tr><th>Pin</th><th>Value</th></tr> %s </table>
 +
    </body>
 +
</html>
 +
"""
 +
 +
import socket
 +
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
 +
 +
s = socket.socket()
 +
s.bind(addr)
 +
s.listen(1)
 +
 +
print('прослушиваем', addr)
 +
 +
while True:
 +
    cl, addr = s.accept()
 +
    print('клиент подключился от', addr)
 +
    cl_file = cl.makefile('rwb', 0)
 +
    while True:
 +
        line = cl_file.readline()
 +
        if not line or line == b'\r\n':
 +
            break
 +
    rows = ['<tr><td>%s</td><td>%d</td></tr>' % (str(p), p.value()) for p in pins]
 +
    response = html % '\n'.join(rows)
 +
    cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
 +
    cl.send(response)
 +
    cl.close()
 +
</syntaxhighlight>
  
 
=См.также=
 
=См.также=

Текущая версия на 12:20, 1 июля 2020

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Сеть – TCP-сокеты[1]

TCP-сокеты – это строительные кирпичики большей части интернета. Благодаря этим сокетам осуществляется надежный поток байтов между подключенными друг к другу сетевыми устройствами. В этой части руководства мы покажем несколько разных примеров использования этих TCP-сокетов.

Star Wars Asciimation

Самое простое, что можно сделать – это загрузить данные из интернета. Мы воспользуемся для этого сервисом Star Wars Asciimation, который можно найти на сайте blinkenlights.nl. Он использует протокол TELNET на порте 23, чтобы передавать данные любому, кто к нему подключится. Его очень легко использовать, потому что он не требует аутентификации (вам не нужно будет писать имя или пароль) – вы можете сразу начинать загружать данные.

Во-первых, надо убедиться, есть ли у вас модуль socket:

>>> import socket

Затем нужно узнать IP-адрес сервера:

>>> addr_info = socket.getaddrinfo("towel.blinkenlights.nl", 23)

Функция getaddrinfo() вернет список адресов, но каждый адрес будет содержать избыточную и не нужную нам информацию. Нам лишь нужен первый корректный адрес, а затем лишь IP-адрес и порт сервера. Чтобы сделать это, впишите следующее:

>>> addr = addr_info[0][-1]

Если вписать addr_info и addr в командную строку, вы увидите, какая информация в них хранится.

При помощи IP-адреса мы можем создать сокет и подключиться к серверу:

>>> s = socket.socket()
>>> s.connect(addr)

Теперь, подключившись, мы можем загрузить и показать данные:

>>> while True:
...     data = s.recv(500)
...     print(str(data, 'utf8'), end='')
...

Когда этот цикл будет выполнен, он должен начать показывать анимацию (чтобы прервать ее, нажмите  Ctrl + C ).

Вы также можете запустить этот же самый код на своем ПК при помощи обычного Python (если у вас есть желание попробовать его там).

Запрос HTTP GET

В этом примере мы покажем, как загрузить веб-страницу. Протокол HTTP использует порт 80 и перед тем, как что-нибудь загрузить, вам надо будет отправить запрос GET. В этом запросе вам также надо будет указать страницу, которую нужно извлечь.

Давайте зададим функцию, способную загрузить и напечатать URL:

def http_get(url):
    import socket
    _, _, host, path = url.split('/', 3)
    addr = socket.getaddrinfo(host, 80)[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'))
    while True:
        data = s.recv(100)
        if data:
            print(str(data, 'utf8'), end='')
        else:
            break
    s.close()

Затем попробуйте следующее:

>>> http_get('http://micropython.org/ks/test.html')

В результате эта функция должна скачать веб-страницу и напечатать в консоли ее HTML-код.

Простой HTTP-сервер

Код ниже создает простой HTTP-сервер, обслуживающий одну веб-страницу, на которой содержится таблица с состояниями всех GPIO-контактов:

import machine
pins = [machine.Pin(i, machine.Pin.IN) for i in (0, 2, 4, 5, 12, 13, 14, 15)]

html = """<!DOCTYPE html>
<html>
    <head> <title>ESP8266 Pins</title> </head>
    <body> <h1>ESP8266 Pins</h1>
        <table border="1"> <tr><th>Pin</th><th>Value</th></tr> %s </table>
    </body>
</html>
"""

import socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()
s.bind(addr)
s.listen(1)

print('прослушиваем', addr)

while True:
    cl, addr = s.accept()
    print('клиент подключился от', addr)
    cl_file = cl.makefile('rwb', 0)
    while True:
        line = cl_file.readline()
        if not line or line == b'\r\n':
            break
    rows = ['<tr><td>%s</td><td>%d</td></tr>' % (str(p), p.value()) for p in pins]
    response = html % '\n'.join(rows)
    cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
    cl.send(response)
    cl.close()

См.также

Внешние ссылки