iwan
Goto Top

Internet Bandbreite per Skript ermitteln

Systeme: aktuell Win XP, später Win7, Verbindung per UMTS

Hallo zusammen,

für unseren Außendienst benötigen wir einfache Möglichkeit, die aktuelle Internet Bandbreite (spez. Downloadrate) zu ermitteln.
Ca. 90% der User verwenden UMTS und haben halt leider nicht immer 3G zur Verfügung.
Leider achten sie auch nicht immer drauf, was sie aktuell zur Verfügung haben.
Da hagelt es dann leider häufiger "böse" Anrufe, das ein Datenabgleich oder Suftwareupdate mal wieder länger dauert.
Daher ist gewünscht, das der User eine Art Hinweisfenster erhält, bevor er eine VPN-Verbindung aufbaut.
Nicht gewünscht ist, das der Mitarbeiter auf irgendeine Webseite geht und einen "Speedtest" durchführt oder irgendwelche zusätzlichen Programme aufrufen muss.

IST-Zustand: aktuell wird eine Verknüpfung auf dem Desktop (.CMD) aufgerufen, die die VPN-Verbindung öffnet, seine Netzlaufwerke mappt, nach Updates guckt und andere Dinge.

SOLL-Zustand: das Ergebnis soll ein Skript sein, das z.Bsp. von unserem eigenen Webserver eine Datei lädt und die Downloadrate ermittelt.
Der Mitarbeiter erhält dann eine Meldung, das z.Bsp. die aktuelle Verbindung zu langsam ist, um einen Datentransfer zu machen o.ä.

ANSATZ: mit WGet habe ich schon ein paar Tests gemacht und ich sehe auch brauchbare Ergebnisse.
Das diese keine 100%ige Aussagekraft haben, ist uns durchaus bwusst.
Erstaunlicherweise kommen die Ergebnisse recht nah an die Realität ran.
Ich habe das Ergebnis in eine Log.txt geschrieben und die Zeile auch mit findstr ausgelesen.
Nur komm ich da nicht weiter....

Vielleicht kennt ja jemand eine Möglichkeit (.cmd, .vbs, o.ä.), wie man sowas realisieren könnte.

Content-ID: 173764

Url: https://administrator.de/contentid/173764

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

Skyemugen
Skyemugen 27.09.2011 um 13:51:13 Uhr
Goto Top
Aloha,

du hast also schon eine passende Möglichkeit und kommst nicht weiter, nun dann poste doch mal dein bisheriges Skript (bitte mit -Tags) und beschreibe dazu, was nicht läuft oder was noch zusätzlich geschehen sollte.

Das wäre m.M.n. momentan die sinnvollste Variante ... ausgenommen, bastla & Co. KG zaubern wieder unbekannte tools herbei, die das auf der cmd-Ebene ebenso erledigen ^_^

greetz André

P.S.: Ich persönlich mag ja keine crossposter ...
Iwan
Iwan 27.09.2011 um 15:04:05 Uhr
Goto Top
Hallo,

was hat das mit Crossposter zu tun, wenn man einfach auf mehrere Resourcen zurückgreifen kann?
Das ist für mich so, als wenn ich nur bei einem einzigen Händler ein Angebot einhole statt bei mehreren.

Zum Thema:

Aufruf von WGET:
WGET -t 1 ftp://ftp.avm.de/public/1000KBYT -o speed.txt

Dadurch wird der komplette Downloadvorgang in die speed.txt geschrieben.
Ich habe das Ergebnis mal auf entscheidenden Zeilen gekürzt:
   850K .......... .......... .......... .......... .......... 92%  681K 0s
   900K .......... .......... .......... .......... .......... 97%  647K 0s
   950K .......... .......... ......                          100%  764K=2.1s

