Pular para o conteúdo

Isolando Dados RGB em Capturas USB

Este tutorial mostrará como descodificar dados USB para implementar dispositivos no SignalRGB.

Antes de tentar interpretar a captura de dados USB, queremos ordená-la para encontrar pacotes específicos.

No Wireshark:

  1. Abra a captura de dados USB
  2. Clique no cabeçalho ‘Info’ para ordenar por tipo de pacote
  3. Percorra até encontrar um tipo URB_INTERRUPT OUT ou SET_REPORT Request

Se não encontrar nenhum dos comandos acima, pode estar a trabalhar com um dispositivo RAWUSB ou pode não ter feito a captura corretamente. Se tiver um dispositivo RAWUSB, verá comandos URB_BULK_OUT ou URB_CONTROL OUT. Se tiver um dispositivo RAWUSB, entre no servidor Discord para ajuda com desenvolvimento.

Os primeiros pacotes que procuraremos são aqueles que contêm os valores RGB que definimos ao fazer as nossas capturas de pacotes USB.

Nota: Vamos ignorar propositalmente os pacotes de inicialização do dispositivo por agora. Podem ser necessários mais tarde.

Os dados enviados em cada pacote vêm após todas as informações do cabeçalho do protocolo USB. Para ver isto, precisamos encontrar a secção Data Fragment.

  1. Selecione um pacote
  2. Selecione o campo HID Data ou expanda a secção Setup Data e selecione o campo Data Fragment
  3. Clicar no campo também deve destacar a secção de dados em azul na parte inferior do Wireshark
  4. O campo selecionado também mostrará os dados enviados sem espaçamento. Cada 2 caracteres é um único byte nesta visualização.

Nota: Os valores que estamos a observar estarão em HEX (base 16), que é um formato de dados que representa 0 a 255 em decimal como valores de 0x00 a 0xFF.

Como definimos vermelho, verde e azul nos seus valores máximos no nosso guia de Captura de Dados USB, procuraremos valores de 0xFF na nossa captura. Se usou cores diferentes na captura, precisará saber a cor HEX específica usada ou refazer a captura com cores conhecidas.

Tradicionalmente, os pacotes de iluminação de um dispositivo contêm um cabeçalho que indica qual comando o pacote representa e qual zona de iluminação do dispositivo estamos a endereçar, seguido pelos dados RGB e raramente alguns dados de rodapé como um checksum CRC.

Os dados RGB geralmente seguem alguns formatos que podemos verificar procurando as cores que definimos na nossa captura:

  • R, G, B, R, G, B, R, G, B (Vermelho → Verde → Azul → Repetir)
  • RRR, GGG, BBB (Vários Vermelho → Vários Verde → Vários Azul → Repetir)
  • Br, R, G, B (Brilho → Vermelho → Verde → Azul → Repetir)

Nota: Alguns dispositivos usam uma ordem de cores diferente. Embora a maioria use RGB, pode descobrir que o seu dispositivo usa GBR, BGR ou outra combinação.

No nosso caso, os valores que procuramos serão:

  • 0xff, 0x00, 0x00 | 0x00, 0xff, 0x00 | 0x00, 0x00, 0xff (se o dispositivo usar a ordem de pacotes R,G,B).
  • 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 (se o dispositivo usar a ordem de pacotes RRR,GGG,BBB).
  • 0xff, 0xff, 0x00, 0x00 | 0xff, 0x00, 0xff, 0x00 | 0xff, 0x00, 0x00, 0xff (se o dispositivo usar a ordem de pacotes Br,R,G,B)

Nota: Os exemplos acima são apenas algumas estruturas de pacotes comuns para dispositivos e podem não se aplicar sempre. Precisará comparar e procurar semelhanças.

Ao percorrer os pacotes, encontramos que o pacote 271 na nossa captura contém bytes que se parecem com a estrutura de pacotes R,G,B.

Nota: Alguns dispositivos podem usar múltiplos pacotes para definir as cores em todo o dispositivo. Certifique-se de olhar para os próximos pacotes e encontrar onde o pacote inicial se repete.

Vamos marcar este pacote usando a função MARK/UNMARK Packet no Wireshark, que pode ser feita premindo as teclas CTRL + M simultaneamente ou clicando com o botão direito no pacote e clicando em MARK/UNMARK Packet.

Para confirmar que este pacote é realmente um dos nossos pacotes de dados de cor, continuaremos a percorrer para baixo para procurar mais pacotes que se encaixem na nossa estrutura R,G,B. Também verificaremos se esses pacotes seguem a ordem em que definimos as cores no software original. Este é um bom momento para olhar os cabeçalhos dos pacotes e ver se mudam. Se estiverem a mudar num padrão, é muito provável que precise de múltiplos pacotes para definir todos os LEDs no dispositivo.

Observando o pacote 271, o pacote 273 e o pacote 275 lado a lado, podemos ver que os dados RGB parecem ser apenas Vermelho no pacote 271 (0xFF, 0x00, 0x00), apenas Verde no pacote 273 (0x00, 0xFF, 0x00) e apenas Azul no pacote 275 (0x00, 0x00, 0xFF). Observando os dados do cabeçalho acima da secção RGB, podemos ver que esses dados não mudam entre os três pacotes. Isto provavelmente significa que estamos a alterar as mesmas zonas de cor nesses pacotes.

  • Também vale notar que podemos usar os pacotes de cor para determinar quantas zonas um dispositivo contém. Podemos fazer isso verificando quantas vezes os nossos valores conhecidos ocorrem nos pacotes de dados RGB. No exemplo abaixo, vemos que o dispositivo tem 4 zonas que podemos definitivamente endereçar.

Continuaremos a descer pelos pacotes até encontrar todos os pacotes que contêm dados de cor e os termos marcado. Depois disso, passaremos para a criação do ficheiro de plugin.