Skip to content

Instantly share code, notes, and snippets.

@MarcosYonamine963
Created February 13, 2025 14:01
Show Gist options
  • Save MarcosYonamine963/6bb5fdf62fe9a59b77538d04e974eff6 to your computer and use it in GitHub Desktop.
Save MarcosYonamine963/6bb5fdf62fe9a59b77538d04e974eff6 to your computer and use it in GitHub Desktop.
Sobre a inversão dos bytes no protocolo 1-Wire

Sobre a inversão dos bytes dos cartões RFID no protocolo 1-Wire

Muitos equipamentos utilizam leitores RFID que simulam um iButton no protocolo 1-Wire. Porém, para encapsular os bytes dos cartões no protocolo 1-Wire, alguns detalhes são importantes na hora da interpretação do pacote.

Para este gist, utilizaremos um único cartão de referência para os testes e exemplos.

Cartão de Referência

O Cartão de Referência a ser utilizado possui o seguinte ID em hexadecimal: 0x DC 20 E7 8C. Veja foto abaixo.

A conversão desse ID para decimal é representado pelo "A2":

Caso consideremos a ordem dos bytes invertidos, ou seja, 0x 8C E7 20 DC, a conversão para decimal nessa ordem é representada pelo "A0":

Por padrão, consideraremos a ordem A2 como sendo o "normal".

Envio para o 1-Wire

O pacote de dados 1-Wire é dividido em um frame da seguinte forma:

Family Code DATA CRC
(1 byte) (6 bytes) (1 byte)

Observe que o campo DATA possui 6 bytes, mas o cartão RFID possui apenas 4 bytes.

Dessa forma, o leitor irá preencher apenas 4 bytes desse campo, e os 2 restantes serão nulos.

Para simular um iButton, o campo Family Code será preenchido com o byte 0x01.

Assim, para o cartão de bytes 0x DC 20 E7 8C, o pacote 1-Wire na ordem normal dos bytes ficará:

0x 01 8C E7 20 DC 00 00 F3

E na ordem invertida, será:

0x 01 DC 20 E7 8C 00 00 6A

Essa ordem é a ordem de transmissão dos bytes. Ou seja, o byte 0x01 sempre será o primeiro byte a ser transmitido.

Você deve estar se perguntando: "mas por que na ordem normal, os bytes no pacote estão invertidos?". Isso se deve ao "endianess" do protocolo.

O protocolo 1-Wire padronizou os campos do pacote de dados em Little Endian (veja figura abaixo).

Observe que no formato Little-Endian de Transmissão, o LSB é enviado primeiro.

Por exemplo, para os bytes 0x DC 20 E7 8C, temos que o MSB (Most Significant Byte) é o byte 0x DC, e o LSB (Least Significant Byte) é o byte 0x 8C.

Como o protocolo de transmissão 1-wire está em little endian, o byte LSB é transmitido primeiro. Por isso que, ao montar o pacote de transmissão, a ordem dos bytes no campo DATA ficará invertida para que na recepção e processamento dos dados elas sejam interpretadas na maneira correta.


Vamos ver alguns exemplos utilizando um leitor de cartões RFID Mifare, e alguns rastreadores, Jiga e equipamentos de análise.

O leitor pode ser configurado para encapsular os dados do cartão no pacote 1-wire na ordem normal ou invertida.

Utilizando uma Jiga 1-Wire

A Jiga 1-Wire (equipamento proprietário Effortech) faz a leitura 1-wire, e o dado lido é processado para identificar os 4 bytes do cartão, considerando a ordem normal dos bytes. Os dados processados são enviados para o computador via serial RS-232.

  • Com o leitor configurado com bytes normais, temos a seguinte leitura para o cartão DC 20 E7 8C:

  • Com o leitor configurado com bytes invertidos, temos a seguinte leitura para o cartão DC 20 E7 8C:

Utilizando um analisador lógico

  • Com o leitor configurado com bytes normais, temos a seguinte leitura para o cartão DC 20 E7 8C:

  • Com o leitor configurado com bytes invertidos, temos a seguinte leitura para o cartão DC 20 E7 8C:

Utilizando um rastreador Teltonika FMC125

  • Com o leitor configurado com bytes normais, temos a seguinte leitura para o cartão DC 20 E7 8C:

  • Com o leitor configurado com bytes invertidos, temos a seguinte leitura para o cartão DC 20 E7 8C:

Utilizando um rastreador Calamp LMU2631G

  • Com o leitor configurado com bytes normais, temos a seguinte leitura para o cartão DC 20 E7 8C:

  • Com o leitor configurado com bytes invertidos, temos a seguinte leitura para o cartão DC 20 E7 8C:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment