مكتبة InSim لـ Node.js مع دعم TypeScript.
يوفر Node InSim واجهة برمجة تطبيقات JavaScript للتواصل مع بروتوكول Live for Speed InSim عبر اتصال TCP. بعد الاتصال بمضيف LFS عبر اسم مضيف ومنفذ، ستتمكن من إرسال حزم InSim إلى المضيف واستقبال الحزم الواردة من المضيف.
جميع بنيات الحزم في Node InSim مطابقة للبنيات المحددة في بروتوكول InSim. يتم توثيق جميع فئات الحزم بجميع خصائصها وفقًا للمواصفات.
Node InSim متوافق مع الإصدار 9 من InSim.
قم بتثبيت حزمة node-insim
NPM في تطبيق Node.js الخاص بك:
npm install --save node-insim
أو إذا كنت تستخدم الغزل:
yarn add node-insim
لمزيد من الوثائق التفصيلية لواجهة برمجة التطبيقات العامة، راجع https://simbroadcasts.github.io/node-insim/.
للاتصال بمضيف LFS، يجب عليك إدخال اسم المضيف الخاص به والمنفذ والاسم المختصر لتطبيق InSim الخاص بك.
يجب تكوين منفذ InSim في إعدادات مضيف LFS. تأكد أيضًا من السماح لعنوان 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، فاضبط خيار Protocol
على UDP
في وظيفة connect
.
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 باستخدام طريقة send()
على مثيل فئة InSim
، والذي يأخذ وسيطة واحدة - مثيل فئة الحزمة.
إحدى الطرق السريعة لتعيين خصائص الحزمة هي نشرها في مُنشئ الفئة:
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 Relay:
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 في سلسلة معلومات عميل InSim Relay في منتدى LFS.
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 بإخراج أي سجلات إلى الإخراج القياسي.
لتمكين التسجيل، استخدم متغير البيئة DEBUG
عند تشغيل تطبيق InSim الخاص بك. جميع السجلات مسبوقة بـ node-insim
. يمكنك استخدام أحرف البدل لتصفية السجلات التي تحتاجها.
DEBUG= * node insim.js # debug all messages
DEBUG=node-insim:tcp node insim.js # debug only TCP protocol messages
يمكنك العثور على أمثلة للتطبيقات باستخدام Node InSim في مجلد الأمثلة.
مثال | ||
---|---|---|
اتصال إنسيم | جافا سكريبت + سي جي إس | تايب سكريبت + ESM |
اتصال InSim (مضيفون متعددون) | جافا سكريبت + سي جي إس | تايب سكريبت + ESM |
اتصال InSim (UDP) | جافا سكريبت + سي جي إس | تايب سكريبت + ESM |
تتابع InSim | جافا سكريبت + سي جي إس | تايب سكريبت + ESM |
مقياس خارجي | جافا سكريبت + سي جي إس | تايب سكريبت + ESM |
OutGauge مع أزرار InSim | جافا سكريبت + سي جي إس | تايب سكريبت + ESM |
OutSim | جافا سكريبت + سي جي إس | تايب سكريبت + ESM |
OutSim مع الخيارات | جافا سكريبت + سي جي إس | تايب سكريبت + 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
. يمكن تكوين مضيف ومنفذ InSim عن طريق نسخ .env
إلى .env.local
في دليل lfs-test
.
yarn test:lfs
سيمر هذا الأمر عبر كل تطبيق في المجلد examples/
، وسيثبت تبعياته، ثم ينشئ التطبيق (على الآلة الكاتبة فقط).
yarn test:examples
yarn lint
yarn format
سيتم إنشاء الملفات المترجمة في dist/
.
yarn build
يمكنك تشغيل تنسيق التعليمات البرمجية وإصلاح lint + والإنشاء والاختبار باستخدام الأمر التالي:
yarn check-all