Voltar

Decodificação CAN & OBD-II com Navixy IoT Logic: um guia de operações bitwise

Denis Demianikov
Autor

Denis Demianikov

15 de setembro de 2025
Decodificação CAN & OBD-II com Navixy IoT Logic: um guia de operações bitwise

Principais conclusões:

  • O Navixy IoT Logic agora suporta operações bitwise e de nível de byte para decodificação direta de dados do barramento CAN e OBD-II.
  • As expressões JEXL permitem criar novos atributos ou construir regras condicionais SE/ENTÃO baseadas em bits ou flags específicos.
  • O Navixy IoT Logic agora suporta operações bitwise e de nível de byte para decodificação direta de dados do barramento CAN e OBD-II.
  • As expressões JEXL permitem criar novos atributos ou construir regras condicionais SE/ENTÃO baseadas em bits ou flags específicos.
  • Operadores bitwise e de deslocamento possibilitam extração e combinação precisas de valores multi-byte.
  • Casos de uso comuns incluem diagnóstico veicular, decodificação de dados CAN e protocolos de sensores personalizados.
  • Esta atualização oferece insights em tempo real sem codificação, reduzindo overhead e aumentando a vantagem competitiva.

Se você já ficou olhando para uma mensagem do barramento CAN se perguntando como extrair aquele estado de transmissão enterrado no bit 3, ou precisou decodificar códigos de falha OBD-II a partir de dados hexadecimais brutos, você conhece essa dor. Até agora, processar esses dados de telemetria codificados em binário significava escrever analisadores personalizados, manter scripts externos ou se contentar com interpretação incompleta dos dados.

Isso muda hoje.

O Navixy IoT Logic acabou de receber uma grande atualização com operações bitwise e de nível de byte abrangentes, transformando como os profissionais de telemetria lidam com dados complexos de veículos. Vamos explorar o que isso significa para suas operações de telemetria e por que é um divisor de águas para TSPs trabalhando com dados sofisticados de frotas.

Usando Expressões JEXL em Nós do IoT Logic

As expressões do Navixy IoT Logic (baseadas no Apache JEXL, Java Expression Language) podem ser usadas em dois tipos de nós de fluxo: nós Atributo de Iniciação e nós Lógicos. O nó Atributo de Iniciação permite criar ou transformar atributos de dados usando expressões personalizadas (ex.: computar novos valores a partir de dados brutos do dispositivo). O nó Lógico avalia uma expressão booleana para dividir o fluxo de dados baseado em condições (lógica SE/ENTÃO).

Em outras palavras, você usa expressões para calcular novos valores ou para definir regras condicionais no fluxo de trabalho do IoT Logic. Por exemplo, você pode computar um novo parâmetro combinando bits de dados recebidos, ou configurar uma regra que dispara apenas quando flags de bit específicos estão presentes nos dados.

  • Nó Atributo de Iniciação: Este nó permite derivar novos atributos escrevendo expressões JEXL que operam em campos de dados recebidos. Aqui você pode usar matemática bitwise para interpretar valores brutos. Por exemplo, se um dispositivo envia um byte de status combinado, você poderia criar atributos separados para cada bit de status usando expressões (veja exemplos abaixo).

  • Nó Lógico: Este nó introduz ramificação se-então baseada em uma expressão booleana. Todas as expressões do nó lógico devem avaliar para verdadeiro ou falso. Operações de bit são frequentemente usadas aqui para verificar flags dentro de uma máscara de bit — por exemplo, você pode rotear dados pelo caminho "Verdadeiro" se um certo bit estiver definido em um valor de status. Isso permite alertas e ações baseados em condições (como disparar um alarme se um bit de falha do motor for 1) configurados de maneira low-code. O nó Lógico essencialmente implementa lógica SE/SENÃO do lado do servidor: se uma condição binária nos dados for atendida, então faça X, senão faça Y.

Operadores bitwise essenciais para Processamento de Dados de Telemetria

