InSim

InSim

az InSim egy olyan protokoll, amely lehetővé teszi egy külső program számára, hogy élőben kommunikáljon a sebesség érdekében. Ez lehetővé teszi, hogy hozzon létre egy socket kapcsolatot a játékot, és küldeni és fogadni adatcsomagokat. Az InSim protokoll leírja, hogyan formázza ezeket a csomagokat, és minden olyan programozási nyelv, amely képes hálózati kapcsolatot létrehozni, és bináris adatokat küldeni és fogadni.

a hivatalos dokumentációt az InSim fájl tartalmazza.txt, a games doc mappában található. Ez egy C++ fejlécfájlból áll, amely tartalmazza az egyes csomagok meghatározását, valamint a Scawen megjegyzéseit, hogy hogyan kell használni őket. Az itt található dokumentáció ennek a fájlnak a kiegészítője.

UDP vs TCP

az InSim támogatja mind az UDP, mind a TCP kapcsolatokat. UDP módban csak egyetlen kapcsolat hozható létre, azonban legfeljebb nyolc kapcsolat hozható létre a játékkal a TCP-ben. Függetlenül attól, hogy TCP-ben vagy UDP-ben csatlakozik-e, megadhat egy külön UDP-aljzatot az autó pozíciófrissítéseinek fogadásához, például az IS_MCI és az IS_NLP.

InSim example

az InSim kapcsolat létrehozásának módja természetesen attól függ, hogy melyik programozási nyelvet használja, de itt megkíséreljük dokumentálni a folyamatot néhány példával a népszerű Python programozási nyelvből. Mint fentebb említettük, minden olyan nyelv, amely képes socket-kapcsolatot létrehozni, felhasználható az LFS-hez való csatlakozásra, azonban az elv ettől függetlenül ugyanaz marad.

kapcsolat létrehozása

először is létre kell hoznunk egy socket kapcsolatot a játékkal, ebben az esetben a TCP-ben.

# Import Python's socket module.import socket# Initialise the socket in TCP mode. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# Connect to LFS.sock.connect(('localhost', 29999))

inicializálás az InSim

a kapcsolat létrehozása után inicializálnunk kell az InSim rendszert az IS_ISI csomag elküldésével. Mielőtt ezt megtehetnénk, először meg kell intitailse InSim belül LFS magát. Ehhez indítsa el a játékot, és írja be a “/insim 29999″csevegési parancsot. A használt portszám bármilyen érvényes port lehet, de általában a 29999 az elfogadott alapértelmezett.

itt található az Is_isi csomag meghatározása az InSim-től.txt.

struct IS_ISI // InSim Init - packet to initialise the InSim system{byteSize;// 44byteType;// ISP_ISIbyteReqI;// If non-zero LFS will send an IS_VER packetbyteZero;// 0wordUDPPort;// Port for UDP replies from LFS (0 to 65535)wordFlags;// Bit flags for options (see below)byteSp0;// 0bytePrefix;// Special host message prefix characterwordInterval;// Time in ms between NLP or MCI (0 = none)charAdmin;// Admin password (if set in LFS)charIName;// A short name for your program};

minden InSim csomag 4 bájtból álló fejléccel kezdődik. Az első bájt a csomag mérete, majd az ISP_ enumerációból származó csomag típusa, majd a ReqI (request Id). Amikor az LFS-hez kérés érkezik, a ReqI értékét nem nullára kell állítani, ahol az LFS a kért csomag ReqI-jében beállított értékkel válaszol. Végül a negyedik bájt a kérdéses csomag típusától függően változik, amely ebben az esetben üres.

mint látható, az IS_ISI csomag különböző opciókat és jelzőket tartalmaz, amelyeket az InSim rendszer inicializálásakor használnak. Ezeket az adatokat bináris formázott karakterláncba kell csomagolni, hogy elküldjük az LFS-nek.

# Import Python's struct module, which allows us to pack and unpack strings.import struct# Pack the IS_ISI data into a string.isi = struct.pack('BBBBHHBcH16s16s', 44, # Size 1, # Type 1, # ReqI 0, # Zero 0, # UDPPort 0, # Flags 0, # Sp0 ' ', # Prefix 0, # Interval 'password', # Admin 'MyProgram',) # IName# Send the string to InSimsock.send(isi)

