Schelles WOL

  • Hi ihr Autoitler !!!

    ich baue für meine Schule ne Rechnersteuerung für die Lehrer. Is alles schon fertig nur ein schlelleres Wake on LAN Fehlt noch. Das was ich sonst so gefunden habe das hat so im schitt 2 sec gebraucht und im Raum sind aber 30 Rechner und dass dauert eunfach zu lange. Könnte mir einer Helfen wenns geht Den WOL Prozess so zu gestalten das die Praktisch alle gleichzeitig Starten?

    Und wenn das in Autoit nicht ralisierbar ist dann könnte mir bestimmt einer in C++ helfen (dll).

    sry für den langen Text... :D :D :D

  • Ist das wirklich so langsam?

    Spoiler anzeigen
    [autoit]

    Global $asMacs[3] = [ _
    "112233445566", _
    "112233445566", _
    "112233445566" _
    ]

    UDPStartup()
    $Broadcast = UDPOpen("255.255.255.255", 9, 1)

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

    For $i = 0 To UBound($asMacs)-1
    UDPSend($Broadcast, _MagicPacket($asMacs[$i]))
    Next

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

    UDPCloseSocket($Broadcast)
    UDPShutdown()

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

    Func _MagicPacket($sMac)
    ;Author: Prog@ndy
    If Not IsBinary($sMac) Then $sMac = Binary('0x' & StringRegExpReplace($sMac,'(0x)|[^A-Za-z0-9]', ''))
    Local $binPacket = Binary('0xFFFFFFFFFFFF')
    For $i = 1 To 16
    $binPacket &= $sMac
    Next
    Return $binPacket
    EndFunc

    [/autoit]


    //Edit: Für den Broadcast an 255.255.255.255 braucht man die Beta. Sonst musst du den Broadcastbereich anders wählen und den 3. Parameter entfernen ;)

    Einmal editiert, zuletzt von progandy (3. Dezember 2009 um 15:34)

  • also ich habe das an meine alten lappi ausprobiert und das hat knappe 2 sec gedauert aber ich hatte keine anderen rechner da!!

    ich habe diese funktion von benutzt

    Spoiler anzeigen
    [autoit]


    ;#INDEX# ===========================================================================================
    ; Title .........: _Net_Wol
    ; AutoIt Version: 3.3.0.0
    ; Language: English
    ; Description ...: Function that sends a Magic Packet for WOL to an specified IP-Address or Hostname
    ; ===================================================================================================

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

    ; #FUNCTION# ;=======================================================================================
    ;
    ; Name...........: _Net_Wol
    ; Description ...: Wake on Lan Function, by sending the "MagicPacket"
    ; Syntax.........: _Net_Wol($sWolMac, $sWolIp)
    ; Parameters ....: $sWolMac - The MAC-Address of the Network Adapter in the format "XXXXXXXXXXXX"
    ; X = [0-9 & A-F not case-sensitive]
    ; $sWolIp - The IPAdress of the NIC in the format "192.168.0.1"
    ; - or the Broadcast-Address of the Subnet in the format "192.168.0.255"
    ; - or the Internet Hostname of the NIC e.g. myhost.isp
    ; Return values .: Success - Returns 1
    ; Failure - Returns 0 and Sets @Error:
    ; |1 - Invalid $sWolMac
    ; |2 - Invalid $sWolIp
    ; |3 - Error sending "MagicPacket"
    ; Author ........: Schnuffel http://www.autoit.de
    ; Modified.......:
    ; Remarks .......: Internet Host name may not work behind NAT-Router's
    ; the Magic Packet is always send to the Broadcast-Address ".255"
    ; Return 1 means only, that the MagicPacket is been sent,
    ; it indicates not whether the Remote-PC ist really started
    ; Related .......:
    ; Link ..........;
    ; Example .......; Yes
    ; #include <_Net_Wol.au3>
    ; Send a WakeOnLan packet for the MAC-Address "0002A5840B46" to the SubNet "192.168.0"
    ; _Net_Wol("0002A5840B46", "192.168.0.255")
    ; ;==================================================================================================

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

    Func _Net_Wol($sWolMac, $sWolIp, $iWolSwitch = 0)
    If Not StringRegExp($sWolMac, "(\A[[:xdigit:]]{12}\z)") Then
    SetError(1, 0, 1)
    Return 0
    EndIf
    TCPStartup()
    $sWolIp = TCPNameToIP($sWolIp)
    TCPShutdown()
    If Not StringRegExp($sWolIp, "\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}\b\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){1}\b") Then
    SetError(1, 0, 2)
    Return 0
    EndIf
    Local $sWolHeader, $sWolData, $sWolConnect, $sWolResult
    For $p = 1 To 11 Step 2
    $sWolData &= Chr(Dec(StringMid($sWolMac, $p, 2)))
    Next
    For $p = 1 To 6
    $sWolHeader = Chr(Dec("ff")) & $sWolHeader
    Next
    For $p = 1 To 16
    $sWolHeader &= $sWolData
    Next
    UDPStartup()
    $sWolConnect = UDPOpen($sWolIp, 7)
    $sWolResult = UDPSend($sWolConnect, $sWolHeader)
    UDPCloseSocket($sWolConnect)
    UDPShutdown()
    If $sWolResult = "102" Then
    Return 1
    Else
    SetError(1, 0, 3)
    Return 0
    EndIf
    EndFunc ;==>_Net_Wol

    [/autoit]


    aber es kann natürlich auch am rechner liegen deine funktion habe ich noch nich benutzt vielicht isse ja schneller

    und sag mal was mussen bei brodcast rein etwa meine ip oder was???

  • Ich glaube, die Bremse bei _Net_Wol ist vor allem das TCPNameToIP und das andauernde TCPStartUp TCPShutdown. Außerdem sieht das nicht gerade effizient aus:

    [autoit]

    $sWolData &= Chr(Dec(StringMid($sWolMac, $p, 2)))

    [/autoit]


    Das ganze mit Binary ist denke ich eleganter und schneller ;) Außerdem mache ich nur ein mal UDPOpen, womit das auch wegfällt.
    Da ein UDP-Broadcast keine Verbindung aufbaut, sollte die Geschwindigkeit des Skripts immer gleich sein, egal ob andere Rechner im Netzwerk sind oder nicht.

    //Edit: Broadcast kannst du für die Beta so lassen, für Die Stable musst du zumindest den ersten Teil deinem Netzwerk anpassen, z.B.:

    [autoit]

    $Broadcast = UDPOpen('192.255.255.255',9)

    [/autoit]

    Einmal editiert, zuletzt von progandy (3. Dezember 2009 um 15:51)

  • Vorab: Mit Powerswitch ( http://www.f-grubert.de/ ) funktioniert das ganz gut (am einfachsten per batch).

    ABER: Die Freude über schnelles einschalten hört dann auf, wenn die 30 Rechner wirklich innerhalb einer Sekunde eingeschaltet werden - die Sicherung der Elektroinstallation wird das mit Sicherheit verhindern (wer's nicht glaubt: Drei Rechner, Monitore, Drucker, zuhause an Steckdodenleiste mit Schalter: Einschalten, Sicherungskasten suchen, Sicherung wieder einschalten).

    An einer Schule könnte es sein, dass die Schlüsselgewalt des Hausmeisters über den Sicherungskasten wacht - besser nicht ausprobieren.

    Abhilfe 1: Benutz Dein langsames Script und baue weitere Kunstpausen ein
    Abhilfe 2: Falls Du PowerSwitch o.vergleichbares benutzt, baue nach jedem Einschaltbefehl Pausen ein!

    Alles Gute
    Michael