Создание WiFi монитора параметров ПК на платформах ESP32 или ESP8266
В этой статье мы рассмотрим как создать  WiFi монитор параметров ПК на платформах ESP8266 и ESP32.
Создание WiFi монитора параметров ПК на платформах ESP32 или ESP8266
29.02.2024 в 10:57   902 0
Версия для печати

Создание WiFi монитора параметров ПК  на платформах ESP32 или ESP8266

Введение

В современном мире, где компьютеры играют важную роль в повседневной жизни людей, мониторинг параметров компьютера становится все более важным. Одним из наиболее удобных способов мониторинга параметров компьютера является использование WiFi монитора, который позволяет получать информацию о работе системы на удаленном устройстве через Wi-Fi соединение.

В этой статье мы рассмотрим, как создать WiFi монитор параметров ПК на платформах ESP8266 и ESP32. Эти платформы являются популярными в мире разработки IoT устройств, и благодаря своей высокой производительности и низкой стоимости, они могут быть использованы для создания WiFi монитора параметров ПК.

Важно отметить, что в данной статье  мы сосредоточимся лишь на предоставлении базовых знаний и навыков, необходимых для создания своих собственных устройств..

Мы рассмотрим процесс настройки серверной части WiFi монитора, передачу данных по wifi и расшифровку полученных значений на конечном устройстве. Эта информация может быть использована для создания своих собственных устройств, адаптированных к конкретным потребностям и требованиям.

Создание WiFi монитора параметров ПК на платформах ESP8266 и ESP32 может быть отличным способом улучшить контроль за работой вашего компьютера и обеспечить более эффективное управление системой. Если вы заинтересованы в создании WiFi монитора параметров ПК на платформах ESP8266 или ESP32, то эта статья предоставит вам необходимую информацию и руководство по действиям.

Алгоритм работы

Получение и обработка информации о параметрах ПК реализуется по следующему алгоритму: 

  • На ПК запускается серверная программа, которая занимается сбором информации о различных параметрах компьютера. Такие как температура процессора, скорость вентиляторов, напряжение и т.д.
  • Для передачи данных о параметрах ПК на клиентское устройство на компьютере  необходимо настроить и запустить веб-сервер. Затем, при помощи запроса на сервер от клиентского устройства по протоколу HTTP, сервер отправляет JSON-файл с данными о параметрах ПК. JSON-файл содержит информацию о различных параметрах, которые мониторятся сервером.
  • После получения JSON-файла, данные могут быть обработаны на клиентском устройстве и использованы для отображения информации о параметрах ПК.

Настройка серверной части

В качестве сервера мы будем использовать Libre Hardware Monitor (LHM). Это свободно распространяемая программа для мониторинга и отслеживания различных параметров компьютера, таких как температура процессора, скорость вентиляторов, напряжение и т.д. Важной особенностью LHM является возможность экспорта данных в форматы CSV, XML, JSON или HTML, а также возможность развертывания веб сервера на ПК для мониторинга данных параметров компьютера по локальной сети. Что идеально подходит для нашего проекта.  

Итак, после скачивания Libre Hardware Monitor из репозитория на Github, распаковки и запуска приступаем к настройке веб сервера. Запустим окно конфигурации выбрав в главном меню  Options>Remote Web Server>Port:
options

В открывшемся окне выбираем номер порта, по которому будет доступен веб сервер, А также обращаем внимание на строку с адресом по которому будет доступен сервер:

port

Скопируйте строку с адресом сервера в буфер обмена и нажмите Ок для сохранения настроек. Для запуска сервера нажмите в меню Options>Remote Web Server>Run. При успешном запуске возле данного пункта меню появится галочка.

Проверьте работу сервера. Для этого откройте браузер и перейдите по адресу скопированному из меню настроек веб сервера.

Если вы все сделали правильно, то на экране вы увидите следующее:

lhmweb

Это означает, что веб сервер запущен и готов к работе.

