Cursor on Target is het kleinste schema dat het meeste werk verzet in moderne tactische software. Eén XML-document — een paar honderd bytes — draagt een positie, een identiteit, een betrouwbaarheid en een levensduur, en dat document volstaat om een markering op elke kaart in een meshnetwerk te plaatsen. Het ontstond als een MITRE-initiatief om een operator een doel van het ene systeem naar het andere te laten doorgeven met een letterlijke cursorbeweging, en het werd de lingua franca van het TAK-ecosysteem. Dit is een veld-voor-veld doorloop van het Cursor on Target-formaat: het event-model, de typetaxonomie, de point-geometrie, de detail-container, en de realiteit van het correct genereren en valideren ervan.

1. het CoT-event-model

Elk CoT-bericht is één enkel <event>-element. Er is geen envelop, geen header, geen apart register van berichttypen — het root-element is het bericht. Dit is de bewuste ontwerpkeuze die CoT goedkoop maakt: één recursief schema draagt een bevriende soldaat, een vijandig voertuig, een geofence, een chatbericht, een noodbaken en een sensortrack, zonder een codepad per berichttype op de leiding.

Het event bevat precies één <point>-kind (waar het ding zich bevindt) en een optioneel <detail>-kind (al het andere erover). De semantiek van een event wordt volledig bepaald door zijn attributen plus de open inhoud van <detail>. Een parser die de vier kernattributen en het point begrijpt, kan elk CoT-bericht op een kaart weergeven zonder ook maar één detail-uitbreiding te begrijpen — die eigenschap van geleidelijke degradatie is waarom CoT schaalt over leveranciers die nooit met elkaar hebben afgestemd.

Het is de moeite waard stil te staan bij wat niet in het model zit. Er is geen onderscheid op schemaniveau tussen een eenheid, een markering, een chatbericht en een sensortrack — dat zijn allemaal events, alleen onderscheiden door hun type en de detail-kinderen die ze dragen. Er is geen bevestiging, geen volgnummer en geen sessie. CoT is fire-and-forget; betrouwbaarheid, ordening en aflevering worden naar beneden geduwd, naar het transport (TCP, TLS of multicast-UDP) en de applicatie daarboven. Dat minimalisme is de bepalende eigenschap van het schema: het doet één ding — zeggen waar iets is en wat het is, voor een begrensde tijd — en weigert een eigen protocolstack te laten groeien.

2. event-attributen

Het <event>-element draagt een vaste set attributen. version is de schemaversie, vrijwel altijd 2.0. uid is de wereldwijd unieke identificator voor het beschreven ding — niet het bericht, het ding. Het opnieuw verzenden van een bijgewerkte positie voor dezelfde entiteit hergebruikt dezelfde uid; zo weet een ontvanger dat hij een bestaande markering moet verplaatsen in plaats van een nieuwe te creëren. UID's zijn vrije tekenreeksen, maar TAK-clients gebruiken conventioneel een stabiele identificator per apparaat (bijv. ANDROID-serienummer) voor zelfrapportages.

type is de MITRE-typestring (Sectie 3). how beschrijft de herkomst van de data — hoe de positie is afgeleid. Veelvoorkomende waarden zijn h-g-i-g-o (mens, GPS-afgeleid, handmatig ingevoerd) en m-g (machine, GPS). Het how-veld is wat een fusion-engine in staat stelt een handmatig ingevoerde spotmelding anders te wegen dan een live GPS-feed.

De levenscyclus-triade is time, start en stale, allemaal ISO 8601 UTC-tijdstempels. time is wanneer het bericht is geproduceerd. start is wanneer de informatie geldig wordt. stale is wanneer ze verloopt. Het venster tussen start en stale is de geldigheidsduur van het event: nadat stale is verstreken, moet een conforme ontvanger het event als verlopen behandelen en de markering verwijderen of grijs maken. Een zelfpositie-rapport van een bewegende eenheid kan stale op time + 75 seconden zetten; een statisch meetpunt kan het uren vooruit zetten. Het correct krijgen van deze triade is de allergrootste bron van "spookmarkeringen" — zet stale te ver in de toekomst en dode tracks blijven hangen; zet het te kort en live tracks flikkeren.

Belangrijk inzicht: CoT heeft geen expliciet verwijderbericht. Je trekt een track terug door hem stale te laten worden, of door één laatste update te sturen waarvan de stale-tijd al in het verleden ligt. Statusbeheer in een CoT-netwerk is daarom een timeoutprobleem, geen transactieprobleem — elke ontvanger doet onafhankelijk garbage collection op zijn eigen klok, en daarom is klokafwijking tussen knooppunten een operationeel gevaar, geen cosmetisch.

