InSim

InSim

InSim er en protokol, der gør det muligt for et eksternt program at kommunikere med Live for hastighed. Det giver dig mulighed for at oprette en sokkelforbindelse med spillet og til at sende og modtage pakker med data. InSim-protokollen beskriver, hvordan hver af disse pakker er formateret, og ethvert programmeringssprog, der kan oprette en netværksforbindelse og sende og modtage strenge af binære data, kan interface med det.

den officielle dokumentation er inkluderet i filen InSim.tekst, findes i mappen Spil doc. Den består af en C++ header-fil, der indeholder definitionen for hver pakke, samt kommentarer fra Scavenia om, hvordan hver skal bruges. Dokumentationen her er tænkt som et supplement til denne fil.

UDP vs TCP

InSim understøtter både UDP og TCP-forbindelser. I UDP-tilstand kan der kun oprettes en enkelt forbindelse, men der kan oprettes op til otte forbindelser til spillet i TCP. Uanset om det er tilsluttet i TCP eller UDP, er det muligt at angive en separat UDP-stik til modtagelse af bilpositionsopdateringer, såsom IS_MCI og IS_NLP.

InSim eksempel

hvordan du går i gang med at oprette en InSim-forbindelse afhænger naturligvis af hvilket programmeringssprog du bruger, men her forsøger vi at dokumentere processen med nogle eksempler fra det populære Python-programmeringssprog. Som nævnt ovenfor kan ethvert sprog, der er i stand til at oprette en stikkontakt, bruges til at interface med LFS, men princippet forbliver det samme uanset.

oprettelse af en forbindelse

først og fremmest skal vi etablere en sokkelforbindelse med spillet, i dette tilfælde i TCP.

# 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))

initialisering af InSim

efter oprettelse af forbindelsen skal vi initialisere InSim-systemet ved at sende IS_ISI-pakken. Før vi kan gøre dette, skal vi dog først intitailse InSim inden for LFS selv. For at gøre dette skal du starte spillet og indtaste chatkommandoen “/insim 29999”. Det anvendte portnummer kan være en hvilken som helst gyldig port, men 29999 har generelt en tendens til at være den accepterede standard.

her er definitionen for IS_ISI-pakken fra InSim.TST.

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};

hver InSim-pakke begynder med en overskrift, der består af 4 byte. Den første byte er størrelsen på pakken efterfulgt af pakketypen fra isp_-tællingen og derefter rekvisitionen (står for anmodning-Id). Når der fremsættes en anmodning til LFS, skal værdien af rekvisitionen indstilles til ikke-nul, hvorved LFS svarer med den samme værdi, der er angivet i rekvisitionen for den anmodede pakke. Endelig varierer den fjerde byte afhængigt af den pågældende pakke, som i dette tilfælde er tom.

som du kan se, indeholder is_isi-pakken forskellige indstillinger og flag, der bruges, når InSim-systemet initialiseres. Vi skal pakke disse data i en binær formateret streng for at sende den til LFS.

# 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)

modtagelse af Data

efter oprettelse af forbindelsen og initialisering af InSim skal vi derefter opsætte pakken modtage loop. Da data i TCP-tilstand sendes som en konstant strøm af data, kan flere pakker ankomme i et enkelt modtagelsesopkald, og nogle pakker kan ankomme ufuldstændige. Det betyder, at vi skal gemme alle indgående data i en buffer og derefter læse hver pakke ud, når vi er sikre på, at den er færdig.

# 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()

udpakning af pakker

når vi har modtaget pakkedataene som en binær formateret streng, skal vi derefter pakke disse data ud i et format, der er nyttigt for os. I vores tidligere eksempel, da vi sendte IS_ISI-initailiseringspakken, satte vi rekvisitionen til ikke-nul, hvilket betyder, at LFS reagerede med en IS_VER-versionspakke, men vi gjorde ikke noget med det. Lad os først se på definitionen for IS_VER-pakken fra InSim.TST.

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};

lad os nu se på, hvordan vi ville udpakke disse data i 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

for at holde forbindelsen åben sender LFS en “keep alive” – pakke hvert 30.sekund. Denne pakke er en IS_TINY med en SubT (undertype) af TINY_NONE. Vi skal svare på denne pakke hver gang den modtages for at forhindre, at forbindelsen med InSim går ud.

# 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)

yderligere eksempler

du kan se det fulde eksempel på denne kode såvel som andre på insim-eksemplerne.

InSim-biblioteker

selvfølgelig som det gamle ordsprog går, bør du ikke forsøge at genopfinde hjulet (medmindre du forsøger at lære mere om hjul), og der er flere modne InSim-biblioteker til rådighed til brug i din egen kode.

