Skip to content

Napredna komunikacija

Ova stranica pokriva napredne metode USB komunikacije, serijske interfejse i mrežne sokete. Za osnovna čitanja i pisanja pogledajte Pisanje i čitanje.

Razumevanje razlike između tipova USB prenosa pomaže vam da izaberete pravu metodu i debagujete neočekivane greške.

TipMetodaTipična veličinaSlučaj korišćenja
Interruptdevice.write() / device.read()3–64 bajtaRGB podaci, male komande, unos sa tastature/miša
Bulkdevice.write() / device.read()64–1025 bajtaLCD slike, ažuriranja firmvera, veliki blokovi konfiguracije
Controldevice.send_report() / device.get_report() / device.control_transfer()32–192 bajtaAutentifikacija, HID Feature Reports, konfiguracija uređaja

Iste funkcije device.write() i device.read() se koriste za Interrupt i Bulk prenose — USB drajver određuje tip na osnovu endpointa i veličine paketa.


Šalje HID GET_INPUT_REPORT Control Transfer. Slično device.get_report(), ali eksplicitno zahteva Input Report umesto Feature Report-a. Koristite ovo kada get_report() vraća pogrešne podatke jer uređaj razdvaja svoje tipove Input i Feature Report-a.

ParametarTipOpisPrimer
DataArray1D ArrayPodaci zahteva za izveštaj[0x01]
LengthIntOčekivana veličina izveštaja u bajtovima64
PovratakTipOpis
DataArray1D ArrayBajtovi primljeni od uređaja
var inputData = device.input_report([0x01], 64);

Izvršava direktan Bulk ili Interrupt prenos ka određenom USB endpointu. Za razliku od device.write() i device.read(), koji koriste endpoint izabran putem device.set_endpoint(), ovo vam omogućava da adresujete bilo koji endpoint putem njegove adrese.

  • Adrese endpointa koje završavaju sa 0x80 ili više su IN (uređaj → host, čitanje).
  • Adrese endpointa ispod 0x80 su OUT (host → uređaj, pisanje).
ParametarTipOpisPrimer
EndpointHexUSB adresa endpointa0x81
DataArray1D ArrayPodaci za slanje (OUT) ili prazan niz (IN)[0x01, 0x02]
LengthIntVeličina prenosa u bajtovima64
TimeoutIntMilisekunde do otkazivanja100
PovratakTipOpis
DataArray1D ArrayPrimljeni bajtovi (IN prenosi), ili prazno
// Piši na endpoint 0x01
device.bulk_transfer(0x01, [0x00, 0x01, 0x02], 3, 100);
// Čitaj sa endpointa 0x81
var response = device.bulk_transfer(0x81, [], 64, 100);
// Veliki Bulk pisanje (npr. podaci LCD slike)
device.bulk_transfer(0x02, imageData, 1024, 500);

Low-Level USB Control Transfer. Koristi se za handshake-ove autentifikacije, protokole specifične za proizvođača i slučajeve kada HID metode nisu dovoljne. Ovo je Control Transfer, ne Bulk Transfer.

ParametarTipOpisPrimer
RequestTypeHexUSB Request Type bitmapa (pravac, tip, primalac)0xA1
RequestHexKod zahteva (specifičan za uređaj)0x01
ValueHexPolje vrednosti0x0100
IndexIntIndeks interfejsa ili endpointa0x00
DataArray1D ArrayPodaci za slanje (Host→Uređaj), ili prazno[]
LengthIntOčekivana dužina odgovora (Uređaj→Host)192
TimeoutIntMilisekunde do otkazivanja1000
PovratakTipOpis
DataArray1D ArrayPrimljeni bajtovi (Uređaj→Host prenosi)

Česte vrednosti RequestType:

VrednostPravacTipPrimalacSlučaj korišćenja
0x21Host → UređajClassInterfaceHID SET_REPORT
0xA1Uređaj → HostClassInterfaceHID GET_REPORT
0x80Uređaj → HostStandardUređajČitanja deskriptora
0x00Host → UređajStandardUređajStandardne komande
// Čitaj token autentifikacije (Uređaj → Host, Class, Interface)
var token = device.control_transfer(
0xA1, // Uređaj→Host, Class, Interface
0x01, // GET_REPORT
0x0100, // Tip izveštaja (Feature) + Report ID
0x00, // Interface 0
[], // Nema odlaznih podataka
192, // Očekuj 192 bajta nazad
1000 // Timeout od 1 sekunde
);
// Pošalji Feature Report (Host → Uređaj)
device.control_transfer(0x21, 0x09, 0x0300, 0, [0x03, 0x08, 0x32], 0, 500);

Za uređaje sa serijskim/COM portom, importujte Serial modul i postavite Type() vašeg plugina na "serial".