A linguagem de expressão da Navixy suporta o conjunto padrão de operadores bitwise fornecido pelo JEXL. Estes operam no nível de bit binário de valores inteiros. Você pode usá-los em expressões para manipular bits dentro de dados numéricos (ex.: mascarar ou alternar bits específicos). Os operadores bitwise suportados incluem:

  • E bitwise (&) — Produz um 1 em cada posição de bit onde ambos operandos têm um 1. Use isso para mascarar bits (manter apenas bits que atendem a uma condição).

Exemplo:
33 & 4 avalia para 0 porque em binário 33 é 0010 0001 e 4 é 0000 0100; nenhuma posição de bit se sobrepõe com 1, então o resultado é 0000 0000. Na lógica IoT, io_status & 0x08 isolaria o bit 3 do atributo io_status (já que 0x08 em binário é 0000 1000). Se essa expressão for diferente de zero, significa que aquele bit específico era 1.

  • OU bitwise (|) — Produz um 1 em cada posição de bit onde qualquer operando tem um 1. Use isso para combinar bits.

Exemplo:
33 | 4 resulta em 37 porque 0010 0001 | 0000 0100 = 0010 0101 (binário para 37). Isso poderia mesclar flags de dois valores, embora em telemetria você frequentemente faça OU de um valor com uma máscara para definir um certo bit como 1.

  • OU exclusivo bitwise (^) — Produz um 1 em cada posição de bit onde exatamente um operando tem um 1 (ou exclusivo).

