Hoppa till innehåll

Avancerad kommunikation

Den här sidan täcker avancerade USB-kommunikationsmetoder, seriella portar och nätverkssockets. För grundläggande läsningar och skrivningar, se sidan Skrivningar och läsningar.

Att förstå skillnaden mellan USB-transfereringstyper hjälper dig att välja rätt metod och felsöka oväntade fel.

TypMetodTypisk storlekAnvändningsfall
Interruptdevice.write() / device.read()3–64 byteRGB-data, små kommandon, tangentbords-/musinmatning
Bulkdevice.write() / device.read()64–1025 byteLCD-bilder, firmware-uppdateringar, stora konfigurationsblock
Controldevice.send_report() / device.get_report() / device.control_transfer()32–192 byteAutentisering, HID-funktionsrapporter, enhetskonfiguration

Samma device.write() och device.read()-funktioner används för både interrupt- och bulk-transfereringar — USB-drivrutinen bestämmer typen från slutpunkten och paketstorlek.


Skickar en HID GET_INPUT_REPORT-kontrolltransferering. Liknar device.get_report() men begär specifikt en inmatningsrapport snarare än en funktionsrapport. Använd detta när get_report() returnerar fel data eftersom enheten skiljer på rapport-typer för inmatning och funktion.

ParameterTypBeskrivningExempel
DataArray1D ArrayRapportförfrågningsdata[0x01]
LengthIntFörväntad rapportstorlek (byte)64
ReturnerarTypBeskrivning
DataArray1D ArrayBytes mottagna från enheten
var inputData = device.input_report([0x01], 64);

Utför en direkt bulk- eller interrupt-transferering till en specifik USB-slutpunkt. Till skillnad från device.write() och device.read() som använder slutpunkten vald av device.set_endpoint(), låter det här dig rikta dig mot vilken slutpunkt som helst via adress.

  • Slutpunkter med adresser som slutar på 0x80 eller högre är IN-riktning (enhet → värd, läsning).
  • Slutpunktsadresser under 0x80 är OUT-riktning (värd → enhet, skrivning).
ParameterTypBeskrivningExempel
EndpointHexUSB-slutpunktens adress0x81
DataArray1D ArrayData att skicka (OUT) eller tom array (IN)[0x01, 0x02]
LengthIntTransfereringsstorlek (byte)64
TimeoutIntMillisekunder innan avbrott100
ReturnerarTypBeskrivning
DataArray1D ArrayMottagna bytes (IN-transfereringar) eller tom
// Skriv till slutpunkt 0x01
device.bulk_transfer(0x01, [0x00, 0x01, 0x02], 3, 100);
// Läs från slutpunkt 0x81
var response = device.bulk_transfer(0x81, [], 64, 100);
// Stor bulk-skrivning (t.ex. LCD-bilddata)
device.bulk_transfer(0x02, imageData, 1024, 500);

Lågnivå USB-kontrolltransferering. Används för autentiseringshandskakning, tillverkarspecifika protokoll och situationer där HID-metoder inte räcker. Det här är en kontrolltransferering, inte en bulk-transferering.

ParameterTypBeskrivningExempel
RequestTypeHexUSB-förfrågningstyp-bitmask (riktning, typ, mottagare)0xA1
RequestHexFörfrågningskod (enhetsspecifik)0x01
ValueHexVärdefält0x0100
IndexIntGränssnitts- eller slutpunktsindex0x00
DataArray1D ArrayData att skicka (värd till enhet) eller tom[]
LengthIntFörväntad svarslängd (enhet till värd)192
TimeoutIntMillisekunder innan avbrott1000
ReturnerarTypBeskrivning
DataArray1D ArrayMottagna bytes (enhet-till-värd-transfereringar)

Vanliga RequestType-värden:

VärdeRiktningTypMottagareAnvändningsfall
0x21Värd → EnhetKlassGränssnittHID SET_REPORT
0xA1Enhet → VärdKlassGränssnittHID GET_REPORT
0x80Enhet → VärdStandardEnhetDeskriptorläsningar
0x00Värd → EnhetStandardEnhetStandardkommandon
// Läs autentiseringstoken (enhet → värd, klass, gränssnitt)
var token = device.control_transfer(
0xA1, // Enhet till värd, klass, gränssnitt
0x01, // GET_REPORT
0x0100, // Rapporttyp (funktion) + rapport-ID
0x00, // Gränssnitt 0
[], // Ingen utgående data
192, // 192 bytes förväntade
1000 // 1 sekunders timeout
);
// Skicka funktionsrapport (värd → enhet)
device.control_transfer(0x21, 0x09, 0x0300, 0, [0x03, 0x08, 0x32], 0, 500);

