Aller au contenu

Communication avancée

Cette page couvre les méthodes de communication USB avancées, les ports série et les sockets réseau. Pour les lectures et écritures de base, voir Écritures et lectures.

Comprendre la différence entre les types de transfert USB vous aidera à choisir la bonne méthode et à déboguer les erreurs inattendues.

TypeMéthodeTaille typiqueCas d’usage
Interruptdevice.write() / device.read()3–64 octetsDonnées RGB, petites commandes, entrée clavier/souris
Bulkdevice.write() / device.read()64–1025 octetsImages LCD, mises à jour firmware, grands blocs de configuration
Controldevice.send_report() / device.get_report() / device.control_transfer()32–192 octetsAuthentification, rapports HID feature, configuration appareil

Les mêmes fonctions device.write() et device.read() sont utilisées pour les transferts interrupt et bulk — le pilote USB détermine le type d’après le point d’accès et la taille du paquet.


Envoie un transfert de contrôle HID GET_INPUT_REPORT. Similaire à device.get_report() mais demande spécifiquement un rapport Input plutôt qu’un rapport Feature. Utilisez ceci quand get_report() retourne des données incorrectes parce que l’appareil sépare ses types de rapports Input et Feature.

ParamètreTypeDescriptionExemple
DataArrayTableau 1DDonnées de demande de rapport[0x01]
LengthIntTaille de rapport attendue en octets64
RetourTypeDescription
DataArrayTableau 1DOctets reçus depuis l’appareil
var inputData = device.input_report([0x01], 64);

Effectue un transfert bulk ou interrupt direct vers un point d’accès USB spécifique. Contrairement à device.write() et device.read() qui utilisent le point d’accès sélectionné par device.set_endpoint(), ceci vous permet de cibler n’importe quel point d’accès par son adresse.

  • Les adresses de point d’accès se terminant par 0x80 ou plus sont IN (appareil → hôte, lecture).
  • Les adresses de point d’accès inférieures à 0x80 sont OUT (hôte → appareil, écriture).
ParamètreTypeDescriptionExemple
EndpointHexAdresse du point d’accès USB0x81
DataArrayTableau 1DDonnées à envoyer (OUT), ou tableau vide (IN)[0x01, 0x02]
LengthIntTaille du transfert en octets64
TimeoutIntMillisecondes avant abandon100
RetourTypeDescription
DataArrayTableau 1DOctets reçus (transferts IN), ou vide
// Écrire vers le point d'accès 0x01
device.bulk_transfer(0x01, [0x00, 0x01, 0x02], 3, 100);
// Lire depuis le point d'accès 0x81
var response = device.bulk_transfer(0x81, [], 64, 100);
// Grande écriture bulk (ex. données d'image LCD)
device.bulk_transfer(0x02, imageData, 1024, 500);

Transfert de contrôle USB de bas niveau. Utilisé pour les handshakes d’authentification, les protocoles spécifiques aux fabricants et les cas où les méthodes HID sont insuffisantes. C’est un transfert de contrôle, pas un transfert bulk.

ParamètreTypeDescriptionExemple
RequestTypeHexBitmap du type de requête USB (direction, type, destinataire)0xA1
RequestHexCode de requête (spécifique à l’appareil)0x01
ValueHexChamp valeur0x0100
IndexIntIndex d’interface ou de point d’accès0x00
DataArrayTableau 1DDonnées à envoyer (hôte→appareil), ou vide[]
LengthIntLongueur de réponse attendue (appareil→hôte)192
TimeoutIntMillisecondes avant abandon1000
RetourTypeDescription
DataArrayTableau 1DOctets reçus (transferts appareil→hôte)

Valeurs RequestType courantes :

ValeurDirectionTypeDestinataireCas d’usage
0x21Hôte → AppareilClassInterfaceHID SET_REPORT
0xA1Appareil → HôteClassInterfaceHID GET_REPORT
0x80Appareil → HôteStandardAppareilLecture de descripteurs
0x00Hôte → AppareilStandardAppareilCommandes standard
// Lire le jeton d'authentification (appareil → hôte, class, interface)
var token = device.control_transfer(
0xA1, // Appareil→hôte, class, interface
0x01, // GET_REPORT
0x0100, // Type de rapport (Feature) + ID de rapport
0x00, // Interface 0
[], // Pas de données sortantes
192, // Attendre 192 octets en retour
1000 // Timeout 1 seconde
);
// Envoyer un rapport feature (hôte → appareil)
device.control_transfer(0x21, 0x09, 0x0300, 0, [0x03, 0x08, 0x32], 0, 500);

