JaBoG32 ATC

Diskussionen, Hinweise, Feedback, usw. rund um LockOn Mods und Add-Ons.

Moderator: JaBoG32 Stab

Benutzeravatar
Zillion
Intermediate Member
Beiträge: 227
Registriert: 22. Apr 2004, 21:47

JaBoG32 ATC

Beitrag von Zillion » 21. Feb 2005, 06:51

moinsen,

Da das Addon nun spürbar näher rückt habe ich mir die Lua Sachen nochmal näher angeguckt. Momentan arbeite ich noch immer daran das listener.lua Script so zu editieren, dass es die empfangenen Werte in eine Datei schreibt... Am anderen Ende bin ich in 2 Flashforen um herauszufinden wie ich diese Datei dann am Besten geparst bekomme um die Positionen der Flugzeuge regelmässig zu plotten.

Einen kleinen Fortschritt habe ich jedoch bereits erzielt, indem ich es endlich hingekriegt habe die export.lua so zu editieren, dass sie tatsächlich nur noch im Sekunden Takt oder mehr, ihre Werte exportiert was die Netzwerk Auslastung nun beliebig reduziert... :D

Wenn einer der Interessierten nochmal mithelfen mag, kann er sich diesen io.write ja nochmal genauer ansehen. Die im listener.lua verwendete Variable die den empfangenen String inne hat ist (L) , kleingeschrieben...

Der io.write funktioniert zusammen mit diesem io.output. So wie ich es verstanden habe wird im io.output die Datei definiert und im write, wie der Name sagt, geschrieben.
Mit dem Anhang string.format weiss er dann wie geschrieben werden soll, wobei in den Anführungszeichen gesagt wird was geschrieben werden soll und nach den Anführungszeichen in der gleichen Reihenfolge jedem Komma getrennten Typ (%.2f = 2 Stelliger Float, %s = String) eine Variable zugewiesen wird....

\n = newline

Für die listener lua habe ich es demnach mit:

io.write(string.format("l = %s\n", l)) probiert.

Geht auch endlich ohne Fehler, nur schreiben tut er NIX... :gruebel:

[quotea31]-----------------------------------------------------------------------------
-- TCP sample: Little program to dump lines received at a given port
-- LuaSocket sample files
-- Author: Diego Nehab
-- RCS ID: $Id: listener.lua,v 1.7 2003/06/26 18:47:46 diego Exp $
-----------------------------------------------------------------------------
path = "./luasocket.dll"


[color=reda31]local file = io.open("c:/Export.log", "W")
if file then
io.output(file)[/colora31] [color=bluea31]<--- Soll Datei definieren[/colora31][color=reda31]
else
print("no File")
end
[/colora31]


local f = assert(loadlib(path, "luaopen_socket"))
f()
host = host or "*"
port = port or 8080
if arg then
host = arg[1] or host
port = arg[2] or port
end
print("Binding to host '" ..host.. "' and port " ..port.. "...")
s, e = socket.bind(host, port)
if not s then
print(e)
exit()
end
i, p = s:getsockname()
print("Waiting connection from talker on " .. i .. ":" .. p .. "...")
c, e = s:accept()
if not c then
print(e)
exit()
end

print("Connected. Here is the stuff:")
l, e = c:receive()
while not e do

l, e = c:receive()
[color=reda31]io.write(string.format("l = %s\n", l))[/colora31] [color=bluea31]<---Soll Schreiben[/colora31]
[color=greena31]print(l)[/colora31] [color=bluea31]<--- Füllt unsere Eingabe Aufforderung[/colora31]

end
print(e)
[/quotea31]

So und nu geh ich noch 4 Stunden pennen... Guts nächtli... :roll:

EDIT: :lol: :lol: :spring: :spring: :spring:

Hab das dann auch noch irgendwie hingekriegt... glaub ich hätte das "w" klein schreiben sollen...
Zuletzt geändert von Zillion am 21. Jun 2008, 15:30, insgesamt 1-mal geändert.
Bild

JaBoG32_Chrissi
Site Admin
Beiträge: 6858
Registriert: 15. Jun 2003, 16:43

Beitrag von JaBoG32_Chrissi » 21. Feb 2005, 13:04

Kuhl! :D Gibts schon eine kleine Demo zu sehen? ;) ;)


Was mir jetzt sonst noch in den Sinn gekommen wäre:

[code97c]local file = io.open("c:/Export.log", "W")
if file then
io.output(file) <--- Soll Datei definieren
else
print("no File")
end
[/code97c]

Öffnet er hier die Datei?
Falls nicht hätte man versuchen können das "local" bei der Variable $file wegzulassen. Weiß nicht ob das was bringt, ist mir aber gerade so in den Sinn gekommen ;) ;)
2. JaBoG32 "Fighting Wildcats"

Gruß, Chrissi aka Kichi :D
Our Dreams are Wings

Bild

Benutzeravatar
Zillion
Intermediate Member
Beiträge: 227
Registriert: 22. Apr 2004, 21:47

Beitrag von Zillion » 4. Mär 2005, 12:51

Update,

Nach der gestrigen Diskussion mit Chrissi war ich wieder frisch motiviert und hab mich ans Werk gemacht.
Mit Chrissi habe ich mich gestern dann geeingt wie man es am besten angehen sollte. Das sah dann ca. so aus:

[imgclb]http://www.polymoon.org/ServerDiagramm2.jpg[/imgclb]

Wobei sich Chrissi dann um den Listener Socket und um die Text Datei gekümmert hätte.
Inzwischen[/colorclb] habe ich allerdings [url=http://www.moock.org/chat/moockComm.zipclb]diesen[/colorclb][/urlclb] wunderbaren Multithreading Java Broadcast Server gefunden der Daten nach dem export.lua Prinzip direkt auf einem Port empfängt und ohne zu fragen an alle verbundenen Flash Clients weiterleitet. Da der Server in Java geschrieben ist lässt er sich problemlos auf allen Rechnern ausführen und benötigt bei mir gerade mal 2 % CPU Auslastung mit einem verbundenen Lockon. Eine Beispiel FLA (Flash Datei) ist beigefügt. Das neue Prinzip sähe dann ca. so aus:

[imgclb]http://www.polymoon.org/ServerDiagramm.jpg[/imgclb]

8)

Inzwischen bin ich damit so weit dass mein Flash registriert das sich LockOn verbunden hat :spring:
Einziges Problem:
Gesendete und empfangene Daten in Flash müssen mit einem sog. Nullbyte Character terminiert werden. Wie ich den an den String in meiner Export LUA anhänge muss ich noch mal erörtern.
Das ich in einem Flash Chat Beispiel allerdings ein:
"New User Connected" empfange wenn LockOn startet ist mal wieder ein kleiner Erfolg, der dieses Posting rechtfertigt.

Jippie

:spring: :spring: :spring: :spring: :spring: :spring: :spring:

Unser ATC Programm ist auf dem besten Wege realität zu werden...
Bild

JaBoG32_Chrissi
Site Admin
Beiträge: 6858
Registriert: 15. Jun 2003, 16:43

Beitrag von JaBoG32_Chrissi » 4. Mär 2005, 13:38

Kuhl :D Freut mich zu hören ;)

Hab da noch eine Frage zu dieser Java App :)

Wie genau funktioniert der Server? Überprüft der Server, ob von einem Radar Controller eine Anfrage kommt, und wenn ja, dann checkt der Java Server, ob er von Fliegern Dateninput bekommt und leitet diese an den Radar Controller weiter?

Oder ist es so, dass der Java Server intern cachet und immer Daten von den Fliegern sammelt und sobald sich ein Radar Controller connected, diese Daten zu ihm weiterleitet? :D
2. JaBoG32 "Fighting Wildcats"

Gruß, Chrissi aka Kichi :D
Our Dreams are Wings

Bild

Benutzeravatar
Zillion
Intermediate Member
Beiträge: 227
Registriert: 22. Apr 2004, 21:47

Beitrag von Zillion » 4. Mär 2005, 15:04

Mahlzeit,

Gerade aus der Mittagspause zurück...
Also am besten du liest dir das Readme durch, darin wird der Mechanismus ein wenig erklärt.
Ansonsten kann ich es dir, so wie ich es verstanden habe, versuchen zu erklären. Also ganz vorne Angefangen.

Multithreading Server nennt man den Server weil er connections zu mehreren Clients aufrecht erhählt. Normalerweise ist es ja so, dass wenn sich ein Client mit einer Socket verbindet, die Connection geöffnet wird. Die Socket wartet jetzt auf Daten von dem Client. Solange sie das tut, blockt sie Anfrangen anderer Clients, da sie ja noch auf die Daten des Clients wartet der sich zuerst verbunden hat. In einer Multithreading Server Socket ist das allerdings so gelöst, das man eine HauptSocket hat, die bei Verbindungsaufbau die Anfrage direkt an eine NebenSocket weiterleitet, die sich dann ausschliesslich mit diesem Client beschäftigt, so dass die Hauptsocket wieder frei ist neue Verbindungen zu akzeptieren.