2011-09-27 14:03:46 (475 KB/s) - `1000KBYT.1' saved [1000000]  
Interessant für die weitere Verarbeitung wäre ein Auslesen der 450 KB/s.
Diese müsste dann in 450 und KB/s aufgesplittet werden.
Theoretisch könnte ja auch MB/s da stehen, die ich mit der aktuellen Leitung hier aber nicht erreichen werde.
Skyemugen
Skyemugen 27.09.2011 um 15:37:17 Uhr
Goto Top
Aloha,

was hat das mit Crossposter zu tun, wenn man einfach auf mehrere Resourcen zurückgreifen kann?
Das ist für mich so, als wenn ich nur bei einem einzigen Händler ein Angebot einhole statt bei mehreren.
Crossposting aber egal ...

Nun, eine Möglichkeit wäre z.B. etwa so:
@echo off & setlocal
set "Datei=E:\Skripte\speed.txt"  
set "M=%temp%\message.vbs"  
if not exist M >%M% echo MsgBox "Ihre Verbindung ist zu langsam!", vbExclamation,"Bandbreite ungenügend"  
set "Datum=%date:~-4%-%date:~3,2%-%date:~0,2%"  
for /f "tokens=2 delims=()" %%s in ('findstr /c:"%Datum% %time:~0,5%" "%Datei%"') do set "speed=%%s"  
set "wert=%speed: KB/s=%"  
if %wert% lss 500 cscript //nologo %M%
pause
goto :eof

Momentan wird nach Datum und Uhrzeit (nur Stunden und Minuten) gesucht, da die Sekunden beim Ausführen des Batches sich unterscheiden können / werden zu dem Wert in der speed.txt, ich denke eine Minutenüberschreitung dürfte relativ ausgeschlossen sein, wenn beides in einem Zug abläuft.

Ich habe die Meldung einfach mal als VBS gemacht, damit der User eine Popupmeldung hat, es ginge auch per
if %wert% lss 500 (
NET SEND %computername% Ihre Verbindung ist zu langsam,^
die Bandbreite betraegt momentan nur %speed%
)
Sofern net send aktiviert ist, gut oben müsste Windows Scripting Host auch aktiv sein (default) oder du lässt es nur als echo im cmd laufen aber wer beachtet das schon ...

greetz André
Terence-Chill
Terence-Chill 27.09.2011 um 16:26:42 Uhr
Goto Top
Hallo Iwan, André

ich persönlich würde folgenderweise vorgehen um Speed und Einheit zu ermitteln: (getestet, hat funktioniert)

for /f "tokens=2 delims=() skip=4" %%a IN ('type kb.txt') DO CALL :WEITER "%%a"  
:WEITER
for /f "tokens=1* delims= " %%a IN (%1) DO (SET rate=%%a & SET einh=%%b)  

ECHO Rate: %rate% - %einh%
- oder -
for /f "tokens=2 delims=() skip=4" %%a IN ('type kb.txt') DO (  
	for /f "tokens=1* delims= " %%b IN ("%%a") DO (SET rate=%%b & SET einh=%%c)  
)

Wie du dann weiter vorgehen willst, wenn du diese beiden Daten hast, bleibt dir überlassen. Von VBS hab' ich keine Ahnung und net send halte ich für nicht die beste Lösung.

Gruß

Edit: Ich hab' die Datei einfach mal kb.txt benannt - hier kannst du natürlich noch eleganter mit Variablen o.ä. vorgehen. Insgesamt geht das ganze bestimmt eleganter und schlanker; leider nicht mit meiner Erfahrung (;
Edit2: Etwas schlankere Alternative
Skyemugen
Skyemugen 27.09.2011 um 16:46:47 Uhr
Goto Top
Aloha,

aha, lieber zwei Schleifen hatte ich auch erst im Sinn aber hier ... meh zu viel des Guten, statt ein kurzes Ersetzen *gg* niedriger als KB/s wird's wohl nicht und höher hat der TE ja bereits ausgeschlossen face-wink und was machst du, wenn die Textdatei nicht überschrieben wird, sondern immer hinten ran? skip=4, hm, das muss er dann auch anpassen und erst einmal abzählen.

Also ich weiß ja nicht face-wink

greetz André
Terence-Chill
Terence-Chill 27.09.2011 um 17:21:22 Uhr
Goto Top
Hey André,

mir ging's nicht darum, deine Version zu ersetzen, lediglich wollte ich einen zweiten Vorschlag, der auch auf die Einheit eingeht, darstellen.
Klar, falls die Datei nicht überschrieben, sondern die aktuellen Werte angehängt werden, würde man mit meiner Variante dumm da stehen (das Skip ist übrigens, zumindest kann ich das in Hinblick auf die gelieferten Daten sagen, nicht notwendig. Es sollte das ganze nur etwas schneller machen).

Wie würdest du den String auseinanderziehen ohne zweite Schleife, bzw., ist das überhaupt möglich?

Gruß
Iwan
Iwan 27.09.2011 um 18:10:13 Uhr
Goto Top
Vielen dank schon mal für die 2 Lösungsansätze.

NETSEND fällt aber raus, da es nicht aktiviert ist.
Den Umweg mit der Ausgabe über .VBS finde ich persönlich auch nicht so prickelnd.

Wichtig ist mir, das die Werte im .CMD landen und ich sie von da aus weiterverarbeiten kann.
Dies bieten beide Lösungsansätze, die ich spätestens morgen testen werde.


PS: Crossposting ist sehr effektiv, solange man die Lösung auch überall bekannt gibt.
Somit sehe ich da nichts negatives drin, aber jedem seine Meinung...
bastla
bastla 27.09.2011 um 18:13:00 Uhr
Goto Top
Hallo Terence-Chill und willkommen im Forum!
Wie würdest du den String auseinanderziehen ohne zweite Schleife
Etwa so:
for /f "skip=4 tokens=3-4 delims=() " %%a IN ('type kb.txt') DO SET /a rate=%%a & SET "einh=%%b"
- wobei ich mich allerdings, wie Skye, nicht auf die Zeilenanzahl verlassen würde - daher eher:
for /f "tokens=3-4 delims=() " %%a IN ('findstr "%date:~-4%-%date:~-7,2%-%date:~-10,2%" kb.txt') DO SET /a rate=%%a & SET "einh=%%b"
Grüße
bastla
Terence-Chill
Terence-Chill 27.09.2011 um 19:02:32 Uhr
Goto Top
Schön, Danke face-smile Wie immer - eigentlich garnicht so kompliziert!
Skyemugen
Skyemugen 27.09.2011 um 19:23:10 Uhr
Goto Top
Aloha bastla,

"delims=()" ... hm, ich hatte mich zwar so oder so am Anfang auf die Klammer eingeschossen, weil sie mein Blickfang war, wollte allerdings dann doch tokens=3-4 verwenden aber glaubst du, heute lief irgendwas? Ich hatte natürlich den Fehler gemacht und "delims= ()" gesetzt *pfeif* und mich dann doch wieder meiner Arbeit gewidmet, statt das Leerzeichen im Delimiter ans Ende zu setzen *tärä* - so ist das mit dem Licht, manchmal brennt es ...

Aber auch in deiner Variante: Wenn die Datei nur vergrößert wird, statt neu beschrieben, läuft das nicht ganz so wie gewollt, daher hatte ich noch die Stunde-Minute-Suche mit eingebaut aber ich schätze, die Datei wird wahrscheinlich eh jedes Mal neu überschrieben, keine Ahnung wie wget das handhabt face-wink
Den Umweg mit der Ausgabe über .VBS finde ich persönlich auch nicht so prickelnd.
Frag' mal den Enduser, der keine Lust hat, in der Konsole Plaintext zu lesen face-wink Ohne Popup mit Klick-Mich kriegen die meisten doch gar nix wirklich mit.
mir ging's nicht darum, deine Version zu ersetzen, lediglich wollte ich einen zweiten Vorschlag, der auch auf die Einheit eingeht, darstellen.
Aye, war mir schon klar aber den Vorschlag hatte ich extra ausgelassen face-wink

greetz André
bastla
bastla 27.09.2011 um 19:33:17 Uhr
Goto Top
Hallo Skye!
Wenn die Datei nur vergrößert wird, statt neu beschrieben
... steht der aktuellste Eintrag vermutlich am Ende ... face-wink

Grüße
bastla
Iwan
Iwan 27.09.2011 um 19:46:27 Uhr
Goto Top
Richtig, er steht am Ende der Datei face-wink
Ich habe eigentlich nicht vor, die Datei fortzuschreiben, sondern sie beim nächsten Aufruf zu überschreiben.
Nur die ermittelten Werte werde ich mir evtl. in einer separaten Datei wegschreiben.

@bastla
for /f "tokens=3-4 delims=() " %%a IN ('findstr "%date:~-4%-%date:~-7,2%-%date:~-10,2%" kb.txt') DO SET /a rate=%%a & SET "einh=%%b"  
Damit sucht er nach jedem Eintrag in der Datei, richtig?
bastla
bastla 27.09.2011 um 22:25:08 Uhr
Goto Top
Hallo Iwan!
Damit sucht er nach jedem Eintrag in der Datei, richtig?
Nach jedem Eintrag mit dem heutigen Datum (Du kannst ja testweise
findstr "%date:~-4%-%date:~-7,2%-%date:~-10,2%" kb.txt
ohne das Drumherum ausführen) - sollte es mehrere Zeilen der Art
2011-09-27 14:03:46 (475 KB/s) - `1000KBYT.1' saved [1000000]
geben, werden nach der Schleife die Werte der letzten passenden Zeile in den Variablen stehen ...
Nur die ermittelten Werte werde ich mir evtl. in einer separaten Datei wegschreiben.
Dann kannst Du mit "tokens=1-4" auch Datum und Uhrzeit (als %%a und %%b; Wert und Einheit wären dann %%c und %%d) "mitnehmen" ...

