Le protocole Cyberrail est défini en plusieurs couches :
D’un point de vue “Modèle OSI”, le protocole se découpe de façon suivante :
La couche dialogue permet d’abstraire et de normaliser différents types de messages. Il y a plusieurs familles de messages spécifiées par le protocole. En outre, chaque message dispose d’un type, spécifié par chaque module et portant une valeur “métier”.
Attention, dans les deux derniers cas, il ne s’agit pas d’erreurs fonctionnelles mais purement protocolaire.
Un message sera envoyé avec les éléments suivants :
request”, ”response”, ”warning”, ”error”Résumé des messages possibles concernant les requêtes :
| Type de Message | Présence du destinataire | Présence de l’identifiant |
| Message asynchrone | X | |
| Message asynchrone diffusé | ||
| Requête | X | X |
| Requête diffusé | X |
Certains messages et certains paramètres doivent respecter un formalisme qui leur est propre.
Les messages asynchrones peuvent être envoyés n’importe quand. Le, ou les destinataires doivent exister. En cas d’inexistence du destinataire, un avertissesment est renvoyé.
Les messages asynchrones peuvent être envoyés n’importe quand. Les destinataire doivent préalablement s’abonner au type du message. En cas d’absence de destinataire, un avertissesment est renvoyé.
Les requêtes peuvent être envoyées n’importe quand, même lorsqu’une requête précédente n’a toujours pas obtenue sa ou ses réponses.
Chaque requête doit disposer d’un, ou de plusieurs destinataires.
Chaque nouvelle requête doit disposer d’un identifiant différent des précédents. Cet identifiant doit être unique parmi tous les modules. En cas d’identifiant déjà existant, la requête sera rejetée par un avertissement.
Cette requête ne recevra qu’une seule réponse par destinataire.
Le noeud central informera le module originaire de la requête que celle-ci est terminée une fois toutes les réponses reçues via une dernière réponse correspondant à cette requête.
Même principe que pour les requêtes.
Le noeud central informera le module originaire de la requête que celle-ci est terminée une fois toutes les réponses reçues. C’est le seul moyen pour ce module de connaitre le moment ou toutes les réponses possibles sont reçues.
Les réponses sont obligatoirement des messages dont l’identifiant unique est spécifié. Il est interdit de générer des réponses comportant un identifiant qui n’a pas été créé par une requête. Dans ce dernier cas, la réponse est ignorée et un avertissement est envoyée.
L’identifiant d’une requête est valide à partir de sa réception par un module et pour une et une seule réponse.
Ces messages ne sont envoyés que par le noeud central. Un client correctement écrit ne devrais pas générer de tels types de messages.
Une requête :
{
"family": "request",
"type": "saveRequest",
"id": "4542546",
"content": ""
}
Un message simple :
{
"family": "request",
"type": "plopMessage",
"dest": ["module1-1245", "moduleX-7541],
"content": {
"content" : "payload",
"desc": "This is the payload"
}
}
Une réponse à la requête précédente :
{
"family": "response",
"type": "saveResponse",
"id": "4542546",
"content": "Data to be saved"
}
{
"family": "response",
"type": "noMoreResponse",
"id": "4542546",
}