Guten Abend,
ein recht komplexes Problem beschäftigt mich seit einiger Zeit. Es geht dabei um das
BattlEye Remote Console Protokoll.
Zur Verwaltung von Gameservern gibt es zahlreiche Programme in jeglichen
Programmiersprachen. Diese sind natürlich live bei aktiver Verbindung zum Server.
Als zeitgenössische Lösung nutze ich allerdings eine browserbasierte Version.
Diese ist in allen (neuen/alten) Browsern nutzbar und dank des eigenen Designs
auf allen Platformen, also auch auf Mobilgeräten verfügbar.
--
Das Problem
Derzeit verwende ich die ARC als Grundlage der Verbindung zu den Servern.
Die Version ist zwangsläufig nicht live, was in zu diesem Problem ignoriert werden kann.
Um einen Befehl per RCON zu senden, wird also eine Verbindung zum Server via. Socket
hergestellt, es wird sich angemeldet, der Befehl gesendet und die Verbindung geschlossen.
Möchte ich PHP zwingen die Verbindung aufrecht zu erhalten, um zu lauschen, welche
Nachrichten vom BattlEye Server an die verbundenen Clients gesendet werden, komme ich
an meine Erkenntnisgrenzen.
--
Das Protokoll: BattlEye RCon Protokoll
Der Code: Pastebin
--
Im aktuell Codebespiel sendet PHP einen Befehl an den Server, beispielsweise admins.
Der Befehl listet alle via. RCON verbunden Client auf.
Soweit so gut...
--
Lasse ich PHP nun auf jegliche Nachricht vom BattlEye Server lauschen bricht das
ganze Konstrukt zusammen und socket_resvfrom gibt nur noch eine Antwort zurück,
statt fortlaufend und zwar die zuletzt erhaltene.
Wichtig ist zu erwähnen, dass PHP so lang wartet, bis eine Nachricht vom BattlEye
Server an die Clients gesendet wird.
Codeausschnitt: Pastebin
Ersetzt wird der Abschnitt Sending messages durch Reading socket in loop
Die LoginMsg wird erfolgreich an den Server gesendet.
Darauf hin wartet PHP bis zum Erhalt der ersten Antwort vom Server.
RCON admin #0 sendet eine globale Nachricht (Werbung) an den Server und automatisch
auch an alle verbunden RCON Client. Tatsächlich wird die Nachricht aber nur einmalig gesendet.
socket_resvfrom erhält trotz aktiver Verbindung aber nur diese, trotz des Loops.
Fortlaufend richtig kommen die Nachrichten aber wie folgt an einem anderen eingeloggten Clienten an.
Die roten Zahlen sind die in der Reihenfolge erhaltenen Antworten vom BattlEye Server
(an alle aktiven RCON Clients). Auffällig ist, dass mein PHP Code nur die zweite erhaltene
Nachricht wiedergibt.
Das Ziel ist aber, dass meine Schleife fortlauffend die Antworten ausgibt, um diese bsp.
in eine Datei oder Datenbank zu schreiben oder diese ggf. live auszuwerten.
--
Das Protokoll verlangt nach einem Heartbeat, der ihm wie im Code ersichtlich auch
gesendet wird.
Allerdings scheint mein Code fehlerhaft oder unvollständig zu sein.
Im Bezug auf das BattlEye Protokoll müssen im Punkt 2) Command packet die
Anworten vom Server offenbar bestätigt werden sowie im Punkt 3) Server message packet
muss der verbundene Client regelmäßig auf den Heartbeat vom Server antworten.
--
Das schlussendliche Ziel besteht eigentlich aus 2 getrennten Systemen.
System 1
- PHP baut eine RCON Verbindung zum Server auf (via. Sockets)
- PHP lauscht allen Antworten vom BattlEye Server an die Clients
- die Antworten werden in DB oder Dateien mitgeschrieben
- PHP sendet Heartbeats und bestätigt die Antworten vom Server, damit die Verbindung bestehen bleibt
Die Verbindung zum Server kann nur manuell getrennt werden auf durch Abriss der Verbindung.
System 2
- PHP ist permanent zu allen Server via. Websocket Server verbunden
- ausgelöste Aktionen im Front-End durch Clients bewirken, dass Befehle an die bestehende Verbindung
im Back-End gesendet werden
Beispielhafte Nutzung
Beispielhaft dafür ist das Rauswerfen eines Spielers.
Durch die aktive Verbindung zum Server kann PHP den Ingame Chat mitlesen, der an alle verbunden
RCON Clients gesendet wird. Werden bsp. Filter auf Worte oder Zeichenfolgen aufmerksam, wie Beleidigungen
oder Links, generiert PHP den entsprechenden RCON Befehl, beispielhaft kick PlayerID [no advertisment] und
sendet diesen an den Server.
Um Ressourcen zu sparen und die gleichzeitige Nutzung dutzende Clients zu gewährleisten, ist PHP permanent
via. Websocket Server zu den Gameservers via. RCON verbunden. Nur die Websocket Clients melden sich am
Websocket Server an und ab. Die Verbindung zu den Server muss stabil bestehen bleiben.
Sollte sich dem Problem jemand annehmen wollen, kann man mich gern benachrichtigen.
Ob entgeldlich oder unentgeldlich spielt dabei für mich keine Rolle.
Eine zeitnahe Lösung des Problems wäre wichtig.
// Der Beitrag wurde eventuell bereits in PHP-Fortgeschritten gepostet, ist aber für mich "unsichtbar"?
ein recht komplexes Problem beschäftigt mich seit einiger Zeit. Es geht dabei um das
BattlEye Remote Console Protokoll.
Zur Verwaltung von Gameservern gibt es zahlreiche Programme in jeglichen
Programmiersprachen. Diese sind natürlich live bei aktiver Verbindung zum Server.
Als zeitgenössische Lösung nutze ich allerdings eine browserbasierte Version.
Diese ist in allen (neuen/alten) Browsern nutzbar und dank des eigenen Designs
auf allen Platformen, also auch auf Mobilgeräten verfügbar.
--
Das Problem
Derzeit verwende ich die ARC als Grundlage der Verbindung zu den Servern.
Die Version ist zwangsläufig nicht live, was in zu diesem Problem ignoriert werden kann.
Um einen Befehl per RCON zu senden, wird also eine Verbindung zum Server via. Socket
hergestellt, es wird sich angemeldet, der Befehl gesendet und die Verbindung geschlossen.
Möchte ich PHP zwingen die Verbindung aufrecht zu erhalten, um zu lauschen, welche
Nachrichten vom BattlEye Server an die verbundenen Clients gesendet werden, komme ich
an meine Erkenntnisgrenzen.
--
Das Protokoll: BattlEye RCon Protokoll
Der Code: Pastebin
--
Im aktuell Codebespiel sendet PHP einen Befehl an den Server, beispielsweise admins.
Der Befehl listet alle via. RCON verbunden Client auf.
Soweit so gut...
--
Lasse ich PHP nun auf jegliche Nachricht vom BattlEye Server lauschen bricht das
ganze Konstrukt zusammen und socket_resvfrom gibt nur noch eine Antwort zurück,
statt fortlaufend und zwar die zuletzt erhaltene.
Wichtig ist zu erwähnen, dass PHP so lang wartet, bis eine Nachricht vom BattlEye
Server an die Clients gesendet wird.
Codeausschnitt: Pastebin
Ersetzt wird der Abschnitt Sending messages durch Reading socket in loop
Die LoginMsg wird erfolgreich an den Server gesendet.
Darauf hin wartet PHP bis zum Erhalt der ersten Antwort vom Server.
RCON admin #0 sendet eine globale Nachricht (Werbung) an den Server und automatisch
auch an alle verbunden RCON Client. Tatsächlich wird die Nachricht aber nur einmalig gesendet.
socket_resvfrom erhält trotz aktiver Verbindung aber nur diese, trotz des Loops.
Fortlaufend richtig kommen die Nachrichten aber wie folgt an einem anderen eingeloggten Clienten an.
Die roten Zahlen sind die in der Reihenfolge erhaltenen Antworten vom BattlEye Server
(an alle aktiven RCON Clients). Auffällig ist, dass mein PHP Code nur die zweite erhaltene
Nachricht wiedergibt.
Das Ziel ist aber, dass meine Schleife fortlauffend die Antworten ausgibt, um diese bsp.
in eine Datei oder Datenbank zu schreiben oder diese ggf. live auszuwerten.
--
Das Protokoll verlangt nach einem Heartbeat, der ihm wie im Code ersichtlich auch
gesendet wird.
Allerdings scheint mein Code fehlerhaft oder unvollständig zu sein.
Im Bezug auf das BattlEye Protokoll müssen im Punkt 2) Command packet die
Anworten vom Server offenbar bestätigt werden sowie im Punkt 3) Server message packet
muss der verbundene Client regelmäßig auf den Heartbeat vom Server antworten.
--
Das schlussendliche Ziel besteht eigentlich aus 2 getrennten Systemen.
System 1
- PHP baut eine RCON Verbindung zum Server auf (via. Sockets)
- PHP lauscht allen Antworten vom BattlEye Server an die Clients
- die Antworten werden in DB oder Dateien mitgeschrieben
- PHP sendet Heartbeats und bestätigt die Antworten vom Server, damit die Verbindung bestehen bleibt
Die Verbindung zum Server kann nur manuell getrennt werden auf durch Abriss der Verbindung.
System 2
- PHP ist permanent zu allen Server via. Websocket Server verbunden
- ausgelöste Aktionen im Front-End durch Clients bewirken, dass Befehle an die bestehende Verbindung
im Back-End gesendet werden
Beispielhafte Nutzung
Beispielhaft dafür ist das Rauswerfen eines Spielers.
Durch die aktive Verbindung zum Server kann PHP den Ingame Chat mitlesen, der an alle verbunden
RCON Clients gesendet wird. Werden bsp. Filter auf Worte oder Zeichenfolgen aufmerksam, wie Beleidigungen
oder Links, generiert PHP den entsprechenden RCON Befehl, beispielhaft kick PlayerID [no advertisment] und
sendet diesen an den Server.
Um Ressourcen zu sparen und die gleichzeitige Nutzung dutzende Clients zu gewährleisten, ist PHP permanent
via. Websocket Server zu den Gameservers via. RCON verbunden. Nur die Websocket Clients melden sich am
Websocket Server an und ab. Die Verbindung zu den Server muss stabil bestehen bleiben.
Sollte sich dem Problem jemand annehmen wollen, kann man mich gern benachrichtigen.
Ob entgeldlich oder unentgeldlich spielt dabei für mich keine Rolle.
Eine zeitnahe Lösung des Problems wäre wichtig.
// Der Beitrag wurde eventuell bereits in PHP-Fortgeschritten gepostet, ist aber für mich "unsichtbar"?
Kommentar