Осталось открыть доступ к веб серверу из локальной сети. Для этого необходимо соответствующим образом настроить брэндмауэр Windows. Нажмите комбинацию клавиш Win+R и в открывшемся окне введите firewall.cpl. 

brandmauer

В открывшемся окне выберите пункт Дополнительные параметры:

Дополнительные параметры

Далее, сначала нажмите на Правила для входящих подключений, затем на кнопку Создать правило...

 

создать правило

В Мастере создания правила для нового входящего подключения выберите пункт Для порта:

мастер1

Далее выберите протокол TCP и в поле Определенные локальные порты укажите номер порта из настроек веб сервера LHM:

мастер2

В новом окне выберите Разрешить подключение:

мастер3

В следующем окне выберите для каких профилей применяется правило. Можете оставить без изменений:

мастер4

И, наконец, введите имя для создаваемого правила:

мастер5

Нажмите Готово для сохранения изменений. На этом настройка серверной части завершена.

Клиентская часть

После завершения настройки серверной части, можно приступать к написанию клиента.  В качестве аппаратной платформы возьмем ESP32, хотя данный код с минимальными изменениями будет работать и на ESP8266. В качестве среды программирования выберем Arduino IDE. В рамках данной статьи подразумевается, что у вас в Arduino IDE уже установлены все необходимые ядра для работы с ESP8266  и ESP32 и вы умеете подключать сторонние библиотеки к проекту. Так что укажу лишь версии ядра и необходимых библиотек, которые установлены у меня.

Ядра:

  • ESP32 2.0.9
  • ESP8266 3.1.2

Библиотеки:

  • HTTPClient 2.2.0
  • ArduinoJson 6.20.0

Текст программы

Далее приведен текст программы, которая делает следующее:

  • Подключается к вашей локальной сети по WiFi.
  • Отправляет GET запрос веб серверу LHM, который расположен в той же локальной сети
  • Получает в ответ JSON файл с параметрами ПК, собранными LHM
  • С помощью ArduinoJSON обрабатывает его и сохраняет значения в локальные переменные для последующей работы

#include <WiFi.h> //Библиотека для работы с wifi
#include <HTTPClient.h> //библиотека для отправки http запросов серверу
#include <ArduinoJson.h>//библиотека для парсинга JSON
#include <WiFiClient.h> //необходима для работы http client по wifi

// Указываем идентификатор и пароль от своей WiFi-сети
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";