Grüße
bastla
Skyemugen
Skyemugen 27.09.2011 um 22:42:12 Uhr
Goto Top
Aloha bastla,

ich sag's ja: Wir arbeiten schon zu viel mit Unterprogrammen, sodass mir schon glatt entfällt, dass der letzte Wert gespeichert wird :D

greetz André
Iwan
Iwan 28.09.2011 um 10:04:26 Uhr
Goto Top
Guten morgen zusammen,

ich habe nun die Code-Schnipsel zusammengeworfen und folgendes Skript herausbekommen:
del 1000KBYT
wget.exe -t 1 ftp://ftp.avm.de/public/1000KBYT -o speed.txt
for /f "tokens=1-4 delims=() " %%a IN ('findstr "%date:~-4%-%date:~-7,2%-%date:~-10,2%" speed.txt') DO SET Dat=%%a & SET Uhr=%%b & SET /a rate=%%c & SET "einh=%%d"  
echo %Dat% %Uhr%: %rate% %einh%
If %rate% LSS 500 echo Zu langsam (weniger als 500kb)
If %rate% GTR 500 echo Alles ok (mehr als 500kb)
Das funktioniert soweit schon mal einwandfrei. Nun muss ich es halt noch mit div. Inet-Verbindungen testen.

Vielen dank !
Berrnd
Berrnd 28.09.2011 um 19:58:35 Uhr
Goto Top
Hi,

