Cursor on Target (CoT) is een XML-gebaseerd berichtformaat ontwikkeld door het US Air Force Research Laboratory in de vroege jaren 2000 om een specifiek probleem op te lossen: hoe deelt u de positie, identiteit en status van een doel of eenheid tussen heterogene militaire systemen die niet zijn ontworpen om samen te werken? Het antwoord van CoT was een minimaal, uitbreidbaar XML-schema dat elk systeem kon produceren en consumeren, zonder centraal register of coГ¶rdinerende autoriteit vereist.
Twee decennia later is CoT de de facto standaard geworden voor positierapportage en gebeurtenisuitwisseling in het tactische randecosysteem. ATAK (Android Team Awareness Kit), WinTAK, iTAK, TAK Server en honderden plugins en aangepaste integraties spreken allemaal CoT. Elke defensiesoftware die positiedata moet uitwisselen met tactische veldsystemen moet CoT-berichten genereren of consumeren. Dit artikel legt het formaat in detail uit en toont hoe u een CoT-parser en -generator implementeert.
Wat CoT Is en Hoe Het de De Facto Standaard Werd
CoT bereikte dominantie niet via een formeel standaardisatieproces maar via organische adoptie gedreven door operationeel nut. Het Air Force Research Laboratory bracht het formaat uit als onderdeel van zijn "Cursor on Target"-concept — het idee dat elke sensor elke wapen of weergave kan aansturen door een gemeenschappelijke datastructuur te delen die een doel beschrijft. De eenvoud van het XML-formaat, gecombineerd met uitbreidbaarheid en de afwezigheid van licentiebeperkingen, maakte snelle adoptie mogelijk.
De kritieke enabling factor was ATAK's adoptie van CoT als zijn interne en externe dataformaat. ATAK werd de dominante situationeel bewustzijnsapplicatie voor afgestegen soldaten, en omdat alles wat ATAK produceert een CoT-gebeurtenis is, moet elk systeem dat integreert met ATAK CoT spreken. Het formaat verspreidde zich van ATAK naar UAV-grondbeheersstations, voertuiggemonteerde BMS-displays, commandopostsoftware en webgebaseerde COP-systemen. Tegen het midden van de jaren 2010 was het bouwen van een tactisch softwaresysteem dat CoT niet ondersteunde een aanzienlijke integratielast.
XML-structuur: Event-, Point- en Detail-elementen
Een CoT-bericht is een XML-document met een enkel rootelement: <event>. Elk CoT-bericht is een gebeurtenis, ongeacht of het een positie-update, een sensorrapport, een chatbericht of een missieopdracht beschrijft. Het gebeurteniselement draagt verschillende verplichte attributen die het gebeurtenistype, de bron en het tijdvenster identificeren.
Een minimaal CoT-positierapport ziet er zo uit:
<event version="2.0"
uid="ALPHA-1-1"
type="a-f-G-U-C"
how="m-g"
time="2026-05-11T08:30:00.000Z"
start="2026-05-11T08:30:00.000Z"
stale="2026-05-11T08:31:00.000Z">
<point lat="48.3794"
lon="31.1656"
hae="150.0"
ce="10.0"
le="5.0"/>
<detail>
<contact callsign="ALPHA-1-1"/>
<group name="Cyan" role="Team Member"/>
<status battery="85"/>
<track speed="0.0" course="270.0"/>
</detail>
</event>
Uitleg van de sleutelattributen:
uid: Een wereldwijd unieke identifier voor de gerapporteerde entiteit. De UID blijft bestaan over alle rapporten voor dezelfde entiteit. Voor een soldaat die ATAK gebruikt, is de UID doorgaans afgeleid van de hardware-identifier van het apparaat. Voor een UAV is de UID doorgaans het serienummer van het luchtschip. UID-uniciteit wordt afgedwongen door conventie, niet door een register — implementaties moeten een betekenisvol, botsingsbestendig UID-schema gebruiken (bijvoorbeeld: <roepnaam>-<eenheid>-<apparaat-hash>).
type: Een hiГ«rarchische tekenreeks die de entiteitsclassificatie codeert. De typetekenreeks gebruikt een puntgescheiden hiГ«rarchie: het eerste teken codeert het affiliatiedomein (a = atomen, wat fysieke entiteiten betekent), het tweede segment codeert affiliatie (f = vriendelijk, h = vijandig, n = neutraal, u = onbekend), het derde segment codeert domein (G = grond, A = lucht, S = zee, U = onderwater), en volgende segmenten coderen eenheidstype. Het type a-f-G-U-C decodeert als: atoom, vriendelijk, grond, eenheid, gevecht. Het type a-h-A decodeert als: atoom, vijandig, lucht.
time / start / stale: Drie ISO 8601 UTC-tijdstempels die definiëren wanneer de gebeurtenis is gegenereerd (time), wanneer de gerapporteerde staat geldig werd (start) en wanneer het rapport als verlopen moet worden beschouwd (stale). De verouderde tijd is kritiek — een consument moet stoppen met het weergeven van een entiteit of de visuele betrouwbaarheid verminderen wanneer de huidige tijd de verouderde tijdstempel overschrijdt. Het stale correct instellen is een veelvoorkomende foutenbron: een rapport met een verouderde tijd 24 uur in de toekomst blijft voor onbepaalde tijd op de COP hangen nadat de bron offline gaat.
point: De positie van de entiteit in WGS84-coördinaten. lat en lon zijn in decimale graden. hae is hoogte boven het WGS84-ellipsoïde in meters (niet hoogte boven gemiddeld zeeniveau — wees u bewust van dit onderscheid bij integratie met systemen die MSL gebruiken). ce en le zijn cirkelfout en lijnfout — de 1-sigma positieonzekerheid in meters horizontaal en verticaal respectievelijk.
detail: Een uitbreidbaar XML-element dat toepassingsspecifieke data draagt. Het detail-element heeft geen vast schema — alle child-elementen zijn geldig. Het TAK-ecosysteem definieert een set bekende detail-subelementen (contact, groep, status, track, precisionlocation) die ATAK herkent en weergeeft. Aangepaste plugins voegen hun eigen detail-subelementen toe.
CoT-typen: ClassificatiehiГ«rarchie
De CoT-typehiГ«rarchie is het belangrijkste aspect van het formaat voor een C2-systeemontwikkelaar. De typetekenreeks bepaalt hoe het ontvangende systeem de gebeurtenis classificeert, symboliseert en verwerkt. Enkele kritieke typeprefixen:
a-f-G (Vriendelijke Grond): Vriendelijke grondeenheid. Weergegeven met blauw rechthoeksymbool per MIL-STD-2525. Alle vriendelijke afgestegen en gemonteerde eenheden gebruiken dit prefix, met aanvullende segmenten die het eenheidstype specificeren.
a-h-G (Vijandige Grond): Vijandige grondeenheid. Weergegeven met rood diamantsymbool. Track gerapporteerd door een sensor met vijandige beoordeling.
a-u-G (Onbekende Grond): Grondcontact met onbekende affiliatie. Weergegeven met geel vraagteken. Gebruikt voor ongeГЇdentificeerde radarcontacten en voor contacten waarbij affiliatie niet is beoordeeld.
a-f-A (Vriendelijke Lucht): Vriendelijk luchttrack. Gebruikt voor vriendelijke UAV's, helikopters en vliegtuigen met vaste vleugels.
b-m-p-s-p-loc: Een missieplanning waypoint — onderdeel van de uitzending/beheer typehiërarchie. Gebruikt voor routeplanning en missieoverlay-uitwisseling.
t-x-c-t: Een GeoChat-bericht. ATAK gebruikt CoT om tekstberichten tussen gebruikers te verzenden; de typehiГ«rarchie identificeert de gebeurtenis als een communicatiegebeurtenis in plaats van een positierapport.
TAK Server: Routering, Filtering en Federatie
TAK Server is de server-side component van het TAK-ecosysteem. Het ontvangt CoT-berichten van verbonden clients (ATAK-apparaten, WinTAK-instanties, aangepaste integraties) en routeert ze naar andere verbonden clients op basis van configureerbare regels. Een basisimplementatie van TAK Server stelt alle verbonden clients in staat alle CoT-gebeurtenissen van alle andere verbonden clients te zien — een plat uitzendmodel.
Voor operationele implementaties zijn filtering en federatie essentieel. Datapakketten (configuratiebestanden gedistribueerd aan clients) bepalen welke clients verbinding maken met welke TAK Server-instanties. Groepen beperken welke clients welke gebeurtenissen kunnen zien — clients toewijzen aan een groep betekent dat ze alleen gebeurtenissen ontvangen van andere clients in dezelfde groep. Enterprise Sync stelt in staat missiepakketten, kaarten en configuratiedata te distribueren van de TAK Server naar verbonden clients.
Federatie verbindt meerdere TAK Server-instanties, waardoor CoT-gebeurtenissen kunnen stromen tussen serverinstanties op verschillende geografische locaties of op verschillende beveiligingsniveaus. Een TAK Server op bataljonniveau kan federeren met een TAK Server op brigadeniveau, waarbij federatieregels bepalen welke gebeurtenistypen de grens overschrijden. Federatie is het mechanisme waarmee posities van lagere echelons zichtbaar worden op COP-systemen van hogere echelons zonder directe clientverbindingen naar het hogere systeem te vereisen.
Implementatie in Python: Parseren en Genereren van CoT
Het Python-ecosysteem heeft verschillende CoT-bibliotheken. De pytak-bibliotheek (onderhouden door de TAK-gemeenschap) biedt een volledige implementatie van CoT-gebeurtenisgeneratie en een wachtrij-gebaseerde architectuur voor integratie met TAK Server. Voor parseren is Python's standaard xml.etree.ElementTree voldoende; voor productie wordt lxml met XSD-validatie aanbevolen.
Een positierapport genereren:
import uuid
from datetime import datetime, timezone, timedelta
import xml.etree.ElementTree as ET
def generate_cot_position(uid, callsign, lat, lon, hae, affiliation="f", domain="G"):
now = datetime.now(timezone.utc)
stale = now + timedelta(minutes=1)
fmt = "%Y-%m-%dT%H:%M:%S.000Z"
event = ET.Element("event", {
"version": "2.0",
"uid": uid,
"type": f"a-{affiliation}-{domain}-U-C",
"how": "m-g",
"time": now.strftime(fmt),
"start": now.strftime(fmt),
"stale": stale.strftime(fmt)
})
ET.SubElement(event, "point", {
"lat": str(lat),
"lon": str(lon),
"hae": str(hae),
"ce": "10.0",
"le": "5.0"
})
detail = ET.SubElement(event, "detail")
ET.SubElement(detail, "contact", {"callsign": callsign})
ET.SubElement(detail, "track", {"speed": "0.0", "course": "0.0"})
return ET.tostring(event, encoding="unicode")
Verbinding maken met een TAK Server via TCP en een CoT-gebeurtenis verzenden vereist het opzetten van een TCP-socketverbinding naar poort 8087 (of TLS op 8089) en het schrijven van de XML-tekenreeks gevolgd door een nul-terminator byte (\x00 of \n afhankelijk van de serverversie). De pytak-bibliotheek abstraheert dit en ondersteunt ook multicast UDP voor netwerk-lokale implementaties.
Richtlijn voor verouderde tijd: Stel de verouderde tijd in op ongeveer 2Г— het verwachte update-interval voor het entiteitstype. Voor een afgestegen soldaat die elke 30 seconden bijwerkt, moet stale 60 seconden zijn. Voor een UAV die bijwerkt op 1 Hz, moet stale 5-10 seconden zijn. Een verouderde tijd die te lang is, zorgt ervoor dat spooktracks op de COP blijven nadat een entiteit offline gaat; een verouderde tijd die te kort is, zorgt ervoor dat geldige tracks flikkeren wanneer updates worden vertraagd door netwerkjitter.