Jetzt direkt zu deiner Frage:
Wie der Datenfluss genau aussieht weiss ich leider auch nicht. Im groben kann man allerdings sagen, dass die Socket auf keinen Fall erst auf Anfragen der Radarcontroller wartet um dann die Flieger zu fragen ob es Daten gibt die sie weiterleiten kann.
Auch werden die Daten meiner Meinung nach nicht gecacht.
Ich glaube man kann einen Broadcast Server am besten mit einem Spiegel vergleichen.
Sobald Daten kommen werden die Direkt an alle verbunden Clients weitergeleitet, leider auch an die Clients die die Daten verursacht haben. An letzterem arbeite ich auch noch so das die Daten im idealfall nur an die RadarController weitergeleitet werden und nich zusätzlich auch noch an die Flieger, was ja blödsinnig wäre aber auch nicht so schlimm, bis auf den erhöhten Traffic.

Hier mal ein Ausszug aus der Readme:
[quotetqd]Overview
--------
CommServer is a communications relay server written in Java. When running it
acts as a broadcast relay mechanism to connected clients...i.e., it accepts
incoming messages from a client and then relays that message to
all connected clients including the original producer. No processing is done
on the message; it is relayed verbatim.
[/quotetqd]

Eine anderes gut veranschaulichendes Beispiel ist ein Chat Programm...
Wenn du was chattest erhalten alle verbunden mit-chatter deine Nachricht, inklusive dir selbst.

Ich hoffe ich habe dein Frage damit beantwortet.

Wie gesagt der Link steht oben... einfach mal runterladen readme lesen und mit der Eingabeaufforderung starten
Das geht mit:

java CommServer [Port#]

und [url=http://www.polymoon.org/tobi/privat/cha ... 080.swftqd]dieser[/colortqd][/urltqd] Link führt dich zum Download des Flash Chat clients den ich mal so eingestellt habe das er auf 127.0.0.1 auf Port 8080 lauscht. Davon kannst du mehrere öffnen und dann mit die selber chatten.
Du kannst auch mal zum test deine export.lua auf 127.0.0.1 stellen und hören, DING DONG, aha, Lock on verbindet sich mit Flash...

Nur senden tuts noch nich da dieser Nullbyte Character fehlt... Naja kriegen wir hin. Wenn du magst kannst du auch schonmal testen ob du das ding auf deinen Linux/Unix Server zum laufen kriegst...

Viel Spass
:)
Bild

JaBoG32_Chrissi
Site Admin
Beiträge: 6858
Registriert: 15. Jun 2003, 16:43

Beitrag von JaBoG32_Chrissi » 4. Mär 2005, 15:13

Hi Zillion,

Danke :D

Werde gleiche mal versuchen das Proggi auf meinem Server zum Laufen zu bringen :)
2. JaBoG32 "Fighting Wildcats"

Gruß, Chrissi aka Kichi :D
Our Dreams are Wings

Bild

JaBoG32_Chrissi
Site Admin
Beiträge: 6858
Registriert: 15. Jun 2003, 16:43

Beitrag von JaBoG32_Chrissi » 5. Mär 2005, 12:36

Hi Zillion, :)

Ich habe gerade eine Antwort von meinem Provider bekommen, was das starten und killen von Prozessen auf dem Server angeht.
Da Ich keinen Zugriff auf die Konsole habe (hab einen gemanageten Server; keinen Root-Server), müsste für das Starten der Java App jedesmal ein Techniker bezahlt werden, der dann lokal am Server arbeitet.
Nachdem Ich mir vorstellen kann, dass es an der Java App noch einige Änderungen geben wird, hab Ich mal nachgefragt, was Ich machen kann, dass Ich zumindest teilweise Root-Zugriff bekomme.

Glücklicherweise wurde mir eine Möglichkeit angeboten, mit der Ich Dienste starten, beenden und neustarten kann (Jau mein Provider ist echt klasse! :D). Das Ganze wäre mit einem Arbeitsaufwand von 30 Minuten verbunden, was mich 60€ kosten würde. Das Programm bediene / steuere Ich über das Anlegen von Dateien per FTP. Hierbei würde Ich mir dann eine kleine grafische Benutzeroberfläche in php schreiben, die sich dann um das Anlegen der Dateien kümmert ;)