Insim biblioteker
Bibliotek Platform Licens internet
LFSLib . net ramme GPL projektside
Lfs_ekstern .NET ramme gratis vare lfsforum tråd
JInSim Java Mosilla lfsforum tråd
pyinsim Python LGPL lfsforum tråd
CInSim C / C++ gratis vare lfsforum tråd
phplfs PHP5 Apache Licens V2.0 projektside
PRISM PHP7 MIT lfsforum sektion
InSim.NET . net ramme LGPL lfsforum tråd

InSim Reference

her er et forsøg på at henvise til den komplette InSim-protokol.

Pakkehenvisning
pakke beskrivelse Type
initialisering
IS_ISI insim initialisering instruktion
generelle formål
IS_TINY generelle formål 4 byte pakke begge
IS_SMALL generelle formål 8 byte pakke begge
Versionsforespørgsel
IS_VER versionsinformation Info
Statsrapportering og anmodninger
IS_STA sendt når spillet tilstand ændringer Info
IS_SFP Send for at indstille forskellige tilstandsindstillinger instruktion
skærmtilstand
IS_MOD Send for at ændre skærmtilstand instruktion
tekstbeskeder og tastetryk
IS_MSO system-og brugerbeskeder sendt fra LFS Info
IS_III brugerbeskeder til vært InSim Info
IS_MST Send LFS en besked eller kommando (64 tegn) instruktion
Is_msk udvidet version af IS_MST (96 tegn), ikke for kommandoer instruktion
IS_MSL Send besked til lokal spilklient instruktion
IS_MTC Send besked til specifik forbindelse eller afspiller instruktion
IS_SCH Send enkelt tegn eller tastetryk instruktion
Multiplayer anmeldelse
IS_ISM sendt når du starter eller slutter dig til en vært Info
IS_NCI sendt når host admin adgangskode er indstillet, indeholder bruger IP og sprog data Info
afstemning Underret
IS_VTN Underret om spiller stemme (genstart race, kvalificere etc..) Info
Race Tracking
IS_RST Race Start eller genstart Info
IS_NCN ny forbindelse sammenføjning server Info
IS_SLC at rapportere ændringer i biltilstand (aktuelt start eller stop) Info
IS_CSC rapporterer en forbindelses aktuelt valgte bil Info
IS_CNL tilslutning venstre server Info
IS_CPR spiller ændret navn Info
IS_NPL ny spiller, der deltager i race, eller forlader gruber Info
IS_PLP spiller pits (gået til garage skærm) Info
IS_PLL spiller venstre løb (gået til spectate) Info
IS_CRS bil nulstilling (presset mellemrumstasten) Info
IS_JRR kan bruges til at nulstille eller starte en bil på et bestemt sted instruktion
IS_LAP omgangstid afsluttet Info
IS_SP Split tid afsluttet Info
IS_PIT Pit stop startet (ved pit boks) Info
IS_PSF Pit stop færdig Info
IS_PLA spiller indtastet pit lane (til pit eller tjene straf) Info
IS_CHH kameravisning ændret (chase-visning, brugerdefineret visning osv..) Info
IS_PEN straf givet eller cleated Info
IS_TOC spiller overtog en anden bil (førerbytte) Info
IS_FLG spiller vist flag (gul eller blå) Info
IS_PFL spiller flag ændret (auto-gear, auto-kobling osv..) Info
IS_FIN spiller færdig løb (krydset målstregen) Info
IS_RES spiller resultat tildelt, bekræftet finish Info
IS_REO Omarranger startgitter begge
Autocross
IS_AKSI Autocross layout indlæst Info
IS_AKSO spiller hit autocross objekt Info
IS_OCO kan bruges til at tilsidesætte specifikke eller alle startlys instruktion
IS_UCO sender info om insim checkpoints og cirkler Info
bil sporing
IS_NLP spillere nuværende node, omgang og race position Info
IS_MCI mere detaljeret version af IS_NLP, verden-koordinater, hastighed, vinkel og overskrift Info
kamera kontrol
IS_SCC sæt set bil og vælg Kamera instruktion
IS_CPP Indstil fuld kameraposition instruktion
Replay kontrol
IS_RIP Indlæs afspilning og flyt til bestemt destination instruktion
Screenshots
IS_SSH tag et skærmbillede instruktion
Insim knapper
IS_BFN Slet en knap eller alle knapper instruktion
IS_BTN Send en knap til skærmen instruktion
IS_BTC sendt når der klikkes på en knap Info
IS_BTT sendt når tekst er indtastet Info

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.