Netztraffic mit WMI

  • Huhu,

    gibt ja schon so einiges zu dem Thema, hab da aber noch die eine oder andere Frage:

    Lese wie folgt den Traffic aus:

    Spoiler anzeigen

    Funktioniert soweit auch ohne Probs, nur hab ich zum verifizieren der Werte noch den NetSpeedMonitor mit laufen und der zeigt komplett andere Werte an. Sind immer um einiges höher.
    Hat da einer eine Erklärung zu??

    Gruß und Danke
    MrB

    2 Mal editiert, zuletzt von MrB (27. Januar 2015 um 17:42)

    • Offizieller Beitrag

    Es gibt so einen schönen Spruch: "Wer mist, mist Mist!" ;)
    In Deinem Fall besteht das Problem wohl darin, dass Du "nur" alle 500ms (Sleep 500) die Daten abfragst.
    Du musst die Daten permanent abfragen, addieren und das Ergebnis alle 500ms anzeigen lassen.
    Das Array in jedem Funktionsaufruf neu zu erstellen ist auch sehr zeitintensiv. Besser nur die Werte auslesen und von der Funktion zurückgeben lassen.

  • @Oscar
    OK, so weit angepasst. Nur was meinst du mit addieren? Sagt der Name der WMI-Class nicht aus das der Wert schon auf Sekunde basiert?
    Wenn nicht meinst mit einem 500ms Timer die Werte permanent (gar kein sleep?) auslesen und addieren?

    P.S.: Gab´s da nicht eine min. Zeit die zwischen den einzelnen WMI Abfragen liegen musste?

    Angepasst mit 1 Sek Timer

    Spoiler anzeigen
    [autoit]


    Global $aReturn[4][2]

    [/autoit] [autoit][/autoit] [autoit]

    $aReturn[0][0] = "Download Speed"
    $aReturn[1][0] = "Upload Speed"
    $aReturn[2][0] = "Name"
    $aReturn[3][0] = "Bandbreite LAN"

    [/autoit] [autoit][/autoit] [autoit]

    $aReturn[0][1] = 0
    $aReturn[1][1] = 0
    $aReturn[2][0] = "No Data"
    $aReturn[3][0] = "No Data"

    [/autoit] [autoit][/autoit] [autoit]

    Global $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20, $colItems = "", $strComputer = "localhost"
    $Upload = 0
    $Download = 0
    $Timer = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("+!x", "_Exit") ; Shift + Alt + x

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $aTraffic = _NetworkSpeed()
    If TimerDiff($Timer) >= 1000 Then
    ToolTip("U: " & $Upload & " kbit/s" & @CRLF & _
    "D: " & $Download & " kbit/s")
    $Timer = TimerInit()
    $Upload = 0
    $Download = 0
    EndIf
    $Upload = $Upload + Round($aTraffic[1][1] / 1024, 2)
    $Download = $Download + Round($aTraffic[0][1] / 1024, 2)
    ;~ Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _NetworkSpeed()

    [/autoit] [autoit][/autoit] [autoit]

    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_PerfFormattedData_Tcpip_NetworkAdapter", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit] [autoit][/autoit] [autoit]

    If IsObj($colItems) Then

    [/autoit] [autoit][/autoit] [autoit]

    For $objItem In $colItems

    [/autoit] [autoit][/autoit] [autoit]

    If $objItem.BytesReceivedPersec > 0 Then
    $aReturn[0][1] = $objItem.BytesReceivedPersec
    $aReturn[1][1] = $objItem.BytesSentPersec
    $aReturn[2][1] = $objItem.Name
    $Bandweite = $objItem.CurrentBandwidth

    [/autoit] [autoit][/autoit] [autoit]

    If $Bandweite = 100000000 Then $aReturn[3][1] = "1 GBit"
    If $Bandweite = 100000 Then $aReturn[3][1] = "100 MBit"
    If $Bandweite = 1000 Then $aReturn[3][1] = "10 MBit"
    Return $aReturn
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Else
    MsgBox(0, "WMI Output", "No WMI Objects Found for class: " & "Win32_PerfFormattedData_Tcpip_NetworkAdapter")
    EndIf

    Return $aReturn
    EndFunc ;==>_NetworkSpeed

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    2 Mal editiert, zuletzt von MrB (27. Januar 2015 um 17:56)

  • Hab´s dann doch noch selbst hin bekommen. Fehler waren die Einheiten!
    Man bekommt ja bei BytesReceivedPersec / 1024 nicht kbit/s sondern KB/s raus, diese dann noch mit dem Wert 7.8125 (Quelle: http://www.print-assistant.de/tools_prepress…_kbps_Mbps.html) multiplizieren und die Werte stimmen überein.

    Hier das "fertige" Script

    Spoiler anzeigen
    [autoit]


    Global $aReturn[4][2]

    [/autoit] [autoit][/autoit] [autoit]

    $aReturn[0][0] = "Download Speed"
    $aReturn[1][0] = "Upload Speed"
    $aReturn[2][0] = "Name"
    $aReturn[3][0] = "Bandbreite LAN"

    [/autoit] [autoit][/autoit] [autoit]

    $aReturn[0][1] = 0
    $aReturn[1][1] = 0
    $aReturn[2][0] = "No Data"
    $aReturn[3][0] = "No Data"

    [/autoit] [autoit][/autoit] [autoit]

    Global $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20, $colItems = "", $strComputer = "localhost"

    [/autoit] [autoit][/autoit] [autoit]

    HotKeySet("+!x", "_Exit") ; Shift + Alt + x

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $aTraffic = _NetworkSpeed()
    ToolTip("U: " & Round(($aTraffic[1][1] / 1024) * 7.8125, 2) & " kbit/s" & @CRLF & _
    "D: " & Round(($aTraffic[0][1] / 1024) * 7.8125, 2) & " kbit/s")
    Sleep(500)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _NetworkSpeed()

    [/autoit] [autoit][/autoit] [autoit]

    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_PerfFormattedData_Tcpip_NetworkAdapter", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit] [autoit][/autoit] [autoit]

    If IsObj($colItems) Then

    [/autoit] [autoit][/autoit] [autoit]

    For $objItem In $colItems

    [/autoit] [autoit][/autoit] [autoit]

    If $objItem.BytesReceivedPersec > 0 Then
    $aReturn[0][1] = $objItem.BytesReceivedPersec
    $aReturn[1][1] = $objItem.BytesSentPersec
    $aReturn[2][1] = $objItem.Name
    $Bandweite = $objItem.CurrentBandwidth

    [/autoit] [autoit][/autoit] [autoit]

    If $Bandweite = 100000000 Then $aReturn[3][1] = "1 GBit"
    If $Bandweite = 100000 Then $aReturn[3][1] = "100 MBit"
    If $Bandweite = 1000 Then $aReturn[3][1] = "10 MBit"
    Return $aReturn
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Else
    MsgBox(0, "WMI Output", "No WMI Objects Found for class: " & "Win32_PerfFormattedData_Tcpip_NetworkAdapter")
    EndIf

    Return $aReturn
    EndFunc ;==>_NetworkSpeed

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Danke an alle die geholfen haben

    Einmal editiert, zuletzt von MrB (27. Januar 2015 um 18:37)

  • 8 / 7.8125 = 1.024
    damit wird direkt von bps in kBps umgerechnet

    • Offizieller Beitrag

    @Andy das kapiere ich nicht.

    Beispiel:BytesReceivedPersec = 10000

    Nach MrB:
    Round((10000 / 1024) * 7.8125, 2)=
    10000/1024*7.8125 = 76.29
    Das wäre dann 76.29 kbit/s

    Richtig ist aber 78.125 kbit/s laut der Webside http://www.print-assistant.de/tools_prepress…_kbps_Mbps.html

    Und das wäre dann
    Round((10000 / 1024) * 8, 2) = 78.13
    Also mal 8 und nicht mal 7.8125 und egal was du mit 8 / 7.8125 = 1.024 mir sagen willst, verstehen ich es nicht.
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Edit: Verstehen kann ich es nur soweit, wenn man mit der falschen Zahl für Kilo arbeitet: Round((10000 / 1000) * 7.8125, 2)
    Was aber dann einen Fehler im Quellcode von MrB wäre. ;)

  • Wenn man permanent Daten aus einer WMI-Klasse abfragt ist es effektiver wenn man mit dem WMI-Refresher-Objekt arbeitet.
    Für das Beispiel hier könnte das z.B. so aussehen:

    Network-Speed mit WMI-Refresher
    [autoit]

    HotKeySet("+!x", "_Exit") ; Shift + Alt + x

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $aTraffic = _NetworkSpeed()
    ToolTip(StringFormat("D: %8.2f kbit/s\nU: %8.2f kbit/s", $aTraffic[0], $aTraffic[1]))
    Sleep(150)
    Until 0

    [/autoit] [autoit][/autoit] [autoit]

    Func _NetworkSpeed()
    Local Static $o_WMI = ObjGet("winmgmts:\\.\root\cimv2")
    Local Static $o_WMIRefresher = ObjCreate("WbemScripting.Swbemrefresher")
    Local Static $o_NetworkPerformData = $o_WMIRefresher.AddEnum($o_WMI, "Win32_PerfFormattedData_Tcpip_NetworkAdapter").objectSet

    [/autoit] [autoit][/autoit] [autoit]

    $o_WMIRefresher.Refresh
    For $i In $o_NetworkPerformData
    If $i.BytesReceivedPersec > 0 Then
    Local $a_Ret[2] = [$i.BytesReceivedPersec / 125, $i.BytesSentPersec / 125]
    Return $a_Ret
    EndIf
    Next
    Local $a_Ret[2] = [0,0]
    Return $a_Ret
    EndFunc ;==>_NetworkSpeed

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (27. Januar 2015 um 20:32)

  • @Raupi,
    Ganz ehrlich gesagt verstehe ich den Sinn dieser Websites nicht, ein Bit ist ein Bit und ein Byte ist ein Byte. Kilo ist 1000 und damit hat es sich!
    Wer rechnet Mega(Giga)Bytes in Bits um und umgekehrt?
    Und wo ist der Bus mit den Leuten drin die DAS interessiert?
    Irgendwelche Jungs mit zu wenig Ego und zu kurzem Bippes haben dem armen und genialen Leibnitz (1646-1716) in die Schuhe geschoben, dass 2^10 ein KILO ist! Leibnitz hat das aber imho nie gesagt! Übrigens wird auf der zzt. aktuellen Wikipedia-Website zum dualen Zahlensystem das Wort KILO nicht verwendet!
    Von daher...pffffff.... 8)

  • Bei mir läuft es auch nicht, gleicher Fehler unter Win7 x64, mit und ohne Adminrechte.

    ***********************************************
    For $i In $o_NetworkPerformData
    For $i In $o_NetworkPerformData^ ERROR

    Error: Variable must be of type "Object".
    ***********************************************

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Probiert mal
    Win32_PerfFormattedData_Tcpip_NetworkInterface
    statt
    Win32_PerfFormattedData_Tcpip_NetworkAdapter


    @AspirinJunkie, dein System?

    Bei mir, Win7-64 Home edition, ist die WMI_CLASS Win32_PerfFormattedData_Tcpip_NetworkInterface, damit funktioniert dein Script und auch das des TE einwandfrei

    AutoIt Scriptomatic ftw :rock: