Association d’objets compatibles

Voici la démarche à suivre pour l’appairage ou l’association d’objets compatibles ZiGate

Étape 1 – Permit JOIN

Pour ouvrir le réseau de la ZiGate afin que les capteurs puissent s’authentifier, il faut envoyer la commande suivante :

ZiGate –> 01 02 10 49 02 10 02 14 B0 FF FC FE 02 10 03 (commande 0x0049)

Décodage :

01 : Début de trame
02 10 49 = 0x0049 (Type de message : Permit JOIN)
02 10 02 14 = 0x04 (Taille des données)
B0 = Cheksum
FF FC = Masque d’adresses (FF FC permet d’écouter tous les objets)
FE = 254 – Nombre de secondes pour l’ouverture du réseau. (ex: si vous voulez ouvrir le réseau 30 sec, remplacez par 1E)
02 10 = 0 . On complète par un zéro car les données sont prévues pour 4 octets (voir taille)

Étape 2 – Appairage de l’objet

Chaque objet possède une instruction d’appairage. Il convient donc de lire la documentation de l’objet afin de trouver la procédure qui convient. Lorsque c’est possible, j’essaie de mon côté de fournir cette procédure que vous pouvez retrouver sur la page des matériels compatibles

Si la procédure se déroule correctement, la première trame reçu par la ZiGate est une trame « Device Announce »

Exemple :

ZiGate ← 01 00 4D 00 0C 9E 30 1E 00 13 7A 00 00 01 23 FC 80 C6 03
Header

01 = Start
00 4D = Message type (device announce)
00 0C = Taille message
9E= Checksum

Message (Device announce):

30 1E = Short address ( adresse utilisée dans le réseau)
00 13 7A 00 00 01 23 FC= Adresse MAC IEEE
80 = Mac capability

Footer

C6 = Qualité du signal
03 = End

Décodage :

Type: 0x004D (End Device Announce)
Short Address: 0x301E
Extended Address: 0x137A00000123FC
MAC Capability: 0x80
Alternate PAN Coordinator: False
Device Type: End Device
Power Source: Battery
Receiver On When Idle: False
Security Capability: Standard
Allocate Address: True

C’est trame qui va vous permettre de :

  • Récupérer l’adresse réseau de l’objet associé
  • Récupérer l’adresse MAC de l’objet
  • Récupérer les propriétés de l’objet

Étape 3 – Connaître les « Endpoint » de l’objet

Un « endpoint » est, en quelque sorte, une adresse ou un port ouvert permettant de stocker des fonctions logicielles (clusters + propriétés). Un objet est en mesure d’avoir plusieurs « endpoint » ou adresse ou port permettant d’avoir plusieurs familles de fonctionnalités.

Après chaque appairage d’objet, il convient d’effectuer cette requête pour enregistrer toutes les fonctionnalités de l’objet.

Requête :

ZiGate –> 01 02 10 45 02 10 02 12 FB 27 9B 03  (commande 0x0045 – Active Endpoint Request)

Décodage :

01 = Début de trame
02 10 45 = 0x0045 (Active EndPoint Request)
02 10 02 12 = Taille du message = 0x0002
FB = Checksum
27 9B = Short address. C’est l’adresse réseau de l’objet que l’on interroge.
03 = Fin de trame

Réponses de l’objet :

ZiGate  <- 01 80 00 00 05 FB 00 3B 00 45 00 03 (Réponse statut OK)
ZiGate <- 01 80 45 00 09 90 3B 00 27 9B 03 01 02 03 D8 03 (Réponse : Active EndPoints Response)

Décodage :

Type: 0x8045 (Active Endpoints Response)
SQN: 0x3B
Status: 0x00
Short Address: 0x279B
Endpoint Count: 3
Endpoint List:
Endpoint 0: 0x01
Endpoint 1: 0x02
Endpoint 2: 0x03

L’objet nous informe qu’il a 3 points d’entrées fonctionnelles. J’ai pris l’exemple du cube magique de Xiaomi mais la plupart des objets n’ont que 1 ou 2 points d’entrées.

Attention ! la plupart du temps vous observerez que le endpoint 0x01 est quasiment toujours utilisé mais certains constructeurs jouent avec cet adressage pour rendre plus propriétaire leur objet. (ex : Philips HUE utilise le endpoint 0x0B)

C’est pour cette raison qu’il est indispensable d’effectuer cette requête lors de l’appairage !

Étape 4 – Lister les clusters (fonctionnalités) de l’objet

Une fois que l’on connait les points d’entrées de l’objet, il faut lister les fonctionnalités de chaque point d’entrée pour utiliser pleinement l’objet.

Requête :

ZiGate -> 01 02 10 43 02 10 02 13 FD 27 9B 02 11 03 (commande 0x0043 – Simple Descriptor Request)

Décodage :

01 = Début de trame
02 10 43 = 0x0045 (Simple Descriptor Request)
02 10 02 13 = Taille du message = 0x0003
FD = Checksum
27 9B = Short address. C’est l’adresse réseau de l’objet que l’on interroge.
01 = Endpoint interrogé
03 = Fin de trame

Réponses de l’objet :

ZiGate  <-  01 80 00 00 05 FA 00 3C 00 43 00 03 (Réponse statut OK)
ZiGate <- 01 80 43 00 1E C3 3C 00 27 9B 1C 01 01 04 5F 01 01 04 00 00 00 03 00 19 00 12 06 00 00 00 03 00 19 00 12 DB 03 (Réponse : Simple Descriptor Response)

Décodage :

Type: 0x8043 (Simple Descriptor Response)
SQN: 0x3C
Status: 0x00
Short Address: 0x279B
Length: 28
EndPoint: 0x01
Profile ID: 0x0104 (ZigBee HA)
Device ID: 0x5F01 (Unknown)
Input Cluster Count: 4
Cluster 0: Cluster ID: 0x0000 (General: Basic)
Cluster 1: Cluster ID: 0x0003 (General: Identify)
Cluster 2: Cluster ID: 0x0019 (General: OTA)
Cluster 3: Cluster ID: 0x0012 (Unknown)
Output Cluster Count: 6
Cluster 0: Cluster ID: 0x0000 (General: Basic)
Cluster 1: Cluster ID: 0x0003 (General: Identify)
Cluster 2: Cluster ID: 0x0019 (General: OTA)
Cluster 3: Cluster ID: 0x0012 (Unknown)
Cluster 4: Cluster ID: 0xDB19 (Unknown)
Cluster 5: Cluster ID: 0x001A (Unknown)

J’utilise toujours sur l’exemple du cube magic de Xiaomi.

Dans cette trame, on peut récupérer des informations importantes :

  • Le profile (normalement très souvent 0x0104 (ZigBee HA)
  • Le device ID (Attention : pas très fiable. selon le fabricant)
  • La liste des fonctionnalités entrantes (input)
  • La liste des fonctionnalités sortantes(output)

Il faut savoir que dans ce type de protocole ZigBee, il existe des clusters publics (référencés dans la norme) mais il existe aussi des clusters propriétaires que le constructeur peut ouvrir pour une utilisation spécifique.

Les clusters (ou fonctionnalités) intègrent des propriétés. Prenons l’exemple le plus simple :

Le cluster (Général : Basic) peut comprendre les propriétés suivantes :
cluster_basicGrâce à ces informations, on peut facilement compléter les propriétés de l’objet appairé.

Par exemple pour connaître le nom de l’objet (le magic cube), voici la requête à envoyer :
ZiGate –> 01 02 11 02 10 02 10 02 1E B5 02 12 27 9B 02 11 02 11 02 10 02 10 02 10 02 10 02 10 02 10 02 11 02 10 02 15 03 

Décodage :

01 = Début de trame
02 11 02 10 02 10 = 0x0100 (Read Attribute request )
02 1E = Taille du message = 0x0014
B5 = Checksum
02 = address mode (short address)
27 9B = Short address. C’est l’adresse réseau de l’objet que l’on interroge.
02 11 = 0x01 = source endpoint
02 11 = 0x01 = destination endpoint
02 10 02 10 02 10 02 10 = 0x0000 Cluster Général BASIC
02 10 = 0x00 direction (vers le client ou vers le server) 0 = server to client
02 10 = 0x00 manufacturer specific 0 = Non spécifique
02 11 = 0x01 = number of attributes
02 10 02 15 = 0x0005 = Numéro d’attribut = « ModelIdentifier »
03 = Fin de trame

ZiGate <- 01 80 00 00 05 84 00 00 01 00 00 03 (Réponse statut OK)
ZiGate <- 01 81 02 00 1D C1 00 27 9B 01 00 00 00 05 00 42 00 10 6C 75 6D 69 2E 73 65 6E 73 6F 72 5F 63 75 62 65 DE 03 (Réponse)

Décodage :

Type: 0x8102 (Attribute Report)
SQN: 0x00
Src Addr: 0x279B
Src Ep: 0x01
Cluster ID: 0x0000 (General: Basic)
Attribute ID: 0x0005
Attribute Size: 0x0010
Attribute Type: 0x42 (Character String)
Attribute Data (Len – 16): lumi.sensor_cube
Status: 0x00

Translate »