För seriella/COM-portentheter, importera seriemodulen och ange "serial" i pluginets Type()-funktion.

import { serial } from "@SignalRGB/serial";
export function Type() { return "serial"; }
serial.connect({
baudRate: 115200, // Standard: 115200
parity: "None", // "None", "Even", "Odd", "Space", "Mark"
dataBits: 8, // 5, 6, 7 eller 8
stopBits: "One" // "One", "OneAndHalf", "Two"
});
MetodBeskrivningReturnerar
serial.connect(options?)Öppna serieportenbool
serial.disconnect()Stäng serieportenvoid
serial.isConnected()Kontrollera anslutningsstatusbool
serial.write(data)Skicka dataskrivna bytes
serial.read(maxBytes?, timeoutMs?)Läs tillgängliga bytes (standard: alla, 1000ms timeout)byte-array
serial.readAll()Läs alla tillgängliga bytes omedelbartbyte-array
serial.availablePorts()Lista tillgängliga COM-portararray
serial.getPortName()Aktuellt portnamnstring
serial.getBaudRate()Aktuell baudhastighetnumber
serial.getDeviceInfo()Portinfo med VID, PID osv.objekt
import { serial } from "@SignalRGB/serial";
export function Type() { return "serial"; }
export function Initialize() {
if (!serial.connect()) {
device.log("Kunde inte ansluta till serieporten");
return;
}
device.log(`Ansluten på ${serial.getPortName()} vid ${serial.getBaudRate()} baud`);
}
export function Render() {
serial.write([0xFF, ...RGBData]);
}
export function Shutdown() {
serial.disconnect();
}

För nätverksanslutna enheter, importera TCP- eller UDP-modulen och ange "network" i Type()-funktionen. Båda modulerna använder en händelsebaserad callback-modell.

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("Ansluten");
socket.send([0x01, 0x02, 0x03]);
});
socket.on("message", (data) => {
device.log(`Mottaget: ${data}`);
});
socket.on("error", (err) => {
device.log(`Fel: ${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-metoder:

MetodBeskrivning
tcp.createSocket()Skapa ny TCP-socket
socket.connect(address, port)Anslut till en värd
socket.send(data)Skicka sträng eller byte-array
socket.bind(port)Bind till lokal port
socket.close()Stäng socketen
socket.on(event, callback)Registrera händelsehanterare

TCP-händelser: "connected", "disconnected", "message", "error"


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

UDP-metoder:

MetodBeskrivning
udp.createSocket()Skapa ny UDP-socket
socket.connect(address, port)Ange standardsändningsmål
socket.send(data)Skicka till ansluten adress
socket.write(data, address, port)Skicka till specifik adress utan att anropa connect() först
socket.bind(port)Bind till lokal port för mottagning
socket.close()Stäng socketen
socket.on(event, callback)Registrera händelsehanterare

UDP-händelser: "connected", "disconnected", "message", "error"


För enheter som kräver krypterad kommunikation (t.ex. Philips Hue), använd dtls-funktionen. Det ger DTLS-krypterad UDP med hjälp av en fördelad nyckel (PSK).

export function Initialize() {
device.addFeature("dtls");
dtls.onConnectionEstablished(() => { device.log("DTLS ansluten"); });
dtls.onConnectionClosed(() => { device.log("DTLS stängd"); });
dtls.onConnectionError(() => { device.log("DTLS-fel"); });
dtls.createConnection("192.168.1.50", 2100, authIdentity, authKey);
}
export function Render() {
if (dtls.hasEncryptedConnection()) {
dtls.send(RGBData);
}
}
export function Shutdown() {
dtls.CloseConnection();
}

DTLS-metoder:

MetodBeskrivning
dtls.createConnection(host, port, identity, key)Öppna krypterad anslutning med PSK
dtls.send(data, endianness?)Skicka krypterad data (0 = little-endian, 1 = big-endian)
dtls.hasEncryptedConnection()Returnerar true om anslutning är upprättad
dtls.CloseConnection()Stäng anslutningen
dtls.onConnectionEstablished(cb)Callback när anslutning lyckades
dtls.onConnectionClosed(cb)Callback när anslutning stängdes
dtls.onConnectionError(cb)Callback vid fel