Ankündigung

Einklappen
Keine Ankündigung bisher.

BattlEye PHP Connector

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • BattlEye PHP Connector

    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"?

  • #2
    Ich kann Dir zwar nicht spontan weiterhelfen. Aber ich empfehle Dir Deinen Quellcode zu dokumentieren.
    https://duckduckgo.com/?q=PHP+socket...mierung&ia=web
    bitcoin.de <- Meine Freelancerwährung

    Kommentar


    • #3
      Der Websocket-Server ist in diesem Fall uninteressant.

      Das primäre Problem besteht erstmal darin, dass die Verbindung zwischen
      PHP und BattlEye nicht bestehen bleibt und das Senden des Heartbeats
      bzw. die Bestätigung des Empfangs nicht wahrgenommen wird.

      Kommentar


      • #4
        PHP wird vom Server meist nur 30 Sekunden maximal ausgeführt, solange noch Verarbeitungen anstehen. Da läuft nix als dauerhafter Prozess der auf Eingaben wartet. Du rufst eine PHP-Seite auf und der Parser rennt durch das Script und fertig. PHP ist daher Zustandslos gegenüber Deiner Verbindung.
        bitcoin.de <- Meine Freelancerwährung

        Kommentar

        Lädt...
        X