ich werf mal noch 'nen Codeschnipsel dazu.
Ich hab für einen ähnlichen Zweck mal eine VBS-Function gebaut. Ob die 100% genau ist kann ich natürlich nicht sagen, kommt aber sicherlich auch an recht realistische Werte ran. ;)
Public Function GetInetDownloadSpeed(ByRef URL) 'As Long  
	Dim WebReq 'As Microsoft.XmlHttp  
	Dim FSO 'As Scripting.FileSystemObject  
	Dim Start, Ende 'As DateTime  
	Dim TempObj 'As Object  
	Dim ContentLength 'As Long  
 	
	Set WebReq = CreateObject("Microsoft.XmlHttp")  
	Set FSO = CreateObject("Scripting.FileSystemObject")  
	
	Start = Now
	
	URL = URL + "?nocacherandomize=" + Replace(FSO.GetTempName, ".tmp", "")  
	
	WebReq.Open "get", URL, False  
	WebReq.Send
	TempObj = WebReq.ResponseBody
	
	ContentLength = WebReq.GetResponseHeader("Content-Length")  
	
	Ende = Now
	
	GetInetDownloadSpeed = Round(ContentLength / 1024 / DateDiff("s", Start, Ende), 2)  
	
	TempObj = Nothing
End Function
Der Rückgabewert ist die Geschwindigkeit in KB/s.

Viele Grüße - Bernd
Iwan
Iwan 28.09.2011 um 20:06:58 Uhr
Goto Top
Und der Aufruf erfolgt mit der runterzuladenen Datei als Paramater?
Berrnd
Berrnd 28.09.2011 um 20:20:02 Uhr
Goto Top
Hi,

ja, der Parameter "URL" ist die URL zu einer beliebigen Web-Resource...
Also z. B.
Kbs = GetInetDownloadSpeed("http://speedtest.qsc.de/10MB.qsc")

Gruß - Bernd