支援 TypeScript 的 Node.js InSim 函式庫。
Node InSim 提供了一個 JavaScript API,可透過 TCP 連線與 Live for Speed InSim 協定進行通訊。透過主機名稱和連接埠連接到 LFS 主機後,您可以將 InSim 封包傳送到主機並接收來自主機的傳入封包。
Node InSim 中的所有封包結構與 InSim 協定中定義的結構相同。所有資料包類別及其所有屬性均根據規範進行記錄。
Node InSim 與 InSim 版本 9 相容。
在 Node.js 應用程式中安裝node-insim
NPM 套件:
npm install --save node-insim
或如果您使用紗線:
yarn add node-insim
有關公共 API 的更詳細文檔,請參閱 https://simbroadcasts.github.io/node-insim/。
若要連接到 LFS 主機,您必須輸入其主機名稱、連接埠和 InSim 應用程式的短名稱。
必須在 LFS 主機設定中設定 InSim 連接埠。另外,請確保允許應用程式連接的公共 IP 位址連接到主機的 InSim 連接埠。
import { InSim } from 'node-insim' ;
const inSim = new InSim ( ) ;
inSim . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
} ) ;
若要一次連線到多個主機,請為每個主機建立一個新的InSim
實例。
import { InSim } from 'node-insim' ;
const inSim1 = new InSim ( ) ;
inSim1 . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
} ) ;
const inSim2 = new InSim ( ) ;
inSim2 . connect ( {
Host : '127.0.0.2' ,
Port : 30000 ,
IName : 'Node InSim App' ,
} ) ;
預設情況下,Node InSim 開啟 TCP 連線。如果要使用 UDP,請在connect
函數中將Protocol
選項設為UDP
。
import { InSim } from 'node-insim' ;
const inSim = new InSim ( ) ;
inSim . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
Protocol : 'UDP' ,
} ) ;
InSim 封包可以使用InSim
類別實例上的send()
方法傳送,該方法採用單一參數 - 封包類別實例。
設定封包屬性的一種快速方法是在類別構造函數中填充它們:
import { InSim } from 'node-insim' ;
import { IS_TINY , TinyType } from 'node-insim/packets' ;
const inSim = new InSim ( ) ;
inSim . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
} ) ;
inSim . send (
new IS_TINY ( {
ReqI : 1 ,
SubT : TinyType . TINY_PING ,
} ) ,
) ;
另一種方法是在建立實例後分配每個屬性:
import { InSim } from 'node-insim' ;
import { IS_TINY , TinyType } from 'node-insim/packets' ;
const inSim = new InSim ( ) ;
inSim . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
} ) ;
const pingPacket = new IS_TINY ( ) ;
pingPacket . ReqI = 1 ;
pingPacket . SubT = TinyType . TINY_PING ;
inSim . send ( pingPacket ) ;
InSim
類別具有可用於向 LFS 發送訊息的輔助方法。
inSim . sendLocalMessage ( 'Local message' ) ;
inSim . sendMessage ( '/end' ) ;
IS_MST
資料包IS_MSX
資料包 inSim . sendMessage ( 'This is a message' ) ;
inSim . sendMessageToConnection ( 4 , 'This is a message targeting UCID 4' ) ;
inSim . sendMessageToPlayer ( 4 , 'This is a message targeting PLID 4' ) ;
InSim
類別公開了一個on()
方法,該方法用於按類型偵聽傳入資料包。
import { InSim } from 'node-insim' ;
import type { IS_VER } from 'node-insim/packets' ;
import { PacketType } from 'node-insim/packets' ;
const inSim = new InSim ( ) ;
inSim . on ( PacketType . ISP_VER , onVersion ) ;
function onVersion ( packet : IS_VER ) {
console . log ( `Connected to LFS ${ packet . product } ${ packet . Version } ` ) ;
}
事件回呼包含接收到的封包和可選的第二個參數 - 接收該封包的InSim
實例。您可以使用該實例發送其他資料包作為回應。
import { InSim } from 'node-insim' ;
import { PacketType } from 'node-insim/packets' ;
import type { IS_VER } from 'node-insim/packets' ;
const inSim = new InSim ( ) ;
inSim . on ( PacketType . ISP_VER , onVersion ) ;
function onVersion ( packet : IS_VER , inSim : InSim ) {
inSim . send (
new IS_TINY ( {
ReqI : 1 ,
SubT : TinyType . TINY_PING ,
} ) ,
) ;
}
您可以在事件處理程序回呼中使用inSim
參數來識別接收到的資料包的來源主機,例如透過options.Host
屬性。
或者, InSim
類別建構子接受可選的id
參數,該參數也可用於區分 InSim 連接。
import { InSim } from 'node-insim' ;
const inSim1 = new InSim ( 'Host One' ) ;
inSim1 . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
IName : 'Node InSim App' ,
} ) ;
const inSim2 = new InSim ( 'Host Two' ) ;
inSim2 . connect ( {
Host : '127.0.0.2' ,
Port : 30000 ,
IName : 'Node InSim App' ,
} ) ;
inSim . on ( PacketType . ISP_VER , onVersion ) ;
function onVersion ( packet : IS_VER , inSim : InSim ) {
console . log ( `Connected to ${ inSim . options . Host } : ${ inSim . options . Port } ` ) ;
if ( inSim . id ) {
console . log ( `InSim connection ID: ${ inSim . id } ` ) ;
}
}
接收或傳送的資料包中的所有字串都會自動從 LFS 編碼轉換為 Unicode,反之亦然。
如果需要存取接收到的封包中的原始 LFS 編碼字串,請使用封包實例中的_raw
屬性,該實例包含所有未轉換的字串屬性。
import { InSim } from 'node-insim' ;
import { PacketType } from 'node-insim/packets' ;
import type { IS_ISM } from 'node-insim/packets' ;
const inSim = new InSim ( ) ;
inSim . on ( PacketType . ISP_ISM , ( packet : IS_ISM ) => {
console . log ( packet . HName ) ; // UTF-8 string - ^1Drifter Team ^7★ Server
console . log ( packet . _raw . HName ) ; // raw string - ^1Drifter Team ^7^J�� Serveru0000u0000u0000u0000
} ) ;
當您在資料包中傳送 Unicode 字串值時,每個字元都會被編碼為正確的 LFS 編碼,因此 LFS 可以在訊息或按鈕中顯示文字。
import { InSim } from 'node-insim' ;
import { PacketType } from 'node-insim/packets' ;
import type { IS_MSL } from 'node-insim/packets' ;
const inSim = new InSim ( ) ;
inSim . on ( PacketType . ISP_VER , ( packet : IS_VER ) => {
inSim . send (
new IS_MSL ( {
Msg : 'čau světe' , // LFS will receive: ^Eèau svìte
} ) ,
) ;
} ) ;
若要連線到 InSim Relay 服務,請使用connectRelay()
方法。連線後,您可以傳送和接收中繼資料包。以下範例示範如何顯示連接到 InSim 中繼的主機清單:
import { InSim } from 'node-insim' ;
import { IR_HLR , IR_HOS , PacketType , HInfo } from 'node-insim/packets' ;
inSim . connectRelay ( ) ;
inSim . on ( 'connect' , ( ) => {
// Request a list of hosts
inSim . send ( new IR_HLR ( ) ) ;
} ) ;
inSim . on ( PacketType . IRP_HOS , ( packet : IR_HOS ) => {
// Log the name of each received host
packet . Info . forEach ( ( host : HInfo ) => {
console . log ( host . HName ) ;
} ) ;
} ) ;
有關 InSim Relay 協定的更多資訊可以在 LFS 論壇上的 InSim Relay 用戶端資訊線程中找到。
import { OutGauge , OutGaugePack } from 'node-insim' ;
const outGauge = new OutGauge ( ) ;
outGauge . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
} ) ;
outGauge . on ( 'packet' , ( data : OutGaugePack ) => {
console . clear ( ) ;
console . log ( data . RPM ) ;
} ) ;
import { OutSim , OutSimPack } from 'node-insim' ;
const outSim = new OutSim ( ) ;
outSim . connect ( {
Host : '127.0.0.1' ,
Port : 29999 ,
} ) ;
outSim . on ( 'packet' , ( data ) => {
// Make sure the simple OutSimPack packet is really received, as opposed to OutSimPack2
if ( ! ( data instanceof OutSimPack ) ) {
return ;
}
console . clear ( ) ;
console . log ( data . PosX ) ;
} ) ;
Node InSim 使用debug
NPM 套件來記錄偵錯日誌。預設情況下,Node InSim 不會將任何日誌輸出到標準輸出。
若要啟用日誌記錄,請在執行 InSim 應用程式時使用DEBUG
環境變數。所有日誌均以node-insim
為前綴。您可以使用通配符來過濾掉您需要的日誌。
DEBUG= * node insim.js # debug all messages
DEBUG=node-insim:tcp node insim.js # debug only TCP protocol messages
您可以在範例資料夾中找到使用 Node InSim 的範例應用程式。
例子 | ||
---|---|---|
InSim 連接 | JavaScript + CJS | TypeScript + ESM |
InSim 連線(多台主機) | JavaScript + CJS | TypeScript + ESM |
InSim 連接 (UDP) | JavaScript + CJS | TypeScript + ESM |
InSim 中繼 | JavaScript + CJS | TypeScript + ESM |
外規 | JavaScript + CJS | TypeScript + ESM |
OutGauge 與 InSim 按鈕 | JavaScript + CJS | TypeScript + ESM |
輸出模擬 | JavaScript + CJS | TypeScript + ESM |
帶選項的 OutSim | JavaScript + CJS | TypeScript + ESM |
在運行範例之前,請按照每個範例的README.md
檔案中的說明進行操作。
例如,若要執行「InSim 連線 - TypeScript」範例,請執行下列命令:
cd examples/typescript/insim-connection
npm install
npm start
yarn dev
將新的 InSim 封包新增至庫時,您可以使用內建程式碼產生器,使用yarn generate
。它將為您建立和更新所有必要的文件。
yarn test
yarn test:watch
要執行這些測試,LFS 必須在 InSim 連接埠開啟的情況下執行。
預設情況下,測試連接到127.0.0.1:29999
。可以透過將.env
複製到lfs-test
目錄中的.env.local
來設定 InSim 主機和連接埠。
yarn test:lfs
此命令將遍歷examples/
資料夾中的每個應用程序,安裝其依賴項,然後建立應用程式(僅限打字稿)。
yarn test:examples
yarn lint
yarn format
編譯後的檔案將在dist/
中建立。
yarn build
您可以使用以下命令運行程式碼格式、lint + 修復、建置和測試:
yarn check-all