void setup() {
 Serial.begin(115200);

 // Начинаем подключение к сети
 WiFi.begin(ssid, password);

 // Проверяем статус. Если нет соединения, то выводим сообщение о подключении
 while (WiFi.status() != WL_CONNECTED) {
 delay(1000);
 Serial.println("Соединяемся к WiFi-сети...");
 }

 Serial.println("Есть подключение к WiFi-сети");
}
//Функция получения параметров ПК
void hardwareMonitor()
{
 
 WiFiClient client; //инициализируем клиента для передачи данных по wifi
 HTTPClient http; //Инициализируем библиотеку httpclient
 // Отправляем запрос
 http.useHTTP10(true); //устанвливаем версию http протокола 1.1
 http.begin(client, "http://192.168.1.66:8085/data.json"); //указываем библиотеке через какой интерфейс отправлять данные и на какой адрес
 //Здесь проверяем доступен ли воообще JSON по указанному нами адресу
 int httpCode = http.GET(); //отправляем запрос и получаем код ответа

 // httpCode равен -1 при ошибке
 if (httpCode > 0) {
 // HTTP запрос отправлен
 // файл найден на сервере
 if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { 
 }
 } else {
 Serial.printf("sensors http sync failed, error: %s\n", http.errorToString(httpCode).c_str()); //содержимое файла не может быть прочитано
 return;
 }

 if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { //если файл получен начинаем обработку
//фильтруем содержимое для экономии памяти микроконтроллера 
StaticJsonDocument<224> filter;//создаем вспомогательный Json документ для фильтрации получаемых значений

JsonObject filter_Children_0_Children_0 = filter["Children"][0]["Children"].createNestedObject();
filter_Children_0_Children_0["Text"] = true;

JsonObject filter_Children_0_Children_0_Children_0_Children_0 = filter_Children_0_Children_0["Children"][0]["Children"].createNestedObject();
filter_Children_0_Children_0_Children_0_Children_0["Text"] = true;
filter_Children_0_Children_0_Children_0_Children_0["Value"] = true;
filter_Children_0_Children_0_Children_0_Children_0["Children"][0]["Value"] = true;
 // непосредственно парсинг основоного JSON. 
 DynamicJsonDocument doc(18000); //выделяем память
 deserializeJson(doc, http.getStream(), DeserializationOption::Filter(filter), DeserializationOption::NestingLimit(12));//читаем файл и применяем фильтр
 doc.shrinkToFit();//освобождаем неиспользованную память
 //Присваиваем значения переменным
 String cpuName = doc["Children"][0]["Children"][1]["Text"];//название процессора
 String cpuTempPackage = doc["Children"][0]["Children"][1]["Children"][1]["Children"][10]["Value"];//температура процессора
 String cpuLoad = doc["Children"][0]["Children"][1]["Children"][2]["Children"][0]["Value"];//загруженность процессора
 String gpuName = doc["Children"][0]["Children"][3]["Text"];//название видеокарты
 String gpuHotSpot = doc["Children"][0]["Children"][3]["Children"][1]["Children"][0]["Value"];//температура видеокарты
 String gpuLoad = doc["Children"][0]["Children"][3]["Children"][2]["Children"][0]["Value"];//загруженность видеокарты
 String usedRAM = doc["Children"][0]["Children"][2]["Children"][1]["Children"][0]["Value"];//использованная память ОЗУ
 String freeRAM = doc["Children"][0]["Children"][2]["Children"][1]["Children"][1]["Value"];//свободная память ОЗУ
 String gpuRAMused = doc["Children"][0]["Children"][3]["Children"][5]["Children"][1]["Value"];//Использованная видеопамять
 String gpuRAM = doc["Children"][0]["Children"][3]["Children"][5]["Children"][0]["Value"];//свободная видеопамять
 String cpuFANpercent= doc["Children"][0]["Children"][0]["Children"][0]["Children"][3]["Children"][0]["Value"];//скорость работы вентилятор процессора в процентах
 String gpuFANpercent = doc["Children"][0]["Children"][3]["Children"][4]["Children"][0]["Value"];//скорость работы вентилятора видеокарты в процентах
 String uploadSpeed = doc["Children"][0]["Children"][12]["Children"][2]["Children"][0]["Value"];//скорость передачи данных по сети
 String downloadSpeed = doc["Children"][0]["Children"][12]["Children"][2]["Children"][1]["Value"];//скорость загрузки данных по сети
 
 }
 http.end();//закрываем http соединение
 
}

void loop() {
hardwaremonitor();//вызываем функцию чтения данных параметров ПК
delay(5000);//ждем 5 секунд
}

В коде программы множество комментариев, объясняющих основные процессы в ней происходящие, но некоторые моменты, относящиеся к обработке JSON, требуют особого внимания.

Получение параметров ПК из JSON

JSON файл на веб сервере LHM, генерируется динамически и его содержимое во многом зависит от компонентов из которых собран ваш компьютере. То есть ключи отвечающие за тот или иной параметр в примере программы выше, совсем необязательно будут отвечать за тот же параметр на вашем оборудовании или вообще присутствовать. Дополнительную сложность добавляет и именование ключей в данном файле. В общем виде он представляет собой древовидную структуру с множеством ветвлений, каждый узел которого называется CHILDREN, а ветви именуются цифрами. И лишь конечные ключи каждой ветви имеют хоть сколько-нибудь понятное обозначение.

