Важной особенностью WMI является то, что хранящиеся в нём объекты соответствуют динамическим ресурсам, то есть параметры этих ресурсов постоянно меняются, поэтому параметры таких объектов не хранятся постоянно, а создаются по запросу потребителя данных. Хранилище свойств объектов WMI называется репозиторием и расположено в системной папке операционной системы Windows: %SystemRoot%\System32\WBEM\Repository.
Так как WMI построен по объектно-ориентированному принципу, то все данные операционной системы представлены в виде объектов и их свойств и методов.
Все классы группируются в пространства имен, которые иерархически упорядочены и логически связаны друг с другом по определенной технологии или области управления. В WMI имеется одно корневое пространство имен Root, которое в свою очередь имеет 4 подпространства: CIMv2, Default, Security и WMI.
Классы имеют свойства и методы и находятся в иерархической зависимости друг от друга, то есть классы-потомки могут наследовать или переопределять свойства классов-родителей, а также добавлять свои свойства.
мониторинг аппаратное обеспечение приложение
Свойства классов используются для однозначной идентификации экземпляра класса и для описания состояния используемого ресурса. Обычно все свойства классов доступны только для чтения, хотя некоторые из них можно модифицировать определенным методом. Методы классов позволяют выполнить действия над управляемым ресурсом.
Для обращения к объектам WMI используется специфический язык запросов WMI Query Language (WQL), который является одной из разновидностей SQL.
В работе для получения информации о ресурсах системы использовались следующие WMI queries (Приложение Б):
· батарея
var query = new ManagementObjectSearcher ("SELECT * FROM Win32_Battery");
· жесткие диски
var query = new ManagementObjectSearcher ("SELECT * FROM Win32_DiskDrive");
Разработчики утилиты Open Hardware Monitor представили открытую одноименную библиотеку, инструменты которой позволяют получать данные об аппаратной составляющей компьютера. Данные получаются использованием WMI-запросов, однако процесс их извлечения заметно упрощен.
Основными типами данных являются:
· HardwareType - перечисление, предназначенное для различения частей оборудования друг от друга. Эта структура не полагается на конкретный тип, так как получение данных зависит от датчиков, фиксирующих параметры, а таковые могут отсутствовать. В проекте использованы некоторые значения перечисления: CPU, RAM и HDD.
· SensorType - перечисления для различения датчиков определенных типов параметров. Использованы Voltage, Clock, Temperature, Load, Data, Level.
Технология запросов Open Hardware Monitor основана на взаимосвязи экземпляров датчиков и аппарата: аппаратная компонента имеет несколько датчиков, каждый датчик имеет один родительский аппарат.
Свойство Hardware возвращает коллекцию доступных аппаратных элементов. Свойства Name, HardwareType позволяют получить и разграничить получаемые параметры. Свойство Sensors возвращает коллекцию параметров датчиков. Информация о каждом показателе получается при помощи свойств Name и Value. (Приложение В)
Таким образом, процесс извлечения данных об аппаратном состоянии представляет собой следующий алгоритм:
· В качестве родительского программного компонента выступает Hardware.computer, который настраивается в зависимости от необходимых данных с помощью свойств: RAMEnabled, HDDEnabled, CPUEnabled.
· Свойство Computer. Hardware возвращает все доступные аппаратные компоненты, которые фильтруются по типу с помощью свойства HardwareType.
· У каждого элемента Computer. Hardware вызывается свойство Sensors. Полученная коллекция
типов датчиков фильтруется по типу регистрируемых данных. Значения данных
передаются в результирующие списки.
Изначально предполагалось, что все необходимые данные будут запрашиваться с использованием "чистых" WMI-запросов. Как оказалось в процессе реализации, эта технология не может предоставить все запрашиваемые параметры. Библиотека не имеет доступа к таким данным, как температура процессора, его загрузка, напряжение на нем, список всех активных процессов, температуры жестких дисков.
Таким образом, появилась необходимость в новой библиотеке, которая бы решила данную проблему. Такой технологией оказался Open Hardware Monitor, который смог предоставить все данные, кроме информации о процессах и их модулях. Информация о них поставляется с помощью стандартного класса System. Diagnostics. Process.
В основном, вся работа проекта основана на библиотеке Open Hardware Monitor, которая позволяет
получать текущие аппаратные данные. Однако для того чтобы получить всю
информацию о каком-либо компоненте, необходим был довольно большой промежуток
времени, так как система должна была получить все параметры датчиков,
распределить их по типам и обработать. Для оптимизации данного процесса была
применена многопоточность. Для регистрации данных о каждом аппаратном
компоненте были созданы потоки, каждый из которых отвечал за сбор информации с
отдельного датчика. Таким образом, было увеличено быстродействие и появилась
возможность обновлять данные ежесекундно.
Приложение содержит ряд окон для предоставления возможности
предоставления информации о системе. Рассмотрим работу с каждым из них.
Рис. 1. Окно мониторинга ЦПУ
При запуске программы пользователю предоставляется окно с наиболее
важными аппаратными характеристиками - данными о ЦПУ (рис.1). На нем имеется
несколько окон со списками параметров. Каждое окно отвечает за характеристики,
регистрируемые отдельными датчиками: мощность, температура, частота и загрузка
ЦПУ. Показатели измеряются ежесекундно.
Рис. 2. Окно мониторинга ОЗУ
В окне представлены данные о количестве занятой и свободной памяти, а также о текущей загрузке ОЗУ (рис. 2). Показатели обновляются каждые две секунды.
Рис. 3. Окно мониторинга жестких дисков
В окне представлены данные о жестких дисках: их объем, температура, загрузка и т.д. (рис. 3). Показатели обновляются по клику на кнопку "Update the data”.
Рис. 4. Окно мониторинга батареи
В окне представлены текущие данные о батарее: статус, доступность, напряжение, зарядка, оставшееся время до полной разрядки (рис.4). Данные обновляются каждые пять секунд.
Рис. 5. Окно с информацией об активных процессах и модулях
Рис. 6. Окно с настройками интерфейса
Окно предоставляется шаблоном MUI. (рис.6) Пользователю предоставляется возможность выбрать тему и
акцентный цвет в ходе использования приложения.
В ходе работы над курсовым проектом был разработан программный продукт для сбора характеристик аппаратного обеспечения. В качестве объектов мониторинга выступают процессор, оперативная память, жесткие диски, батарея. Система позволяет отследить все активные процессы и их модули.
В результате написания проекты были закреплены навыки работы с технологией WPF, многопоточностью. Также были применены WMI-запросы и шаблон интерфейса MUI, технология Open Hardware Monitor.
Программное средство "Hardware Monitoring” - это проектный программный продукт, готовый к использованию на персональных компьютерах различных типов.
В качестве улучшений видятся: управление процессами, сбор
информации о дополнительных компонентах (видеокарта, BIOS и т.д.), общее
расширение интерфейса и функциональности.
[1] Волосевич, А. Технология Windows Presentation Foundation / А. Волосевич. - Минск.: БГУИР, 2014. - 108 с.
[2] Microsoft [Электронный ресурс]. - Электронные данные. - Режим доступа: https: // msdn. microsoft.com/ <https://msdn.microsoft.com/>.
[4] GitHub [Интернет ресурс]. - Электронные данные. - Режим доступа: https: // github.com/firstfloorsoftware/mui/wiki <https://github.com/firstfloorsoftware/mui/wiki>
[4] Википедия [Интернет ресурс]. - Электронные данные. - Режим доступа: http://ru. wikipedia.org/wiki/ <http://ru.wikipedia.org/wiki/>.
[5] Open Hardware Monitor [Электронный ресурс]. - Электронные
данные. - Режим доступа: <http://openhardwaremonitor.org/>
public class Processes
{List<string> ProcessNames { get; set; }ProcessModuleCollection modules {get; set; }Process [] processes { get; set; }Processes ()
{= new List<string> ();
}void GetAllProcesslNames ()
{= Process. GetProcesses ();(int i = 0; i < processes. Length; i++)
{. Add (processes [i]. ProcessName);
}
}static List<string> GetModules (string process_name)
{<string> result = new List<string> ();
{[] choosed_process = Process. GetProcessesByName (process_name);modules = choosed_process [0]. Modules;(int i = 0; i < modules. Count; i++)
{. Add (modules [i]. ModuleName);
}
}(System.componentModel. Win32Exception e)
{
result. Clear ();
}
return result;
}
}
Приложение Б Класс получения информации о батарее (использование WMI)
class Battery
{string ComputerName { get; set; }List<string> ResultInfo { get; set; }Battery ()
{= SystemInformation.computerName;= new List<string> ();
}void GetBatteryInformation ()
{serverName = @"\\" + ComputerName + @"\root\cimv2";scope = new ManagementScope (serverName);query = new SelectQuery ("SELECT * FROM Win32_Battery");
{(var searcher = new ManagementObjectSearcher (scope, query))
{info = searcher. Get ();batteryAvailabilities = (from ManagementObject value in info select value ["Availability"]. ToString ()). ToList ();(var value in batteryAvailabilities)
{status = Int32. Parse (value);status_value = CheckBatteryAvailability (status);. Add (String. Format ("Availability: {0}",status_value));
}batteryStatuses = (from ManagementObject value in info select value ["BatteryStatus"]. ToString ()). ToList ();(var value in batteryStatuses)
{status = Int32. Parse (value);status_value = CheckBatteryStatus (status);. Add (String. Format ("Status: {0}",status_value));
}batteryVolts = (from ManagementObject value in info select value ["DesignVoltage"]. ToString ()). ToList ();(var value in batteryVolts)
{millivolt;. TryParse (value, out millivolt);volt = (double) millivolt / 1000;. Add (String. Format ("Voltage: {0} V",volt));
}batteryCharges = (from ManagementObject value in info select value ["EstimatedChargeRemaining"]. ToString ()). ToList ();(var value in batteryCharges)
{. Add (String. Format ("Charged on: {0} % ",value));
}batteryInfo = (from ManagementObject value in info select value ["EstimatedRunTime"]. ToString ()). ToList ();(var value in batteryInfo)
{. Add (String. Format ("Remaining time: {0} min",value));
}
}
}(ManagementException e)
{;
}
}string CheckBatteryAvailability (int status)
{(status)
{1:"Other";2:"Unknown";3:"Running or Full Power";4:"Warning";5:"In Test";6:"Not Applicable";7:"Power Off";8:"Off Line";9:"Off Duty";10:"Degraded";11:"Not Installed";12:"Install Error";13:"The device is known to be in a power save mode, but its exact status is unknown";14:"The device is in a power save state but still functioning, and may exhibit degraded performance";15:"The device is not functioning, but could be brought to full power quickly. ";16:"Power Cycle";17:"The device is in a warning state, though also in a power save mode. ";:"";
}
}string CheckBatteryStatus (int status)
{(status)
{1:"The battery is discharging";2:"The system has access to AC";3:"Fully Charged";4:"Low";5:"Critical";6:"Charging";7:"Charging and High";8:"Charging and Low";9:"Charging and Critical";10:"Undefined";11:"Partially Charged";:
return "";
}
}
}
public static class CPU
{static Computer GetComputer ()
{myComputer;settings = new MySettings (new Dictionary<string, string>
{
{"/intelcpu/0/temperature/0/values", "H4sIAAAAAAAEAOy9B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iu6 // MH37x79i9/+NX6N3/TJm9/5f/01fw1+fosnv+A/+OlfS37/jZ/s/Lpv9fff6Ml/NTef/yZPnozc5679b+i193 // TQZ+/w2Dd+P9/sZeX/67v/GTf/b3iP3u4/ObBL // 73+i+f039+D8Zk/+xz/e/P6beu2TQZju8yH8f6OgzcvPv/U3/Rb8+z/0f/9b/+yfaOn8079X6fr6Cws7ln/iHzNwflPv99/wyS/+xY4+v/evcJ+733+jJ5 // Cw7/4ndy9Im3+U2e/Fbnrk31C93vrt/fyPvdb+N // hsF7/4/AQAA // 9NLZZ8WAIAAA==" },
});= new Computer (settings) { CPUEnabled = true };
{. Open ();
}(NullReferenceException e)
{. Open ();
}myComputer;
}static string GetCPUName ()
{myComputer = GetComputer ();(var hardwareItem in myComputer. Hardware)
{(hardwareItem. HardwareType == HardwareType. CPU)
{. Update ();(IHardware subHardware in hardwareItem. SubHardware). Update ();name = hardwareItem. Name;name;
}
}"";
}static void GetCPUInfo (int id, int [] threadId, out List<string> info)
{myComputer = GetComputer ();. Sleep (0);= new List<string> ();(var hardwareItem in myComputer. Hardware)
{(hardwareItem. HardwareType == HardwareType. CPU)
{. Update ();(IHardware subHardware in hardwareItem. SubHardware). Update ();
// name = hardwareItem. Name;(var sensor in hardwareItem. Sensors)
{(id == threadId [1] && sensor. SensorType == SensorType. Temperature)
{. Add (String. Format ("{0}: {1} C", sensor. Name, sensor. Value. HasValue? sensor. Value. Value. ToString (): "no value"));
}(id == threadId [2] && sensor. SensorType == SensorType. Clock)
{. Add (String. Format ("{0}: {1} MHz", sensor. Name, sensor. Value. HasValue? sensor. Value. Value. ToString (): "no value"));
}(id == threadId [3] && sensor. SensorType == SensorType. Load)
{. Add (String. Format ("{0}: {1} %", sensor. Name, sensor. Value. HasValue? sensor. Value. Value. ToString (): "no value"));
}(id == threadId [0] && sensor. SensorType == SensorType. Power)
{. Add (String. Format ("{0}: {1} W", sensor. Name, sensor. Value. HasValue? sensor. Value. Value. ToString (): "no value"));
}
}
}. Sleep (500);
};
}
}
public partial class CPUInfo: UserControl
{[] threadId { get; set; }static bool visible { get; set; }CPUInfo ()
{= new int [4];= true;();();();();
}void SetLabel (Label label, string content)
{. Content = content;. FontSize = 20.0;
label. FontWeight = FontWeights. Bold;
}void SetAllLabels ()
{(cpu_name_label, CPU. GetCPUName ());(cpu_power_label, "CPU power");(cpu_temp_label, "CPU temp");(cpu_clock_label, "CPU clock");(cpu_load_label, "CPU load");
}void SetListViews (int id, List<string> info)
{(id == threadId [0])(cpu_power_lv, info);(id == threadId [2])(cpu_clock_lv, info);(id == threadId [1])(cpu_temp_lv, info);(id == threadId [3])(cpu_load_lv, info);
}void StyleListView (ListView lv)
{. Margin = new Thickness (5.0);brush = new SolidColorBrush (Color. FromRgb (204, 204, 204));. Background = brush;
}void StyleAllListViews ()
{(cpu_power_lv);(cpu_clock_lv);(cpu_temp_lv);(cpu_load_lv);
}void AddNewItemsToListView (ListView lv, List<string> items)
{. Dispatcher. BeginInvoke (new Action (delegate ()
{. Items. Clear ();brush = new SolidColorBrush (Color. FromRgb (51, 51, 51));(var item in items)
{new_item = new ListViewItem ();_item. Content = item;. Items. Add (new_item);_item. Foreground = brush;
}. Items. Refresh ();
}));
}void StartThreads ()
{temperatureThread = new Thread (new ThreadStart (ThreadRoutine));[0] = temperatureThread. ManagedThreadId;. Start ();clockThread = new Thread (new ThreadStart (ThreadRoutine));[1] = clockThread. ManagedThreadId;. Start ();loadThread = new Thread (new ThreadStart (ThreadRoutine));[2] = loadThread. ManagedThreadId;. Start ();powerThread = new Thread (new ThreadStart (ThreadRoutine));[3] = powerThread. ManagedThreadId;. Start ();
}void ThreadRoutine ()
{(! StopThread. StopAllThreads)
{id = Thread. CurrentThread. ManagedThreadId;<string> info;. GetCPUInfo (id, threadId, out info);(id, info);= this. IsVisible;. StopCpuThread =! visible;
| [Методичка] Остеология |
| 00539 |
| 02.03 |
| 0501 Конунников ЛР1-1 |
| 10-2_ЛР |
| 10Лекция 10 |
| 1136 |
| 1304 |
| 131 |
| 1362 |