Cursor on Target (CoT) on XML-pohjainen viestiformaatti, jonka Yhdysvaltain ilmavoimien tutkimuslaboratorio kehitti 2000-luvun alussa ratkaisemaan tietyn ongelman: miten jakaa kohteen tai yksikön sijainti, identiteetti ja tila heterogeenisten sotilasjärjestelmien välillä, joita ei ole suunniteltu yhteentoimiviksi? CoT:n vastaus oli minimaalinen, laajennettavissa oleva XML-skeema, jota mikä tahansa järjestelmä voi tuottaa ja kuluttaa ilman keskitettyä rekisteriä tai koordinointiauktoriteettia.

Kaksi vuosikymmentä myöhemmin CoT:sta on tullut tosiasiallinen standardi sijaintiraportoinnille ja tapahtumien jakamiselle taktisessa reunaekosysteemissä. ATAK (Android Team Awareness Kit), WinTAK, iTAK, TAK Server ja sadat laajennukset ja räätälöidyt integraatiot puhuvat kaikki CoT:ta.

Mitä CoT on ja miten siitä tuli tosiasiallinen standardi

CoT saavutti hallitsevuuden ei muodollisen standardointiprosessin vaan operatiivisen hyödyllisyyden ajaman orgaanisen käyttöönoton kautta. ATAK:n CoT:n käyttöönotto omana sisäisenä ja ulkoisena dataformaattina oli kriittinen mahdollistava tekijä. ATAK:sta tuli hallitseva jalkautuneelle sotilaalle tarkoitettu tilannetietoisuussovellus, ja koska kaikki ATAK:n tuottama on CoT-tapahtuma, kaikkien ATAK:n kanssa integroituvien järjestelmien on puhuttava CoT:ta.

XML-rakenne: Tapahtuma-, piste- ja yksityiskohta-elementit

CoT-viesti on XML-dokumentti yhdellä juurielementillä: <event>. Jokainen CoT-viesti on tapahtuma riippumatta siitä, kuvaako se sijaintipäivitystä, anturiraporttia, chat-viestiä vai tehtävää. Tapahtuma-elementti kantaa useita pakollisia attribuutteja, jotka tunnistavat tapahtumatyypin, lähteen ja aikaikkuna.

Minimaalinen CoT-sijaintiraportti näyttää tältä:

<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>

Tärkeimpien attribuuttien purkaminen:

uid: Maailmanlaajuisesti yksilöllinen tunniste raportoitavalle kokonaisuudelle. UID pysyy samana kaikissa saman kokonaisuuden raporteissa.

type: Hierarkkinen merkkijono, joka koodaa kokonaisuuden luokituksen. Tyyppimerkkijono käyttää pistehierarkiaa: ensimmäinen merkki koodaa affiliaatioalueen (a = atomit, eli fyysiset kokonaisuudet), toinen segmentti koodaa affiliaation (f = ystävällinen, h = vihamielinen, n = neutraali, u = tuntematon), kolmas segmentti koodaa toimialueen (G = maa, A = ilma, S = meri).

time / start / stale: Kolme ISO 8601 UTC -aikaleimaa, jotka määrittelevät milloin tapahtuma luotiin (time), milloin raportoitu tila tuli voimaan (start), ja milloin raportti on katsottava vanhentuneeksi (stale). Vanhentumisaika on kriittinen – kuluttajan tulee lopettaa kokonaisuuden näyttäminen tai alentaa sen visuaalista luottamusta, kun nykyinen aika ylittää vanhentumisaikaleiman.

point: Kokonaisuuden sijainti WGS84-koordinaateissa. lat ja lon ovat desimaaliasteissa. hae on korkeus WGS84-ellipsoidin yläpuolella metreinä (ei korkeus merenpinnan yläpuolella). ce ja le ovat ympyrävirhe ja lineaarivirhe.

detail: Laajennettavissa oleva XML-elementti, joka kantaa sovelluskohtaista dataa. TAK-ekosysteemi määrittelee joukon tunnettuja yksityiskohdan alielementtejä (contact, group, status, track, precisionlocation), jotka ATAK tunnistaa ja näyttää.

CoT-tyypit: Luokitushierarkia

a-f-G (Ystävällinen maa): Ystävällinen maayksikkö. Renderöidään sinisellä suorakulmiolla MIL-STD-2525:n mukaan.

a-h-G (Vihamielinen maa): Vihamielinen maayksikkö. Renderöidään punaisella vinoneliöllä.

a-u-G (Tuntematon maa): Tuntematon affiliaation maakontakti. Renderöidään keltaisella kysymysmerkillä.

a-f-A (Ystävällinen ilma): Ystävällinen ilmajäljitys. Käytetään ystävällisille UAV:ille, helikoptereille ja kiinteäsiipialusten konetyyppien jäljityksiin.

b-m-p-s-p-loc: Tehtäväsuunnittelun välipiste – osa lähetys-/hallintatyyppihierarkiaa. Käytetään reittien suunnitteluun ja tehtäväkerrosten jakamiseen.

t-x-c-t: GeoChat-viesti. ATAK käyttää CoT:ta tekstiviestien välittämiseen käyttäjien välillä.

TAK Server: Reititys, suodatus ja federaatio

TAK Server on TAK-ekosysteemin palvelinpuolen komponentti. Se vastaanottaa CoT-viestejä yhdistyneiltä asiakkailta (ATAK-laitteet, WinTAK-instanssit, räätälöidyt integraatiot) ja reitittää ne muille yhdistyneille asiakkaille konfiguroitavien sääntöjen perusteella.

Federaatio yhdistää useita TAK Server -instansseja, mahdollistaen CoT-tapahtumien virtauksen palvelininstanssien välillä eri maantieteellisissä sijainneissa tai eri turvallisuustasoilla.

Toteutus Pythonilla: CoT:n jäsennys ja luonti

Python-ekosysteemissä on useita CoT-kirjastoja. pytak-kirjasto (TAK-yhteisön ylläpitämä) tarjoaa täydellisen toteutuksen CoT-tapahtumien luomiseen.

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")

Vanhentumisajan ohje: Aseta vanhentumisaika noin 2-kertaiseksi kokonaisuustyypin odotettuun päivitysväliin. Jalkautuneelle sotilaalle, joka päivittyy joka 30 sekunnissa, vanhentumisajan tulisi olla 60 sekuntia. UAV:lle, joka päivittyy 1 Hz:llä, vanhentumisajan tulisi olla 5–10 sekuntia.