Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
products:laboratory_iot_c:exp57 [2024/12/05 10:52] – [Эксперимент 57. Простой веб-сервер] labuser30 | products:laboratory_iot_c:exp57 [2024/12/05 11:22] (текущий) – [Программный код эксперимента] labuser30 |
---|
==== Программный код эксперимента ==== | ==== Программный код эксперимента ==== |
| |
<file python Exp57.py[enable_line_numbers="2", start_line_numbers_at="1"]> | <file arduino Exp57.ino[enable_line_numbers="2", start_line_numbers_at="1"]> |
from micropyserver import MicroPyServer | #include <ESP8266WiFi.h> |
import time | #include <ESP8266WebServer.h> |
import network | |
import gc | |
_init() | |
gc.collect() | |
| |
wlan_id = "Wi-Fi_Name" | #define WIFI_NAME "WiFi_Name" |
wlan_pass = "Wi-Fi_Password" | #define WIFI_PASSWORD "WiFi_Password" |
| |
wlan = network.WLAN(network.STA_IF) | ESP8266WebServer server(80); |
wlan.active(True) | |
wlan.connect(wlan_id, wlan_pass) | |
time.sleep(1) | |
| |
while wlan.isconnected() == False: | void showMessage() { |
pass | server.send(200, "text/html", "HELLO WORLD!"); |
| } |
| |
print('Device IP:', wlan.ifconfig()[0]) | void setup() { |
| Serial.begin(9600); |
| Serial.println(); |
| |
| Serial.print("Connecting to WiFi"); |
| WiFi.mode(WIFI_STA); |
| WiFi.begin(WIFI_NAME, WIFI_PASSWORD); |
| while (WiFi.status() != WL_CONNECTED) { |
| Serial.print("."); |
| delay(500); |
| } |
| Serial.println(); |
| Serial.println("WiFi connected"); |
| Serial.print("IP address: "); |
| Serial.println(WiFi.localIP()); |
| |
def show_message(request, params): | server.on("/", showMessage); |
''' request handler ''' | server.begin(); |
server.send("HELLO WORLD!") | } |
| void loop() { |
server = MicroPyServer() | server.handleClient(); |
''' add request handler ''' | } |
server.add_route("/", show_message) | |
''' start server ''' | |
server.start() | |
</file> | </file> |
| |
<WRAP center round important 60%> | <WRAP center round important 60%> |
Первым делом в коде программы нужно заменить ''Wi-Fi_Name'' на имя нужной ести, а ''Wi-Fi_Password'' на пароль от нее. | Первым делом в коде программы нужно заменить ''WiFi_Name'' на имя нужной cести, а ''WiFi_Password'' на пароль от нее. |
</WRAP> | </WRAP> |
| |
| Создаем объект веб-сервера, в качестве параметра указываем порт на котором он будет принимать запросы. |
''gc.collect()'' — вызывается для сборки "мусора". Переменные, объекты и данные, которые были использованы в программах не сразу удаляются из памяти микроконтроллера после завершения использования и даже после завершения программы. Python удаляет эти данные постепенно. Чтобы очистить память немедленно мы и вызываем ''gc.collect()''. Без этого при многократных запусках программ может возникнуть нехватка памяти. | <code arduino[enable_line_numbers="2", start_line_numbers_at="7"]> |
| ESP8266WebServer server(80); |
Создаем объект сетевого интерфейса и активируем его | |
<code python[enable_line_numbers="2", start_line_numbers_at="11"]> | |
wlan = network.WLAN(network.STA_IF) | |
wlan.active(True) | |
</code> | </code> |
| |
Подключаемся к сети и секунду ждем соединения | Устанавливаем режим клиента. Подключаемся к сети и печатаем точку каждые полсекунды, до тех пор, пока микроконтроллер не подключится к сети. Если соединение не устанавливается, то скорее всего допущена ошибка в имени сети или пароле от нее. |
<code python[enable_line_numbers="2", start_line_numbers_at="13"]> | <code arduino[enable_line_numbers="2", start_line_numbers_at="19"]> |
wlan.connect(wlan_id, wlan_pass) | WiFi.mode(WIFI_STA); |
time.sleep(1) | WiFi.begin(WIFI_NAME, WIFI_PASSWORD); |
| while (WiFi.status() != WL_CONNECTED) { |
| Serial.print("."); |
| delay(500); |
| } |
</code> | </code> |
| |
Проверяем состояние подключения. Если соединение еще не установлено, то проверяем снова, до тех пор, пока соединение не будет установлено. Если соединение не устанавливается, то скорее всего допущена ошибка в имени сети или пароле от нее. | В сети есть специальный сервер, который выдает настройки вновь подключаемым устройствам — DHCP сервер. Помимо прочих настроек, он назначает устройствам IP- адреса. После подключения нашего устройства, ему был присвоен IP-адрес. Выведем этот адрес в последовательный порт. |
<code python[enable_line_numbers="2", start_line_numbers_at="16"]> | <code arduino[enable_line_numbers="2", start_line_numbers_at="26"]> |
while wlan.isconnected() == False: | Serial.print("IP address: "); |
pass | Serial.println(WiFi.localIP()); |
</code> | |
| |
В сети есть специальный сервер, который выдает настройки вновь подключаемым устройствам — DHCP сервер. Помимо прочих настроек, он назначает устройствам IP- адреса. После подключения нашего устройства, ему был присвоен IP-адрес. Выведем этот адрес в терминал | |
<code python[enable_line_numbers="2", start_line_numbers_at="19"]> | |
print('Device IP:', wlan.ifconfig()[0]) | |
</code> | </code> |
| |
Например, может быть получен адрес ''192.168.0.25'' или ''192.168.43.195''. Но может быть и другой. Это зависит от настроек сети и уже подключенных к ней устройств. Не очень важно какой именно адрес был назначен нашему микроконтроллеру, главное, что этот адрес нам нужно запомнить, ведь именно по нему мы будем обращаться к устройству. | Например, может быть получен адрес ''192.168.0.25'' или ''192.168.43.195''. Но может быть и другой. Это зависит от настроек сети и уже подключенных к ней устройств. Не очень важно какой именно адрес был назначен нашему микроконтроллеру, главное, что этот адрес нам нужно запомнить, ведь именно по нему мы будем обращаться к устройству. |
| |
Создадим веб- сервер | Настраиваем веб-сервер таким образом, что при обращении к главной странице будет вызываться функция ''show_message'' |
<code python[enable_line_numbers="2", start_line_numbers_at="25"]> | |
server = MicroPyServer() | |
</code> | |
| |
Настроим его таким образом, что при обращении к главной странице будет вызываться функция ''show_message'' | <code arduino[enable_line_numbers="2", start_line_numbers_at="29"]> |
<code python[enable_line_numbers="2", start_line_numbers_at="27"]> | server.on("/", showMessage); |
server.add_route("/", show_message) | |
</code> | </code> |
| |
На веб- сервере, или скажем: на сайте, может быть не одна страница, а много. Адрес страницы, к которой мы хотим обратиться мы передаем в адресе (URL) после домена сайта. Например %%http://pinlab.ru/page1%% или %%http://pinlab.ru/page2%%. Если имя страницы отсутствует, то обращение происходит к главной странице. В коде нашего сервера адрес главной страницы обозначается символом ''/'' | На веб-сервере, или скажем: на сайте, может быть не одна страница, а много. Адрес страницы, к которой мы хотим обратиться мы передаем в адресе (URL) после домена сайта. Например %%http://pinlab.ru/page1%% или %%http://pinlab.ru/page2%%. Если имя страницы отсутствует, то обращение происходит к главной странице. В коде нашего сервера адрес главной страницы обозначается символом ''/'' |
| |
Запускаем веб- сервер | Запускаем веб-сервер: |
<code python[enable_line_numbers="2", start_line_numbers_at="29"]> | <code arduino[enable_line_numbers="2", start_line_numbers_at="30"]> |
server.start() | server.begin(); |
| </code> |
| |
| В основном цикле программы проверяем наличие новых клиентов: |
| <code arduino[enable_line_numbers="2", start_line_numbers_at="30"]> |
| server.handleClient(); |
</code> | </code> |
| |
| |
Когда браузер обращается к главной странице нашего веб- сервера, веб сервер вызывает функцию ''show_message'': | Когда браузер обращается к главной странице нашего веб- сервера, веб сервер вызывает функцию ''show_message'': |
<code python[enable_line_numbers="2", start_line_numbers_at="21"]> | <code arduino[enable_line_numbers="2", start_line_numbers_at="9"]> |
def show_message(request, params): | void showMessage() { |
''' request handler ''' | server.send(200, "text/html", "HELLO WORLD!"); |
server.send("HELLO WORLD!") | } |
</code> | </code> |
| В ней всего одна строка, в которой вызывается метод ''send'', отправляющий клиенту ответ. Именно этот текст мы и увидели в браузере. Первый аргумент метода ''send()'' — код HTTP сообщения, второй — тип сообщение, третий — само сообщение. |
В ней всего одна строка, в которой вызывается метод ''send'', отправляющий клиенту ответ. Именно этот текст мы и увидели в браузере. | |
| |
Таким образом мы написали простейший веб-сервер, который при обращении к нему отправляет строку приветствия. | Таким образом мы написали простейший веб-сервер, который при обращении к нему отправляет строку приветствия. |