Deshalb will Ich jetzt erstmal nachfragen: Ist es wirklich sicher, dass wir diese oder eine ähnliche Java Applikation verwenden werden?

Auf meinem Server ist bereits das JDK 1.4.2 installiert. Reicht das für den Java Broadcast Server? :)
2. JaBoG32 "Fighting Wildcats"

Gruß, Chrissi aka Kichi :D
Our Dreams are Wings

Bild

Benutzeravatar
Woodstock
Semi-Professional
Beiträge: 3644
Registriert: 8. Nov 2004, 00:59

Beitrag von Woodstock » 5. Mär 2005, 16:18

@ Zillion & Chrissi:

Ich hab keine blasse Ahnung von den IT-Details, die Ihr hier bequatscht, aber ich hab gerafft, worum es grob geht... - Radar für Woody und Konsorten.
Und deshalb wollt ich Euch zumindest schonmal Danke für Eure Mühen sagen, bleibt dran, lasst Euch von Rückschlägen nicht entmutigen!
Die Community und ich werden es Euch danken.
"For aviators like us, the sky is not the limit - it´s our home!"

Benutzeravatar
Zillion
Intermediate Member
Beiträge: 227
Registriert: 22. Apr 2004, 21:47

ES KLAPPT !!

Beitrag von Zillion » 6. Mär 2005, 08:40

:D Endlich,

[imgb5d]http://www.polymoon.org/tobi/privat/esklappt.jpg[/imgb5d]

:spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring: :spring:

Habs endlich geschafft... Jetzt am besten wieder regelmässig schlafen gehen und Allen Carrs "Endlich Nichtraucher" fertig lesen :oops:
Muss noch ein oder zwei Sachen ändern aber im Prinzip funktionierts.

@Chrissi
Wir könnens trotzdem anders probieren wenn du magst aber das wäre wieder mit etlichen schlaflosen Nächten verbunden :lol: Ich glaub schon das die 1.4.2 ausreicht, ich hab selbst die ganze Zeit die 1.4.2.06 benutzt und der CommServer ist aus dem Jahre 2000.

@Woody
Danke fürs Danke

Ich häng mal die export.lua an, dann kann wer auch immer selbst mal rumprobieren.. Die anderen benötigten Files sind ja oben verlinkt...
Eine Sache die noch nicht so elegant ist, ist die Tatsache das ich die XML Tags jetzt erstmal direkt in der export lua angehängt habe, das muss ich dann noch so machen das sie erst im Server angehängt werden, aber dafür muss ich noch ein bissl mehr JAVA lernen...

[quoteb5d]function LuaExportStart()

local path = "./luasocket.dll"
local f = assert(loadlib(path, "luaopen_socket"))
f()
local host = '127.0.0.1'
local port = 8080
if socket then
c, e = socket.connect(host, port) -- connect to the listener socket
end

end


function LuaExportBeforeNextFrame()

end


function LuaExportAfterNextFrame()

end


function LuaExportActivityNextEvent(t)
local tNext = t

local t = LoGetModelTime()
local name = LoGetPilotName()
local altBar = LoGetAltitudeAboveSeaLevel()
local altRad = LoGetAltitudeAboveGroundLevel()
local pitch, bank, yaw = LoGetADIPitchBankYaw()
local vel = LoGetVerticalVelocity()
local speed = LoGetIndicatedAirSpeed()
local gforce = LoGetAccelerationUnits()


if c then
s, e = c:send(string.format("<USER>%s</USER><MESSAGE>%.2f,%.2f,%.2f,%.2f,%.2f,%.2f</MESSAGE>",name,altBar,vel,speed,pitch, bank,gforce))
s, e = c:send("\0")
end


tNext = tNext + 1.0

return tNext

end


function LuaExportStop()

if c then
s, e = c:send("quit") -- to close the listener socket
c:close()
end

end
[/quoteb5d]

So ich geh nu mal pennen, is schon wieder 9:41 morgens...
Bild

Benutzeravatar
Pjotr
Senior Member
Beiträge: 1847
Registriert: 23. Feb 2004, 10:03

Beitrag von Pjotr » 6. Mär 2005, 09:00

Kann zwar ebenfalls kaum folgen, aber das klingt vielversprechend. Danke auch von mir! =)
Bild

Antworten