Exemplo:
33 ^ 4 também resulta em 37 (0010 0001 ^ 0000 0100 = 0010 0101) porque o bit que estava definido em 4 é alternado em 33, resultando em 37. (XOR é útil para alternar bits (inverter 0 ↔ 1) ou verificar diferenças em padrões de bit.

  • NÃO bitwise (~) — Operador de complemento que inverte cada bit do operando (transforma 0 em 1 e 1 em 0).

Exemplo:
~ 33 resulta em -34 em um sistema de 32 bits. Isso ocorre porque 33 (0010 0001 em 8-bit para ilustração) se torna 1101 1110 que representa -34 na forma de complemento de dois. Na prática, ~x pode ser usado para inverter uma máscara (ex.: x & ~0x0F limparia os 4 bits inferiores de x).

Esses operadores permitem controle refinado sobre dados binários. Por exemplo, se um dispositivo envia um único inteiro onde cada bit representa um estado diferente de sensor (uma máscara de bit), você pode usar & para testar bits específicos ou extrair subconjuntos de bits. A plataforma da Navixy antecipa explicitamente esse caso de uso, já que a capacidade de aplicar mascaramento de bit é parte de seu kit de ferramentas de enriquecimento de dados.

Deslocamento de bits: Trabalhando com dados multi-byte de veículos

Além da lógica bitwise básica, você pode deslocar bits para a esquerda ou direita em JEXL. Deslocamentos de bit são cruciais para combinar ou fatiar valores multi-byte. Os operadores de deslocamento suportados são:

  • Deslocamento à esquerda (<<) — Move todos os bits do operando da esquerda para a esquerda pelo número de posições especificado pelo operando da direita. Deslocar à esquerda por n bits é equivalente a multiplicar por 2^n (assumindo que não há overflow).

Exemplo:
1 << 2 dá 4 (binário 0001 se torna 0100). No IoT Logic, se você tem um byte alto e quer formar um valor de 16 bits, você pode fazer high_byte << 8 (deslocá-lo para as posições dos 8 bits superiores).

  • Deslocamento à direita (>>) — Move bits para a direita, preservando o sinal (este é um deslocamento aritmético à direita). O bit mais à esquerda (bit de sinal) é replicado para preencher as novas posições mais à esquerda para números com sinal.

Exemplo: 4 >> 2 resulta em 1 (0100 >> 2 = 0001). Se o valor fosse negativo, >> o manteria negativo estendendo os 1s. Deslocamentos à direita são úteis para extrair bits de menor ordem empurrando bits indesejados para fora à direita. Por exemplo, para descartar os 3 bits mais baixos de um valor (mantendo o resto), você poderia fazer value >> 3.

  • Deslocamento à direita sem sinal (>>>) — Move bits para a direita com preenchimento de zero (um deslocamento lógico). Isso significa que não preserva o bit de sinal; em vez disso, sempre insere 0s à esquerda. O resultado é sempre um inteiro não-negativo, efetivamente tratando o número como sem sinal para esta operação. O deslocamento à direita sem sinal é útil ao trabalhar com dados binários brutos onde você não quer estender o sinal. Em muitos cenários de telemetria, você provavelmente usará o >> normal para extração de bits, mas >>> pode ser relevante se lidando com valores de 32 bits onde a distinção importa (ex.: processando toda a faixa de 32 bits como sem sinal).

Usar deslocamentos em combinação com máscaras de bit permite direcionar bytes ou bits específicos em um número.

Exemplo: Digamos que você tem um valor de 16 bits e precisa dos 8 bits altos e baixos separadamente: você pode obter o byte alto com (value>> 8) & 0xFF e o byte baixo com value & 0xFF. Aqui, >> 8 desloca o byte alto para a posição do byte mais baixo, e 0xFF (255 em decimal) é uma máscara para isolar 8 bits.

Em JEXL, você pode escrever literais numéricos em hexadecimal (prefixo com 0x) para conveniência ao definir tais máscaras. Por exemplo, 0xFF é a máscara para 8 bits, 0xF para 4 bits, etc.

Combinando e extraindo bytes de payloads complexos

Muitos parâmetros de IoT e barramento CAN abrangem múltiplos bytes ou empacotam vários campos em um número. O IoT Logic da Navixy permite lidar com esses usando operações de bit e deslocamento, essencialmente tratando bytes dentro de inteiros maiores. Aqui estão algumas técnicas comuns para manipulação byte-wise:

  • Combinando múltiplos bytes. Se um dispositivo fornece dois ou mais valores de byte separados que formam uma única medição, você pode combiná-los usando deslocamentos e ORs. Por exemplo, suponha que uma mensagem CAN dê engine_rpm_high e engine_rpm_low (cada 1 byte, representando um valor RPM de 16 bits). Você pode reconstruir o RPM completo com uma expressão para um novo atributo "engine_rpm":
(engine_rpm_high << 8) | engine_rpm_low

 

Isso desloca o byte alto para os 8 bits superiores e o mescla com o byte baixo via OU bitwise. O resultado engine_rpm é um novo atributo inteiro de 16 bits. Similarmente, você poderia combinar 4 valores de um byte em um inteiro de 32 bits deslocando por 24, 16, 8 e 0 bits e fazendo OU entre eles. Isso é útil para montar IDs ou leituras compostas de sensores que vêm divididas em bytes.
  • Extraindo bytes de uma palavra. Conversamente, você pode receber um único valor de 32 bits de um dispositivo mas precisar extrair bytes específicos (ex.: códigos de status ou bytes individuais de sensor dentro dele). Usando máscaras e deslocamentos:

    • Byte mais baixo: value & 0xFF dá os 8 bits mais baixos.

    • Próximo byte: (value >> 8) & 0xFF dá os bits 8-15.

    • E assim por diante: (value >> 16) & 0xFF para bits 16-23, (value >> 24) & 0xFF para bits 24-31.

      Cada vez deslocamos à direita o byte desejado para a posição dos 8 bits mais baixos, depois mascaramos. Assim, você pode quebrar um campo multi-byte em componentes separados se necessário para análise ou relatórios.

  • Isolando e interpretando campos de bit. Suponha que dentro de um byte, diferentes bits ou grupos de bits carreguem significados diferentes (um cenário comum com bytes de status do barramento CAN). Por exemplo, imagine um único byte de uma mensagem OBD-II onde: bit0 = MIL (luz de aviso do motor) ligado/desligado, bits1-3 = status do sistema de combustível (0—7), bit4 = alguma flag, etc. Usando IoT Logic, você pode isolar estes:

    • mil_on = (status_byte & 0x1) == 1 — isso verifica o bit menos significativo. Se igual a 1, o indicador MIL está ligado. Ou usando extensão util: util:checkBit(status_byte, 0).

    • fuel_system_status = (status_byte >> 1) & 0x7 — isso desloca o byte à direita por 1 (então bit1 se torna o novo LSB) e mascara com 0x7 (0b111) para extrair os próximos três bits como um número 0—7. Ou usando extensão util: util:bits(status_byte, 1, 3).

    • flag = (status_byte & 0x10) != 0 — mascara bit4 (0x10 é binário 00010000) e verifica se é diferente de zero, resultando em um booleano verdadeiro se aquele bit era 1. Ou usando extensão util: util:checkBit(status_byte, 4).

Usando essas técnicas, você pode derivar novos atributos que representam estados ou valores significativos, em vez de lidar com um campo de bits opaco. O IoT Logic da Navixy essencialmente permite criar sensores virtuais ou campos calculados para qualquer detalhe de nível de bit que você precise, tudo através de expressões.

Usando operações de bit em lógica condicional (regras SE/ENTÃO)

Um dos aspectos mais poderosos de ter operações de bit e byte no IoT Logic é a capacidade de conduzir fluxos de trabalho condicionais baseados em sinais binários. No nó Lógico, você escreve uma expressão que deve retornar verdadeiro/falso — e expressões bitwise se encaixam perfeitamente, desde que você as compare para produzir um resultado booleano. Aqui estão alguns exemplos de uso de operações de bit em condições:

  • Detectando um bit específico (flag). Se um dispositivo envia um inteiro onde cada bit é uma flag (ex.: uma máscara de bit de código de erro), você pode disparar lógica quando uma certa flag está ativa. Por exemplo, imagine que can_status é um inteiro cujo bit 2 indica superaquecimento do motor.

Uma condição do nó Lógico poderia ser:

(can_status & 0x4) != 0

ou usando extensão util:

util:checkBit(can_status, 2)

 

Esta expressão usa & 0x4 (máscara 0100 binário) para isolar o bit 2, e verifica se o resultado é diferente de zero (significando que o bit 2 era 1). Se verdadeiro, o fluxo de trabalho seguirá o ramo ENTÃO — talvez levantando um alerta ou registrando um evento de superaquecimento do motor. Se falso, segue o ramo SENÃO ou simplesmente não faz nada se nenhum caminho SENÃO estiver configurado. Esta é uma condição clássica de teste de bit.
  • Critérios de múltiplos bits. Você também pode verificar combinações de bits ou múltiplas condições. Por exemplo, suponha que você queira garantir que ambos bit 0 e bit 1 estejam definidos em um byte io_flags (digamos, indicando que ambos sensores de porta dianteira e traseira estão ativos).

Você poderia escrever:

(io_flags & 0x03) == 0x03

ou usando extensão util:

util:bits(io_flags, 0, 1) == 0x03

 

Aqui 0x03 (binário 00000011) mascara os dois bits mais baixos e a expressão compara o resultado com 0x03. Será verdadeiro apenas se ambos bits 0 e 1 fossem 1. Este tipo de verificação produz um booleano adequado para o nó Lógico (true = ambas condições atendidas). Outro exemplo: usando um OU bitwise em uma condição — talvez você queira disparar uma ação se qualquer um de vários bits estiver definido. Você poderia combinar testes de bit com OU lógico (||), ou simplesmente mascarar e comparar com zero. Ex.: (errors & 0xF0) != 0 verificaria se _qualquer um_ dos 4 bits superiores de errors está ativo (diferente de zero). Esta condição única efetivamente significa "pelo menos uma dessas flags de erro está presente." Se isso avaliar como verdadeiro, você pode ramificar para enviar um relatório de diagnóstico.
  • Casos extremos — Bitwise em contexto booleano. Lembre-se que em JEXL, uma expressão bitwise como A & B por si só resulta em um número, não um booleano. Então em um nó Lógico, não escreva apenas x & 0x10 sozinho — isso produziria um resultado numérico (ex.: 16 ou 0), que não é explicitamente verdadeiro/falso. Sempre compare com algo (ex.: != 0 ou == algumaMáscara) para obter um resultado booleano. Similarmente, se você usar deslocamentos de bit, garanta que o resultado final da expressão seja um booleano. Você também pode envolver condições em parênteses e combinar com &&/|| conforme necessário para lógica complexa.

No geral, usar operações bitwise em condições desbloqueia uma capacidade poderosa: você pode criar regras SE-ENTÃO baseadas em dados brutos de nível de bit vindos de veículos ou sensores. A documentação da Navixy nota que JEXL pode lidar desde aritmética básica até expressões lógicas complexas, e na verdade a inclusão de lógica de mascaramento de bit significa que até telemetria binária de baixo nível pode conduzir ações de alto nível. Provedores de serviços de telemetria podem configurar regras como "Se qualquer flag de sensor de pressão de pneu estiver baixa (de um campo de bits) ou se o bit do botão de emergência estiver pressionado, então envie um alerta" — tudo configurado através de uma expressão em vez de escrever um programa personalizado.

Funções utilitárias para fórmulas

Além dos operadores bitwise, as fórmulas Navixy também suportam um conjunto de funções utilitárias (util) que facilitam o trabalho com números no nível de bit e byte:

  • util:signed(Number n, int bytesAmount) [Long] — converte um número sem sinal n de tamanho bytesAmount bytes em um valor com sinal. Por exemplo, util:signed(65535, 2) retorna -1.

  • util:checkBit(Number n, int bitIndex) [Boolean] — verifica se o bit na posição bitIndex em n está definido. Retorna true ou false. Por exemplo, util:checkBit(4, 2) retorna true.

  • util:bit(Number n, int bitIndex) [Integer] — retorna o valor do bit na posição bitIndex (1 ou 0). Por exemplo, util:bit(4, 0) retorna 0.

  • util:bits(Number n, int firstBit, int lastBitInclusive) [Long] — extrai um intervalo de bits de firstBit até lastBitInclusive (inclusivo). Se lastBitInclusive for menor que firstBit, os bits são lidos em ordem reversa. Por exemplo, util:bits(1321678, 0, 3) retorna 14, enquanto util:bits(1321678, 3, 0) retorna 7.

  • util:bytes(Number n, int firstByte, int lastByteInclusive) [Long] — extrai um intervalo de bytes defirstByte até lastByteInclusive (inclusivo). Se lastByteInclusive for menor que firstByte, os bytes são lidos em ordem reversa. Por exemplo, util:bytes(1321678, 0, 1) retorna 10958, e util:bytes(1321678, 1, 0) retorna 52778.

Essas funções complementam os operadores bitwise e são particularmente úteis para analisar protocolos de dispositivos personalizados ou trabalhar com valores brutos de telemetria.

Contexto do mundo real e casos de uso

Operações de bit e byte no IoT Logic são especialmente valiosas em cenários avançados de telemetria e IoT, onde dispositivos produzem dados codificados. Aqui estão alguns contextos onde você aplicará essas operações:

  • Decodificação de dados do barramento CAN. Rastreadores GPS modernos com interfaces de barramento CAN frequentemente recuperam dados ricos do veículo (nível de combustível, RPM do motor, status da porta, códigos de diagnóstico, etc.). Muitos destes vêm como valores binários empacotados. Por exemplo, uma mensagem CAN pode conter várias flags de status em um byte ou um valor de 16 bits onde cada bit significa uma condição diferente (cinto de segurança afivelado, porta aberta, ABS ativo, etc.). Usando o IoT Logic da Navixy, você pode decodificar tais dados em tempo real. O blog oficial da Navixy destaca que com operações bitwise incorporadas, integradores podem "decodificar estados de transmissão, detectar flags de erro ou identificar eventos de veículos codificados em sinais binários" diretamente via expressões. Isso significa que você poderia pegar um can_status_word bruto e, dentro do seu fluxo IoT Logic, dividi-lo em pedaços legíveis por humanos (como seatbelt_fastened = verdadeiro/falso, gear_position = N, etc.) sem ferramentas externas. Esses insights derivados podem então ser alimentados para alertas, relatórios ou processamento adicional na plataforma.

  • OBD-II e diagnósticos de veículos. Dados OBD-II frequentemente incluem Códigos de Problema de Diagnóstico (DTCs) e bytes de status para vários testes embarcados. Por exemplo, há um PID padrão OBD-II que retorna um campo de bits de testes de monitor completados/incompletos para emissões. Aplicando máscaras de bit, você poderia interpretar quais testes foram feitos ou quais subsistemas relataram falhas. Adicionalmente, os próprios códigos DTC são codificados (o primeiro byte contém uma mistura de bits para sistema e um código numérico). Um usuário avançado poderia usar deslocamentos e máscaras para decodificar um formato DTC se enviando bytes brutos. Na prática, muitos dispositivos analisam DTCs para você, mas o IoT Logic dá flexibilidade para lidar com qualquer informação binária personalizada ou proprietária de dispositivos OBD.

  • Protocolos de sensores personalizados. Além de veículos, qualquer sensor IoT que envia dados binários (ex.: um pacote de entradas digitais em um número, ou dispositivos IoT que enviam uma máscara de bit de alarmes ativos) pode ser analisado com essas operações. Por exemplo, se você tem um sensor de temperatura que relata um status de 8 bits onde cada bit corresponde a um alarme de limiar, você pode isolar quais limiares foram excedidos. Isso é crucial para provedores de telemetria que integram hardware diverso — o IoT Logic atua como uma camada de normalização onde você pode interpretar formatos binários específicos de dispositivos em parâmetros unificados e significativos.

  • Performance e sem codificação. Todas essas manipulações de bit/byte ocorrem na lógica do lado do servidor da Navixy em tempo real, sem necessidade de implantar código personalizado ou mudanças de firmware. As expressões são avaliadas em fluxos de dados recebidos conforme chegam, e você pode encadear múltiplas operações. Por exemplo, você pode calcular um valor de bits usando um nó Atributo de Iniciação, então imediatamente usar esse novo valor em uma condição de nó Lógico. Isso é feito em milissegundos conforme os dados chegam, possibilitando fluxos de trabalho responsivos (como alertas instantâneos ou filtragem de dados) baseados em sinais de baixo nível. A Navixy enfatiza que esta abordagem requer "nenhuma codificação complexa" e é semelhante a escrever fórmulas em uma planilha — tornando o processamento de dados poderoso acessível para engenheiros e analistas de telemetria que podem não ser programadores em tempo integral.

Conclusão: Processamento aprimorado de dados sem overhead de desenvolvimento

Com o IoT Logic aprimorado da Navixy, você agora tem acesso direto ao batimento binário de suas operações de frota. Os operadores bitwise (&, |, ^, ~) e deslocamentos de bit (<<, >>, >>>) que antes exigiam conhecimento especializado em codificação agora fazem parte do seu kit de ferramentas cotidiano. Seja decodificando quadros de barramento CAN, interpretando protocolos de sensores personalizados ou extraindo flags de diagnóstico de dados brutos de veículos, tudo acontece dentro do fluxo de trabalho da sua plataforma existente.

Isso não é apenas sobre conveniência técnica — é sobre vantagem competitiva. Enquanto outros mantêm pipelines complexos de processamento externo, você está construindo regras responsivas de processamento de dados low-code que transformam sinais binários em inteligência de negócios em tempo real. Diagnósticos de motor, status de sensores, detecção de falhas, tudo extraído do hardware existente sem escrever uma única linha de software externo.

A indústria de telemetria evoluiu para onde o manuseio de bytes e bits determina quanto valor você pode extrair de dados IoT. O compromisso da Navixy com operações binárias avançadas garante que você não está apenas acompanhando essa evolução — você está liderando-a.

Pronto para levar o processamento de dados de telemetria para o próximo nível? Entre em Contato com Vendas e veja como o IoT Logic da Navixy pode transformar seus fluxos de trabalho IoT.