Например, чтобы добраться до ключа хранящего значение температуры процессора нужно поочередно пройти следующие ветви:

["Children"][0]["Children"][1]["Children"][1]["Children"][10]["Value"]

То есть от корневого узла мы переходим на ветвь 0, затем на следующем ветвлении на 1 ветвь, далее на развилке опять на 1 ветвь, потом уже на следующей развилке перейдя на 10 ветвь мы найдем искомый параметр Value со значением температуры.

И весь этот путь мы и должны записать в функцию парсинга JSON для присваивания значения данного параметра переменной.

То есть для каждого нужного вам параметра вы сначала должны найти на какой из ветвей он находится, затем указать полный путь к нему в функции парсинга.

Откроем веб интерфейс сервера LHM, введя в браузере адрес http://IPадресПК:8085/ и найдем искомый параметр:

example1

Как вы можете увидеть, он называется Fan #2. Запомните это имя. Это пригодится вам в дальнейшем.

 

Далее откройте в новой вкладке браузера сайт https://jsonformatter.org/json-parser. Это удобный инструмент для работы с JSON файлами

example2

Вернитесь на вкладку с веб интерфейсом сервера и добавьте к его адресу /data.json. Должно получиться следующее http://IPадресПК:8085/data.json. В открывшемся окне появится содержимое json файла с данными:

example3

Скопируйте его содержимое и вставьте в левое окно редактора:

example4

В правом окне редактора JSON автоматически предстанет в виде древовидной структуры. В поле Search введите искомый параметр Fan #2:

example5

После того как параметр будет найден, кликните левой кнопкой мыши в древовидной структуре по ключу Value относящемуся к данной ветви и и верхней части экрана появится полный путь к нему:

example6

Останется лишь добавить его в функцию парсинга:

String cpuFAN= doc["Children"][0]["Children"][0]["Children"][0]["Children"][2]["Children"][0]["Value"];

Аналогично добавляются и другие параметры.

Фильтрация JSON

Необходимо также упомянуть и о таком важном действии как фильтрация исходного JSON файла. В первоначальном виде JSON занимает в памяти около 50 кб, что по меркам микроконтроллера весьма и весьма много. А его парсинг вообще занимает целую вечность и очень сильно тормозит работу программы, а чаще всего вовсе приводит к неожиданной перезагрузке микроконтроллера. Благодаря фильтрации можно существенно уменьшить объем обрабатываемых данных, указав лишь нужные нам ключи. Остальные будут просто игнорироваться. Подробно об этом можно прочесть в документации к библиотеке ArduinoJSON. В примере программы фильтр настроен лишь на чтение ключей "text" и "Value", что позволило уменьшить объем занимаемой памяти до 13 кб и скорость обработки увеличить почти в 5 раз.

Заключение

В заключении можно сказать, что создание WiFi монитора параметров ПК на ESP8266 или ESP32 с использованием веб-сервера Libre Hardware Monitor является интересным и полезным проектом для тех, кто интересуется IoT и мониторингом параметров компьютера. С помощью этого проекта можно создать свою собственную систему мониторинга, которая будет мгновенно предупреждать вас о проблемах с компьютером, таких как перегрев процессора или сбой в работе вентиляторов.

Несмотря на то, что данная статья не рассматривает создание готового устройства, а лишь базовые сведения по настройке, передаче данных и расшифровке полученных значений для создания на их основе своих собственных устройств, она может послужить отличным отправным материалом для более глубокого изучения темы и разработки более продвинутых проектов.

Материал также доступен на моем канале: Яндекс Дзен и в группе ВК
Категория: Программирование | Добавил: :, (06.05.2023)
Просмотров: 902 | Теги: WiFi, Параметры ПК, ESP8266, ESP32 | Рейтинг: 0.0/0
Поделиться:
Всего комментариев: 0
avatar