Pular para o conteúdo

Comunicação Avançada

Esta página cobre métodos avançados de comunicação USB, portas seriais e sockets de rede. Para leituras e escritas básicas, consulte Escritas e Leituras.

Entender a diferença entre os tipos de transferência USB ajuda você a escolher o método correto e depurar erros inesperados.

TipoMétodoTamanho típicoCaso de uso
Interruptdevice.write() / device.read()3–64 bytesDados RGB, pequenos comandos, entrada de teclado/mouse
Bulkdevice.write() / device.read()64–1025 bytesImagens LCD, atualizações de firmware, grandes blocos de configuração
Controldevice.send_report() / device.get_report() / device.control_transfer()32–192 bytesAutenticação, relatórios HID feature, configuração do dispositivo

As mesmas funções device.write() e device.read() são usadas para transferências interrupt e bulk — o driver USB determina o tipo pelo endpoint e tamanho do pacote.


Envia uma transferência de controle HID GET_INPUT_REPORT. Similar a device.get_report() mas solicita especificamente um relatório Input em vez de um relatório Feature. Use isso quando get_report() retorna dados incorretos porque o dispositivo separa seus tipos de relatório Input e Feature.

ParâmetroTipoDescriçãoExemplo
DataArrayArray 1DDados de solicitação de relatório[0x01]
LengthIntTamanho de relatório esperado em bytes64
RetornoTipoDescrição
DataArrayArray 1DBytes recebidos do dispositivo
var inputData = device.input_report([0x01], 64);

Realiza uma transferência bulk ou interrupt direta para um endpoint USB específico. Ao contrário de device.write() e device.read() que usam o endpoint selecionado por device.set_endpoint(), isso permite que você direcione qualquer endpoint pelo seu endereço.

  • Endereços de endpoint terminando em 0x80 ou superior são IN (dispositivo → host, leitura).
  • Endereços de endpoint abaixo de 0x80 são OUT (host → dispositivo, escrita).
ParâmetroTipoDescriçãoExemplo
EndpointHexEndereço do endpoint USB0x81
DataArrayArray 1DDados a enviar (OUT), ou array vazio (IN)[0x01, 0x02]
LengthIntTamanho da transferência em bytes64
TimeoutIntMilissegundos antes de desistir100
RetornoTipoDescrição
DataArrayArray 1DBytes recebidos (transferências IN), ou vazio
// Escrever para o endpoint 0x01
device.bulk_transfer(0x01, [0x00, 0x01, 0x02], 3, 100);
// Ler do endpoint 0x81
var response = device.bulk_transfer(0x81, [], 64, 100);
// Grande escrita bulk (ex. dados de imagem LCD)
device.bulk_transfer(0x02, imageData, 1024, 500);

Transferência de controle USB de baixo nível. Usado para handshakes de autenticação, protocolos específicos de fabricante e casos em que os métodos HID são insuficientes. Esta é uma transferência de controle, não uma transferência bulk.

ParâmetroTipoDescriçãoExemplo
RequestTypeHexBitmap do tipo de solicitação USB (direção, tipo, destinatário)0xA1
RequestHexCódigo de solicitação (específico do dispositivo)0x01
ValueHexCampo valor0x0100
IndexIntÍndice de interface ou endpoint0x00
DataArrayArray 1DDados a enviar (host→dispositivo), ou vazio[]
LengthIntComprimento de resposta esperado (dispositivo→host)192
TimeoutIntMilissegundos antes de desistir1000
RetornoTipoDescrição
DataArrayArray 1DBytes recebidos (transferências dispositivo→host)

Valores RequestType comuns:

ValorDireçãoTipoDestinatárioCaso de uso
0x21Host → DispositivoClassInterfaceHID SET_REPORT
0xA1Dispositivo → HostClassInterfaceHID GET_REPORT
0x80Dispositivo → HostStandardDispositivoLeituras de descritor
0x00Host → DispositivoStandardDispositivoComandos padrão
// Ler token de autenticação (dispositivo → host, class, interface)
var token = device.control_transfer(
0xA1, // Dispositivo→host, class, interface
0x01, // GET_REPORT
0x0100, // Tipo de relatório (Feature) + ID do relatório
0x00, // Interface 0
[], // Sem dados de saída
192, // Esperar 192 bytes de volta
1000 // Timeout de 1 segundo
);
// Enviar um relatório feature (host → dispositivo)
device.control_transfer(0x21, 0x09, 0x0300, 0, [0x03, 0x08, 0x32], 0, 500);

