Plateforme · Multi Stacks
Communication véhicule et IoT industriel, déclarée en fichiers de données.
CAN, J1939, UDS, Modbus, ISOBUS — même moteur, un seul DSL, un seul runtime. Les piles s'exécutent en parallèle sur les mêmes interfaces physiques avec des cycles de vie indépendants. Les modifications de protocole sont des éditions JSON, pas des releases firmware.
Fait partie de la couche moteur no-code — configurer le comportement des piles en JSON, sans recompilation. Developer-first : DSL JSON complet via le SDK MOS4.
Le modèle déclaratif
Quatre éléments — un seul moteur.
Chaque déploiement Multi Stacks, bus véhicule ou IoT industriel, est déclaré en quatre parties mobiles. La stratégie périodique est disponible d'emblée ; les séquences avancées émergent en composant avec MSP et MEP.
1 · Protocole
Le transport et l'encadrement — CAN, CAN-FD, J1939, ISO-TP, DoIP, UDS, K-Line, ISOBUS, Modbus RTU/TCP, CANopen. La sélection est un champ JSON ; aucune recompilation pour ajouter un transport.
2 · Question + Réponse
Quelle commande, PID, PGN ou registre envoyer et comment décoder la réponse. Les expressions de décodage sont en ligne — octets en entrée, signal nommé en sortie.
3 · Diffusion
Gestion des messages non sollicités et en lecture seule — écoute passive, décodage de style événementiel sans requête. Le même JSON déclare le décodage pour les trames non sollicitées.
4 · Stratégie
Quelles séquences exécuter et quand. Périodique par défaut. Piloté par signal via MSP, piloté par événement via MEP — le reste de MOS4 fournit la stratégie avancée sans sortir du modèle déclaratif.
Couverture protocolaire
16 familles de protocoles dans une API unifiée.
| Protocole | Transport | Segment typique |
|---|---|---|
| CAN Classical | CAN | Passager, VUL, hors-route |
| CAN-FD | CAN | Passager moderne, VE |
| ISO-TP | CAN segmenté | Couche diagnostic UDS |
| DoIP | Ethernet | Diagnostic ECU moderne |
| UDS | ISO-TP / DoIP | Services de diagnostic unifiés |
| OBD-II | ISO-TP / K-Line | Émissions véhicules légers (ISO 15031) |
| OBFCM | OBD-II / UDS | Reporting carburant/énergie UE (2021/392) |
| J1939 | CAN | Poids lourds, bus |
| J1587/J1708 | RS-485 | Poids lourds legacy |
| J1850 VPW/PWM | Monofil | Passager legacy (GM, Chrysler) |
| K-Line | ISO 9141-2 | Véhicules passager anciens |
| CANopen | CAN | Industrie, machines hors-route |
| ISOBUS | CAN (ISO 11783) | Équipements agricoles (lecture seule) |
| Modbus RTU/TCP | RS-485 / Ethernet | Capteurs industriels, groupes électrogènes, automates |
| GMLAN | CAN | Passager GM legacy |
| TP 2.0 | CAN | Passager groupe VAG |
Modbus ASCII est expérimental — non revendiqué pour la production. ISOBUS est en acquisition lecture seule ; la création d'affichage VT n'est pas prise en charge.
Apportez votre bus et votre mix de protocoles — nous adaptons Multi Stacks.
Exemple pratique · véhicule (J1939)
Scénario dashcam poids lourd — charge moteur via J1939.
Une dashcam de flotte poids lourd a besoin de la charge moteur et de la vitesse à 10 Hz, ainsi que de lectures de codes défaut à la demande. L'ensemble est une seule pile JSON.
JSON de pile J1939 minimal
{
"ecu_id": "EngineECU",
"address": "0x00",
"commands": [
{
"name": "engine_load_pct",
"pgn": "0xF003",
"spn": 92,
"period_ms": 100,
"decode": "A * 100 / 255"
},
{
"name": "road_speed_kph",
"pgn": "0xFEF1",
"spn": 84,
"period_ms": 100,
"decode": "(A * 256 + B) / 256"
}
],
"dtc": { "service": "uds", "read": "0x19", "clear": "0x14" }
} Ajouter un PGN, changer une période ou câbler un nouveau service DTC est une édition JSON et un commit. Pas de recompilation, pas de flash firmware.
Exemple pratique · IoT industriel (Modbus)
Interrogation d'un automate en Modbus RTU.
Mêmes quatre éléments, protocole différent. Un contrôleur de groupe électrogène industriel expose des registres d'entrée ; une pile Modbus les interroge à 1 Hz, les décode en signaux nommés et diffuse un événement quand un seuil est dépassé.
JSON de pile Modbus minimal
{
"device_id": "Genset-01",
"transport": "modbus_rtu",
"slave_id": 7,
"commands": [
{
"name": "coolant_temp_c",
"function": "read_input_registers",
"address": 30001,
"count": 1,
"period_ms": 1000,
"decode": "A / 10"
},
{
"name": "fuel_level_pct",
"function": "read_input_registers",
"address": 30002,
"count": 1,
"period_ms": 1000,
"decode": "A"
}
],
"broadcast": { "on_threshold": "fuel_level_pct < 10", "emit": "low_fuel" }
} Modbus RTU et Modbus TCP/MBAP partagent le même DSL. Passer de l'un à l'autre est un seul champ JSON.
Composition de stratégie
Multi Stacks piloté par MSP ou par MEP.
L'élément Stratégie est intentionnellement simple — périodique, avec des déclencheurs de diffusion optionnels. Les séquences avancées émergent quand MSP (piloté par signal) ou MEP (piloté par événement) est la stratégie.
MSP pilote Multi Stacks (piloté par signal)
Un graphe MSP surveille un signal décodé — par exemple, la vitesse dépassant 80 km/h — et déclenche une requête Multi Stacks (ex. lecture UDS d'un snapshot de consommation). La réponse circule en retour dans la même pile.
Un graphe MSP surveille un seuil de signal et déclenche une requête UDS Multi Stacks ; la réponse Multi Stacks revient dans MSP.
flowchart LR Sig[Graphe MSP<br/>seuil signal] -->|déclencheur| MS[Multi Stacks<br/>envoyer requête UDS] MS -->|réponse| Sig
MEP pilote Multi Stacks (piloté par événement)
Une règle MEP se déclenche sur un événement nommé (moteur ON, franchissement de géofence, téléchargement OTA terminé) et exécute une séquence d'action Multi Stacks — par exemple, effacer les DTC après une visite de service, ou lire un snapshot ECU ponctuel.
Un événement EventBus déclenche une règle MEP, dont l'action exécute une séquence Multi Stacks.
flowchart LR Evt[EventBus<br/>événement nommé] -->|déclencheur| MEP[Règle MEP] MEP -->|action| MS[Multi Stacks<br/>exécuter séquence]
Mode multi-pile
N piles · un seul ensemble d'interfaces physiques.
Chaque pile s'exécute avec un cycle de vie indépendant et un chemin d'export indépendant sur les mêmes interfaces physiques. Plusieurs piles partageant un bus ne nécessitent pas de planificateur — l'API protocole unifiée arbitre l'accès et applique l'isolation.
Trois piles indépendantes partagent une API protocole unifiée. La pile A est une pile OBD-II JSON lisant des PIDs passager. La pile B est une pile J1939 JSON lisant des PGNs camion. La pile C est une pile Modbus JSON lisant des capteurs RS-485. Toutes trois alimentent l'API protocole unifiée, qui arbitre l'accès et applique des cycles de vie indépendants. Le gestionnaire dispatche vers trois interfaces physiques — CAN0, CAN1 et RS-485 — sans conflits de propriété de bus. Chaque pile exporte indépendamment : pile A vers le sujet MQTT A, pile B vers le sujet MQTT B, pile C vers le moteur de politique.
flowchart TD S1[Pile A — OBD-II JSON<br/>PIDs passager] S2[Pile B — J1939 JSON<br/>PGNs camion] S3[Pile C — Modbus JSON<br/>capteurs RS-485] V[API protocole unifiée<br/>arbitrage · cycles de vie] S1 --> V S2 --> V S3 --> V V --> Iface1[CAN0] V --> Iface2[CAN1] V --> Iface3[RS-485] S1 -->|export| MQ1[Sujet MQTT A] S2 -->|export| MQ2[Sujet MQTT B] S3 -->|export| MEP[Moteur de politique]
| Méthode | Cadence | Description |
|---|---|---|
| SubscribeData | configurable | Valeurs de signaux décodés et nommés pour consommation par MSP et MEP |
| SubscribeBusLoad | ~1 Hz | Métriques de charge CAN par interface physique |
| SubscribeCanFrames | débit trame | Tap de trames brutes — flux fusionné de toutes les piles actives |
Le tap de trames brutes diffuse en temps réel pour consommation par MSP, le pont MQTT et le service de base de données MOS4.
Capacités
Ce qui est disponible d'emblée.
22 piles par défaut validées en CI, gestion DTC de niveau production, passthrough J2534-2, et résilience par disjoncteur intégrée — disponibles sans écrire un planificateur ni gérer manuellement l'arbitrage de bus.
22 piles par défaut validées en CI
OBD-II, UDS, J1939, ISOBUS, OBFCM, Modbus, CANopen et autres sont inclus et validés à chaque push CI via des tests Python/pytest autonomes. Ajoutez votre propre pile en tant que fichier JSON à côté d'eux.
Lecture + effacement DTC
Les codes défaut sont lus et effacés dans les piles prises en charge via le service OBD-II 03/04 ou les services d'information de diagnostic UDS. Déclaré dans le JSON de la pile — aucun code personnalisé requis.
Passthrough J2534-2
Une API JSON/Protobuf PassThru avec support de l'API étendue J2534-2 permet aux outils de diagnostic existants et aux flasheurs ECU d'atteindre le véhicule via le même gateway — pas de dongle J2534 dédié requis.
Résilience par disjoncteur
Après des échecs de communication répétés avec un ECU spécifique, cette pile se rétracte automatiquement et rapporte son état de santé au contrôleur cloud. Les autres piles sur le même gateway continuent de fonctionner normalement — pas de tempête de retry, pas de panne en cascade.
Identification + push de pile OE
La bonne pile pour chaque véhicule, automatiquement.
Avant tout sondage, le runtime identifie le véhicule et sélectionne la pile OE appropriée à charger. La pile OE poussée standardise les données — nommage, format, unités et fréquence — pour les DTC OE, la télémétrie tableau de bord et les autres surfaces de données OE.
Identification par VIN
Le VIN est lu depuis le véhicule lors de la connexion. Le runtime le mappe à la définition de pile OE correspondante et la charge avant le premier cycle de sondage. Aucune configuration manuelle au niveau du véhicule.
Logique d'identification
Quand le VIN seul est insuffisant, une logique d'identification personnalisée — déclarée dans la configuration de la pile — gère les cas particuliers : variantes de véhicule, retrofits ou configurations de flotte mixte. Le résultat est toujours une sélection de pile.
Config par véhicule
L'identification peut aussi être pilotée par une configuration par véhicule poussée depuis le cloud. Cela prend en charge les flottes où la résolution basée sur le VIN est indisponible ou remplacée par une affectation opérateur.
Ce processus d'identification est autonome — l'appareil résout la pile correcte localement depuis le résultat d'identification, sans aller-retour cloud requis pour le fonctionnement courant. Le cloud pousse la définition de pile OE une fois ; l'appareil l'applique à chaque connexion.
Les clients peuvent étendre le catalogue de piles avec leurs propres piles — achetées, propriétaires ou issues d'ingénierie inverse — avec leur propre logique d'identification. Les piles personnalisées sont limitées à leur flotte uniquement ; elles coexistent avec les piles OE par défaut sans conflit.
Pour le diagnostic à distance piloté par le cloud — où un humain ou une IA est le maître plutôt que l'appareil — consultez notre équipe technique au sujet de la surface de diagnostic à distance.
Où cela s'inscrit
Un pilier de la couche opérations.
Le diagnostic à distance est l'un des cinq piliers de la couche opérations — avec l'observabilité, la sécurité, l'OTA et le cycle de vie. Lire l'ensemble sur /fr/platform/operations.
Simulation ECU
Tests sans matériel sur vcan.
mos-mes simule un ou plusieurs ECU sur CAN virtuel ou DoIP et répond aux commandes
UDS, OBD-II et ISO-TP avec des stratégies de signal configurables : constante, rampe, sinus, aléatoire
ou table de correspondance. Les pipelines CI exécutent des suites de régression UDS/OBD-II complètes
sans banc physique.
Le CLI autonome exécute load-stack, validate-stack et un REPL interactif
sans dépendance au runtime MOS4. Idéal pour intégrer la validation de pile dans votre propre pipeline
CI.
Support des langages
Six langages pour les extensions de pile.
Les clients peuvent étendre le comportement des piles — logique d'identification personnalisée, transformations de signaux et gestionnaires d'actions — en utilisant l'un des six langages. Lua 5.4 est l'option de scripting à plus faible barrière d'entrée : aucune chaîne d'outils Rust requise.
Rust
Authoring natif de micro services. Type safety complet, intégration EventBus zéro-copie.
Python
Scripting et charges de travail data-science. Validation de piles en CI via Pytest sans matériel.
C / C++
Bases de code embarquées existantes et SDK fournisseurs. L'isolation par conteneur applique le même budget de ressources.
Go
Micro services orientés réseau et adaptateurs de passerelle. Livraison OCI standard.
JavaScript / TypeScript
Micro services UI, tableaux de bord web et scripting d'actions MEP.
Lua 5.4
Option de scripting à plus faible barrière. Étendez le comportement des piles sans chaîne d'outils Rust. Gestionnaires d'actions rechargeable à chaud via le service de configuration.
FAQ
Questions fréquentes
-
Multi Stacks est-il la même chose que OBDStacks ?
Oui. OBDStacks est le nom historique ; Multi Stacks est le nom canonique depuis le 2026-05-05. Même moteur, même DSL JSON, même catalogue default-stacks/.
-
Combien de protocoles le runtime prend-il en charge simultanément ?
Jusqu'à 16 familles de protocoles partagent une API protocole unifiée. Plusieurs piles s'exécutent en parallèle avec des cycles de vie indépendants et des chemins d'export indépendants sur les mêmes interfaces physiques.
-
Qu'est-ce qu'une pile déclarative ?
Une pile est un fichier de données JSON spécifiant ECU, commandes, actions, exports, conditions et expressions. Mettre à jour un PID, changer une période d'échantillonnage ou ajuster une politique de réponse est une édition JSON et un commit — pas une release firmware.
-
Modbus ASCII fonctionne-t-il en production ?
Modbus ASCII est une fonctionnalité expérimentale — ne pas l'utiliser pour des déploiements en production. Modbus RTU (RS-485) et Modbus TCP/MBAP sont tous deux prêts pour la production.
-
Puis-je tester une pile sans matériel ECU réel ?
Oui. mos-mes simule un ou plusieurs ECU sur une interface CAN virtuelle et répond aux commandes UDS, OBD-II et ISO-TP avec des stratégies de signal configurables. Les pipelines CI exécutent des suites de régression complètes sur vcan sans banc physique.
-
Que couvre le support DTC ?
Lecture et effacement de DTC dans les piles prises en charge — via le service OBD-II 03/04 ou les services d'information de diagnostic UDS.
-
Comment Multi Stacks se compose-t-il avec MSP et MEP ?
Une « Stratégie » Multi Stacks est périodique par défaut. Pour les séquences pilotées par signal, un graphe MSP publie un déclencheur et Multi Stacks envoie la requête correspondante. Pour les séquences pilotées par événement, une règle MEP se déclenche sur un événement nommé et exécute une action Multi Stacks. Les deux compositions restent déclaratives.
Apportez votre matrice de protocoles.
Listez les familles d'actifs que vous déployez ; nous les matcherons aux bonnes piles et montrerons la configuration de cycles de vie concurrents sur un appareil de développement.