Skocz do zawartości

Pobieranie parametrów hardware - biblioteka Libre


Pomocna odpowiedź

Napisano (edytowany)

Witam wszystkich!

Forum przeglądam od dłuższego czasu, w ostatnich dniach zacząłem uczyć się programowania (C#, Arduino).

Założenia: wykorzystanie darmowej biblioteki LibreHardwareMonitor to odczytu parametrów komputera, następnie przesyłanie do Arduino po porcie szeregowym a na koniec prezentacja 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();
}

Narazie wszystko się zgadza, mam w systemie dwie karty sieciowe przewodowe i obie są widoczne:

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:

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ę 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

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

Gdzie może leżeć problem?

Jako ciekawostkę 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ć taki wynik:

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

Aktualizacja: odpytuję urządzenia Ethernet i Ethernet2 a nie Połączenia lokalne, gdyż dla tych pierwszych sensory z biblioteki Libre zwracają wartości niezerowe, 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

 

Edytowano przez Adik

Dodałem zmienną "liczba_znakow"

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

                }

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

W obu przypadkach otrzymuje 10:

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

Dzisiaj niestety już się poddaję.

Jakoś specjalnie tego nie analizowałem ale na oko błąd jest prosty. Masz tam "jeśli nazwa urządzenia zawiera tekst Ethernet to zapisz urządzenie w zmiennej NetworkName1". Tylko Ethernet 2 też zawiera w sobie Ethernet. W związku z tym najpierw do tego NetworkName1 wpisuje ci pierwszy interfejs sieciowy a po chwili nadpisuje to drugim. 

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Może zrobić `if (hw.Name.ToString().Equals("Ethernet"))` i `if (hw.Name.ToString().Equals("Ethernet 2"))`? Jeśli te sieci nazywają się Ethernet i Ethernet 2 to użycie IndexOf nie jest za bardzo uzasadnione. Równie dobrze jakieś inne dziwne urządzenie może mieć słowo Ethernet w nazwie. Bezpieczniej jest wtedy użyć Equals.

  • Lubię! 2
(edytowany)

@etet100 pięknie dziękuję, problem rozwiązany jest dokładnie tak jak zaproponowałeś, Equals działa. 🙂

 

int liczba_znakow = hw.Name.Length;
                if (hw.Name.Equals("Ethernet"))
                { 
                    NetworkName1 = "Network1:";
                    NetworkName1 += hw.Name;
                    NetworkName1 += " | "+liczba_znakow;
                }
Sieć: Network1:Ethernet | 8 | Sieć: Network2:Ethernet 2 10

 

Edytowano przez Adik

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...