Para dispositivos serial/COM port, importe o módulo serial e defina Type() do seu plugin como "serial".

import { serial } from "@SignalRGB/serial";
export function Type() { return "serial"; }
serial.connect({
baudRate: 115200, // Padrão: 115200
parity: "None", // "None", "Even", "Odd", "Space", "Mark"
dataBits: 8, // 5, 6, 7 ou 8
stopBits: "One" // "One", "OneAndHalf", "Two"
});
MétodoDescriçãoRetorna
serial.connect(options?)Abrir a porta serialbool
serial.disconnect()Fechar a porta serialvoid
serial.isConnected()Verificar estado da conexãobool
serial.write(data)Enviar dadosbytes escritos
serial.read(maxBytes?, timeoutMs?)Ler bytes disponíveis (padrão: todos, timeout 1000 ms)array de bytes
serial.readAll()Ler todos os bytes disponíveis imediatamentearray de bytes
serial.availablePorts()Listar portas COM disponíveisarray
serial.getPortName()Nome da porta atualstring
serial.getBaudRate()Taxa de baud atualnumber
serial.getDeviceInfo()Informações da porta com VID, PID, etc.object
import { serial } from "@SignalRGB/serial";
export function Type() { return "serial"; }
export function Initialize() {
if (!serial.connect()) {
device.log("Falha ao conectar à porta serial");
return;
}
device.log(`Conectado em ${serial.getPortName()} a ${serial.getBaudRate()} baud`);
}
export function Render() {
serial.write([0xFF, ...RGBData]);
}
export function Shutdown() {
serial.disconnect();
}

Para dispositivos conectados em rede, importe o módulo TCP ou UDP e defina Type() como "network". Ambos os módulos usam um modelo de callback baseado em eventos.

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("Conectado");
socket.send([0x01, 0x02, 0x03]);
});
socket.on("message", (data) => {
device.log(`Recebido: ${data}`);
});
socket.on("error", (err) => {
device.log(`Erro: ${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étodos TCP:

MétodoDescrição
tcp.createSocket()Criar um novo socket TCP
socket.connect(address, port)Conectar a um host
socket.send(data)Enviar string ou array de bytes
socket.bind(port)Vincular a uma porta local
socket.close()Fechar o socket
socket.on(event, callback)Registrar um manipulador de evento

Eventos TCP: "connected", "disconnected", "message", "error"


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

Métodos UDP:

MétodoDescrição
udp.createSocket()Criar um novo socket UDP
socket.connect(address, port)Definir destino de envio padrão
socket.send(data)Enviar para o endereço conectado
socket.write(data, address, port)Enviar para um endereço específico sem chamar connect() primeiro
socket.bind(port)Vincular a uma porta local para recepção
socket.close()Fechar o socket
socket.on(event, callback)Registrar um manipulador de evento

Eventos UDP: "connected", "disconnected", "message", "error"


Para dispositivos que requerem comunicação criptografada (ex. Philips Hue), use a feature dtls. Ela fornece UDP criptografado DTLS usando uma Chave Pré-Compartilhada (PSK).

export function Initialize() {
device.addFeature("dtls");
dtls.onConnectionEstablished(() => { device.log("DTLS conectado"); });
dtls.onConnectionClosed(() => { device.log("DTLS fechado"); });
dtls.onConnectionError(() => { device.log("Erro 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étodos DTLS:

MétodoDescrição
dtls.createConnection(host, port, identity, key)Abrir uma conexão criptografada usando uma PSK
dtls.send(data, endianness?)Enviar dados criptografados (0 = little-endian, 1 = big-endian)
dtls.hasEncryptedConnection()Retorna true se a conexão estiver estabelecida
dtls.CloseConnection()Fechar a conexão
dtls.onConnectionEstablished(cb)Callback quando a conexão é bem-sucedida
dtls.onConnectionClosed(cb)Callback quando a conexão fecha
dtls.onConnectionError(cb)Callback em caso de erro