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 |