{"id":490253,"date":"2026-08-08T13:48:33","date_gmt":"2026-08-08T13:48:33","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=490253"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2026-08-08T13:48:33","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=490253","title":{"rendered":"\u041a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 ESP (MicroPython): \u0447\u0438\u0441\u0442\u044b\u0439 socket \u0438 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0439 HTTP \u2014 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442-\u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><strong>\u041c\u0438\u043d\u0438\u043c\u0443\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u2014 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f<\/strong>    <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u043e\u0431\u0437\u043e\u0440\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435-\u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0447\u0438\u0441\u0442\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c socket \u2014 \u0431\u0435\u0437 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0432\u0440\u043e\u0434\u0435 Microdot, <code>urequests<\/code> \u0438\u043b\u0438 <code>MicroWebSrv2.<\/code><\/p>\n<p>\u00a0\u041f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043e\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439?<\/p>\n<p>\u00a0\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u00ab\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb. \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 socket, \u043b\u044e\u0431\u0430\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0439. \u0412\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442\u0435 \u0431\u044b\u0442\u044c \u0437\u0430\u043b\u043e\u0436\u043d\u0438\u043a\u043e\u043c \u0447\u0443\u0436\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435.<\/p>\n<p>\u00a0\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438. \u0414\u043b\u044f ESP8266 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u0435\u0439 ESP-01S \u0441 1 \u041c\u0411 Flash) \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u043d\u0430 \u0441\u0447\u0435\u0442\u0443. \u0413\u043e\u0442\u043e\u0432\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0441\u0438\u0442\u044c 10\u201320 \u041a\u0411, \u0430 \u0447\u0438\u0441\u0442\u044b\u0439 socket \u0440\u0435\u0448\u0430\u0435\u0442 \u0442\u0435 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u0430\u0442\u0440\u0430\u0442\u0430\u043c\u0438.<\/p>\n<p>\u00a0\u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c. \u0412\u044b \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b \u043a \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c \u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u043e\u0434 \u043b\u044e\u0431\u0443\u044e, \u0434\u0430\u0436\u0435 \u0441\u0430\u043c\u0443\u044e \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0435\u0441\u0442\u044c \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430, \u0430 socket \u2014 \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430.<\/p>\n<p>\u00a0\u042d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u2014 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0430\u0442\u044c\u044f, \u0430 \u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442-\u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445. \u041c\u044b \u043f\u0440\u043e\u0439\u0434\u0451\u043c \u043f\u0443\u0442\u044c \u043e\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a Wi-Fi \u0434\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0432 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u0440\u0435\u0436\u0438\u043c\u0435.<\/p>\n<p>\u00a0\u0421\u043e\u043a\u0435\u0442 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0442\u0438. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e, \u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u043e\u043a\u0435\u0442 \u2014 \u044d\u0442\u043e \u0434\u0432\u0435\u0440\u044c, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u0442\u0443\u0447\u0430\u0442\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u044b. \u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0441\u043e\u043a\u0435\u0442 \u2014 \u044d\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0443\u0447\u0438\u0442\u0441\u044f \u0432 \u0434\u0432\u0435\u0440\u044c \u0438 \u0436\u0434\u0451\u0442 \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<p>\u00a0\u0421\u043e\u043a\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u2014 TCP \u0438\u043b\u0438 UDP. \u041e\u043d \u0443\u043c\u0435\u0435\u0442:<\/p>\n<p>\u00a0&#8212; \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 (<code>connect()<\/code> \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430, <code>accept()<\/code> \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430).<\/p>\n<p>&#8212; \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 (<code>send()<\/code> \u0438 <code>recv()<\/code>).<\/p>\n<p>&#8212; \u0420\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u0438\u043b\u0438 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u0440\u0435\u0436\u0438\u043c\u0435.<\/p>\n<p>&#8212; \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0447\u0435\u0440\u0435\u0437 <code>setsockopt()<\/code>.<\/p>\n<p>\u00a0\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0438 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438.<\/p>\n<p>\u00a0\u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/p>\n<p>1. \u0424\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442: Wi-Fi \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0435\u0442\u044c\u044e<\/p>\n<p>\u0420\u0435\u0436\u0438\u043c\u044b <code>STA_IF<\/code> \u0438 <code>AP_IF<\/code>, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c, \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 NVS, \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u0431\u0440\u043e\u0441 \u0441\u0442\u0435\u043a\u0430. <\/p>\n<p>\u00a02. \u042f\u0434\u0440\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b: \u0441\u043e\u043a\u0435\u0442\u044b<\/p>\n<p>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u043a\u0435\u0442 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0439 \u0438 \u043a\u043e\u0434\u0430. \u0411\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0438 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0436\u0438\u043c\u044b \u2014 \u043a\u043e\u0433\u0434\u0430 \u0438 \u043a\u0430\u043a\u043e\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c <code>setblocking()<\/code>, <code>settimeout()<\/code> \u0438 \u0438\u0445 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 TIME_WAIT \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435 \u00abAddress already in use\u00bb.<\/p>\n<p>\u00a04. \u042f\u0437\u044b\u043a \u043e\u0431\u0449\u0435\u043d\u0438\u044f: \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b HTTP<\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 GET \u0438 POST-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u0437 URL, \u0447\u0442\u0435\u043d\u0438\u0435 \u0442\u0435\u043b\u0430. <\/p>\n<p>\u00a0<strong>\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430 \u2014 Wi-Fi \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0442\u044c\u044e.<\/strong><\/p>\n<p>\u041b\u044e\u0431\u0430\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c ESP \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c IP-\u0430\u0434\u0440\u0435\u0441 \u2014 \u043b\u0438\u0431\u043e \u043e\u0442 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 (\u0440\u0435\u0436\u0438\u043c STA), \u043b\u0438\u0431\u043e \u0440\u0430\u0437\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0430\u043c (\u0440\u0435\u0436\u0438\u043c AP). \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e, \u0442\u043e ESP \u0432 \u043c\u0438\u0440\u0435 \u0441\u0435\u0442\u0435\u0439 \u2014 \u043a\u0430\u043a \u043a\u0443\u0440\u044c\u0435\u0440. \u041e\u043d \u043b\u0438\u0431\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0447\u0443\u0436\u043e\u0439 \u0441\u0435\u0442\u0438 (\u0440\u043e\u0443\u0442\u0435\u0440), \u043b\u0438\u0431\u043e \u0441\u0430\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0443\u043d\u043a\u0442\u043e\u043c \u0432\u044b\u0434\u0430\u0447\u0438, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0441\u0432\u043e\u044e. <\/p>\n<p><strong>\u0414\u0432\u0435 \u0440\u043e\u043b\u0438: \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0442\u043e\u0447\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430<\/strong>    <\/p>\n<p><strong>\u0420\u0435\u0436\u0438\u043c STA_IF (\u043a\u043b\u0438\u0435\u043d\u0442) \u2014 \u00ab\u042f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0441\u044c \u043a \u0447\u0443\u0436\u043e\u0439 \u0441\u0435\u0442\u0438\u00bb<\/strong><\/p>\n<p>\u00a0\u041a\u043e\u0433\u0434\u0430 ESP \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043a\u043b\u0438\u0435\u043d\u0442, \u043e\u043d \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0440\u043e\u0443\u0442\u0435\u0440\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442 \u043d\u0435\u0433\u043e IP-\u0430\u0434\u0440\u0435\u0441. \u042d\u0442\u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u2014 \u0440\u043e\u0443\u0442\u0435\u0440 \u0432\u044b\u0434\u0430\u0451\u0442 \u0435\u0433\u043e \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 DHCP, \u0438 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0430\u0434\u0440\u0435\u0441 \u0447\u0430\u0441\u0442\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c. ESP \u0437\u0434\u0435\u0441\u044c \u2014 \u00ab\u0433\u043e\u0441\u0442\u044c\u00bb \u0432 \u0447\u0443\u0436\u043e\u0439 \u0441\u0435\u0442\u0438.<\/p>\n<p>\u00a0\u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435 \u043d\u0430 ESP \u0441\u0435\u0440\u0432\u0435\u0440, \u0430 IP-\u0430\u0434\u0440\u0435\u0441 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e (\u0442\u0435\u043b\u0435\u0444\u043e\u043d, \u0434\u0440\u0443\u0433\u043e\u0439 ESP) \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u2014 \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u0430\u0440\u0443\u044e \u0434\u0432\u0435\u0440\u044c, \u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u00ab\u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u00bb. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c IP-\u0430\u0434\u0440\u0435\u0441 (\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 IP \u0438\u043b\u0438 DHCP-\u0440\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u044f).<\/p>\n<pre><code class=\"python\">import networkimport time# ======================================================# 1. \u041d\u0410\u0421\u0422\u0420\u041e\u0419\u041a\u0410 \u0414\u041e \u041f\u041e\u0414\u041a\u041b\u042e\u0427\u0415\u041d\u0418\u042f# ======================================================# 1.1. \u0417\u0430\u0434\u0430\u0451\u043c \u0438\u043c\u044f \u0445\u043e\u0441\u0442\u0430 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)# \u0418\u043c\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0440\u043e\u0443\u0442\u0435\u0440\u0430.# \u0412\u0430\u0436\u043d\u043e: \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0414\u041e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.network.hostname(\"ESP32S3_HOME_SENSOR\")  # \u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 32 \u0441\u0438\u043c\u0432\u043e\u043b\u0430# 1.2. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441sta = network.WLAN(network.STA_IF)# 1.3. \u041d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 IP (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)# \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435, \u0435\u0441\u043b\u0438:# - \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0435\u0441\u044c \u043a \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (DHCP-\u0440\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430)# - \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e IP \u0441\u0432\u043e\u0431\u043e\u0434\u0435\u043dSTATIC_IP = \"192.168.4.99\"       # \u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441SUBNET = \"255.255.255.0\"          # \u041c\u0430\u0441\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u0442\u0438GATEWAY = \"192.168.4.1\"           # IP \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (\u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430)DNS = \"8.8.8.8\"                   # DNS-\u0441\u0435\u0440\u0432\u0435\u0440sta.ifconfig((STATIC_IP, SUBNET, GATEWAY, DNS))# 1.4. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c Wi-Fi \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441sta.active(True)# ======================================================# 2. \u0421\u0411\u0420\u041e\u0421 \u041a\u042d\u0428\u0410 NVS (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)# ======================================================# ESP \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0443\u0441\u043f\u0435\u0448\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u0432 NVS-\u043f\u0430\u043c\u044f\u0442\u0438.# \u0427\u0442\u043e\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0443\u0436\u043d\u043e\u0439 \u0441\u0435\u0442\u0438,# \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u0431\u0440\u043e\u0441 \u0441\u0442\u0435\u043a\u0430.sta.disconnect()      # \u0420\u0430\u0437\u0440\u044b\u0432\u0430\u0435\u043c \u0430\u0432\u0442\u043e\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438sta.active(False)     # \u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441time.sleep(1)         # \u0414\u0430\u0451\u043c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0441\u0431\u0440\u043e\u0441sta.active(True)      # \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0430\u043d\u043e\u0432\u043e# ======================================================# 3. \u041f\u041e\u0414\u041a\u041b\u042e\u0427\u0415\u041d\u0418\u0415 \u041a \u0421\u0415\u0422\u0418# ======================================================sta.connect(\"\u0414\u043e\u043c\u0430\u0448\u043d\u0438\u0439_WiFi\", \"\u043f\u0430\u0440\u043e\u043b\u044c\")# \u0416\u0434\u0451\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0446\u0438\u043a\u043b)while not sta.isconnected():    time.sleep_ms(50)print(\" \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e! IP:\", sta.ifconfig()[0])print(\" \u0418\u043c\u044f \u0445\u043e\u0441\u0442\u0430:\", sta.config('dhcp_hostname'))# ======================================================# 4. \u041e\u0421\u041d\u041e\u0412\u041d\u041e\u0419 \u0426\u0418\u041a\u041b \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435# ======================================================while True:    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435    if sta.isconnected():        #  \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0435\u0441\u0442\u044c \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f        # \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0438\u0451\u043c \u043a\u043e\u043c\u0430\u043d\u0434, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c        pass    else:        #  \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043e \u2014 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f        print(\" \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043e. \u041f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0441\u044c...\")                sta.disconnect()        sta.active(False)        time.sleep(1)        sta.active(True)        sta.connect(\"\u0414\u043e\u043c\u0430\u0448\u043d\u0438\u0439_WiFi\", \"\u043f\u0430\u0440\u043e\u043b\u044c\")                # \u0416\u0434\u0451\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c        timeout = 10000  # 10 \u0441\u0435\u043a\u0443\u043d\u0434        start = time.ticks_ms()        while not sta.isconnected():            if time.ticks_diff(time.ticks_ms(), start) &gt; timeout:                print(\" \u041e\u0448\u0438\u0431\u043a\u0430: \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\")                break            time.sleep_ms(50)                if sta.isconnected():            print(\" \u041f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e! IP:\", sta.ifconfig()[0])        # \u041f\u0430\u0443\u0437\u0430 \u0434\u043b\u044f \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438    time.sleep_ms(10)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442? <\/strong><\/p>\n<p>\u00a0<strong>network.hostname()<\/strong> &#8212;\u00a0\u00a0\u00a0\u00a0\u0437\u0430\u0434\u0430\u0451\u0442 \u0438\u043c\u044f ESP, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0438\u0434\u043d\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0440\u043e\u0443\u0442\u0435\u0440\u0430. \u0423\u0434\u043e\u0431\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432 \u0441\u0435\u0442\u0438. \u041d\u043e \u043e\u043d\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u043f\u043e <a href=\"http:\/\/%D0%B8%D0%BC%D1%8F.local\" rel=\"noopener noreferrer nofollow\">http:\/\/\u0438\u043c\u044f.local<\/a> \u2014 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u0435\u043d mDNS, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 ESP \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e.<\/p>\n<p><strong>sta.ifconfig()<\/strong> &#8212; \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 IP-\u0430\u0434\u0440\u0435\u0441. ESP \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 (\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u00ab\u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0433\u043e\u00bb IP). <\/p>\n<p><strong>sta.disconnect()<\/strong> + active(False\/True) &#8212; \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u0431\u0440\u043e\u0441 Wi-Fi \u0441\u0442\u0435\u043a\u0430. \u041e\u0447\u0438\u0449\u0430\u0435\u0442 \u043a\u044d\u0448 NVS, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u043d\u0443\u0436\u043d\u043e\u0439 \u0441\u0435\u0442\u0438. ESP \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 SSID \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 (NVS). \u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 ESP8266 \u043c\u043e\u0436\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u044d\u0442\u043e\u0439 \u0441\u0435\u0442\u0438, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u0432\u044b\u0437\u0432\u0430\u043b\u0438 connect() \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438.<\/p>\n<p><strong>while not sta.isconnected()<\/strong>\u00a0\u00a0 \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0446\u0438\u043a\u043b \u2014 \u0431\u0435\u0437 \u0441\u0435\u0442\u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u0438\u0434\u0451\u043c<\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 <strong>isconnected()<\/strong> \u0432 \u0446\u0438\u043a\u043b\u0435 &#8212; \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u041f\u0440\u0438 \u043e\u0431\u0440\u044b\u0432\u0435 \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/p>\n<p>\u00a0<strong>\u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a: \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b wlan.config() &#8212; <\/strong>\u0441\u043a\u0440\u044b\u0442\u044c<\/p>\n<p>\u00a0\u0414\u043b\u044f \u0442\u043e\u043d\u043a\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Wi-Fi \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 wlan.config(). \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b (ESP8266, ESP32), \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0438 \u0432\u0435\u0440\u0441\u0438\u0438 MicroPython. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435.<\/p>\n<pre><code class=\"python\"># \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430wlan.config(param_name=value)# \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044fvalue = wlan.config('param_name')<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"center\"><strong>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>STA<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"center\"><strong>AP<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\"><strong>mac<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">MAC-\u0430\u0434\u0440\u0435\u0441   (\u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\"><strong>ssid<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u043c\u044f   \u0441\u0435\u0442\u0438 (\u0434\u043b\u044f AP \u2014 \u0438\u043c\u044f \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\"><strong>channel<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">Wi-Fi   \u043a\u0430\u043d\u0430\u043b (1\u201313). \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0440\u0442\u0430\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f AP<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\"><strong>hidden<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043a\u0440\u044b\u0442\u044c   SSID (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f AP)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\"><strong>security<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b   \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,\u00a0network.AUTH_WPA2_PSK)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\"><strong>key<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0430\u0440\u043e\u043b\u044c   \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (\u0434\u043b\u044f AP)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\"><strong>hostname<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u043c\u044f   \u0445\u043e\u0441\u0442\u0430 \u0434\u043b\u044f DHCP\/mDNS.\u00a0<strong>\u0423\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439<\/strong>\u00a0\u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u00a0network.hostname()<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\"><strong>reconnects<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e   \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (0 = \u043d\u0435\u0442, -1 = \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\"><strong>txpower<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u043e\u0449\u043d\u043e\u0441\u0442\u044c   \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u0432 \u0434\u0411\u043c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\"><strong>pm<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u042d\u043d\u0435\u0440\u0433\u043e\u0441\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u0435 (PM_PERFORMANCE,\u00a0PM_POWERSAVE,\u00a0PM_NONE)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\"><strong>protocol<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b   802.11 (<strong>\u0442\u043e\u043b\u044c\u043a\u043e ESP32<\/strong>)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">bandwidth<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0428\u0438\u0440\u0438\u043d\u0430   \u043a\u0430\u043d\u0430\u043b\u0430 (<strong>\u0442\u043e\u043b\u044c\u043a\u043e ESP32<\/strong>)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u0420\u0435\u0436\u0438\u043c AP_IF (\u0442\u043e\u0447\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430) \u2014 \u00ab\u042f \u0441\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u044e \u0441\u0432\u043e\u044e \u0441\u0435\u0442\u044c\u00bb<\/strong><\/p>\n<p><strong>\u00a0<\/strong>\u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 ESP \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043c\u0438\u043d\u0438-\u0440\u043e\u0443\u0442\u0435\u0440\u043e\u043c. \u041e\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e Wi-Fi-\u0441\u0435\u0442\u044c \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c (SSID) \u0438 \u0441\u0430\u043c \u0440\u0430\u0437\u0434\u0430\u0451\u0442 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0432\u0448\u0438\u043c\u0441\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c. IP-\u0430\u0434\u0440\u0435\u0441 \u0441\u0430\u043c\u043e\u0439 ESP \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439 \u2014 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e 192.168.4.1. \u041e\u043d \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u0432\u044b \u0441\u0430\u043c\u0438 \u0435\u0433\u043e \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e.<\/p>\n<pre><code class=\"python\">import networkimport time# ======================================================# 1. \u041d\u0410\u0421\u0422\u0420\u041e\u0419\u041a\u0410 \u0422\u041e\u0427\u041a\u0418 \u0414\u041e\u0421\u0422\u0423\u041f\u042b# ======================================================ap = network.WLAN(network.AP_IF)# \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0414\u041e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044fap.config(essid=\"ESP_\u0421\u0442\u0430\u043d\u0446\u0438\u044f\", password=\"12345678\", channel=6)# \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0430ap.active(True)# ======================================================# 2. \u041e\u0421\u041d\u041e\u0412\u041d\u041e\u0419 \u0426\u0418\u041a\u041b \u2014 \u041c\u041e\u041d\u0418\u0422\u041e\u0420\u0418\u041d\u0413 \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u042f# ======================================================while True:    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430    if not ap.active():        print(\" \u0422\u043e\u0447\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b\u0430\u0441\u044c! \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c...\")        ap.active(False)        time.sleep(1)        ap.active(True)        ap.config(essid=\"ESP_\u0421\u0442\u0430\u043d\u0446\u0438\u044f\", password=\"12345678\")        print(\" \u0422\u043e\u0447\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430\")        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u044b    if ap.isconnected():        # \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 (\u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f)        print(\" \u0415\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b\")    else:        print(\" \u041a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043d\u0435\u0442\")        # \u041f\u0430\u0443\u0437\u0430 \u0434\u043b\u044f \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438    time.sleep_ms(5000)  # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0435 5 \u0441\u0435\u043a\u0443\u043d\u0434<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442?<\/strong><\/p>\n<p><strong>ap.config(essid=&#8230;, password=&#8230;)<\/strong> &#8212; \u0437\u0430\u0434\u0430\u0451\u0442 \u0438\u043c\u044f \u0441\u0435\u0442\u0438 (SSID) \u0438 \u043f\u0430\u0440\u043e\u043b\u044c. \u041a\u043b\u0438\u0435\u043d\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u044d\u0442\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c<\/p>\n<p><strong>ap.active(True)<\/strong> &#8212; \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0442\u043e\u0447\u043a\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e ESP \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0441\u0435\u0442\u044c.<\/p>\n<p><strong>ap.ifconfig()[0] <\/strong>&#8212; \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 IP-\u0430\u0434\u0440\u0435\u0441 ESP. \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a ESP.<\/p>\n<p><strong>ap.isconnected()<\/strong> &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0435\u0441\u0442\u044c \u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b. \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p><strong>ap.active()<\/strong> &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0441\u0431\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<p>\u00a0<strong>\u041f\u043e\u0447\u0435\u043c\u0443 isconnected() \u0434\u043b\u044f AP \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435?<\/strong><\/p>\n<p>\u0414\u043b\u044f STA isconnected() \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0435\u0441\u0442\u044c \u043b\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0440\u043e\u0443\u0442\u0435\u0440\u043e\u043c. \u042d\u0442\u043e \u043e\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e.<\/p>\n<p>\u0414\u043b\u044f AP isconnected() \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u043b\u0438 \u043a \u0442\u043e\u0447\u043a\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u044b. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u043d\u0430\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u0432\u0430\u0448\u0435\u0439 \u0441\u0435\u0442\u0438. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441\u0430\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430.<\/p>\n<p>\u00a0\u0415\u0441\u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u00ab\u0443\u043f\u0430\u043b\u0430\u00bb (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437-\u0437\u0430 \u0441\u0431\u043e\u044f), \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 ap.active() \u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 True, \u0435\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u043a\u043b\u044e\u0447\u0451\u043d.<\/p>\n<p>\u00a0<strong>\u0412\u0430\u0436\u043d\u044b\u0435 \u043d\u044e\u0430\u043d\u0441\u044b \u0434\u043b\u044f \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430<\/strong><\/p>\n<p>1. disconnect() \u0434\u043b\u044f AP \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f, \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443!<\/p>\n<pre><code class=\"python\">#  \u041d\u0415\u041f\u0420\u0410\u0412\u0418\u041b\u042c\u041d\u041e \u2014 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443ap.disconnect()  # OSError: STA required#  \u041f\u0420\u0410\u0412\u0418\u041b\u042c\u041d\u041e \u2014 \u0442\u043e\u043b\u044c\u043a\u043e active(False\/True)ap.active(False)time.sleep(1)ap.active(True)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>2. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 AP \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f<\/p>\n<p>\u00a0\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 config() (SSID, \u043f\u0430\u0440\u043e\u043b\u044c, \u043a\u0430\u043d\u0430\u043b), \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u041f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c active(True) \u043e\u043d\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<p>\u00a03. \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441<\/p>\n<p>\u0412 \u0440\u0435\u0436\u0438\u043c\u0435 AP ESP \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043c\u0435\u0435\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 192.168.4.1). \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a ESP.<\/p>\n<p>\u00a04. \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 AP \u0438 STA<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0441 AP \u043d\u0430 STA, \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u0435 AP \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435 STA:<\/p>\n<pre><code class=\"python\"># \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441 AP \u043d\u0430 STAap.active(False)          # \u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0430sta.active(True)          # \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0440\u0435\u0436\u0438\u043csta.connect(\"\u0414\u043e\u043c\u0430\u0448\u043d\u0438\u0439_WiFi\", \"\u043f\u0430\u0440\u043e\u043b\u044c\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>                                                              \u042f\u0434\u0440\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b: \u0441\u043e\u043a\u0435\u0442\u044b<\/strong><\/p>\n<p>\u0418 \u0442\u0430\u043a, \u00a0\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 ESP \u043a Wi-Fi \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 IP-\u0430\u0434\u0440\u0435\u0441 \u0438 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435. \u041d\u043e IP-\u0430\u0434\u0440\u0435\u0441 \u2014 \u044d\u0442\u043e \u043a\u0430\u043a \u043d\u043e\u043c\u0435\u0440 \u0434\u043e\u043c\u0430. \u0421\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043e\u043d \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u0435\u043d, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0434\u0432\u0435\u0440\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0443\u0447\u0430\u0442\u044c\u0441\u044f, \u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0437\u0430 \u043d\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0442\u043e\u0432 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0432\u044b\u0434\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.<\/p>\n<p>\u00a0\u0412 \u043c\u0438\u0440\u0435 \u0441\u0435\u0442\u0435\u0439 \u044d\u0442\u0443 \u00ab\u0434\u0432\u0435\u0440\u044c\u00bb \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0441\u043e\u043a\u0435\u0442\u043e\u043c (socket).<\/p>\n<p>\u00a0\u0421\u043e\u043a\u0435\u0442 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0442\u0438. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e:<\/p>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u043e\u043a\u0435\u0442 \u2014 \u044d\u0442\u043e \u0434\u0432\u0435\u0440\u044c \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0440\u0438\u0451\u043c\u043d\u043e\u0439. \u0421\u0435\u0440\u0432\u0435\u0440 \u0441\u0438\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043d\u0430\u0442\u044b, \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u0438 \u0436\u0434\u0451\u0442, \u043a\u043e\u0433\u0434\u0430 \u043a\u0442\u043e-\u0442\u043e \u043f\u043e\u0441\u0442\u0443\u0447\u0438\u0442. \u041e\u043d \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u043a\u0442\u043e \u043f\u0440\u0438\u0434\u0451\u0442 \u0438 \u043a\u043e\u0433\u0434\u0430. \u0415\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u0432\u0435\u0440\u044c, \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441, \u043e\u0442\u0434\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438\u0437 \u0441\u0432\u043e\u0435\u0433\u043e \u0430\u0440\u0445\u0438\u0432\u0430 \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0434\u0432\u0435\u0440\u044c.<\/p>\n<p>\u00a0\u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0441\u043e\u043a\u0435\u0442 \u2014 \u044d\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0441 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u0432\u0435\u0440\u0438. \u041e\u043d \u0441\u0442\u0443\u0447\u0438\u0442 (\u0438\u043b\u0438 \u0437\u0432\u043e\u043d\u0438\u0442 \u0432 \u0437\u0432\u043e\u043d\u043e\u043a), \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441. \u0415\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 (IP) \u0438 \u043d\u043e\u043c\u0435\u0440 \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u044b (\u043f\u043e\u0440\u0442). \u0415\u0441\u043b\u0438 \u0434\u0432\u0435\u0440\u044c \u043e\u0442\u043a\u0440\u044b\u043b\u0438 \u2014 \u043e\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a05\/816\/106\/a05816106796357d7cbf941ec075bd1d.png\" width=\"1046\" height=\"244\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a05\/816\/106\/a05816106796357d7cbf941ec075bd1d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a05\/816\/106\/a05816106796357d7cbf941ec075bd1d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<pre><code class=\"python\">import socketimport time# ======================================================# 1. \u0421\u041e\u0417\u0414\u0410\u0401\u041c \u041a\u041b\u0418\u0415\u041d\u0422\u0421\u041a\u0418\u0419 \u0421\u041e\u041a\u0415\u0422# ======================================================# socket.AF_INET \u2014 IPv4 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u0432\u0438\u0434\u0430 192.168.1.1)# socket.SOCK_STREAM \u2014 TCP (\u043d\u0430\u0434\u0451\u0436\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438)client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u043d\u0430 \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (connect, send, recv)# \u0411\u0435\u0437 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430 \u043a\u043b\u0438\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u043d\u0443\u0442\u044c \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430, \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442client.settimeout(5)  # 5 \u0441\u0435\u043a\u0443\u043d\u0434# ======================================================# 2. \u041f\u041e\u0414\u041a\u041b\u042e\u0427\u0410\u0415\u041c\u0421\u042f \u041a \u0421\u0415\u0420\u0412\u0415\u0420\u0423# ======================================================SERVER_IP = \"192.168.4.1\"   # IP-\u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (ESP \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 AP)SERVER_PORT = 80            # \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \u0434\u043b\u044f HTTPtry:    # connect() \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c    # \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043a\u043e\u0440\u0442\u0435\u0436 (IP, \u043f\u043e\u0440\u0442)    client.connect((SERVER_IP, SERVER_PORT))    print(\" \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e!\")except OSError as e:    print(f\" \u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f: {e}\")    client.close()    time.sleep(5)        # \u0416\u0434\u0451\u043c 5 \u0441\u0435\u043a\u0443\u043d\u0434 \u0438 \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043d\u043e\u0432\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435    # return False       # \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f    # machine.reset()    # \u0418\u043b\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c ESP# ======================================================# 3. \u041e\u0422\u041f\u0420\u0410\u0412\u041b\u042f\u0415\u041c \u0417\u0410\u041f\u0420\u041e\u0421# ======================================================# \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c HTTP GET-\u0437\u0430\u043f\u0440\u043e\u0441# \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430:#   \u0421\u0422\u0420\u041e\u041a\u0410 \u0417\u0410\u041f\u0420\u041e\u0421\u0410: \u043c\u0435\u0442\u043e\u0434 \u043f\u0443\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044f#   \u0417\u0410\u0413\u041e\u041b\u041e\u0412\u041a\u0418: \u043a\u043b\u044e\u0447: \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u043a\u0430\u0436\u0434\u044b\u0439 \u0441 \\r\\n)#   \u041f\u0423\u0421\u0422\u0410\u042f \u0421\u0422\u0420\u041e\u041a\u0410: \\r\\n \u2014 \u043a\u043e\u043d\u0435\u0446 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432request = (    \"GET \/data?temp=24.5&amp;humidity=55 HTTP\/1.1\\r\\n\"  # \u041f\u0443\u0442\u044c \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438    f\"Host: {SERVER_IP}\\r\\n\"                         # \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a    \"Connection: close\\r\\n\"                          # \u0417\u0430\u043a\u0440\u044b\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0432\u0435\u0442\u0430    \"\\r\\n\"                                          # \u041f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 = \u043a\u043e\u043d\u0435\u0446 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432)try:            # sendall() \u2014 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0412\u0421\u0415 \u0434\u0430\u043d\u043d\u044b\u0435    # \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 send(), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445    # sendall() \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b.    # .encode() \u2014 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0431\u0430\u0439\u0442\u044b (str \u2192 bytes),    # \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043e\u043a\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0431\u0430\u0439\u0442\u0430\u043c\u0438.    client.sendall(request.encode())    print(\" \u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\")except OSError as e:    print(f\" \u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438: {e}\")    client.close()    # return False, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f# ======================================================# 4. \u041f\u041e\u041b\u0423\u0427\u0410\u0415\u041c \u041e\u0422\u0412\u0415\u0422# ======================================================try:     response = b\"\"  # \u041f\u0443\u0441\u0442\u043e\u0439 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430        # \u0427\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043d\u0435 \u0437\u0430\u043a\u0440\u043e\u0435\u0442\u0441\u044f    # \u041f\u043e\u0447\u0435\u043c\u0443 \u0432 \u0446\u0438\u043a\u043b\u0435? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 1024 \u0431\u0430\u0439\u0442.    # recv(1024) \u0447\u0438\u0442\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 1024 \u0431\u0430\u0439\u0442\u0430 \u0437\u0430 \u043e\u0434\u0438\u043d \u0440\u0430\u0437.    # \u0415\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u2014 \u043d\u0443\u0436\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437.    while True:        chunk = client.recv(1024)  # \u0427\u0438\u0442\u0430\u0435\u043c \u043a\u0443\u0441\u043e\u043a \u0434\u043e 1024 \u0431\u0430\u0439\u0442        if not chunk:              # \u041f\u0443\u0441\u0442\u043e\u0439 \u043e\u0442\u0432\u0435\u0442 = \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u0430\u043a\u0440\u044b\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435            break        response += chunk          # \u041d\u0430\u043a\u043e\u043f\u043b\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435            # .decode() \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u0430\u0439\u0442\u044b \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u0442\u0440\u043e\u043a\u0443    print(response.decode())# \u041f\u0420\u0418 \u041d\u0415\u041e\u0411\u0425\u041e\u0414\u0418\u041c\u041e\u0421\u0422\u0418 \u041f\u0410\u0420\u0421\u0418\u041c \u041e\u0422\u0412\u0415\u0422 \u041f\u0410\u0420\u0421\u0415\u0420 \u0412 \u041e\u0422\u0414\u0415\u041b\u042c\u041d\u041e\u041c \u041a\u041e\u0414\u0415except OSError as e:    print(f\" \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f: {e}\")# ======================================================# 5. \u0417\u0410\u041a\u0420\u042b\u0412\u0410\u0415\u041c \u0421\u041e\u041a\u0415\u0422# ======================================================# close() \u2014 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0441\u043e\u043a\u0435\u0442\u0430# \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044cclient.close()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0422\u0440\u0438 \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e\u043a\u0435\u0442\u0430<\/strong><\/p>\n<p>\u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 (settimeout(None)) \u2014 \u0436\u0434\u0451\u0442 \u0432\u0435\u0447\u043d\u043e. \u041e\u043f\u0430\u0441\u043d\u043e \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u2014 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u043d\u0443\u0442\u044c \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430.<\/p>\n<p>\u041d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 (settimeout(0)) \u2014 \u043d\u0435 \u0436\u0434\u0451\u0442 \u0432\u043e\u043e\u0431\u0449\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p>\u0421 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c (settimeout(5)) \u2014 \u0436\u0434\u0451\u0442 5 \u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u043e\u0442\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u0421\u0430\u043c\u044b\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/p>\n<p>\u00a0<strong>\u041a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c?<\/strong><\/p>\n<p>\u00a0\u0412 MicroPython \u0443 \u0441\u043e\u043a\u0435\u0442\u0430 \u043d\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u0430 isconnected(). \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u2014 \u0435\u0441\u043b\u0438 \u043f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0438\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 OSError, \u0437\u043d\u0430\u0447\u0438\u0442, \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043e.<\/p>\n<p>\u00a0\u0414\u043b\u044f \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 keepalive-\u043f\u0430\u043a\u0435\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0440\u043e\u0443\u0442\u0435\u0440 \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u043b\u0438 \u0441\u043e\u043a\u0435\u0442 \u0438\u0437-\u0437\u0430 \u0431\u0435\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0431\u043e\u0440\u043a\u0430\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043e\u043f\u0446\u0438\u044f SO_KEEPALIVE, \u043d\u043e \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e.<\/p>\n<p>\u00a0\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e: \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 IoT-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 (\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0438\u0439, \u043e\u043f\u0440\u043e\u0441 \u043a\u043e\u043c\u0430\u043d\u0434) \u043f\u0440\u043e\u0449\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0438 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u2014 \u044d\u0442\u043e \u043d\u0430\u0434\u0451\u0436\u043d\u0435\u0435 \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.<\/p>\n<p>\u00a0<strong>\u041a\u0430\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0439\u043c\u0430\u0442\u044c \u043f\u0440\u0438 connect()?<\/strong><\/p>\n<p>\u0412 MicroPython \u0432\u0441\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u043a\u0430\u043a OSError \u0441 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c \u043a\u043e\u0434\u043e\u043c (errno). <\/p>\n<p>\u00a0\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/p>\n<p>116\u00a0\u00a0\u00a0\u00a0\u00a0 ETIMEDOUT &#8212; \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u2014 \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>111\u00a0\u00a0\u00a0\u00a0\u00a0 ECONNREFUSED &#8212; \u0441\u0435\u0440\u0432\u0435\u0440 \u043e\u0442\u0432\u0435\u0440\u0433 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u2014 \u043f\u043e\u0440\u0442 \u0437\u0430\u043a\u0440\u044b\u0442 \u0438\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043b\u0443\u0448\u0430\u0435\u0442.<\/p>\n<p>104\u00a0\u00a0\u00a0\u00a0\u00a0 ECONNRESET &#8212; \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441\u0431\u0440\u043e\u0448\u0435\u043d\u043e \u2014 \u0441\u0435\u0440\u0432\u0435\u0440 \u0440\u0430\u0437\u043e\u0440\u0432\u0430\u043b \u0441\u0432\u044f\u0437\u044c. <\/p>\n<p>103\u00a0\u00a0\u00a0\u00a0\u00a0 ECONNABORTED &#8212; \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u043e \u2014 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. <\/p>\n<p>113\u00a0\u00a0\u00a0\u00a0\u00a0 EHOSTUNREACH &#8212; \u0445\u043e\u0441\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u2014 \u0441\u0435\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0430\u0434\u0440\u0435\u0441\u0430.<\/p>\n<p>119\u00a0\u00a0\u00a0\u00a0\u00a0 EINPROGRESS &#8212; \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f (\u043f\u0440\u0438 \u043d\u0443\u043b\u0435\u0432\u043e\u043c \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0435). <\/p>\n<p>118\u00a0\u00a0\u00a0\u00a0\u00a0 EALREADY &#8212; \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f.<\/p>\n<p>128\u00a0\u00a0\u00a0\u00a0\u00a0 ENOTCONN &#8212; \u0441\u043e\u043a\u0435\u0442 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d.<\/p>\n<p><strong>\u00a0send()<\/strong> \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 (\u0435\u0441\u043b\u0438 \u0431\u0443\u0444\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d). <strong>sendall()<\/strong> \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0432\u0441\u0435\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u0414\u043b\u044f HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 sendall().<\/p>\n<p><strong>\u00a0\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043e\u0442\u0432\u0435\u0442\u043e\u043c?<\/strong><\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 HTTP-\u043e\u0442\u0432\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442:<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0443 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u2014 \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430 (200 \u2014 \u0443\u0441\u043f\u0435\u0448\u043d\u043e, 404 \u2014 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e, 500 \u2014 \u043e\u0448\u0438\u0431\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430).<\/p>\n<p>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u2014 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f.<\/p>\n<p>\u0422\u0435\u043b\u043e \u2014 \u0441\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0435\u0445\u0442, JSON \u0438\u043b\u0438 HTML).<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0443\u0436\u043d\u043e:<\/p>\n<p>\u0418\u0437\u0432\u043b\u0435\u0447\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<p>\u0415\u0441\u043b\u0438 status_code == 200 \u2014 \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0435\u043b\u0430.<\/p>\n<p>\u00a0\u0415\u0441\u043b\u0438 \u0441\u0442\u0430\u0442\u0443\u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 (\u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043f\u043e\u043f\u044b\u0442\u043a\u0443, \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e). \u0412\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0430\u0440\u0441\u0438\u0442 HTTP-\u043e\u0442\u0432\u0435\u0442 \u0438 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u0435\u043b\u043e:<\/p>\n<pre><code class=\"python\">def parse_http_response(response_bytes):    \"\"\"    \u041f\u0430\u0440\u0441\u0438\u0442 HTTP-\u043e\u0442\u0432\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 (\u0441\u0442\u0430\u0442\u0443\u0441, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0442\u0435\u043b\u043e)    \"\"\"    # 1. \u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0431\u0430\u0439\u0442\u044b \u0432 \u0441\u0442\u0440\u043e\u043a\u0443    response_str = response_bytes.decode('utf-8')        # 2. \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043a\u043e\u043d\u0435\u0446 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 (\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0441\u0442\u0440\u043e\u043a\u0438)    header_end = response_str.find('\\r\\n\\r\\n')        # 3. \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438    status_line = response_str[:response_str.find('\\r\\n')]    headers = response_str[:header_end]    body_str = response_str[header_end + 4:]  # \u0422\u0435\u043b\u043e \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0430        # 4. \u041f\u0430\u0440\u0441\u0438\u043c \u0441\u0442\u0430\u0442\u0443\u0441    parts = status_line.split(' ')    http_version = parts[0]   # \"HTTP\/1.1\"    status_code = int(parts[1])  # 200    status_text = ' '.join(parts[2:])  # \"OK\"        # 5. \u041f\u0430\u0440\u0441\u0438\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c    headers_dict = {}    for line in headers.split('\\r\\n')[1:]:  # \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 (\u0441\u0442\u0430\u0442\u0443\u0441)        if ': ' in line:            key, value = line.split(': ', 1)            headers_dict[key] = value        return status_code, status_text, headers_dict, body_str<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u042f\u0437\u044b\u043a \u043e\u0431\u0449\u0435\u043d\u0438\u044f: \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b HTTP<\/strong><\/p>\n<p><strong>\u00a0<\/strong>HTTP \u2014 \u044d\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u041a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443, \u0441\u0435\u0440\u0432\u0435\u0440 \u0435\u0451 \u0447\u0438\u0442\u0430\u0435\u0442, \u043f\u0430\u0440\u0441\u0438\u0442 \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 GET \u0438 POST.<\/p>\n<p>\u00a0<strong>GET-\u0437\u0430\u043f\u0440\u043e\u0441: \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 URL<\/strong><\/p>\n<p>GET \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (\u043f\u043e\u0441\u043b\u0435 ?) \u0438\u043b\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0432 \u043f\u0443\u0442\u044c \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0443.<\/p>\n<p><code>GET \/data?temp=24.5&amp;humidity=55 HTTP\/1.1<\/code><\/p>\n<p><code>Host: 192.168.4.1<\/code><\/p>\n<p><code>Connection: close<\/code><\/p>\n<p>\u00a0<strong>\/data<\/strong> \u2014 \u043f\u0443\u0442\u044c (\u0440\u0435\u0441\u0443\u0440\u0441).<\/p>\n<p><strong>?temp=24.5&amp;humidity=55<\/strong> \u2014 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (\u043a\u043b\u044e\u0447=\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f &amp;).<\/p>\n<p>\u041f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 <strong>(\\r\\n\\r\\n)<\/strong> \u2014 \u043a\u043e\u043d\u0435\u0446 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432.<\/p>\n<p>\u00a0<\/p>\n<p><code># \u0411\u0415\u0417 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432<\/code><\/p>\n<p><code>request = \"GET \/data HTTP\/1.1\\r\\nHost: 192.168.4.1\\r\\n\\r\\n\"<\/code><\/p>\n<p><code># \u0421 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438<\/code><\/p>\n<p><code>request = \"GET \/data?temp=24.5&amp;humidity=55 HTTP\/1.1\\r\\nHost: 192.168.4.1\\r\\n\\r\\n\"<\/code><\/p>\n<p><strong>\u041a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c GET:<\/strong><\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0447\u0442\u0435\u043d\u0438\u0435).<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043e\u0431\u044a\u0451\u043c\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<p>\u041d\u0435\u0442 \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043f\u0430\u0440\u043e\u043b\u0438, \u0442\u043e\u043a\u0435\u043d\u044b).<\/p>\n<p>\u00a0<strong>POST-\u0437\u0430\u043f\u0440\u043e\u0441: \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0435\u043b\u0435<\/strong><\/p>\n<p>POST \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 <strong>\u0432 \u0442\u0435\u043b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/strong>, \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432.<\/p>\n<p><code>POST \/api\/data HTTP\/1.1<\/code><\/p>\n<p><code>Host: 192.168.4.1<\/code><\/p>\n<p><code>Content-Type: application\/json<\/code><\/p>\n<p><code>Content-Length: 35<\/code><\/p>\n<p><code>Connection: close<\/code><\/p>\n<p><code>\u00a0{\"temp\": 24.5, \"humidity\": 55}<\/code><\/p>\n<p><strong>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c?<\/strong><\/p>\n<p>\u00a0\u0422\u0435\u043b\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 (\\r\\n\\r\\n).<\/p>\n<p>Content-Length \u2014 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d! \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u043b\u0438\u043d\u0443 \u0442\u0435\u043b\u0430 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445.<\/p>\n<p>Content-Type \u2014 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 (application\/json, text\/plain, application\/x-www-form-urlencoded).<\/p>\n<pre><code class=\"python\">import jsondata = {\"temp\": 24.5, \"humidity\": 55}body = json.dumps(data)          # \u0421\u0442\u0440\u043e\u043a\u0430 JSONbody_bytes = body.encode()       # \u0411\u0430\u0439\u0442\u044b \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u0434\u043b\u0438\u043d\u044brequest = (    \"POST \/api\/data HTTP\/1.1\\r\\n\"    \"Host: 192.168.4.1\\r\\n\"    \"Content-Type: application\/json\\r\\n\"    f\"Content-Length: {len(body_bytes)}\\r\\n\"   # \u0412 \u0411\u0410\u0419\u0422\u0410\u0425!    \"Connection: close\\r\\n\"    \"\\r\\n\"    f\"{body}\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/strong><\/p>\n<p>GET \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u0430\u043d\u043d\u044b\u0445: GET \/data HTTP\/1.1.<\/p>\n<p>GET \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u2014 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0441\u043b\u0435 ?: \/data?key1=value1&amp;key2=value2.<\/p>\n<p>POST \u2014 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0435\u043b\u0435 \u043f\u043e\u0441\u043b\u0435 \\r\\n\\r\\n.<\/p>\n<p>Content-Length \u2014 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445, \u043d\u0435 \u0432 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u0445: len(body.encode()).<\/p>\n<p>Content-Type \u2014 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 \u0442\u0435\u043b\u0430: application\/json, text\/plain.<\/p>\n<p>\u0414\u043b\u044f \u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u044b len(body) \u0438 len(body.encode()) \u2014 \u0440\u0430\u0437\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430!!!<\/p>\n<p><strong>\u0421\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u043e\u043a\u0435\u0442 \u2014 ESP \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/strong><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c ESP \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u0440\u043e\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u2014 \u043e\u043d \u0441\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u00ab\u0434\u0432\u0435\u0440\u044c\u00bb, \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u0438 \u0436\u0434\u0451\u0442, \u043f\u043e\u043a\u0430 \u043a\u0442\u043e-\u0442\u043e \u043f\u043e\u0441\u0442\u0443\u0447\u0438\u0442. \u042d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0434\u043b\u044f \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, API-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c.<\/p>\n<p>\u00a0\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u043e\u0442\u043a\u0440\u044b\u043b\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043c\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0443\u044e. \u0412\u044b \u0432\u0435\u0448\u0430\u0435\u0442\u0435 \u0432\u044b\u0432\u0435\u0441\u043a\u0443 \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u043c (IP) \u0438 \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u043a\u0430\u0431\u0438\u043d\u0435\u0442\u0430 (\u043f\u043e\u0440\u0442). \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0437\u043d\u0430\u044e\u0442, \u0433\u0434\u0435 \u0432\u0430\u0441 \u043d\u0430\u0439\u0442\u0438. \u0412\u044b \u0441\u0438\u0434\u0438\u0442\u0435 \u0432 \u043a\u0430\u0431\u0438\u043d\u0435\u0442\u0435 \u0438 \u0436\u0434\u0451\u0442\u0435, \u043f\u043e\u043a\u0430 \u043a\u0442\u043e-\u0442\u043e \u043f\u043e\u0441\u0442\u0443\u0447\u0438\u0442 (accept). \u041a\u043e\u0433\u0434\u0430 \u0441\u0442\u0443\u043a \u0440\u0430\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u2014 \u0432\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0435 \u0434\u0432\u0435\u0440\u044c (\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435), \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u0437\u0430\u043a\u0430\u0437 (\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u0441), \u0432\u044b\u0434\u0430\u0451\u0442\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 (\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u043e\u0442\u0432\u0435\u0442) \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0435 \u0434\u0432\u0435\u0440\u044c (close). \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b \u0441\u043d\u043e\u0432\u0430 \u0433\u043e\u0442\u043e\u0432\u044b \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/p>\n<p>\u00a0\u0412\u0430\u0436\u043d\u044b\u0439 \u043d\u044e\u0430\u043d\u0441: \u043e\u0434\u043d\u0430 \u00ab\u0434\u0432\u0435\u0440\u044c\u00bb (\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u043e\u043a\u0435\u0442) \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0442\u044c \u0442\u044b\u0441\u044f\u0447\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043a\u0442\u043e-\u0442\u043e \u0441\u0442\u0443\u0447\u0438\u0442, \u0432\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0435 \u0434\u0432\u0435\u0440\u044c, \u043e\u0431\u0449\u0430\u0435\u0442\u0435\u0441\u044c \u0438 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0435. \u041d\u043e \u0441\u0430\u043c\u0430 \u0434\u0432\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0441\u043b\u0443\u0448\u0430\u0442\u044c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5db\/9eb\/1c6\/5db9eb1c6174aa226688ccb974ffc6c0.png\" width=\"1132\" height=\"551\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/5db\/9eb\/1c6\/5db9eb1c6174aa226688ccb974ffc6c0.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5db\/9eb\/1c6\/5db9eb1c6174aa226688ccb974ffc6c0.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<pre><code class=\"python\">import socketimport time# ======================================================# 1. \u0421\u041e\u0417\u0414\u0410\u0401\u041c \u0421\u0415\u0420\u0412\u0415\u0420\u041d\u042b\u0419 \u0421\u041e\u041a\u0415\u0422# ======================================================# socket.AF_INET \u2014 IPv4# socket.SOCK_STREAM \u2014 TCPserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# ======================================================# 2. \u041d\u0410\u0421\u0422\u0420\u0410\u0418\u0412\u0410\u0415\u041c \u041f\u0415\u0420\u0415\u0418\u0421\u041f\u041e\u041b\u042c\u0417\u041e\u0412\u0410\u041d\u0418\u0415 \u041f\u041e\u0420\u0422\u0410 (\u041a\u0420\u0418\u0422\u0418\u0427\u041d\u041e!)# ======================================================# \u0411\u0435\u0437 \u044d\u0442\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435:# OSError: [Errno 98] EADDRINUSE \u2014 \"Address already in use\"# \u041f\u043e\u0447\u0435\u043c\u0443? \u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u043e\u043a\u0435\u0442\u0430 \u043f\u043e\u0440\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 TIME_WAIT# \u0434\u043e 30-60 \u0441\u0435\u043a\u0443\u043d\u0434. SO_REUSEADDR \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043f\u043e\u0440\u0442 \u0441\u0440\u0430\u0437\u0443.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# ======================================================# 3. \u041f\u0420\u0418\u0412\u042f\u0417\u042b\u0412\u0410\u0415\u041c\u0421\u042f \u041a \u041f\u041e\u0420\u0422\u0423# ======================================================SERVER_PORT = 80  # \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 \u0434\u043b\u044f HTTP# '0.0.0.0' \u2014 \u0441\u043b\u0443\u0448\u0430\u0435\u043c \u043d\u0430 \u0432\u0441\u0435\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u0445 (\u0438 STA, \u0438 AP)server.bind(('0.0.0.0', SERVER_PORT))# ======================================================# 4. \u041d\u0410\u0427\u0418\u041d\u0410\u0415\u041c \u0421\u041b\u0423\u0428\u0410\u0422\u042c# ======================================================# \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440=1 \u2014 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438server.listen(1)# ======================================================# 5. \u0412\u041a\u041b\u042e\u0427\u0410\u0415\u041c \u041d\u0415\u0411\u041b\u041e\u041a\u0418\u0420\u0423\u042e\u0429\u0418\u0419 \u0420\u0415\u0416\u0418\u041c (\u041a\u041b\u042e\u0427\u0415\u0412\u041e\u0419 \u041c\u041e\u041c\u0415\u041d\u0422!)# ======================================================# \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e accept() \u0431\u0443\u0434\u0435\u0442 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b,# \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u0438\u0434\u0451\u0442 \u043a\u043b\u0438\u0435\u043d\u0442. \u0412 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u0440\u0435\u0436\u0438\u043c\u0435 accept()# \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0440\u0430\u0437\u0443 \u2014 \u0435\u0441\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0435\u0442,# \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 OSError: 11 (EAGAIN)server.setblocking(False)# ======================================================# 6. \u041e\u0421\u041d\u041e\u0412\u041d\u041e\u0419 \u0426\u0418\u041a\u041b# ======================================================while True:    try:        # ======================================================        # 6.1 \u041f\u0420\u0418\u041d\u0418\u041c\u0410\u0415\u041c \u0421\u041e\u0415\u0414\u0418\u041d\u0415\u041d\u0418\u0415        # ======================================================                # accept() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u0440\u0442\u0435\u0436: (\u043d\u043e\u0432\u044b\u0439 \u0441\u043e\u043a\u0435\u0442 \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0430\u0434\u0440\u0435\u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430)        conn, addr = server.accept()                # ======================================================        # 6.2 \u0427\u0418\u0422\u0410\u0415\u041c \u0417\u0410\u041f\u0420\u041e\u0421        # ======================================================                # \u0427\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430        request_bytes = conn.recv(1024)        request_str = request_bytes.decode('utf-8')                        # ======================================================        # 6.3 \u041f\u0410\u0420\u0421\u0418\u041c \u0417\u0410\u041f\u0420\u041e\u0421 (\u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e)        # ======================================================                # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443: \"GET \/data?temp=24 HTTP\/1.1\"        first_line = request_str.split('\\r\\n')[0]        parts = first_line.split(' ')                if len(parts) &gt;= 3:            method = parts[0]   # GET \u0438\u043b\u0438 POST            path = parts[1]     # \/data?temp=24            version = parts[2]  # HTTP\/1.1                                                # ======================================================            # 6.4 \u0424\u041e\u0420\u041c\u0418\u0420\u0423\u0415\u041c \u041e\u0422\u0412\u0415\u0422            # ======================================================                        # \u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430: \u0435\u0441\u043b\u0438 \u043f\u0443\u0442\u044c \/ \u2014 \u043e\u0442\u0434\u0430\u0451\u043c \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435            if path == '\/':                body = \"Hello from ESP!\".encode('utf-8')                status = \"200 OK\"                content_type = \"text\/plain\"            else:                body = f\"Path: {path}\".encode('utf-8')                status = \"200 OK\"                content_type = \"text\/plain\"                        # \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c HTTP-\u043e\u0442\u0432\u0435\u0442            response = (                f\"HTTP\/1.1 {status}\\r\\n\"                f\"Content-Type: {content_type}\\r\\n\"                f\"Content-Length: {len(body)}\\r\\n\"  # len(body) \u2014 \u0431\u0430\u0439\u0442\u044b!                \"Connection: close\\r\\n\"                \"\\r\\n\"            ).encode() + body  # \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 (\u0431\u0430\u0439\u0442\u044b) + \u0442\u0435\u043b\u043e (\u0431\u0430\u0439\u0442\u044b)                    else:            # \u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441            body = b\"Bad Request\"            response = (                \"HTTP\/1.1 400 Bad Request\\r\\n\"                f\"Content-Length: {len(body)}\\r\\n\"                \"Connection: close\\r\\n\"                \"\\r\\n\"            ).encode() + body                # ======================================================        # 6.5 \u041e\u0422\u041f\u0420\u0410\u0412\u041b\u042f\u0415\u041c \u041e\u0422\u0412\u0415\u0422        # ======================================================                conn.sendall(response)                        # ======================================================        # 6.6 \u0417\u0410\u041a\u0420\u042b\u0412\u0410\u0415\u041c \u0421\u041e\u0415\u0414\u0418\u041d\u0415\u041d\u0418\u0415        # ======================================================                conn.close()                    except OSError as e:        # \u041a\u043e\u0434 11 = EAGAIN \u2014 \u044d\u0442\u043e \u041d\u0415 \u041e\u0428\u0418\u0411\u041a\u0410!        # \u042d\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u043b \"\u043d\u0435\u0442 \u043d\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439\" \u0432 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u0440\u0435\u0436\u0438\u043c\u0435        if e.args[0] == 11:            # \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0446\u0438\u043a\u043b            pass        else:            # \u0420\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u2014 \u0432\u044b\u0432\u043e\u0434\u0438\u043c            print(f\" \u041e\u0448\u0438\u0431\u043a\u0430: {e}\")        # ======================================================    # 6.7 \u0424\u041e\u041d\u041e\u0412\u042b\u0415 \u0417\u0410\u0414\u0410\u0427\u0418 (\u043e\u043f\u0440\u043e\u0441 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043b\u0435...)    # ======================================================        # \u0417\u0434\u0435\u0441\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0434\u0430\u0442\u0447\u0438\u043a\u0438, \u043c\u0438\u0433\u0430\u0442\u044c \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u043c,    # \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u2014 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c!        # \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0430\u0443\u0437\u0430 \u0434\u043b\u044f \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440    time.sleep_ms(10)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442?<\/strong><\/p>\n<p>\u00a0socket.socket() &#8212; \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u043e\u043a\u0435\u0442, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u0438\u043f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f (IPv4, TCP).<\/p>\n<p>setsockopt(SO_REUSEADDR) &#8212; \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0440\u0442, \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 EADDRINUSE.<\/p>\n<p>bind() &#8212; \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u043a\u0435\u0442 \u043a \u043f\u043e\u0440\u0442\u0443, \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u00ab\u0441\u043b\u044b\u0448\u0430\u0442\u044c\u00bb \u043f\u043e\u0440\u0442.<\/p>\n<p>listen() &#8212; \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u043f\u043e\u0440\u0442, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0441\u043e\u043a\u0435\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c \u043f\u0440\u0438\u0451\u043c\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>setblocking(False) &#8212; \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0436\u0438\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0444\u043e\u043d\u043e\u0432\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u0446\u0438\u043a\u043b\u0435.<\/p>\n<p>accept() &#8212; \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u0432 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 OSError: 11, \u0435\u0441\u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043d\u0435\u0442.<\/p>\n<p>recv() &#8212; \u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/p>\n<p>sendall() &#8212; \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442\u0432\u0435\u0442, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0432\u0441\u0435\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>close() \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b.<\/p>\n<p>\u00a0<strong>\u041f\u043e\u0447\u0435\u043c\u0443 SO_REUSEADDR \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u043d?<\/strong><\/p>\n<p>\u00a0SO_REUSEADDR\u00a0\u2014\u00a0\u044d\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u043e\u043a\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u041e\u0421: \u00ab\u0440\u0430\u0437\u0440\u0435\u0448\u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u044d\u0442\u043e\u0442 IP:\u043f\u043e\u0440\u0442, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f\u00bb.<\/p>\n<p>\u00a0\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0431\u0435\u0437 SO_REUSEADDR (\u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0430\u0434\u0430\u0435\u0442 EADDRINUSE)?<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0442\u044b \u0434\u0435\u043b\u0430\u0435\u0448\u044c s.bind((ip, PORT)), \u041e\u0421 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: \u00ab\u044d\u0442\u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0439\u0447\u0430\u0441 \u043a\u0435\u043c\u2011\u0442\u043e \u0437\u0430\u043d\u044f\u0442?\u00bb. \u0415\u0441\u043b\u0438 \u0434\u0430\u00a0\u2014\u00a0\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 EADDRINUSE.<\/p>\n<p>\u00a0\u041d\u043e \u00ab\u0437\u0430\u043d\u044f\u0442\u00bb \u043c\u043e\u0436\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043d\u0435 \u00ab\u0441\u0435\u0439\u0447\u0430\u0441 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f\u00bb, \u0430 \u00ab\u0431\u044b\u043b \u0437\u0430\u043d\u044f\u0442 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0434\u0430\u0432\u043d\u043e\u00bb. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c TCP TIME_WAIT.<\/p>\n<p>\u00a0<strong>\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 TIME_WAIT<\/strong><\/p>\n<p>\u00a0\u0422\u044b \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0448\u044c \u0441\u0435\u0440\u0432\u0435\u0440 (\u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 ESP32, \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0438\u0442\u0430\u043d\u0438\u044f, \u0432\u044b\u043b\u0435\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u0430). \u041e\u0421 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u043d\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0440\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 TIME_WAIT \u043d\u0430 30\u2013120\u00a0\u0441\u0435\u043a\u0443\u043d\u0434 (\u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u0442\u0435\u043a\u0430). \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u041e\u0421 \u043c\u043e\u0433\u043b\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u00ab\u0437\u0430\u043f\u043e\u0437\u0434\u0430\u0432\u0448\u0438\u0435\u00bb \u043f\u0430\u043a\u0435\u0442\u044b \u0438\u0437 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0422\u044b \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0448\u044c \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0434\u0435\u043b\u0430\u0435\u0448\u044c bind() \u043d\u0430 \u0442\u043e\u0442 \u0436\u0435 \u043f\u043e\u0440\u0442\u00a0\u2014\u00a0\u041e\u0421 \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u043f\u043e\u0440\u0442 \u0432\u0441\u0451 \u0435\u0449\u0451 \u00ab\u0437\u0430\u043d\u044f\u0442\u00bb (\u0432 TIME_WAIT) \u0438 \u0432\u044b\u0434\u0430\u0451\u0442 EADDRINUSE, \u0445\u043e\u0442\u044f \u0442\u0432\u043e\u0439 \u0441\u0442\u0430\u0440\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u0436\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u00a0\u041d\u0430 ESP32 \u044d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e: \u0442\u044b \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b \u043f\u043b\u0430\u0442\u0443, \u043a\u043e\u0434 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442, \u0430 \u043f\u043e\u0440\u0442 \u0435\u0449\u0451 \u00ab\u0432 \u0442\u0435\u043d\u0438\u00bb \u0438\u0437\u2011\u0437\u0430 TIME_WAIT. \u0411\u0435\u0437 SO_REUSEADDR \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0438\u0441\u0442\u0435\u0447\u0451\u0442 \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u041e\u0421.<\/p>\n<p>\u00a0\u0415\u0441\u043b\u0438 \u0434\u0430\u0436\u0435 \u0441 SO_REUSEADDR \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (\u043e\u0448\u0438\u0431\u043a\u0430 98), \u0441\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u0431\u0440\u043e\u0441 Wi-Fi \u0441\u0442\u0435\u043a\u0430 (\u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435) \u2014 \u044d\u0442\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b ESP.<\/p>\n<p>\u00a0<code>s.setsockopt(socket.SOL_SOCKET, <\/code><a href=\"http:\/\/socket.SO\" rel=\"noopener noreferrer nofollow\"><code>socket.SO<\/code><\/a><code>_REUSEADDR, 1)<\/code><\/p>\n<p>\u00a0\u042d\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u041e\u0421: \u00ab\u0435\u0441\u043b\u0438 \u043f\u043e\u0440\u0442 \u0432 TIME_WAIT\u00a0\u2014\u00a0\u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0438 \u043c\u043d\u0435 \u043d\u0430 \u043d\u0435\u0433\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f\u00bb.<\/p>\n<p>\u00a0\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435:<\/p>\n<p>\u00a0\u0422\u044b \u043c\u043e\u0436\u0435\u0448\u044c \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c ESP32\u2011\u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u0447\u0442\u0438 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0436\u0434\u0430\u0442\u044c 1\u20132\u00a0\u043c\u0438\u043d\u0443\u0442\u044b, \u043f\u043e\u043a\u0430 \u041e\u0421 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442 \u043f\u043e\u0440\u0442. \u041f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u044d\u0442\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043a\u0443\u0447\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>\u00a0<strong>\u0412\u0430\u0436\u043d\u043e\u0435 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u0438\u0435 \u0434\u043b\u044f MicroPython \u043d\u0430 ESP32<\/strong><\/p>\n<p>\u00a0\u0425\u043e\u0442\u044f SO_REUSEADDR \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442, \u043e\u043d \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u0430. \u0412\u0441\u0451 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0441\u0442\u0435\u043a TCP\/IP \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 MicroPython \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 TIME_WAIT:<\/p>\n<p>\u00a0\u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 SO_REUSEADDR \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 bind() \u043f\u0440\u043e\u0439\u0442\u0438 \u0441\u0440\u0430\u0437\u0443, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043f\u043e\u0440\u0442 \u0432 TIME_WAIT.<\/p>\n<p>\u0412 \u0434\u0440\u0443\u0433\u0438\u0445\u00a0\u2014\u00a0\u043f\u043e\u0440\u0442 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u00ab\u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d\u00bb \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 ESP32. <\/p>\n<p>\u00a0\u0415\u0441\u043b\u0438 \u043f\u043e\u0440\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043d\u044f\u0442 \u0434\u0440\u0443\u0433\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 ESP32 \u0443\u0436\u0435 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u0432\u0435\u0431\u2011\u0441\u0435\u0440\u0432\u0435\u0440), SO_REUSEADDR \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442. \u041e\u0448\u0438\u0431\u043a\u0430 EADDRINUSE \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0440\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. SO_REUSEADDR \u0441\u043f\u0430\u0441\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u00ab\u043f\u043e\u0440\u0442 \u0431\u044b\u043b \u0437\u0430\u043d\u044f\u0442 \u043d\u0435\u0434\u0430\u0432\u043d\u043e, \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442, \u043d\u043e \u041e\u0421 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0435\u0433\u043e \u0437\u0430\u043d\u044f\u0442\u044b\u043c \u0438\u0437\u2011\u0437\u0430 TIME_WAIT\u00bb.<\/p>\n<p>\u00a0\u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0438 \u041d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 &#8212; <strong>server.setblocking(True \/\u00a0 False)<\/strong><\/p>\n<p>\u00a0\u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u2014 \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430.<\/p>\n<p>\u041d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u2014 \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0434\u0430\u0442\u0447\u0438\u043a\u0438, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u043b\u0435, \u043c\u0438\u0433\u0430\u0442\u044c \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u043c.<\/p>\n<p>\u00a0<strong>\u041a\u0430\u043a \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0430\u0440\u0441\u0438\u0442 GET \u0438 POST (\u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e)<\/strong><\/p>\n<pre><code class=\"python\"># \u041f\u0430\u0440\u0441\u0438\u043c \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430first_line = request_str.split('\\r\\n')[0]  # \"GET \/data?temp=24 HTTP\/1.1\"method, path, version = first_line.split(' ')if method == \"GET\":    # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0437 path    if '?' in path:        path_only, query = path.split('?', 1)  # path_only=\"\/data\", query=\"temp=24\"        # \u041f\u0430\u0440\u0441\u0438\u043c query: temp=24&amp;humidity=55        params = {}        for pair in query.split('&amp;'):            if '=' in pair:                key, value = pair.split('=', 1)                params[key] = value        # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c params['temp'], params.get('humidity', '\u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e')elif method == \"POST\":    # \u0418\u0449\u0435\u043c \u0442\u0435\u043b\u043e \u043f\u043e\u0441\u043b\u0435 \\r\\n\\r\\n    header_end = request_str.find('\\r\\n\\r\\n')    if header_end != -1:        body = request_str[header_end + 4:]        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c Content-Type        if 'application\/json' in request_str:            import json            data = json.loads(body)            # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c data['temperature'], data['humidity']        else:            # plain text \u0438\u043b\u0438 form-data            print(\"\u0422\u0435\u043b\u043e:\", body)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/strong><\/p>\n<p>11\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 EAGAIN &#8212; \u043d\u0435\u0442 \u043d\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 (\u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0436\u0438\u043c).\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/p>\n<p>98\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 EADDRINUSE &#8212; \u043f\u043e\u0440\u0442 \u0443\u0436\u0435 \u0437\u0430\u043d\u044f\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c SO_REUSEADDR.<\/p>\n<p>104\u00a0\u00a0\u00a0\u00a0\u00a0 ECONNRESET &#8212; \u043a\u043b\u0438\u0435\u043d\u0442 \u0440\u0430\u0437\u043e\u0440\u0432\u0430\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435.<\/p>\n<p>107\u00a0\u00a0\u00a0\u00a0\u00a0 ENOTCONN &#8212; \u0441\u043e\u043a\u0435\u0442 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/p>\n<p>128\u00a0\u00a0\u00a0\u00a0\u00a0 ENOTCONN &#8212; \u0441\u043e\u043a\u0435\u0442 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d.<\/p>\n<p>\u00a0<strong>\u0418\u0442\u043e\u0433 \u043f\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0443<\/strong><\/p>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u2014 \u0434\u043e \u0446\u0438\u043a\u043b\u0430.<\/p>\n<p>SO_REUSEADDR \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d \u2014 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a EADDRINUSE.<\/p>\n<p>\u041d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0436\u0438\u043c \u2014 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0441 \u0444\u043e\u043d\u043e\u0432\u044b\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438.<\/p>\n<p>OSError: 11 (EAGAIN) \u2014 \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e! \u042d\u0442\u043e \u0441\u0438\u0433\u043d\u0430\u043b \u00ab\u043d\u0435\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432\u00bb.<\/p>\n<p>\u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u043d\u043e\u0432\u044b\u0439 \u0441\u043e\u043a\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<p>sendall() \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0432\u0441\u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<p>\u00a0\u0412 \u044d\u0442\u043e\u043c \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442\u0435 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0443\u0442\u044c \u00a0\u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043d\u0430 ESP \u2014 \u043e\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a Wi-Fi \u0434\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u0440\u0435\u0436\u0438\u043c\u0435. \u0414\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u043e\u043a\u0435\u0442 \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u0442\u0440\u0430\u0448\u043d\u043e, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u0434\u0432\u0435\u0440\u044c\u00bb \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u043f\u043e\u0447\u0435\u043c\u0443 SO_REUSEADDR \u0441\u043f\u0430\u0441\u0430\u0435\u0442 \u043e\u0442 EADDRINUSE, \u043f\u043e\u0447\u0435\u043c\u0443 Content-Length \u043d\u0443\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0431\u0430\u0439\u0442\u0430\u0445, \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 OSError: 11 \u2014 \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>\u00a0\u0421\u0442\u0430\u0442\u044c\u044f \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u043a\u0430\u043a \u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442-\u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u043e\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0430 \u0441\u0432\u043e\u044e \u0437\u0430\u0434\u0430\u0447\u0443.<\/p>\n<p>\u00a0\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c:<\/p>\n<p>\u042d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432: TCP \u0438\u043b\u0438 UDP \u0438\u043b\u0438 ESP-NOW. \u0413\u0434\u0435 \u043d\u0430\u0448 \u0441\u043e\u043a\u0435\u0442 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 OSI \u0438 \u043a\u0430\u043a \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>\u00a0\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438: Polling, P2P, WebSockets, MQTT. \u041a\u0430\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u043c\u0438 ESP \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0434\u0432\u0443\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u0441\u0432\u044f\u0437\u044c \u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1068214\/\">https:\/\/habr.com\/ru\/articles\/1068214\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041c\u0438\u043d\u0438\u043c\u0443\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u2014 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f    \u0412 \u044d\u0442\u043e\u0439 \u043e\u0431\u0437\u043e\u0440\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435-\u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0447\u0438\u0441\u0442\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c socket \u2014 \u0431\u0435\u0437 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0432\u0440\u043e\u0434\u0435 Microdot, urequests \u0438\u043b\u0438 MicroWebSrv2.\u00a0\u041f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043e\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439?\u00a0\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u00ab\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c\u00bb. \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 socket, \u043b\u044e\u0431\u0430\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0439. \u0412\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442\u0435 \u0431\u044b\u0442\u044c \u0437\u0430\u043b\u043e\u0436\u043d\u0438\u043a\u043e\u043c \u0447\u0443\u0436\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435.\u00a0\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438. \u0414\u043b\u044f ESP8266 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u0435\u0439 ESP-01S \u0441 1 \u041c\u0411 Flash) \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u043d\u0430 \u0441\u0447\u0435\u0442\u0443. \u0413\u043e\u0442\u043e\u0432\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0441\u0438\u0442\u044c 10\u201320 \u041a\u0411, \u0430 \u0447\u0438\u0441\u0442\u044b\u0439 socket \u0440\u0435\u0448\u0430\u0435\u0442 \u0442\u0435 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u0430\u0442\u0440\u0430\u0442\u0430\u043c\u0438.\u00a0\u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c. \u0412\u044b \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b \u043a \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c \u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u043e\u0434 \u043b\u044e\u0431\u0443\u044e, \u0434\u0430\u0436\u0435 \u0441\u0430\u043c\u0443\u044e \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0435\u0441\u0442\u044c \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430, \u0430 socket \u2014 \u0435\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430.\u00a0\u042d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u2014 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0430\u0442\u044c\u044f, \u0430 \u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442-\u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445. \u041c\u044b \u043f\u0440\u043e\u0439\u0434\u0451\u043c \u043f\u0443\u0442\u044c \u043e\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a Wi-Fi \u0434\u043e \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0432 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u0440\u0435\u0436\u0438\u043c\u0435.\u00a0\u0421\u043e\u043a\u0435\u0442 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0442\u0438. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e, \u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u043e\u043a\u0435\u0442 \u2014 \u044d\u0442\u043e \u0434\u0432\u0435\u0440\u044c, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u0442\u0443\u0447\u0430\u0442\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u044b. \u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0441\u043e\u043a\u0435\u0442 \u2014 \u044d\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0443\u0447\u0438\u0442\u0441\u044f \u0432 \u0434\u0432\u0435\u0440\u044c \u0438 \u0436\u0434\u0451\u0442 \u043e\u0442\u0432\u0435\u0442\u0430.\u00a0\u0421\u043e\u043a\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u2014 TCP \u0438\u043b\u0438 UDP. \u041e\u043d \u0443\u043c\u0435\u0435\u0442:\u00a0&#8212; \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 (connect() \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430, accept() \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430).- \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 (send() \u0438 recv()).- \u0420\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u0438\u043b\u0438 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u0440\u0435\u0436\u0438\u043c\u0435.- \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0447\u0435\u0440\u0435\u0437 setsockopt().\u00a0\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0438 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438.\u00a0\u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u04351. \u0424\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442: Wi-Fi \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0435\u0442\u044c\u044e\u0420\u0435\u0436\u0438\u043c\u044b STA_IF \u0438 AP_IF, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c, \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 NVS, \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u0431\u0440\u043e\u0441 \u0441\u0442\u0435\u043a\u0430. \u00a02. \u042f\u0434\u0440\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b: \u0441\u043e\u043a\u0435\u0442\u044b\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u043a\u0435\u0442 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0439 \u0438 \u043a\u043e\u0434\u0430. \u0411\u043b\u043e\u043a-\u0441\u0445\u0435\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0438 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0436\u0438\u043c\u044b \u2014 \u043a\u043e\u0433\u0434\u0430 \u0438 \u043a\u0430\u043a\u043e\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c setblocking(), settimeout() \u0438 \u0438\u0445 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 TIME_WAIT \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435 \u00abAddress already in use\u00bb.\u00a04. \u042f\u0437\u044b\u043a \u043e\u0431\u0449\u0435\u043d\u0438\u044f: \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b HTTP\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 GET \u0438 POST-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u0437 URL, \u0447\u0442\u0435\u043d\u0438\u0435 \u0442\u0435\u043b\u0430. \u00a0\u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430 \u2014 Wi-Fi \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0442\u044c\u044e.\u041b\u044e\u0431\u0430\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c ESP \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c IP-\u0430\u0434\u0440\u0435\u0441 \u2014 \u043b\u0438\u0431\u043e \u043e\u0442 \u0440\u043e\u0443\u0442\u0435\u0440\u0430 (\u0440\u0435\u0436\u0438\u043c STA), \u043b\u0438\u0431\u043e \u0440\u0430\u0437\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0430\u043c (\u0440\u0435\u0436\u0438\u043c AP). \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e, \u0442\u043e ESP \u0432 \u043c\u0438\u0440\u0435 \u0441\u0435\u0442\u0435\u0439 \u2014 \u043a\u0430\u043a \u043a\u0443\u0440\u044c\u0435\u0440. \u041e\u043d \u043b\u0438\u0431\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0447\u0443\u0436\u043e\u0439 \u0441\u0435\u0442\u0438 (\u0440\u043e\u0443\u0442\u0435\u0440), \u043b\u0438\u0431\u043e \u0441\u0430\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0443\u043d\u043a\u0442\u043e\u043c \u0432\u044b\u0434\u0430\u0447\u0438, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0441\u0432\u043e\u044e. \u0414\u0432\u0435 \u0440\u043e\u043b\u0438: \u043a\u043b\u0438\u0435\u043d\u0442 \u0438 \u0442\u043e\u0447\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430    \u0420\u0435\u0436\u0438\u043c STA_IF (\u043a\u043b\u0438\u0435\u043d\u0442) \u2014 \u00ab\u042f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0441\u044c \u043a \u0447\u0443\u0436\u043e\u0439 \u0441\u0435\u0442\u0438\u00bb\u00a0\u041a\u043e\u0433\u0434\u0430 ESP \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043a\u043b\u0438\u0435\u043d\u0442, \u043e\u043d \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0440\u043e\u0443\u0442\u0435\u0440\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442 \u043d\u0435\u0433\u043e IP-\u0430\u0434\u0440\u0435\u0441. \u042d\u0442\u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u2014 \u0440\u043e\u0443\u0442\u0435\u0440 \u0432\u044b\u0434\u0430\u0451\u0442 \u0435\u0433\u043e \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 DHCP, \u0438 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0430\u0434\u0440\u0435\u0441 \u0447\u0430\u0441\u0442\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c. ESP \u0437\u0434\u0435\u0441\u044c \u2014 \u00ab\u0433\u043e\u0441\u0442\u044c\u00bb \u0432 \u0447\u0443\u0436\u043e\u0439 \u0441\u0435\u0442\u0438.\u00a0\u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435 \u043d\u0430 ESP \u0441\u0435\u0440\u0432\u0435\u0440, \u0430 IP-\u0430\u0434\u0440\u0435\u0441 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e (\u0442\u0435\u043b\u0435\u0444\u043e\u043d, \u0434\u0440\u0443\u0433\u043e\u0439 ESP) \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u2014 \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u0430\u0440\u0443\u044e \u0434\u0432\u0435\u0440\u044c, \u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u00ab\u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u00bb. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c IP-\u0430\u0434\u0440\u0435\u0441 (\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 IP \u0438\u043b\u0438 DHCP-\u0440\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u044f).import networkimport time# ======================================================# 1. \u041d\u0410\u0421\u0422\u0420\u041e\u0419\u041a\u0410 \u0414\u041e \u041f\u041e\u0414\u041a\u041b\u042e\u0427\u0415\u041d\u0418\u042f# ======================================================# 1.1. \u0417\u0430\u0434\u0430\u0451\u043c \u0438\u043c\u044f \u0445\u043e\u0441\u0442\u0430 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)# \u0418\u043c\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0440\u043e\u0443\u0442\u0435\u0440\u0430.# \u0412\u0430\u0436\u043d\u043e: \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0414\u041e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f.network.hostname(&#171;ESP32S3_HOME_SENSOR&#187;)  # \u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 32 \u0441\u0438\u043c\u0432\u043e\u043b\u0430# 1.2. \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441sta = network.WLAN(network.STA_IF)# 1.3. \u041d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 IP (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)# \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435, \u0435\u0441\u043b\u0438:# &#8212; \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0435\u0441\u044c \u043a \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (DHCP-\u0440\u0435\u0437\u0435\u0440\u0432\u0430\u0446\u0438\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430)# &#8212; \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e IP \u0441\u0432\u043e\u0431\u043e\u0434\u0435\u043dSTATIC_IP = &#171;192.168.4.99&#187;       # \u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441SUBNET = &#171;255.255.255.0&#187;          # \u041c\u0430\u0441\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u0442\u0438GATEWAY = &#171;192.168.4.1&#187;           # IP \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (\u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430)DNS = &#171;8.8.8.8&#187;                   # DNS-\u0441\u0435\u0440\u0432\u0435\u0440sta.ifconfig((STATIC_IP, SUBNET, GATEWAY, DNS))# 1.4. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c Wi-Fi \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441sta.active(True)# ======================================================# 2. \u0421\u0411\u0420\u041e\u0421 \u041a\u042d\u0428\u0410 NVS (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)# ======================================================# ESP \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0443\u0441\u043f\u0435\u0448\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u0432 NVS-\u043f\u0430\u043c\u044f\u0442\u0438.# \u0427\u0442\u043e\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0443\u0436\u043d\u043e\u0439 \u0441\u0435\u0442\u0438,# \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u0431\u0440\u043e\u0441 \u0441\u0442\u0435\u043a\u0430.sta.disconnect()      # \u0420\u0430\u0437\u0440\u044b\u0432\u0430\u0435\u043c \u0430\u0432\u0442\u043e\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438sta.active(False)     # \u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441time.sleep(1)         # \u0414\u0430\u0451\u043c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0441\u0431\u0440\u043e\u0441sta.active(True)      # \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0430\u043d\u043e\u0432\u043e# ======================================================# 3. \u041f\u041e\u0414\u041a\u041b\u042e\u0427\u0415\u041d\u0418\u0415 \u041a \u0421\u0415\u0422\u0418# ======================================================sta.connect(&#171;\u0414\u043e\u043c\u0430\u0448\u043d\u0438\u0439_WiFi&#187;, &#171;\u043f\u0430\u0440\u043e\u043b\u044c&#187;)# \u0416\u0434\u0451\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0446\u0438\u043a\u043b)while not sta.isconnected():    time.sleep_ms(50)print(&#187; \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e! IP:&#187;, sta.ifconfig()[0])print(&#187; \u0418\u043c\u044f \u0445\u043e\u0441\u0442\u0430:&#187;, sta.config(&#8216;dhcp_hostname&#8217;))# ======================================================# 4. \u041e\u0421\u041d\u041e\u0412\u041d\u041e\u0419 \u0426\u0418\u041a\u041b \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435# ======================================================while True:    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435    if sta.isconnected():        #  \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0435\u0441\u0442\u044c \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f        # \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u0438\u0451\u043c \u043a\u043e\u043c\u0430\u043d\u0434, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c        pass    else:        #  \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043e \u2014 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f        print(&#187; \u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043e. \u041f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0441\u044c&#8230;&#187;)                sta.disconnect()        sta.active(False)        time.sleep(1)        sta.active(True)        sta.connect(&#171;\u0414\u043e\u043c\u0430\u0448\u043d\u0438\u0439_WiFi&#187;, &#171;\u043f\u0430\u0440\u043e\u043b\u044c&#187;)                # \u0416\u0434\u0451\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u043c        timeout = 10000  # 10 \u0441\u0435\u043a\u0443\u043d\u0434        start = time.ticks_ms()        while not sta.isconnected():            if time.ticks_diff(time.ticks_ms(), start) &gt; timeout:                print(&#187; \u041e\u0448\u0438\u0431\u043a\u0430: \u0442\u0430\u0439\u043c\u0430\u0443\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f&#187;)                break            time.sleep_ms(50)                if sta.isconnected():            print(&#187; \u041f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e! IP:&#187;, sta.ifconfig()[0])        # \u041f\u0430\u0443\u0437\u0430 \u0434\u043b\u044f \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438    time.sleep_ms(10)\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442? \u00a0network.hostname() &#8212;\u00a0\u00a0\u00a0\u00a0\u0437\u0430\u0434\u0430\u0451\u0442 \u0438\u043c\u044f ESP, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0438\u0434\u043d\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0440\u043e\u0443\u0442\u0435\u0440\u0430. \u0423\u0434\u043e\u0431\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432 \u0441\u0435\u0442\u0438. \u041d\u043e \u043e\u043d\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u043f\u043e http:\/\/\u0438\u043c\u044f.local \u2014 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u0435\u043d mDNS, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 ESP \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e.sta.ifconfig() &#8212; \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 IP-\u0430\u0434\u0440\u0435\u0441. ESP \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 (\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u00ab\u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0433\u043e\u00bb IP). sta.disconnect() + active(False\/True) &#8212; \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u0431\u0440\u043e\u0441 Wi-Fi \u0441\u0442\u0435\u043a\u0430. \u041e\u0447\u0438\u0449\u0430\u0435\u0442 \u043a\u044d\u0448 NVS, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u043d\u0443\u0436\u043d\u043e\u0439 \u0441\u0435\u0442\u0438. ESP \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 SSID \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 (NVS). \u041f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 ESP8266 \u043c\u043e\u0436\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u044d\u0442\u043e\u0439 \u0441\u0435\u0442\u0438, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u0432\u044b\u0437\u0432\u0430\u043b\u0438 connect() \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438.while not sta.isconnected()\u00a0\u00a0 \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0446\u0438\u043a\u043b \u2014 \u0431\u0435\u0437 \u0441\u0435\u0442\u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u0438\u0434\u0451\u043c\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 isconnected() \u0432 \u0446\u0438\u043a\u043b\u0435 &#8212; \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u041f\u0440\u0438 \u043e\u0431\u0440\u044b\u0432\u0435 \u2014 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u00a0\u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a: \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b wlan.config() &#8212; \u0441\u043a\u0440\u044b\u0442\u044c\u00a0\u0414\u043b\u044f \u0442\u043e\u043d\u043a\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 Wi-Fi \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 wlan.config(). \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b (ESP8266, ESP32), \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0438 \u0432\u0435\u0440\u0441\u0438\u0438 MicroPython. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435.# \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430wlan.config(param_name=value)# \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044fvalue = wlan.config(&#8216;param_name&#8217;)\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435STAAPmacMAC-\u0430\u0434\u0440\u0435\u0441   (\u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u0435\u043d\u0438\u0435)\u2705\u2705ssid\u0418\u043c\u044f   \u0441\u0435\u0442\u0438 (\u0434\u043b\u044f AP \u2014 \u0438\u043c\u044f \u0442\u043e\u0447\u043a\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430)\u2705\u2705channelWi-Fi   \u043a\u0430\u043d\u0430\u043b (1\u201313). \u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0440\u0442\u0430\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f AP\u2705\u2705hidden\u0421\u043a\u0440\u044b\u0442\u044c   SSID (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f AP)\u274c\u2705security\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b   \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,\u00a0network.AUTH_WPA2_PSK)\u274c\u2705key\u041f\u0430\u0440\u043e\u043b\u044c   \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (\u0434\u043b\u044f AP)\u274c\u2705hostname\u0418\u043c\u044f   \u0445\u043e\u0441\u0442\u0430 \u0434\u043b\u044f DHCP\/mDNS.\u00a0\u0423\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439\u00a0\u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u00a0network.hostname()\u2705\u274creconnects\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e   \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (0 = \u043d\u0435\u0442, -1 = \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e)\u2705\u274ctxpower\u041c\u043e\u0449\u043d\u043e\u0441\u0442\u044c   \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u0447\u0438\u043a\u0430 \u0432 \u0434\u0411\u043c\u2705\u2705pm\u042d\u043d\u0435\u0440\u0433\u043e\u0441\u0431\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u0435 (PM_PERFORMANCE,\u00a0PM_POWERSAVE,\u00a0PM_NONE)\u2705\u2705protocol\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b   802.11 (\u0442\u043e\u043b\u044c\u043a\u043e ESP32)\u2705\u2705bandwidth\u0428\u0438\u0440\u0438\u043d\u0430   \u043a\u0430\u043d\u0430\u043b\u0430 (\u0442\u043e\u043b\u044c\u043a\u043e ESP32)\u2705\u2705\u0420\u0435\u0436\u0438\u043c AP_IF (\u0442\u043e\u0447\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430) \u2014 \u00ab\u042f \u0441\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u044e \u0441\u0432\u043e\u044e \u0441\u0435\u0442\u044c\u00bb\u00a0\u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 ESP \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043c\u0438\u043d\u0438-\u0440\u043e\u0443\u0442\u0435\u0440\u043e\u043c. \u041e\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e Wi-Fi-\u0441\u0435\u0442\u044c \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c (SSID) \u0438 \u0441\u0430\u043c \u0440\u0430\u0437\u0434\u0430\u0451\u0442 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0432\u0448\u0438\u043c\u0441\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c. IP-\u0430\u0434\u0440\u0435\u0441 \u0441\u0430\u043c\u043e\u0439 ESP \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439 \u2014 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e 192.168.4.1. \u041e\u043d \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u0432\u044b \u0441\u0430\u043c\u0438 \u0435\u0433\u043e \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e.import networkimport time# ======================================================# 1. \u041d\u0410\u0421\u0422\u0420\u041e\u0419\u041a\u0410 \u0422\u041e\u0427\u041a\u0418 \u0414\u041e\u0421\u0422\u0423\u041f\u042b# ======================================================ap = network.WLAN(network.AP_IF)# \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0414\u041e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044fap.config(essid=&#187;ESP_\u0421\u0442\u0430\u043d\u0446\u0438\u044f&#187;, password=&#187;12345678&#8243;, channel=6)# \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0442\u043e\u0447\u043a\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0430ap.active(True)# ======================================================# 2. \u041e\u0421\u041d\u041e\u0412\u041d\u041e\u0419 \u0426\u0418\u041a\u041b \u2014 \u041c\u041e\u041d\u0418\u0422\u041e\u0420\u0418\u041d\u0413 \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u042f# ======================================================while True:    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430    if not ap.active():        print(&#187; \u0422\u043e\u0447\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b\u0430\u0441\u044c! \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c&#8230;&#187;)        ap.active(False)        time.sleep(1)        ap.active(True)        ap.config(essid=&#187;ESP_\u0421\u0442\u0430\u043d\u0446\u0438\u044f&#187;, password=&#187;12345678&#8243;)        print(&#187; \u0422\u043e\u0447\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430&#187;)        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u044b    if ap.isconnected():        # \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 (\u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f)        print(&#187; \u0415\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b&#187;)    else:        print(&#187; \u041a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043d\u0435\u0442&#187;)        # \u041f\u0430\u0443\u0437\u0430 \u0434\u043b\u044f \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438    time.sleep_ms(5000)  # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0435 5 \u0441\u0435\u043a\u0443\u043d\u0434\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442?ap.config(essid=&#8230;, password=&#8230;) &#8212; \u0437\u0430\u0434\u0430\u0451\u0442 \u0438\u043c\u044f \u0441\u0435\u0442\u0438 (SSID) \u0438 \u043f\u0430\u0440\u043e\u043b\u044c. \u041a\u043b\u0438\u0435\u043d\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u044d\u0442\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043cap.active(True) &#8212; \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0442\u043e\u0447\u043a\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e ESP \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0441\u0435\u0442\u044c.ap.ifconfig()[0] &#8212; \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 IP-\u0430\u0434\u0440\u0435\u0441 ESP. \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a ESP.ap.isconnected() &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0435\u0441\u0442\u044c \u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b. \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438.ap.active() &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043b\u0438 \u0442\u043e\u0447\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-490253","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/490253","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=490253"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/490253\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=490253"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=490253"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=490253"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}