2016
|
Programme ohne Compiler: VBS-Quelltext
|
|
Plane-Hopping
VBScript für die Lösung kleiner Probleme - HFDL-Decoder mit Google-Earth verbinden
|
An anderer Stelle auf dieser Seite wird gezeigt, wie Flugzeugpositionen aus Kurzwellendaten über einen Decoder mit Google-Earth dargestellt werden können.
Dabei wurde die Brücke zwischen zwei unabhängigen Programmen mit der in Windows eingebauten Scriptsprache VBS gebaut und die Informationen vom Decoder Sorcerer aus seiner Log-Datei im TXT-Format in eine KML-Datei im XLM-Format entsprechend eigener Vorstellungen geleitet. Hier der Quelltext mit einigen Erläuterungen.
Zunächst soll die Grobstruktur des Gesamtscripts - und anschließend einige kurze Scripts zum Kennen lernen gezeigt werden. Dann folgen die einzelnen Routinen mit ihren Erläuterungen und am Ende die Hauptschleife dieses Scripts, welches Google Earth steuert mittels von Flugzeugen über Kurzwelle ausgestrahlter Positionsdaten, um über den Globus zu "hoppen".
|
|
Das Script erhebt keinerlei Anspruch darauf eine Endversion irgendeiner Lösung darzustellen, vielmehr wird hier gezeigt, wie ad-hoc Schritte gegangen wurden, um die Vorstellungen zu realisieren. Der Ablauf ist wie folgt:
- Übergabeparameter auswerten (auskommentiert)
- Dateisystem anlegen
- Hauptschleife (Loop) mit
- Log-Datei komplett einlesen (readlog)
- Bei neuen Flugdaten (newplane)
- XML-Datei-Kopf anlegen
- XML-Positionen usw. einfügen
- XML-Datei-Fuß anlegen
- Neuen Flug auf Konsole ausgeben (Wscript.Echo)
- Über KML-Datei Google-Earth aufrufen
- Auf neuen Log-Eintrag warten (waitlog)
- Endlos-Wiederholung
|
Programmierung in VBScript
|
Die Programmerstellung kann im Editor (z.B. Notepad) erfolgen. Wer bereits in VB etwas erstellt hat kennt möglicherweise folgende Syntax: MsgBox "Hallo Welt" . Durch einfaches Umbenennen der Dateierweiterung führt Windows diese Zeilen entsprechend den Anweisungen aus. Ein zusätzlicher Compiler oder Interpreter (VB/VBA) zur Ausführung ist nicht erforderlich, da schon längere Zeit von vielen unbemerkt mit Windows ein Script Host von Microsoft ausgeliefert wird. Dadurch sind quasi Batch-Programme in 'VB' möglich. Der Profi sollte sich der Windows-Powershell zuwenden, für das kleine Problem reicht oft CMD.EXE, also das alte Konsolenfenster aka "command.com", was ja schon vor längerer Zeit zur EXE befördert wurde. Um die verschiedenen Ausgabemodi zu unterscheiden, nun erst ein winziger Einstieg im Telegrammstil.
Erstes Programm "Hallo Welt" ...
- Editor starten (z.B. Desktop, rechte Maustaste, Neu, Textdatei)
MsgBox "Hallo Welt, 66" eingeben
- Datei speichern und anschließend in "hallo.vbs" umbenennen (Icon wechselt).
- Doppelklick auf "hallo.vbs" zeigt das Ergebnis
Zweites Programm "Hallo Welt" ...
- Editor starten
Wscript.Echo "Hallo Welt" eingeben
- Datei speichern und anschließend in "hallo.vbs" umbenennen (Icon wechselt).
- Doppelklick auf "hallo.vbs" zeigt das Ergebnis
Zweites Programm ohne Message-Box-Ausgabe
- Editor starten
cscript hallo.vbs eingeben
- Datei speichern und anschließend in "hallo.bat" umbenennen (Icon wechselt).
- Doppelklick auf "hallo.bat" zeigt das Ergebnis sehr kurz.
- In "hallo.vbs" die Zeile
Wscript.sleep 10000 anhängen
Nun kann das Ergebnis für 10 Sekunden betrachtet werden. Links ist ein Screenshot von einem Windows7-System abgebildet. Dieses Ergebnis wäre auch mit noch älteren Batch-Befehlen möglich, hier sollten jedoch die verschiedenen Ausgaben hervorgehoben werden. Bei vielen Ausgaben via WScript und der Fensterausgabe können sich Staus ergeben, da alle Boxen bestätigt werden müssen. Steht schließlich in der Datei hallo.bat wscript hallo.vbs erhält man die vierte Variante: Eine Messagebox auf dem 'DOS'-Fenster.
|
Know-How Hilfe und Beispiele
|
Bei längeren Scripts und fundiertem Halbwissen ist es Hilfreich auf Beispiele und eine interaktive Hilfe zurück greifen zu können. Mit dem Tool VbsEdit 7.394 von Adersoft erhält der Anfänger was er sucht. Auch die unregistrierte Evaluationsversion ist gerade wegen der sehr vielen Beispiele (Samples) ausgezeichnet zum Testen geeignet. Manches Beispiel läuft nur, wenn die Umgebung als Administrator gestartet wurde. Man sollte dann jedoch wissen, was man startet ... Diese Lösung basiert auf Beispielen aus der Abteilung Text-Files (Scripting Techniques)
|
Functions und Subs Übersicht
|
Die erste Aufgabe war heraus zu finden, ob sich die Log-Datei vom Decoder Sorcerer geändert hat und ob auf sie zugegriffen werden konnte. Nachdem die Zeit-Attribute nicht zum Ziel führten wurde die Dateilänge als Kriterium herangezogen. Der Zugriff erfolgt im ungeschützten Verzeichnis "C:\TEMP\" als Spielwiese, da andere Verzeichnisse unter Windows oft Administratorrechte erfordern. Hier die Funktion, die die Dateilänge liefert:
Function lastmod(filespec)
Dim fso, f
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile(filespec)
lastmod = f.size
End Function
Diese Routine wird benutzt, um eine Änderung zu registrieren. In waitlog wird gewartet, bis sich etwas ändert.
Sub waitlog
Do
WScript.Sleep(1000*interval)
Loop Until lmod<>lastmod(filename)
lmod=lastmod(filename)
End Sub
In der weiter oben angegeben Grobstruktur wird zu beginn die gesamte LOG-Datei eingelesen. In anfänglichen Versionen war die Reihenfolge etwas anders. Hier werden zu Beginn alle Flüge beim Start untersucht. Das Einlesen und die Speicherreservierung kommt aus dem Beispiel "Read a Text-File from the Bottom up". Hier die Anpassung:
Sub readlog
Set f = fs.OpenTextFile(filename, 1)
Do Until f.AtEndOfStream
Redim Preserve arrFileLines(i)
arrFileLines(i) = f.ReadLine
i = i + 1
Loop
f.Close
End Sub
Um aus der Log-Datei, die zu Beginn des Scripts komplett in den Speicher geladen wird, die neuen Flüge zu extrahieren, wurde newplane gebaut:
Function newplane
newplane = False
For n = li To i-1 'Beginning = 0 last plane li
s = arrFileLines(n)
If InStr(s,":")=3 And InStr(s,"LAT")<>0 And _
InStr(s,"LAT 180 0 0 N LON 180 0 0 E")=0 Then
newplane=True
Exit For
End if
Next
End function
Von den drei globalen Variablen werden hier alle drei benutzt. Die Log-Datei-Zeilen stehen in arrFileLines , li enhält die "letzte" bzw. vorige eingelesene Zeilenanzahl und i die aktuelle Zeilenanzahl. Wenn das 3. Zeichen ein ":" ist und das Wort "LAT" vorkommt, handelt es sich wahrscheinlich um Flugpositionsdaten. Da einige Maschinen ohne Koordinaten auftauchen, werden diese ausgesondert. Ein Fund wird mit true quittiert.
Sub Google
Set WshShell = WScript.CreateObject("WScript.Shell")
Return = WshShell.Run(kml)
End Sub
Hier die Routine zum Start von Google Earth, deren Parameter nach eigenen Wünschen angepasst werden können (Run ). Hier wird der einfachste Aufruf benutzt. Die KML-Datei muss mit Earth verknüpft sein, damit die Weitergabe funktioniert.
Als letzte Funktion nun die Buchstabenfummelei, um die Koordinaten des Fluges einigermaßen verlässlich zu lesen und zu wandeln, um sie in der Hauptschleife in die XML-Datei zu schreiben. Eine Script-Variante der C-Funktion sscanf wäre jetzt gut, aber es gibt ja Mid ...
Function latlon(lonlat,s)
sp0=InStr(s,lonlat)+4
sp1=InStr(sp0,s," ") 'LAT 50 38 27 N
lat1=Trim(Mid(s,sp0,sp1-sp0)) '50
sp2=InStr(sp1+1,s," ")
lat2=Trim(Mid(s,sp1+1,sp2-sp1))'38
sp3=InStr(sp2+1,s," ")
lat3=Trim(Mid(s,sp2+1,sp3-sp2))'27
lat4=Trim(Mid(s,sp3+2,1)) 'N
latf=CDbl(lat1)+CDbl(lat2)/60.0+CDbl(lat3)/3600.0
If lat4="S" Or lat4="W" Then latf=-latf
lat=FormatNumber(latf,6)
lat=Replace(lat,",",".")
latlon=lat
End Function
Übergeben wird die gesamte Log-Zeile mit Grad, Minuten und Sekunden und in lonlat , ob "LON", oder "LAT" gewandelt werden soll. Das Ergebnis ist eine vorzeichenbehaftete Dezimalzahl mit DezimalPUNKT, damit Google zufrieden ist.
|
Hauptschleife loop
|
Die Hauptschleife und die Deklarationen stehen am Anfang. Darunter sollten dann die obigen Routinen eingefügt werden, damit das Gesamtscript entsteht, welches der 6.exe im anderen Beitrag entspricht. Angenommen es wird als 6.vbs abgespeichert, dann sollte noch eine entsprechende 6.bat mit der Zeile "cscript 6.vbs " erstellt werden. Wer 6.vbs ohne Konsolenumleitung startet, erhält ziemlich viele Msg-Boxes, je nachdem wie viele Flüge schon in der Log-Datei "0.txt" von Sorcerer stehen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 | Const cl=Chr(13)&Chr(10)
'Set Args = WScript.Arguments
'If args.Count<>2 Then
filename="C:\temp\0.txt"
kml="c:\temp\test0.kml"
interval=15
'End if
'filename=Args(0)
'kml=Args(1)
'interval=Args(2)
'-----------------------------------
Dim arrFileLines(),lmod,li
Set fs = CreateObject("Scripting.FileSystemObject")
WScript.Echo "Sorcerer to Earth converter starting ..."
WScript.Echo "input: "&filename
WScript.Echo "output:"&kml&cl
While True
i = 0
'waitlog ' wait for new filelength of logfile
readlog
If newplane Then
'Create XML Document header
Set fx = fs.CreateTextFile(kml,True)
x="<?xml version=""1.0"" encoding=""UTF-8""?>"& cl & _
"<kml xmlns=""http://earth.google.com/_
kml/2.0"">"& cl &_
"<Document>"& cl & _
"<Style id=""bluepin"">"& cl & _
" <IconStyle>"& cl & _
" <Icon>"& cl & _
" <href>http://maps.google.com/mapfiles/kml/_
shapes/airports.png</href>"& cl & _
" </Icon>"& cl & _
" </IconStyle>"& cl & _
" </Style>"& cl
fx.WriteLine x
'Add new placemarks in xml
For n = li To i-1 'Beginning = 0 one plane li
s = arrFileLines(n)
If InStr(s,":")=3 And InStr(s,"LAT")<>0 And _
InStr(s,"LAT 180 0 0 N LON 180 0 0 E")=0 Then
x="<Placemark>"&cl& _
"<styleUrl>#bluepin</styleUrl>"&cl& _
"<name>" & Trim(Mid(s,27,7)) & "</name>" &cl& _
"<description>"&cl& _
"TIME: " & Left(s,13) & "<br />" &cl& _
"</description>"&cl& _
"<Point>"&cl& _
"<coordinates>" & latlon("LON",s) & _
","&latlon("LAT",s)&",10000</coordinates>"&cl& _
"<TimeStamp><when>2016-1-1T" & Left(s,8) & _
" Z</when></TimeStamp></Point>"&cl& _
"</Placemark>"&cl
fx.WriteLine x
'WScript.Echo s
End if
Next
'Write the xml footer
x="</Document>"&cl&"</kml>"&cl
fx.WriteLine x
fx.Close 'XML
'New Planes with zero LAT LON
For n = li To i-1 'Beginning = 0
s = arrFileLines(n)
If InStr(s,":")=3 Then WScript.Echo s
Next
li=i
Google
End If 'NewPlane
waitlog
Wend
|
Aufgrund der XML-Strings sieht das Listing etwas zerissen aus.
|
Ausblick und Rückblick
|
Befasst man sich etwas mit VBScript, so gibt es doch einige interessante Anwendungen, auch wenn, wegen des einzig vorhandenen Variablentyps Variant, keine direkten DLL-Zugriffe mit Rückgaben möglich sind. Damit entfällt auch TCP/IP auf dieser Ebene ohne Zusatzwrapper. Mit Dateien ist viel zu erledigen, aber auch das Starten von Programmen mit entsprechenden Parametern gestattet es zum Beispiel Demoprogramme mit begrenzter Laufzeit je nach Bedarf automatisch zu starten ...
Während dieses Projektes wurden Erinnerungen an VBA wach. Mit Word für Windows 2 wurde - damals noch live via Satellit - die Programmierung in Office vorgestellt. Es gab sogar ein Wordbasic auf Deutsch (Wenn..Dann..Sonst). Ab Word6 und Excel5 hatte sich VBA etabliert und stand auch meist unbemerkt auf fast jedem PC zur Verfügung. Darum entstand das Buch "Messen Steuern Regeln mit Word und Excel". Ach noch was: VBScript soll nicht weiter entwickelt werden.
Zugehörender Beitrag: HFDL, Flugradar im Wohnzimmer
|
Weitere Software
|