3. de MITRE-typehiërarchie

Het type-attribuut codeert wat het ding is met behulp van MITRE's gepunte, met koppeltekens gescheiden taxonomie. De belangrijkste familie is het atoomtype, voorafgegaan door a-. Een atoomtype leest als een reeks van met koppeltekens gescheiden tokens: a-f-G-U-C.

Het eerste token na a is affiliatie: f vriend, h vijandig, n neutraal, u onbekend, p in afwachting, plus aangenomen/verdachte varianten. Het volgende token is gevechtsdimensie: G grond, A lucht, S oppervlak (zee), U onder water, P ruimte, F SOF. De resterende tokens dalen af in de MIL-STD-2525 symboolhiërarchie — a-f-G-U-C is een bevriende grondeenheid, gevecht, enzovoort. Een wildcard a-f-G-* betekent "een bevriend gronding, verder ongespecificeerd," en renderers vallen terug op het dichtstbijzijnde gedefinieerde symbool. Niet-atoomfamilies gebruiken andere prefixen: b- voor bits (sensor-/geometriegegevens, bijv. b-m-p-s-p-i voor een sensor point of interest), t- voor tasking, en y- voor replies. Het geniale van de gepunte taxonomie is dat ze prefix-decodeerbaar is: een client die alleen a-f-G kent, kan nog steeds een generiek bevriend-grondicoon plaatsen en netjes degraderen op de staart die hij niet herkent.

4. het point-element

Het <point>-element is verplicht en draagt vijf attributen, allemaal vereist. lat en lon zijn WGS-84 decimale graden. hae is de hoogte boven de ellipsoïde in meters — let op "boven de ellipsoïde," niet boven het gemiddelde zeeniveau; het mengen van HAE en orthometrische hoogte (de geoïde-offset kan meer dan 30 m bedragen) is een klassieke verticale-foutbug wanneer CoT in aanraking komt met een systeem dat MSL verwacht.

ce is de circulaire fout — de horizontale 1-sigma onzekerheidsstraal in meters. le is de lineaire fout — de verticale onzekerheid in meters. Samen laten ze een ontvanger een nauwkeurigheidsring tekenen in plaats van een bedrieglijk precies punt. De sentinelwaarde 9999999 (vaak geschreven als 9999999.0) betekent "onbekend" — het is geen echte meting, het is de null van het schema. Een handmatig geplaatst punt zonder ingemeten nauwkeurigheid draagt ce="9999999" le="9999999", en de fusielogica moet die waarde apart behandelen in plaats van hem als een fout van tienduizend kilometer te beschouwen.

Omdat elk attribuut vereist is, bestaat er niet zoiets als een point zonder hoogte of zonder foutschatting — het schema dwingt de producent om een claim te maken, zelfs als die claim "onbekend" is. Dit is een rustig goed ontwerpbesluit: een ontvanger hoeft nooit te raden of een ontbrekend veld nul, onbekend of standaard betekent. Het heeft ofwel een echt getal ofwel de sentinel, en de twee zijn ondubbelzinnig. De kosten zijn dat luie encoders hae="0.0" hardcoderen voor alles, wat erger is dan de sentinel omdat het eruitziet als een echte meting op zeeniveau. Als je de hoogte niet kent, zeg dat dan met 9999999; beweer geen nul.

5. het detail-element

Het <detail>-element is de open uitbreidingscontainer, en daar leeft het ecosysteem van CoT eigenlijk. Het schema legt geen beperking op aan zijn kinderen — elke welgevormde XML is toegestaan — wat TAK in staat stelde een rijk applicatieprotocol bovenop een generiek SA-formaat te leggen zonder het te forken.

De conventionele subelementen worden breed gerespecteerd. <contact> draagt een door mensen leesbaar callsign en, voor TAK, endpointadressering voor directe berichten. <track> draagt course en speed voor bewegende entiteiten, waardoor een statisch punt in een vector verandert. <remarks> is vrije tekst. <status> rapporteert zaken als het batterijniveau. <__group> (dubbele underscore) wijst de eenheid toe aan een TAK-teamkleur en -rol — Cyan, Team Member — wat de kleur van het icoon op het scherm van elke teamgenoot aanstuurt. <takv> rapporteert de TAK-clientversie, het apparaat en het platform. Omdat detail open is, slaat een ontvanger eenvoudigweg de kinderen over die hij niet herkent, wat de hele basis is van CoT- en TAK-interoperabiliteit over heterogene clients heen.

