Skocz do zawartości

Pobieranie parametrów hardware - biblioteka Libre


Adik

Pomocna odpowiedź

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
Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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. 

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.