Documentação obtida por engenharia reversa do aplicativo oficial SyncLight 2.19.1, que é um Electron e portanto carrega o protocolo em JavaScript legível. Nenhuma captura de tráfego USB foi necessária.
SyncLight-2.19.1.exe instalador NSIS
└─ $PLUGINSDIR/app-64.7z arquivo interno
└─ resources/app.asar empacotamento do Electron
└─ .webpack/main/index.js
Depois de desminificar o bundle, os módulos relevantes são:
| Módulo | Papel |
|---|---|
51800 |
Constantes de identificação (LIGHT_VID, LIGHT_PID, …) |
5786 |
Transporte HID, sobre node-hid |
60895 |
Protocolo da barra por cabo (o que este projeto implementa) |
62564 |
Protocolo da variante Bluetooth, com endereçamento por MAC |
82553 |
Protocolo de teclado e mouse RGB, com cabeçalho SC e CRC16 |
51545 |
Classe de dispositivo que junta transporte e protocolo |
72299 |
Contador sequencial de id de pacote |
| Campo | Valor |
|---|---|
| Vendor ID | 0x1A86 (QinHeng) |
| Product ID | 0xFE07 |
| Fabricante | ROBOBLOQ |
| Interface 0 | HID genérico, endpoints de 64 bytes — canal de controle |
| Interface 1 | HID teclado — botões de toque da barra |
A interface 1 aparece como um segundo nó hidraw e ignora os comandos de
cor. Escolher o nó errado dá silêncio, não erro; por isso o projeto localiza a
interface pelo sysfs em vez de assumir um número de hidraw.
┌─────┬─────┬─────────┬──────┬───────┬──────────┬──────────┐
│ 'R' │ 'B' │ tamanho │ id │ ação │ payload │ checksum │
└─────┴─────┴─────────┴──────┴───────┴──────────┴──────────┘
0 1 2 3 4 5..n-2 n-1
- tamanho: total do quadro em bytes, incluindo cabeçalho e checksum. Como é um único byte, um quadro não passa de 255 bytes.
- id: contador que começa em 2, incrementa a cada quadro e volta a 1 ao chegar em 255. Serve para casar a resposta com a pergunta.
- checksum: soma de todos os bytes anteriores, módulo 256.
Na escrita HID, cada relatório leva um byte 0x00 na frente (report ID).
Quadros maiores que 64 bytes são fatiados, e cada fatia leva o seu próprio
report ID.
| Código | Nome | Payload |
|---|---|---|
| 128 | setSyncScreen |
usa cabeçalho SC e tamanho de 16 bits |
| 129 | writeDeviceInfo |
— |
| 130 | readDeviceInfo |
nenhum |
| 131 | readDeviceUUID |
nenhum |
| 133 | setLedEffect |
tipo, índice |
| 134 | setSectionLED |
grupos de 5 bytes |
| 135 | setBrightness |
0..100 |
| 137 | setAutoOff |
ativo, minutos |
| 138 | setDynamicSpeed |
5..100 |
| 139 | setSoundSensitivity |
5..100 |
| 145 | setExternalAudio |
16 bits |
| 147 | setOpenUrl |
1 byte |
| 149 | setLampsAmount |
número de LEDs |
| 150 | setWhiteBright |
modo, valor |
| 151 | turnOffLight |
nenhum |
| 152 | setComputerRhythm |
tipo, valor |
O payload é uma sequência de grupos de 5 bytes:
[ led_inicial, R, G, B, led_final ]
Os LEDs são numerados a partir de 1. O valor 254 significa "até o fim da
fita", independentemente da quantidade real de LEDs — é por isso que apagar
tudo é [1, 0, 0, 0, 254].
Vários grupos cabem no mesmo quadro, o que permite desenhar um degradê inteiro com uma única escrita. Respeitado o limite de 255 bytes do campo de tamanho, cabem até 49 trechos por quadro.
| Offset | Conteúdo |
|---|---|
| 5–7 | id do dispositivo |
| 8 | tamanho de tela configurado |
| 11 | número de LEDs |
| 12–19 | uuid |
| 21–23 | versão da firmware (maior, menor, correção) |
A interface oficial expõe dois tipos, com sete efeitos cada:
- tipo 2 — efeitos dinâmicos, índices 0 a 6
- tipo 3 — reação a som, índices 0 a 6
No tipo 3, o aplicativo distingue ritmo do computador (ele captura o áudio do PC e envia cores quadro a quadro) de ritmo do controlador (a barra usa o próprio microfone). Enviar a ação 133 diretamente ativa o segundo, que funciona sem software nenhum rodando.
- O controle de velocidade da interface é invertido: o aplicativo envia
setDynamicSpeed(100 - valor_do_slider). - Firmwares anteriores à 1.8.0 não têm a ação 151; o aplicativo apaga pintando tudo de preto. Este projeto faz as duas coisas, o que dispensa checar versão.
- Ao desligar, o aplicativo repete o comando quatro vezes com 20 ms de intervalo — indício de que a barra ocasionalmente perde escritas.
- Existe um
verifycom HMAC-SHA256 e chave embutida, mas ele só é usado para teclado e mouse RGB. A barra não exige autenticação.