6. CoT versus Link 16 en VMF

CoT bezet dezelfde conceptuele ruimte als de J-serie en VMF, maar met tegenovergestelde ontwerpprioriteiten. Link 16 J-berichten zijn vaste-formaat, bit-gepakte woorden, op maat van een TDMA-slot; VMF (MIL-STD-6017) is een variabel maar strak bit-georiënteerd formaat voor dragers met lage bandbreedte. CoT is uitgebreide XML, gebouwd voor IP-netwerken waar bytes goedkoop zijn en ontwikkeltijd niet.

CoT naar een J-bericht mappen is in beide richtingen verliesgevend. CoT's affiliatie en gevechtsdimensie mappen netjes op J3.x track-velden en op VMF-identiteitsvelden, en lat/lon/hae vertalen rechtstreeks. De impedantiemismatch zit in precisie en semantiek: een J-serie track quality is een discrete opgesomde waarde, terwijl CoT's ce/le continue meters zijn; CoT's open <detail> heeft geen vaste-formaat tegenhanger en wordt bij een gateway in zijn geheel weggegooid. Omgekeerd hebben J-serie-velden zoals specifieke IFF-modi of PPLI-afgeleide netwerkdeelname geen native CoT-slot en moeten ze in aangepaste detail-uitbreidingen worden gesmokkeld. Gateways die CoT en tactische datalinks overbruggen, dragen daarom een eigenzinnige, handmatig onderhouden veldmap — hetzelfde vertaler-met-een-mening-probleem dat overal in NATO C2 opduikt.

7. streaming en TAK

In productie is CoT een stream, geen document. TAK Server multiplext CoT-events tussen clients: het zelfpositie-rapport van een eenheid stroomt omhoog over een persistente TCP- (vaak TLS-) verbinding met een configureerbare snelheid — gewoonlijk elke 1 tot 10 seconden, afhankelijk van beweging en de instelling "dynamic reporting" — en de server verspreidt het naar abonnees, optioneel gefilterd op missie, groep of geofence. Mesh SA, de serverloze modus, multicast dezelfde events over UDP op het lokale netwerk, zodat een squad werkt zonder infrastructuur.

Berichtsnelheden sturen de engineering. Een oefening met 200 knooppunten waarbij iedereen elke 2 seconden rapporteert, is 100 events/seconde aan alleen al zelfpositie, vóór sensortracks. De server onderhoudt voor niets daarvan een verwijderprotocol; in plaats daarvan doet elke client onafhankelijk garbage collection op de stale-tijdstempels die hij heeft gezien. Stale-gestuurde garbage collection is elegant — geen leider, geen consensus — maar het betekent dat een client die de verbinding verliest, zijn hele beeld zal zien verouderen en op schema zien verdwijnen, wat doorgaans het juiste gedrag is en af en toe een nare verrassing tijdens een comms-blackout.

8. CoT valideren en genereren

Het wire-formaat is vergevingsgezind, waardoor het gemakkelijk is om subtiel kapotte CoT uit te zenden. Valideer tijdens de ontwikkeling tegen het gepubliceerde Event.xsd-schema, maar ken de grenzen ervan: de XSD controleert dat point bestaat en dat de levenscyclusattributen aanwezig en correct getypeerd zijn, maar kan je niet vertellen dat je stale vóór je start ligt, dat je type-token betekenisloos is, of dat je hae een geoïdehoogte is die zich voordoet als ellipsoïdehoogte.

De terugkerende bugs met misvormde berichten zijn voorspelbaar. Tijdstempels zonder de afsluitende Z of met lokale-zone-offsets — CoT-tijd is UTC, punt uit, en een ontbrekende Z stuurt markeringen het verleden of de toekomst in. Omgekeerde levensduren waarbij stale aan start voorafgaat, wat events oplevert die dood bij aankomst zijn. Het hergebruiken van één enkele uid voor verschillende entiteiten, waardoor twee echte tracks samenvallen tot één flikkerende markering. Het uitzenden van een echt ogende ce in plaats van de 9999999-sentinel voor een niet-ingemeten punt, wat fusie verleidt om rommel te vertrouwen. Wanneer je een CoT-encoder bouwt, maak dan van de levenscyclus-triade een eersteklas type dat start ≤ stale afdwingt en UTC weergeeft met de Z, genereer UID's vanuit een stabiele entiteitssleutel in plaats van een teller per bericht, en zend de onbekend-sentinel expliciet uit. Krijg die vier invarianten goed en je CoT zal interoperabel zijn met clients die je nog nooit hebt gezien — wat het hele punt van het formaat is.