adatok fogadása

a kapcsolat létrehozása és az InSim inicializálása után be kell állítanunk a csomagfogadási ciklust. Mivel a TCP módban az adatok állandó adatfolyamként kerülnek elküldésre, több csomag is érkezhet egyetlen vételi hívásban, egyes csomagok pedig hiányosak lehetnek. Ez azt jelenti, hogy az összes bejövő adatot pufferben kell tárolnunk, majd minden csomagot Ki kell olvasnunk, amikor biztosak vagyunk benne, hogy teljes.

# We use a string as the buffer.buffer = ''while True: # Receive up to 1024 bytes of data. data = sock.recv(1024) # If no data is received the connection has closed. if data: # Append received data onto the buffer. buffer += data # Loop through each completed packet in the buffer. The first byte of # each packet is the packet size, so check that the length of the # buffer is at least the size of the first packet. while len(buffer) > 0 and len(buffer) > ord(buffer): # Copy the packet from the buffer. packet = buffer)] # Remove the packet from the buffer. buffer = buffer):] # The packet is now complete! :) # doSomethingWithPacket(packet) else: break# Release the socket.sock.close()

csomagok kicsomagolása

miután megkaptuk a csomagkapcsolt adatokat bináris formázott karakterláncként, akkor ezeket az adatokat olyan formátumba kell kicsomagolnunk, amely hasznos számunkra. Előző példánkban, amikor elküldtük az IS_ISI initailisation csomagot, a ReqI-t nem nullára állítottuk, ami azt jelenti, hogy az LFS IS_VER verziócsomaggal válaszolt, azonban nem tettünk vele semmit. Először nézzük meg az Is_ver csomag definícióját az InSim-től.txt.

struct IS_VER // VERsion{byteSize;// 20byteType;// ISP_VERSIONbyteReqI;// ReqI as received in the request packetbyteZero;charVersion;// LFS version, e.g. 0.3GcharProduct;// Product : DEMO or S1wordInSimVer;// InSim Version : increased when InSim packets change};

most nézzük meg, hogyan szeretnénk kicsomagolni, hogy az adatok Python.

# Import Python's struct module.import struct# Unpack the binary formatted packet data into the values we need.size, type, reqi, zero, version, product, insimver = struct.unpack('BBBB8s6sH', packet)# Check the InSim version.if insimver != 4: print 'Invalid InSim version!' sock.close()

Keep Alive

a kapcsolat nyitva tartása érdekében az LFS körülbelül 30 másodpercenként küld egy “keep alive” csomagot. Ez a csomag egy IS_TINY egy SubT (altípusa) a TINY_NONE. Minden alkalommal válaszolnunk kell erre a csomagra, amikor beérkezik, hogy megakadályozzuk az InSim-mel való kapcsolat időzítését.

# Some constants.ISP_TINY = 3TINY_NONE = 0# Check the packet type.if ord(packet) == ISP_TINY: # Unpack the packet data. tiny = struct.unpack('BBBB', packet) # Check the SubT. if tiny == TINY_NONE: # Send the keep alive packet back to LFS. sock.send(packet)

további példák

a kód teljes példáját az InSim példák oldalon láthatja.

InSim könyvtárak

természetesen a régi mondás szerint nem szabad megpróbálnod újra feltalálni a kereket (hacsak nem akarsz többet megtudni a kerekekről), és számos érett InSim könyvtár áll rendelkezésre a saját kódodban.

InSim könyvtárak
Könyvtár Platform licenc web
LFSLib . NET-keretrendszer GPL projektoldal
LFS_External .NET Framework Freeware lfsforum szál
JInSim Java Mozilla lfsforum szál
pyinsim Python LGPL lfsforum szál
CInSim C / C++ Freeware lfsforum szál
phplfs PHP5 Apache Licenc V2.0 projekt oldal
PRISM PHP7 MIT lfsforum szekció
InSim.NET . NET-keretrendszer LGPL lfsforum szál

InSim Reference

itt egy kísérlet a teljes InSim protokoll hivatkozására.

