Un tracker GPS 4G (firmware JT808) que j’utilise pour un projet IoT pet. Réglage standard MODE,1,30,300# (realtime, 30s en mouvement, 300s à l’arrêt). Logiquement, j’attendais des positions toujours fraîches au pire toutes les 5 min.
En analysant les attributes envoyés via Traccar, je remarque que certaines positions arrivent sans le champ sat :
// Position avec fix frais (device actif)
{ "sat": 21, "motion": true, "batteryLevel": 100, "rssi": 31, ... }
// Position en mode économie (device immobile depuis quelques minutes)
{ "motion": false, "batteryLevel": 100, "rssi": 31, ... }
// ↑ pas de `sat`
Même lat/lon répétée, même inside_zone recalculé… mais pas de nouveau fix GPS.
Pourquoi
Beaucoup de firmwares de trackers low-power coupent le récepteur GPS quand le device est immobile depuis X temps (économie de batterie), et continuent à envoyer périodiquement la dernière position connue. Côté JT808, les bits indiquant « fix valide » et le sat count sont alors omis du body de position, ou mis à 0.
Traccar décode et expose ce que le tracker envoie : si sat est absent du frame, il est absent des attributes. Pas de warning, pas de flag explicite « ceci est un cache ».
Conséquence pour le métier
Une position « fantôme » est un cache, pas une mesure. Elle peut :
- Avoir lat/lon datant de plusieurs minutes, sans rapport avec où est le device maintenant
- Continuer à apparaître
inside_zone=truealors que le device est en fait sorti depuis (le GPS endormi ne sait pas) - Faussement déclencher une alerte si la dernière position de cache est juste hors zone
Pour toute logique métier qui dépend de où est le device maintenant (géofence, distance parcourue, vitesse instantanée, déclenchement d’alerte sur sortie), il faut filtrer.
Le marqueur fiable
attributes.sat présent et > 0 = fix GPS récent. Absent = position cachée. C’est plus fiable que :
motion(peut être true/false selon l’accéléromètre, indépendant du GPS)ignition(véhicules uniquement)fixTime(souvent identique àdeviceTime, peu significatif)
Gating asymétrique selon la criticité
Pour un cas géofence : éviter les faux positifs d’ouverture d’alerte est critique. Donc fail-closed sur sat à l’ouverture d’un épisode → si pas de sat reporté, on n’ouvre pas.
Mais on veut quand même fermer un épisode si le device rentre puis reste immobile (= mode économie) → fail-open sur sat à la fermeture.
C’est l’asymétrie expliquée dans [[82-asymmetrie-fail-open-closed-state-machine]].
Lessons learned
- Un tracker GPS qui envoie une position ≠ un tracker GPS qui fait un fix — la trame « position » peut contenir un cache de la dernière fix connue
attributes.satest le marqueur fiable d’un fix frais côté Traccar : présent = GPS actif au moment du fix, absent = cache du mode économiemotion: falseaccompagné desatabsent = signature du mode économie sur la plupart des firmwares low-power- Ne JAMAIS gater une logique critique sur lat/lon seule : toujours vérifier au moins
sat(oufixTimestrictement croissant) pour s’assurer qu’on parle d’une mesure récente - Le mode économie n’est pas désactivable cleanly sur la plupart des trackers low-cost — c’est un comportement firmware. Faut le gérer côté serveur
- Si tu veux des fix toujours frais, augmente l’intervalle T2 statique au lieu de baisser T1 (T1 trop court = batterie morte vite). Mais accepte qu’au-delà de quelques minutes immobiles, le GPS s’endort de toute façon.