Pobieranie parametrów hardware

0

Witajcie,

Planuję wykorzystać darmową bibliotekę LibreHardwareMonitor do odczytu parametrów komputera, następnie przesyłać dane do płytki Arduino po porcie szeregowym aby na koniec wyświetlić zebrane wartości na wyświetlaczu.

https://github.com/LibreHardwareMonitor/LibreHardwareMonitor

Poniżej mój kod (Visual Studio 2022):

foreach (LibreHardwareMonitor.Hardware.IHardware hw in thisPC.Hardware)
{
    Debug.WriteLine("Nazwa podzespołu="+hw.Name);
    Debug.WriteLine("Typ: " + hw.HardwareType);
    if (hw.HardwareType.ToString().IndexOf("Cpu") > -1)
    {
        cpuName = "CPU:";
        cpuName += hw.Name;
    }
    else if (hw.HardwareType.ToString().IndexOf("Gpu") > -1)
    {
        gpuName = "GPU:";
        gpuName += hw.Name;
    }
    else if (hw.HardwareType.ToString().IndexOf("Motherboard") > -1)
    {
        MotherboardName = "Płyta główna:";
        MotherboardName += hw.Name;
    }

    if (hw.Name.ToString().IndexOf("Ethernet") > -1)
    {
        NetworkName1 = "Network1:";
        NetworkName1 += hw.Name;
    }

    if (hw.Name.ToString().IndexOf("Ethernet 2") > -1)
    {
        NetworkName2 = "Network2:";
        NetworkName2 += hw.Name;
    }

    hw.Update();
}

Jak dotąd wszystko się zgadza, mam widoczne w systemie dwie przewodowe karty sieciowe:

Nazwa podzespołu=Gigabyte TRX40 AORUS XTREME
Typ: Motherboard
Nazwa podzespołu=AMD Ryzen Threadripper 3960X
Typ: Cpu
Nazwa podzespołu=Generic Memory
Typ: Memory
Nazwa podzespołu=NVIDIA GeForce RTX 2080 Ti
Typ: GpuNvidia
Nazwa podzespołu=Ethernet
Typ: Network
Nazwa podzespołu=Ethernet 2
Typ: Network
Nazwa podzespołu=Połączenie lokalne* 1
Typ: Network
Nazwa podzespołu=Połączenie lokalne* 2
Typ: Network
Nazwa podzespołu=Połączenie sieciowe Bluetooth
Typ: Network
Nazwa podzespołu=Wi-Fi

Kolejny etap:

string cpuName = "CPU";
string gpuName = "GPU";
string NetworkName1 = "Network1";
string NetworkName2 = "Network2";

Debug.WriteLine("Model CPU:" + cpuName + " | Model GPU:" + gpuName + " | Płyta główna:" + MotherboardName + " | Sieć: " + NetworkName1 + " | Sieć: " + NetworkName2);

Wynik:

Model CPU:CPU:AMD Ryzen Threadripper 3960X | Model GPU:GPU:NVIDIA GeForce RTX 2080 Ti | Płyta główna:Motherboard:Gigabyte TRX40 AORUS XTREME | Sieć: Network1:Ethernet 2 | Sieć: Network2:Ethernet 2

W tym momencie nie wiem dlaczego zarówno zmienna Network1 jak i Network 2 otrzymuje tą samą wartość: Ethernet 2.

Nawet jeśli zakomentuję linijki kodu:

if (hw.Name.ToString().IndexOf("Ethernet 2") > -1)
{
  NetworkName2 = "Network2:";
  NetworkName2 += hw.Name;
}

Otrzymuję:

Model CPU:CPU:AMD Ryzen Threadripper 3960X | Model GPU:GPU:NVIDIA GeForce RTX 2080 Ti | Płyta główna:Motherboard:Gigabyte TRX40 AORUS XTREME | Sieć: Network1:Ethernet 2 | Sieć: Network2

co nie jest prawdą, gdyż wynikiem dla Network1 powinna być wartość "Ethernet" (bez 2).

Gdzie może leżeć problem?

Dodam, że jeśli wyłączę drugi interfejs (Ethernet 2) w Windows 10 to NetworkName1 przyjmuje prawidłową wartość "Ethernet":

Sieć: Network1:Ethernet | Sieć: Network2

Dla obu aktywnych kart sieciowych w systemie chciałbym uzyskać:

Sieć: Network1:Ethernet | Sieć: Network2:Ethernet 2

Aktualizacja: Dlaczego akurat Ethernet i Ethernet2 a nie Połączenie lokalne 1 i 2? Dla tych pierwszych sensory z biblioteki Libre zwracają wartości, które później będę obrabiał dalej:

Console.WriteLine("Sensor: " + s.Name + " Type: " + s.SensorType + " Value: " + s.Value);
Nazwa podzespołu=Ethernet
Typ: Network
Sensor: Data Uploaded Type: Data Value: 0,9644753
Sensor: Data Downloaded Type: Data Value: 9,591947
Sensor: Upload Speed Type: Throughput Value: 3553,245
Sensor: Download Speed Type: Throughput Value: 11280,33
Sensor: Network Utilization Type: Load Value: 0,01186686
Nazwa podzespołu=Ethernet 2
Typ: Network
Sensor: Data Uploaded Type: Data Value: 0,76421537
Sensor: Data Downloaded Type: Data Value: 4,591947
Sensor: Upload Speed Type: Throughput Value: 153,2457
Sensor: Download Speed Type: Throughput Value: 1180,33
Sensor: Network Utilization Type: Load Value: 0
Nazwa podzespołu=Połączenie lokalne* 1
Typ: Network
Sensor: Data Uploaded Type: Data Value: 0
Sensor: Data Downloaded Type: Data Value: 0
Sensor: Upload Speed Type: Throughput Value: 0
Sensor: Download Speed Type: Throughput Value: 0
Sensor: Network Utilization Type: Load Value: 0
Nazwa podzespołu=Połączenie lokalne* 2
Typ: Network
Sensor: Data Uploaded Type: Data Value: 0
Sensor: Data Downloaded Type: Data Value: 0
Sensor: Upload Speed Type: Throughput Value: 0
Sensor: Download Speed Type: Throughput Value: 0
Sensor: Network Utilization Type: Load Value: 0
1

Jeśli spełnione jest hw.Name.ToString().IndexOf("Ethernet 2") > -1, to spełnione też będzie hw.Name.ToString().IndexOf("Ethernet") > -1. Używaj debugera, ficzerów biblioteki

Pierwsze podejście:

            var collectedHardware = new Dictionary<HardwareType, List<string>>();
            computer.Open();
            try
            {
                computer.Accept(new UpdateVisitor());

                foreach (var hardware in computer.Hardware)
                {
                    if (!collectedHardware.ContainsKey(hardware.HardwareType))
                        collectedHardware[hardware.HardwareType] = new List<string>();
                    collectedHardware[hardware.HardwareType].Add(hardware.Name);
                }
            }
            finally
            {
                computer.Close();
            }

            Func<HardwareType, string> toString = (HardwareType key)
                => collectedHardware.ContainsKey(key) ? string.Join(", ", collectedHardware[key]) : "";
            var output = new StringBuilder();
            output.Append($"Model CPU: {toString(HardwareType.Cpu)} ");
            output.Append($"Model GPU: {toString(HardwareType.GpuIntel)}{toString(HardwareType.GpuNvidia)}{toString(HardwareType.GpuAmd)} ");
            output.Append($"Płyta główna: {toString(HardwareType.Motherboard)} ");
            output.Append($"Sieć: {toString(HardwareType.Network)} ");

            Console.WriteLine(output.ToString());
1

Drugie podejście

        public interface ILabelFactory { string GetLabel(HardwareType type); }
        public class LabelFactory : ILabelFactory
        {
            public string GetLabel(HardwareType type)
            => type switch
            {
                HardwareType.Cpu => "Model CPU",
                HardwareType.GpuIntel => "Model GPU",
                HardwareType.GpuNvidia => "Model GPU",
                HardwareType.GpuAmd => "Model GPU",
                HardwareType.Motherboard => "Płyta główna",
                HardwareType.Network => "Sieć",
                _ => type.ToString()
            };
        }

        public class HardwareWithLabel
        {
            public string Label { get; }
            public HardwareType Type { get; }
            public IList<string> Hardware { get; } = new List<string>();

            public HardwareWithLabel(ILabelFactory labelFactory, HardwareType type)
            {
                Label = labelFactory.GetLabel(type);
                Type = type;
            }

            public void Add(string name) => Hardware.Add(name);
        }

// ...
            var collectedHardware = new Dictionary<HardwareType, HardwareWithLabel>();
            ILabelFactory labelFactory = new LabelFactory();
            computer.Open();
            try
            {
                computer.Accept(new UpdateVisitor());

                foreach (var hardware in computer.Hardware)
                {
                    if (!collectedHardware.ContainsKey(hardware.HardwareType))
                        collectedHardware[hardware.HardwareType] = new HardwareWithLabel(labelFactory, hardware.HardwareType);
                    collectedHardware[hardware.HardwareType].Add(hardware.Name);
                }
            }
            finally
            {
                computer.Close();
            }

            Func<HardwareType, string> toString = (HardwareType key)
                => collectedHardware.ContainsKey(key) ? $"{collectedHardware[key].Label}: {string.Join(", ", collectedHardware[key].Hardware)} " : "";

            var output = new StringBuilder();
            output.Append(toString(HardwareType.Cpu));
            output.Append(toString(HardwareType.GpuIntel));
            output.Append(toString(HardwareType.GpuAmd));
            output.Append(toString(HardwareType.GpuNvidia));
            output.Append(toString(HardwareType.Motherboard));
            output.Append(toString(HardwareType.Network));

            Console.WriteLine(output.ToString());
// ...

1 użytkowników online, w tym zalogowanych: 0, gości: 1