import { serial } from "@SignalRGB/serial";
export function Type() { return "serial"; }
serial.connect({
baudRate: 115200, // Podrazumevano: 115200
parity: "None", // "None", "Even", "Odd", "Space", "Mark"
dataBits: 8, // 5, 6, 7 ili 8
stopBits: "One" // "One", "OneAndHalf", "Two"
});
MetodaOpisPovratak
serial.connect(options?)Otvori serijski portbool
serial.disconnect()Zatvori serijski portvoid
serial.isConnected()Proveri status vezebool
serial.write(data)Pošalji podatkePoslati bajtovi
serial.read(maxBytes?, timeoutMs?)Čitaj dostupne bajtove (podrazumevano: sve, 1000 ms timeout)Niz bajtova
serial.readAll()Odmah pročitaj sve dostupne bajtoveNiz bajtova
serial.availablePorts()Navedi dostupne COM portoveNiz
serial.getPortName()Naziv trenutnog portastring
serial.getBaudRate()Trenutna brzina u baudimanumber
serial.getDeviceInfo()Informacije o portu sa VID, PID itd.object
import { serial } from "@SignalRGB/serial";
export function Type() { return "serial"; }
export function Initialize() {
if (!serial.connect()) {
device.log("Verbindung zum seriellen Port fehlgeschlagen");
return;
}
device.log(`Verbunden auf ${serial.getPortName()} mit ${serial.getBaudRate()} Baud`);
}
export function Render() {
serial.write([0xFF, ...RGBData]);
}
export function Shutdown() {
serial.disconnect();
}

Za uređaje koji podržavaju mrežu, importujte TCP ili UDP modul i postavite Type() na "network". Oba modula koriste model callback-a zasnovan na događajima.

import { tcp } from "@SignalRGB/tcp";
import { udp } from "@SignalRGB/udp";
export function Type() { return "network"; }
import { tcp } from "@SignalRGB/tcp";
let socket;
export function Initialize() {
socket = tcp.createSocket();
socket.on("connected", () => {
device.log("Verbunden");
socket.send([0x01, 0x02, 0x03]);
});
socket.on("message", (data) => {
device.log(`Empfangen: ${data}`);
});
socket.on("error", (err) => {
device.log(`Fehler: ${err}`);
});
socket.connect("192.168.1.100", 8080);
}
export function Render() {
if (socket.state === socket.ConnectedState) {
socket.send(RGBData);
}
}
export function Shutdown() {
socket.close();
}

TCP metode:

MetodaOpis
tcp.createSocket()Kreiraj novi TCP soket
socket.connect(address, port)Poveži se na host
socket.send(data)Pošalji string ili niz bajtova
socket.bind(port)Poveži se na lokalni port
socket.close()Zatvori soket
socket.on(event, callback)Registruj handler događaja

TCP događaji: "connected", "disconnected", "message", "error"


import { udp } from "@SignalRGB/udp";
let socket;
export function Initialize() {
socket = udp.createSocket();
socket.on("message", (data) => {
device.log(`Empfangen: ${data}`);
});
socket.connect("192.168.1.100", 21324);
}
export function Render() {
socket.send(RGBData);
}
export function Shutdown() {
socket.close();
}

UDP metode:

MetodaOpis
udp.createSocket()Kreiraj novi UDP soket
socket.connect(address, port)Postavi podrazumevano odredište slanja
socket.send(data)Pošalji na povezanu adresu
socket.write(data, address, port)Pošalji na određenu adresu bez prethodnog connect() poziva
socket.bind(port)Poveži se na lokalni port za primanje
socket.close()Zatvori soket
socket.on(event, callback)Registruj handler događaja

UDP događaji: "connected", "disconnected", "message", "error"


Za uređaje koji zahtevaju šifrovanu komunikaciju (npr. Philips Hue), koristite dtls funkcionalnost. Pruža DTLS šifrovani UDP sa Pre-Shared Key (PSK).

export function Initialize() {
device.addFeature("dtls");
dtls.onConnectionEstablished(() => { device.log("DTLS verbunden"); });
dtls.onConnectionClosed(() => { device.log("DTLS geschlossen"); });
dtls.onConnectionError(() => { device.log("DTLS Fehler"); });
dtls.createConnection("192.168.1.50", 2100, authIdentity, authKey);
}
export function Render() {
if (dtls.hasEncryptedConnection()) {
dtls.send(RGBData);
}
}
export function Shutdown() {
dtls.CloseConnection();
}

DTLS metode:

MetodaOpis
dtls.createConnection(host, port, identity, key)Otvori šifrovanu vezu sa PSK
dtls.send(data, endianness?)Pošalji šifrovane podatke (0 = Little-Endian, 1 = Big-Endian)
dtls.hasEncryptedConnection()Vraća true ako veza postoji
dtls.CloseConnection()Zatvori vezu
dtls.onConnectionEstablished(cb)Callback kada je veza uspešna
dtls.onConnectionClosed(cb)Callback kada je veza zatvorena
dtls.onConnectionError(cb)Callback pri grešci