Pour les appareils série/COM port, importez le module série et définissez Type() de votre plugin sur "serial".

import { serial } from "@SignalRGB/serial";
export function Type() { return "serial"; }
serial.connect({
baudRate: 115200, // Par défaut : 115200
parity: "None", // "None", "Even", "Odd", "Space", "Mark"
dataBits: 8, // 5, 6, 7 ou 8
stopBits: "One" // "One", "OneAndHalf", "Two"
});
MéthodeDescriptionRetourne
serial.connect(options?)Ouvrir le port sériebool
serial.disconnect()Fermer le port sérievoid
serial.isConnected()Vérifier l’état de la connexionbool
serial.write(data)Envoyer des donnéesoctets écrits
serial.read(maxBytes?, timeoutMs?)Lire les octets disponibles (par défaut : tous, timeout 1000 ms)tableau d’octets
serial.readAll()Lire immédiatement tous les octets disponiblestableau d’octets
serial.availablePorts()Lister les ports COM disponiblestableau
serial.getPortName()Nom du port actuelstring
serial.getBaudRate()Débit en bauds actuelnumber
serial.getDeviceInfo()Infos du port avec VID, PID, etc.object
import { serial } from "@SignalRGB/serial";
export function Type() { return "serial"; }
export function Initialize() {
if (!serial.connect()) {
device.log("Échec de connexion au port série");
return;
}
device.log(`Connecté sur ${serial.getPortName()} à ${serial.getBaudRate()} bauds`);
}
export function Render() {
serial.write([0xFF, ...RGBData]);
}
export function Shutdown() {
serial.disconnect();
}

Pour les appareils connectés en réseau, importez le module TCP ou UDP et définissez Type() sur "network". Les deux modules utilisent un modèle de callback basé sur les événements.

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("Connecté");
socket.send([0x01, 0x02, 0x03]);
});
socket.on("message", (data) => {
device.log(`Reçu : ${data}`);
});
socket.on("error", (err) => {
device.log(`Erreur : ${err}`);
});
socket.connect("192.168.1.100", 8080);
}
export function Render() {
if (socket.state === socket.ConnectedState) {
socket.send(RGBData);
}
}
export function Shutdown() {
socket.close();
}

Méthodes TCP :

MéthodeDescription
tcp.createSocket()Créer un nouveau socket TCP
socket.connect(address, port)Se connecter à un hôte
socket.send(data)Envoyer une chaîne ou un tableau d’octets
socket.bind(port)Lier à un port local
socket.close()Fermer le socket
socket.on(event, callback)Enregistrer un gestionnaire d’événement

Événements TCP : "connected", "disconnected", "message", "error"


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

Méthodes UDP :

MéthodeDescription
udp.createSocket()Créer un nouveau socket UDP
socket.connect(address, port)Définir la destination d’envoi par défaut
socket.send(data)Envoyer à l’adresse connectée
socket.write(data, address, port)Envoyer à une adresse spécifique sans appeler connect() au préalable
socket.bind(port)Lier à un port local pour la réception
socket.close()Fermer le socket
socket.on(event, callback)Enregistrer un gestionnaire d’événement

Événements UDP : "connected", "disconnected", "message", "error"


Pour les appareils qui nécessitent une communication chiffrée (ex. Philips Hue), utilisez la fonctionnalité dtls. Elle fournit un UDP chiffré DTLS avec une clé pré-partagée (PSK).

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

Méthodes DTLS :

MéthodeDescription
dtls.createConnection(host, port, identity, key)Ouvrir une connexion chiffrée avec une PSK
dtls.send(data, endianness?)Envoyer des données chiffrées (0 = little-endian, 1 = big-endian)
dtls.hasEncryptedConnection()Retourne true si la connexion est établie
dtls.CloseConnection()Fermer la connexion
dtls.onConnectionEstablished(cb)Callback quand la connexion réussit
dtls.onConnectionClosed(cb)Callback quand la connexion se ferme
dtls.onConnectionError(cb)Callback en cas d’erreur