Napredna komunikacija
Ova stranica pokriva napredne metode USB komunikacije, serijske interfejse i mrežne sokete. Za osnovna čitanja i pisanja pogledajte Pisanje i čitanje.
Tipovi USB prenosa
Section titled “Tipovi USB prenosa”Razumevanje razlike između tipova USB prenosa pomaže vam da izaberete pravu metodu i debagujete neočekivane greške.
| Tip | Metoda | Tipična veličina | Slučaj korišćenja |
|---|---|---|---|
| Interrupt | device.write() / device.read() | 3–64 bajta | RGB podaci, male komande, unos sa tastature/miša |
| Bulk | device.write() / device.read() | 64–1025 bajta | LCD slike, ažuriranja firmvera, veliki blokovi konfiguracije |
| Control | device.send_report() / device.get_report() / device.control_transfer() | 32–192 bajta | Autentifikacija, 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.
HID Report metode
Section titled “HID Report metode”device.input_report()
Section titled “device.input_report()”Š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.
| Parametar | Tip | Opis | Primer |
|---|---|---|---|
| DataArray | 1D Array | Podaci zahteva za izveštaj | [0x01] |
| Length | Int | Očekivana veličina izveštaja u bajtovima | 64 |
| Povratak | Tip | Opis |
|---|---|---|
| DataArray | 1D Array | Bajtovi primljeni od uređaja |
var inputData = device.input_report([0x01], 64);Raw USB metode
Section titled “Raw USB metode”device.bulk_transfer()
Section titled “device.bulk_transfer()”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
0x80ili više su IN (uređaj → host, čitanje). - Adrese endpointa ispod
0x80su OUT (host → uređaj, pisanje).
| Parametar | Tip | Opis | Primer |
|---|---|---|---|
| Endpoint | Hex | USB adresa endpointa | 0x81 |
| DataArray | 1D Array | Podaci za slanje (OUT) ili prazan niz (IN) | [0x01, 0x02] |
| Length | Int | Veličina prenosa u bajtovima | 64 |
| Timeout | Int | Milisekunde do otkazivanja | 100 |
| Povratak | Tip | Opis |
|---|---|---|
| DataArray | 1D Array | Primljeni bajtovi (IN prenosi), ili prazno |
// Piši na endpoint 0x01device.bulk_transfer(0x01, [0x00, 0x01, 0x02], 3, 100);
// Čitaj sa endpointa 0x81var response = device.bulk_transfer(0x81, [], 64, 100);
// Veliki Bulk pisanje (npr. podaci LCD slike)device.bulk_transfer(0x02, imageData, 1024, 500);device.control_transfer()
Section titled “device.control_transfer()”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.
| Parametar | Tip | Opis | Primer |
|---|---|---|---|
| RequestType | Hex | USB Request Type bitmapa (pravac, tip, primalac) | 0xA1 |
| Request | Hex | Kod zahteva (specifičan za uređaj) | 0x01 |
| Value | Hex | Polje vrednosti | 0x0100 |
| Index | Int | Indeks interfejsa ili endpointa | 0x00 |
| DataArray | 1D Array | Podaci za slanje (Host→Uređaj), ili prazno | [] |
| Length | Int | Očekivana dužina odgovora (Uređaj→Host) | 192 |
| Timeout | Int | Milisekunde do otkazivanja | 1000 |
| Povratak | Tip | Opis |
|---|---|---|
| DataArray | 1D Array | Primljeni bajtovi (Uređaj→Host prenosi) |
Česte vrednosti RequestType:
| Vrednost | Pravac | Tip | Primalac | Slučaj korišćenja |
|---|---|---|---|---|
0x21 | Host → Uređaj | Class | Interface | HID SET_REPORT |
0xA1 | Uređaj → Host | Class | Interface | HID GET_REPORT |
0x80 | Uređaj → Host | Standard | Uređaj | Čitanja deskriptora |
0x00 | Host → Uređaj | Standard | Uređaj | Standardne 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);Serijska komunikacija
Section titled “Serijska komunikacija”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"; }Opcije veze
Section titled “Opcije veze”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"});Serijske metode
Section titled “Serijske metode”| Metoda | Opis | Povratak |
|---|---|---|
serial.connect(options?) | Otvori serijski port | bool |
serial.disconnect() | Zatvori serijski port | void |
serial.isConnected() | Proveri status veze | bool |
serial.write(data) | Pošalji podatke | Poslati bajtovi |
serial.read(maxBytes?, timeoutMs?) | Čitaj dostupne bajtove (podrazumevano: sve, 1000 ms timeout) | Niz bajtova |
serial.readAll() | Odmah pročitaj sve dostupne bajtove | Niz bajtova |
serial.availablePorts() | Navedi dostupne COM portove | Niz |
serial.getPortName() | Naziv trenutnog porta | string |
serial.getBaudRate() | Trenutna brzina u baudima | number |
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();}Mrežna komunikacija (TCP / UDP)
Section titled “Mrežna komunikacija (TCP / UDP)”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:
| Metoda | Opis |
|---|---|
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:
| Metoda | Opis |
|---|---|
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"
DTLS (Šifrovani UDP)
Section titled “DTLS (Šifrovani UDP)”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:
| Metoda | Opis |
|---|---|
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 |