csomag referencia
csomag leírás Típus
inicializálás
IS_ISI InSim inicializálás utasítás
általános célú
IS_TINY általános célú 4 bájtos csomag mindkettő
IS_SMALL általános célú 8 bájtos csomag mindkettő
Verzió kérés
IS_VER verzióinformáció információ
állami jelentések és kérelmek
IS_STA elküldve, amikor a játék állapota megváltozik Info
IS_SFP Küldés különböző állapotbeállítások beállításához utasítás
képernyő mód
IS_MOD Küldés a képernyő mód megváltoztatására utasítás
szöveges üzenetek és gombnyomások
IS_MSO rendszer-és felhasználói üzenetek az LFS – ből Info
IS_III felhasználói üzenetek a fogadó InSim Info
IS_MST üzenet vagy parancs küldése az LFS-nek (64 karakter) utasítás
IS_MSX az IS_MST bővített változata (96 karakter), nem parancsokhoz utasítás
IS_MSL üzenet küldése a helyi játék kliensnek utasítás
IS_MTC üzenet küldése egy adott csatlakozónak vagy lejátszónak utasítás
IS_SCH Küldés egy karakter vagy gombnyomás utasítás
többjátékos értesítés
IS_ISM elküldve egy gazdagép indításakor vagy csatlakozásakor Info
IS_NCI elküldve, amikor a host admin jelszó be van állítva, felhasználói IP és nyelvi adatokat tartalmaz Info
szavazás értesítés
IS_VTN értesítés a játékosok szavazásáról (verseny újraindítása, kvalifikáció stb..) információ
Versenykövetés
IS_RST a verseny kezdete vagy újraindítása Info
IS_NCN új kapcsolat csatlakozás szerver Info
IS_SLC az autó állapotának változásainak jelentése (jelenleg indítás vagy leállítás) Info
IS_CSC kapcsolat aktuálisan kiválasztott autójának jelentése Info
IS_CNL kapcsolat bal szerver Info
IS_CPR játékos megváltozott név Info
IS_NPL új játékos csatlakozik a versenyhez, vagy elhagyja a boxot Info
IS_PLP játékos gödrök (elment a garázs képernyő) Info
IS_PLL játékos left race (gone to spectate) Info
IS_CRS autós Visszaállítás (szóköz megnyomása) Info
IS_JRR használható egy autó alaphelyzetbe állítására vagy indítására egy meghatározott helyen utasítás
IS_LAP köridő befejezve Info
IS_SPX Részidő kitöltve Info
IS_PIT megkezdődött a boxkiállás (boxkiállásnál) Info
IS_PSF boxkiállás befejezve Info
IS_PLA játékos belépett a boxutcába (a boxba vagy a büntetőbe) Info
IS_CHH kamera nézet megváltozott (hajsza nézet, egyéni nézet stb..) információ
IS_PEN büntetés adott vagy kitört Info
IS_TOC játékos átvett egy másik autót (vezető csere) Info
IS_FLG Játékos látható zászló (sárga vagy kék) Info
IS_PFL játékos zászlók megváltozott (auto-fogaskerekek, auto-Kuplung stb..) információ
IS_FIN játékos befejezte verseny (keresztbe célvonalon) Info
IS_RES játékos eredmény odaítélve, megerősítve Befejezés Info
IS_REO rajtrács átrendezése mindkettő
Autocross
IS_AXI Autocross elrendezés betöltve Info
IS_AXO játékos hit autocross objektum Info
IS_OCO lehet használni, hogy felülbírálja specifikus vagy minden indító lámpa utasítás
IS_UCO információkat küld az InSim ellenőrző pontokról és körökről Info
autó követés
IS_NLP játékosok aktuális csomópont, kör és verseny pozíció Info
IS_MCI az IS_NLP részletesebb változata, világkoordináták, sebesség, szög és irány Info
kamera vezérlés
IS_SCC Set megtekintett autó és válassza ki a kamera utasítás
IS_CPP állítsa be a kamera teljes helyzetét utasítás
Replay Control
IS_RIP töltsd be a visszajátszást és lépj az adott helyre utasítás
képek
IS_SSH készítsen képernyőképet utasítás
InSim gombok
IS_BFN Egy gomb vagy az összes gomb törlése utasítás
IS_BTN gomb küldése a képernyőre utasítás
IS_BTC elküldve, ha EGY gombra kattint Info
IS_BTT szöveg beírásakor elküldve Info

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.