Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp57 [2024/12/05 10:52] – [Эксперимент 57. Простой веб-сервер] labuser30products:laboratory_iot_c:exp57 [2024/12/05 11:22] (текущий) – [Программный код эксперимента] labuser30
Строка 11: Строка 11:
 ==== Программный код эксперимента ==== ==== Программный код эксперимента ====
  
-<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_idwlan_pass+  WiFi.mode(WIFI_STA);  
-time.sleep(1)+  WiFi.begin(WIFI_NAMEWIFI_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>
  
Строка 100: Строка 101:
  
 Когда браузер обращается к главной странице нашего веб- сервера, веб сервер вызывает функцию ''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'', отправляющий клиенту ответ. Именно этот текст мы и увидели в браузере. +
  
 Таким образом мы написали простейший веб-сервер, который при обращении к нему отправляет строку приветствия. Таким образом мы написали простейший веб-сервер, который при обращении к нему отправляет строку приветствия.