
Points clés :
Si vous avez déjà fixé un message de bus CAN en vous demandant comment extraire cet état de transmission enfoui dans le bit 3, ou si vous avez eu besoin de décoder des codes de défaut OBD-II à partir de données hexadécimales brutes, vous connaissez la difficulté. Jusqu'à présent, traiter ces données télématiques codées en binaire signifiait écrire des analyseurs personnalisés, maintenir des scripts externes, ou se contenter d'une interprétation incomplète des données.
Cela change aujourd'hui.
Navixy IoT Logic vient de recevoir une mise à jour majeure avec des opérations au niveau des bits et au niveau des octets complètes, transformant la façon dont les professionnels de la télématique gèrent les données véhicule complexes. Explorons ce que cela signifie pour vos opérations télématiques et pourquoi c'est un changement radical pour les fournisseurs de services télématiques (FST) travaillant avec des données de flotte sophistiquées.
Les expressions Navixy IoT Logic (basées sur Apache JEXL, Java Expression Language) peuvent être utilisées dans deux types de nœuds de flux : les nœuds Initialiser un attribut et les nœuds Logique. Le nœud Initialiser un attribut vous permet de créer ou transformer des attributs de données en utilisant des expressions personnalisées (par exemple, calculer de nouvelles valeurs à partir de données brutes d'appareil). Le nœud Logique évalue une expression booléenne pour diviser le flux de données basé sur des conditions (logique IF/THEN).
En d'autres termes, vous utilisez les expressions pour soit calculer de nouvelles valeurs soit pour définir des règles conditionnelles dans le flux de travail IoT Logic. Par exemple, vous pourriez calculer un nouveau paramètre en combinant des bits à partir de données entrantes, ou configurer une règle qui se déclenche uniquement lorsque des indicateurs de bits spécifiques sont présents dans les données.
Nœud initialiser un attribut : Ce nœud vous permet de dériver de nouveaux attributs en écrivant des expressions JEXL qui opèrent sur les champs de données entrantes. Ici, vous pouvez utiliser les mathématiques au niveau des bits pour interpréter les valeurs brutes. Par exemple, si un appareil envoie un octet d'état combiné, vous pourriez créer des attributs séparés pour chaque bit d'état en utilisant des expressions (voir les exemples ci-dessous).
Nœud logique : Ce nœud introduit une ramification if-then basée sur une expression booléenne. Toutes les expressions de nœud logique doivent évaluer à vrai ou faux. Les opérations sur bits sont souvent utilisées ici pour vérifier les indicateurs dans un masque de bits — par exemple, vous pouvez acheminer les données vers le chemin « Vrai » si un certain bit est défini dans une valeur d'état. Cela permet de configurer des alertes et actions conditionnelles (comme déclencher une alarme si un bit de défaut moteur est à 1) de manière low-code. Le nœud Logique implémente essentiellement la logique IF/ELSE côté serveur : si une condition binaire dans les données est remplie, alors faire X, sinon faire Y.
Le langage d'expression de Navixy prend en charge l'ensemble standard d'opérateurs de manipulation de bits fournis par JEXL. Ceux-ci opèrent au niveau des bits binaires des valeurs entières. Vous pouvez les utiliser dans des expressions pour manipuler les bits dans les données numériques (par exemple, masquer ou basculer des bits spécifiques). Les opérateurs de manipulation de bits pris en charge incluent :
Exemple :
33 & 4 évalue à 0 car en binaire 33 est 0010 0001 et 4 est 0000 0100 ; aucune position de bit ne se chevauche avec 1, donc le résultat est 0000 0000. Dans la logique IoT, io_status & 0x08 isolerait le bit 3 de l'attribut io_status (puisque 0x08 en binaire est 0000 1000). Si cette expression est non-nulle, cela signifie que ce bit spécifique était à 1.
Exemple :
33 | 4 donne 37 car 0010 0001 | 0000 0100 = 0010 0101 (binaire pour 37). Cela pourrait fusionner des indicateurs de deux valeurs, bien qu'en télématique vous ferez souvent un OU d'une valeur avec un masque pour définir un certain bit à 1.
Exemple :
33 ^ 4 donne également 37 (0010 0001 ^ 0000 0100 = 0010 0101) car le bit qui était défini dans 4 bascule dans 33, résultant en 37. (XOR est utile pour basculer les bits (inverser 0 ↔ 1) ou vérifier la différence dans les modèles de bits.
Exemple :
~ 33 résulte en -34 dans un système 32 bits. C'est parce que 33 (0010 0001 en 8-bit pour illustration) devient 1101 1110 qui représente -34 sous forme de complément à deux. En pratique, ~x peut être utilisé pour inverser un masque (par exemple, x & ~0x0F effacerait les 4 bits inférieurs de x).
Ces opérateurs permettent un contrôle fin des données binaires. Par exemple, si un appareil envoie un entier unique où chaque bit représente un état de capteur différent (un masque de bits), vous pouvez utiliser & pour tester des bits spécifiques ou extraire des sous-ensembles de bits. La plateforme Navixy anticipe explicitement ce cas d'usage, car la capacité d'appliquer le masquage de bits fait partie de sa boîte à outils d'amélioration des données.
En plus de la logique de manipulation de bits de base, vous pouvez décaler les bits vers la gauche ou la droite dans JEXL. Les décalages de bits sont cruciaux pour combiner ou découper des valeurs multi-octets. Les opérateurs de décalage pris en charge sont :
Exemple :
1 << 2 donne 4 (binaire 0001 devient 0100). Dans IoT Logic, si vous avez un octet haut et voulez former une valeur 16-bit, vous pourriez faire high_byte << 8 (le décaler vers les positions 8-bit supérieures).
Exemple : 4 >> 2 donne 1 (0100 >> 2 = 0001). Si la valeur était négative, >> la garderait négative en étendant les 1s. Les décalages à droite sont utiles pour extraire des bits d'ordre inférieur en poussant les bits non désirés vers la droite. Par exemple, pour supprimer les 3 bits les plus bas d'une valeur (en gardant le reste), vous pourriez faire value >> 3.
L'utilisation des décalages en combinaison avec des masques de bits vous permet de cibler des octets ou bits spécifiques dans un nombre.
Exemple : Supposons que vous ayez une valeur 16-bit et que vous ayez besoin des 8 bits hauts et des 8 bits bas séparément : vous pouvez obtenir l'octet haut avec (value>> 8) & 0xFF et l'octet bas avec value & 0xFF. Ici, >> 8 décale l'octet haut dans la position d'octet la plus basse, et 0xFF (255 en décimal) est un masque pour isoler 8 bits.
Dans JEXL, vous pouvez écrire des littéraux numériques en hexadécimal (préfixe avec 0x) pour plus de commodité lors de la définition de tels masques. Par exemple, 0xFF est le masque pour 8 bits, 0xF pour 4 bits, etc.
De nombreux paramètres IoT et de bus CAN s'étendent sur plusieurs octets ou empaquettent plusieurs champs dans un nombre. Navixy IoT Logic vous permet de les gérer avec des opérations de bits et de décalage, traitant essentiellement les octets dans des entiers plus grands. Voici quelques techniques courantes pour la manipulation au niveau des octets :
(engine_rpm_high << 8) | engine_rpm_low
Cela décale l'octet haut dans les 8 bits supérieurs et le fusionne avec l'octet bas via un OU au niveau des bits. Le résultat engine_rpm est un nouvel attribut entier 16-bit. De même, vous pourriez combiner 4 valeurs d'un octet en un entier 32-bit en décalant de 24, 16, 8 et 0 bits et en les combinant avec un OU. Ceci est utile pour assembler des IDs ou des lectures de capteurs composites qui arrivent divisées en octets.
Extraire des octets d'un mot. À l'inverse, vous pourriez recevoir une valeur 32-bit unique d'un appareil mais avoir besoin d'extraire des octets spécifiques (par exemple, codes d'état ou octets de capteurs individuels à l'intérieur). En utilisant des masques et des décalages :
Octet le plus bas : value & 0xFF donne les 8 bits les plus bas.
Octet suivant : (value >> 8) & 0xFF donne les bits 8-15.
Et ainsi de suite : (value >> 16) & 0xFF pour les bits 16-23, (value >> 24) & 0xFF pour les bits 24-31.
Chaque fois, nous décalons à droite l'octet désiré dans la position 8-bit la plus basse, puis masquons. De cette façon, vous pouvez décomposer un champ multi-octet en composants séparés si nécessaire pour l'analyse ou les rapports.
Isoler et interpréter les champs de bits. Supposons qu'à l'intérieur d'un octet, différents bits ou groupes de bits portent différentes significations (un scénario courant avec les octets d'état de bus CAN). Par exemple, imaginez un octet unique d'un message OBD-II où : bit0 = MIL (témoin d'avertissement moteur) on/off, bits1-3 = état du système carburant (0—7), bit4 = quelque indicateur, etc. En utilisant IoT Logic, vous pouvez isoler ceux-ci :
mil_on = (status_byte & 0x1) == 1 — ceci vérifie le bit le moins significatif. Si égal à 1, l'indicateur MIL est allumé. Ou en utilisant l'extension util: util:checkBit(status_byte, 0).
fuel_system_status = (status_byte >> 1) & 0x7 — ceci décale l'octet à droite de 1 (donc bit1 devient le nouveau LSB) et masque avec 0x7 (0b111) pour extraire les trois bits suivants comme un nombre 0—7. Ou en utilisant l'extension util: util:bits(status_byte, 1, 3).
flag = (status_byte & 0x10) != 0 — masque bit4 (0x10 est binaire 00010000) et vérifie s'il est non-nul, résultant en un booléen vrai si ce bit était à 1. Ou en utilisant l'extension util: util:checkBit(status_byte, 4).
En utilisant ces techniques, vous pouvez dériver de nouveaux attributs qui représentent des états ou valeurs significatifs, au lieu de traiter avec un champ de bits opaque. Navixy IoT Logic vous permet essentiellement de créer des capteurs virtuels ou des champs calculés pour tout détail au niveau des bits dont vous avez besoin, le tout à travers des expressions.
L'un des aspects les plus puissants d'avoir des opérations de bits et d'octets dans IoT Logic est la capacité de piloter des flux de travail conditionnels basés sur des signaux binaires. Dans le nœud Logique, vous écrivez une expression qui doit retourner vrai/faux — et les expressions au niveau des bits s'intègrent parfaitement, tant que vous les comparez pour produire un résultat booléen. Voici quelques exemples d'utilisation d'opérations de bits dans des conditions :
Une condition de nœud Logique pourrait être :
(can_status & 0x4) != 0
ou en utilisant l'extension util :
util:checkBit(can_status, 2)
Cette expression utilise & 0x4 (masque 0100 binaire) pour isoler le bit 2, et vérifie si le résultat est non-nul (signifiant que le bit 2 était à 1). Si vrai, le flux de travail suivra la branche THEN — peut-être lever une alerte ou enregistrer un événement de surchauffe moteur. Si faux, il suit la branche ELSE ou ne fait simplement rien si aucun chemin ELSE n'est configuré. C'est une condition classique de test de bit.
Vous pourriez écrire :
(io_flags & 0x03) == 0x03
ou en utilisant l'extension util :
util:bits(io_flags, 0, 1) == 0x03
Ici 0x03 (binaire 00000011) masque les deux bits les plus bas et l'expression compare le résultat à 0x03. Il sera vrai seulement si les bits 0 et 1 étaient tous deux à 1. Ce genre de vérification produit un booléen approprié pour le nœud Logique (true = les deux conditions remplies). Autre exemple : utiliser un OU au niveau des bits dans une condition — peut-être voulez-vous déclencher une action si l'un de plusieurs bits est défini. Vous pourriez combiner des tests de bits avec un OU logique (||), ou simplement masquer et comparer à zéro. Par exemple (errors & 0xF0) != 0 vérifierait si _l'un_ des 4 bits supérieurs d'errors est actif (non-nul). Cette condition unique signifie effectivement « au moins un de ces indicateurs d'erreur est présent. » Si cela évalue à vrai, vous pourriez bifurquer pour envoyer un rapport de diagnostic.
Dans l'ensemble, l'utilisation d'opérations au niveau des bits dans les conditions débloque une capacité puissante : vous pouvez créer des règles IF-THEN basées sur des données brutes au niveau des bits provenant de véhicules ou de capteurs. La documentation de Navixy note que JEXL peut gérer de l'arithmétique de base aux expressions logiques complexes, et effectivement l'inclusion de la logique de masquage de bits signifie que même la télémétrie binaire de bas niveau peut piloter des actions de haut niveau. Les fournisseurs de services télématiques peuvent configurer des règles comme « Si un indicateur de capteur de pression de pneu est bas (à partir d'un champ de bits) ou si le bit du bouton d'urgence est pressé, alors envoyer une alerte » — le tout configuré à travers une expression plutôt qu'en écrivant un programme personnalisé.
En plus des opérateurs au niveau des bits, les formules Navixy prennent également en charge un ensemble de fonctions utilitaires (util) qui facilitent le travail avec les nombres au niveau des bits et des octets :
util:signed(Number n, int bytesAmount) [Long] — convertit un nombre non signé n de taille bytesAmount octets en une valeur signée. Par exemple, util:signed(65535, 2) retourne -1.
util:checkBit(Number n, int bitIndex) [Boolean] — vérifie si le bit à la position bitIndex dans n est défini. Retourne true ou false. Par exemple, util:checkBit(4, 2) retourne true.
util:bit(Number n, int bitIndex) [Integer] — retourne la valeur du bit à la position bitIndex (soit 1 soit 0). Par exemple, util:bit(4, 0) retourne 0.
util:bits(Number n, int firstBit, int lastBitInclusive) [Long] — extrait une plage de bits de firstBit à lastBitInclusive (inclus). Si lastBitInclusive est inférieur à firstBit, les bits sont lus dans l'ordre inverse. Par exemple, util:bits(1321678, 0, 3) retourne 14, tandis que util:bits(1321678, 3, 0) retourne 7.
util:bytes(Number n, int firstByte, int lastByteInclusive) [Long] — extrait une plage d'octets defirstByte à lastByteInclusive (inclus). Si lastByteInclusive est inférieur à firstByte, les octets sont lus dans l'ordre inverse. Par exemple, util:bytes(1321678, 0, 1) retourne 10958, et util:bytes(1321678, 1, 0) retourne 52778.
Ces fonctions complètent les opérateurs au niveau des bits et sont particulièrement utiles pour analyser les protocoles d'appareils personnalisés ou travailler avec des valeurs de télémétrie brutes.
Les opérations de bits et d'octets dans IoT Logic sont particulièrement précieuses dans les scénarios télématiques et IoT avancés, où les appareils sortent des données encodées. Voici quelques contextes où vous appliquerez ces opérations :
Décodage de données de bus CAN. Les traceurs GPS modernes avec des interfaces de bus CAN récupèrent souvent des données véhicule riches (niveau de carburant, régime moteur, état des portes, codes de diagnostic, etc.). Beaucoup de ces données viennent comme des valeurs binaires empaquetées. Par exemple, un message CAN pourrait contenir plusieurs indicateurs d'état dans un octet ou une valeur 16-bit où chaque bit signifie une condition différente (ceinture attachée, porte ouverte, ABS actif, etc.). En utilisant Navixy IoT Logic, vous pouvez décoder de telles données à la volée. Le blog officiel Navixy souligne qu'avec des opérations au niveau des bits intégrées, les intégrateurs peuvent « décoder les états de transmission, détecter les indicateurs d'erreur, ou identifier les événements véhicule encodés en signaux binaires » directement via des expressions. Cela signifie que vous pourriez prendre un can_status_word brut et, dans votre flux IoT Logic, le diviser en pièces lisibles par l'homme (comme seatbelt_fastened = vrai/faux, gear_position = N, etc.) sans outils externes. Ces informations dérivées peuvent ensuite être alimentées aux alertes, rapports, ou traitement ultérieur dans la plateforme.
OBD-II et diagnostic véhicule. Les données OBD-II incluent souvent des Codes de Problème de Diagnostic (DTC) et des octets d'état pour divers tests embarqués. Par exemple, il y a un PID OBD-II standard qui retourne un champ de bits de tests de surveillance complétés/incomplets pour les émissions. En appliquant des masques de bits, vous pourriez interpréter quels tests sont faits ou quels sous-systèmes ont rapporté des défauts. De plus, les codes DTC eux-mêmes sont encodés (le premier octet contient un mélange de bits pour le système et un code numérique). Un utilisateur avancé pourrait utiliser des décalages et des masques pour décoder un format DTC s'il envoie des octets bruts. En pratique, beaucoup d'appareils analysent les DTC pour vous, mais IoT Logic vous donne la flexibilité de gérer toute information binaire personnalisée ou propriétaire des appareils OBD.
Protocoles de capteurs personnalisés. Au-delà des véhicules, tout capteur IoT qui envoie des données binaires (par exemple, un paquet d'entrées numériques dans un nombre, ou des appareils IoT qui envoient un masque de bits d'alarmes actives) peut être analysé avec ces opérations. Par exemple, si vous avez un capteur de température qui rapporte un état 8-bit où chaque bit correspond à une alarme de seuil, vous pouvez isoler quels seuils ont été dépassés. Ceci est crucial pour les fournisseurs télématiques qui intègrent du matériel divers — IoT Logic agit comme une couche de normalisation où vous pouvez interpréter les formats binaires spécifiques aux appareils en paramètres unifiés et significatifs.
Performance et sans codage. Toutes ces manipulations de bits/octets se produisent dans la logique côté serveur de Navixy en temps réel, sans besoin de déployer du code personnalisé ou des changements de firmware. Les expressions sont évaluées sur les flux de données entrants au fur et à mesure qu'ils arrivent, et vous pouvez enchaîner plusieurs opérations. Par exemple, vous pourriez calculer une valeur à partir de bits en utilisant un nœud Initialiser un attribut, puis immédiatement utiliser cette nouvelle valeur dans une condition de nœud Logique. Ceci est fait en quelques millisecondes lorsque les données arrivent, permettant des flux de travail réactifs (comme des alertes instantanées ou le filtrage de données) basés sur des signaux de bas niveau. Navixy souligne que cette approche ne nécessite « aucun codage complexe » et est semblable à écrire des formules dans une feuille de calcul — rendant le traitement de données puissant accessible aux ingénieurs télématiques et analystes qui peuvent ne pas être des programmeurs à temps plein.
Avec Navixy IoT Logic amélioré, vous avez maintenant accès direct au battement binaire de vos opérations de flotte. Les opérateurs au niveau des bits (&, |, ^, ~) et les décalages de bits (<<, >>, >>>) qui nécessitaient autrefois une expertise en codage spécialisée font maintenant partie de votre boîte à outils quotidienne. Que vous décodiez des trames de bus CAN, interprétez des protocoles de capteurs personnalisés, ou extrayez des indicateurs de diagnostic à partir de données véhicule brutes, tout se passe dans votre flux de travail de plateforme existant.
Ceci n'est pas seulement une commodité technique — c'est un avantage concurrentiel. Pendant que d'autres maintiennent des pipelines de traitement externes complexes, vous construisez des règles de traitement de données réactives et low-code qui transforment les signaux binaires en intelligence d'affaires en temps réel. Diagnostic moteur, états de capteurs, détection de défauts, tout extrait du matériel existant sans écrire une seule ligne de logiciel externe.
L'industrie télématique a évolué au point où la gestion des octets et bits détermine combien de valeur vous pouvez extraire des données IoT. L'engagement de Navixy envers les opérations binaires avancées assure que vous ne faites pas que suivre cette évolution — vous la menez. _ Prêt à faire passer votre traitement de données télématiques au niveau supérieur ? Contactez les Ventes et voyez comment Navixy IoT Logic peut transformer vos flux de travail IoT._