mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-06-02 06:24:16 +02:00
feat(takserver): Upgrade TAKPacket-SDK to v0.5.0 and delegate sanitization to SDK (#5658)
Co-authored-by: James Rich <james.a.rich@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -120,6 +120,9 @@ wire {
|
||||
prune("meshtastic.GeoPointSource")
|
||||
prune("meshtastic.TakTalkMessage")
|
||||
prune("meshtastic.TakTalkRoomData")
|
||||
// Marti is also shipped by the TAKPacket-SDK jar (org.meshtastic.proto.Marti),
|
||||
// so it must be pruned here too or R8 fails with a duplicate-class error at
|
||||
// release minify. (Team/MemberRole are NOT shipped by the SDK, so they stay.)
|
||||
prune("meshtastic.Marti")
|
||||
}
|
||||
|
||||
|
||||
@@ -134,6 +134,29 @@ core:takserver
|
||||
|
||||
The Local TAK Server can be enabled from the app's Settings screen. When running, ATAK/iTAK clients on the same network can connect to `<device-ip>:8089` and their position reports are automatically bridged onto the mesh. Mesh node positions are broadcast to all connected TAK clients in real time.
|
||||
|
||||
## TAKPacket-SDK consumer & version-bump playbook
|
||||
|
||||
This module consumes the external [TAKPacket-SDK](https://github.com/meshtastic/TAKPacket-SDK) (`org.meshtastic:takpacket-sdk-jvm`) for the V2 wire format. The SDK does CoT-XML ↔ `TAKPacketV2` ↔ zstd-compressed bytes; it owns the dictionaries and the schema.
|
||||
|
||||
**Two V2 wire paths — keep both in mind when the SDK changes:**
|
||||
|
||||
- **Path A (primary, SDK-delegated):** `TakSdkCompressor` / `TakV2Compressor` call the SDK's `CotXmlParser` / `CotXmlBuilder` / `TakCompressor`. This path is insulated from proto field renames *as long as* the SDK artifact and the proto submodule are bumped together.
|
||||
- **Path B (fallback, Android-local Wire proto):** `TAKPacketV2Conversion.kt` builds and reads the Wire-generated `TAKPacketV2` **directly** (used on the SDK-failure send fallback and as the iOS receive stub). It references proto fields by name, so it **breaks at compile time** on any schema change and must be updated in lockstep.
|
||||
|
||||
**The proto submodule (`core/proto/src/main/proto`) must track the SDK's proto.** It is the same `meshtastic/protobufs` repo the SDK generates from. `:core:proto`'s `build.gradle.kts` prunes the atak messages owned by the SDK's own Wire codegen.
|
||||
|
||||
**When bumping to a new (wire-breaking) SDK version:**
|
||||
1. `gradle/libs.versions.toml` → `takpacket-sdk = "<new>"`.
|
||||
2. Bump the `core/proto/src/main/proto` submodule to the matching protobufs commit (push it upstream first, then `git -C core/proto/src/main/proto checkout <sha>` and commit the gitlink). For *local* testing before the protobufs commit is pushed, syncing just `meshtastic/atak.proto`'s content works (Wire regenerates from the working tree).
|
||||
3. **Keep `core/proto/build.gradle.kts`'s `prune(...)` list complete.** The SDK jar ships its own Wire codegen of `org.meshtastic.proto.*` for the WHOLE atak.proto, so `:core:proto` must `prune()` EVERY atak message/enum the SDK ships — otherwise both define the same class and the release **R8 build fails** with `Type org.meshtastic.proto.X is defined multiple times` (it compiles + passes `jvmTest` fine; only R8/dexing catches it). When the schema gains a message (e.g. `Marti` in v0.3.2 — which was missed and broke R8), add a matching `prune("meshtastic.X")` line (+ one per nested proto type — prune does NOT cascade). Verify with: `unzip -l <sdk jar> | grep org/meshtastic/proto/` vs the prune list. (Exception: types the SDK does NOT ship — e.g. `Team`, `MemberRole` — must stay UNpruned, or the bridge loses them.)
|
||||
4. Update **Path B** (`TAKPacketV2Conversion.kt`) and the **bridge** (`TakV2Compressor.kt`) for any renamed/removed/added wire fields.
|
||||
5. Test against the local SDK: publish it (`cd TAKPacket-SDK/kotlin && ./gradlew publishToMavenLocal`), then `./gradlew :core:takserver:jvmTest -PuseMavenLocal` (needs **JDK 21**; `-PuseMavenLocal` is gated in `settings.gradle.kts`). Against a *published* version, drop `-PuseMavenLocal` and add `--refresh-dependencies` to pull from Maven Central.
|
||||
6. Verify the release R8 build (`./gradlew :androidApp:minifyFdroidReleaseWithR8`) — catches prune-list gaps (above) AND confirms the `zstd-jni:…@aar` native lib survives minification (`core/takserver/build.gradle.kts` wires the `@aar` for androidMain, plain jar + `xpp3` for jvmMain).
|
||||
|
||||
**v0.4.0 wire facts (so you don't re-introduce phantom changes):** PLI is **implicit** — the `bool pli` oneof arm was removed; a packet with no payload variant + an `a-f-*` cot type is a PLI. `DrawnShape` vertices are two packed `repeated sint32` columns (`vertex_lat_deltas` / `vertex_lon_deltas`, deltas from the envelope point), not `repeated CotGeoPoint`. **`course` stays `deg×100`, `uid` stays a string, `stale_seconds` stays tag 16** — these were evaluated and deliberately NOT changed; do not "fix" the ×100 scaling in `TAKPacketV2Conversion.kt`.
|
||||
|
||||
**Debug "Send Test CoTs":** `TakMeshTestRunner` sends the bundled `tak_test_fixtures/*.xml` through the SDK path (parse → strip → compress → send). `taktalk_sanity.xml` is intentionally first. The fixtures need no edits across SDK wire breaks because they ride the SDK path; they ARE the regression surface (drawing_* exercise packed vertices, pli_* exercise implicit PLI).
|
||||
|
||||
## Dependency Graph
|
||||
|
||||
<!--region graph-->
|
||||
|
||||
+12
-81
@@ -39,6 +39,7 @@ import org.meshtastic.proto.MeshPacket
|
||||
import org.meshtastic.proto.PortNum
|
||||
import org.meshtastic.proto.TAKPacket
|
||||
import org.meshtastic.proto.Team
|
||||
import org.meshtastic.tak.CotMeshSanitizer
|
||||
import kotlin.concurrent.Volatile
|
||||
import kotlin.concurrent.atomics.AtomicBoolean
|
||||
import kotlin.concurrent.atomics.ExperimentalAtomicApi
|
||||
@@ -330,15 +331,11 @@ class TAKMeshIntegration(
|
||||
// app's own CoTXmlParser would strip. Forward the SDK-generated XML
|
||||
// directly to TAK clients without re-parsing.
|
||||
val rawXml = TakV2Compressor.decompressToXml(wirePayload)
|
||||
// Strip the XML declaration and collapse whitespace — ATAK's TCP
|
||||
// streaming parser expects bare <event>...</event> on a single
|
||||
// line, not a formatted XML document with <?xml ...?> prologue.
|
||||
val xml =
|
||||
rawXml
|
||||
.replace("""<?xml version="1.0" encoding="UTF-8"?>""", "")
|
||||
.replace(Regex("""\s*\n\s*"""), "")
|
||||
.trim()
|
||||
Logger.d { "RAW CoT IN (mesh): $xml" }
|
||||
// Normalize for the TAK TCP stream — drop the <?xml ...?> prologue
|
||||
// and collapse inter-tag whitespace so ATAK's streaming parser sees
|
||||
// bare <event>...</event> on a single line. Centralized in the SDK.
|
||||
val xml = CotMeshSanitizer.normalizeCotXml(rawXml)
|
||||
// Logger.d { "RAW CoT IN (mesh): $xml" }
|
||||
// Routes: ATAK ignores b-m-r CoT events over TCP streaming.
|
||||
// Convert to a KML data package and write to ATAK's auto-import dir.
|
||||
if (xml.contains("""type="b-m-r"""")) {
|
||||
@@ -481,78 +478,12 @@ class TAKMeshIntegration(
|
||||
}
|
||||
|
||||
/**
|
||||
* Strip non-essential XML elements before mesh compression to save wire bytes. These elements add 100-200 bytes
|
||||
* but aren't needed for rendering shapes, routes, chats, markers, PLI, or any other payload on the receiving
|
||||
* end.
|
||||
* Strip non-essential CoT detail before mesh compression to save wire bytes. Delegates to the SDK's
|
||||
* [CotMeshSanitizer] so the strip rules live in ONE golden-tested place shared by every consumer (Android,
|
||||
* Apple, …) and can't drift between sides. Drift here once silently stripped TAK-Talk `<voice>` / `<marti>` and
|
||||
* broke the feature end-to-end — guarded by the strip-preservation test in TAKMeshIntegrationTest and by
|
||||
* CotMeshSanitizerTest in the SDK.
|
||||
*/
|
||||
private val STRIP_PATTERNS =
|
||||
listOf(
|
||||
"""<takv[^>]*/>""", // TAK version (self-closing)
|
||||
"""<takv[^>]*>.*?</takv>""", // TAK version (paired)
|
||||
// NOTE: <voice/>, <voice_profile_id*>, and <marti> are
|
||||
// intentionally NOT stripped here. SDK v0.3.2 carries them
|
||||
// end-to-end so TAKTALK receivers can:
|
||||
// * fire TTS playback on <voice/> + <marti><dest callsign=ME>
|
||||
// * recognize TAKTALK-origin chats via <voice_profile_id>
|
||||
// Stripping these saves ~10-20B per packet but breaks TAKTALK
|
||||
// voice messaging and directed-chat routing on the receiver —
|
||||
// an unacceptable tradeoff. The previous broad pattern
|
||||
// `<voice[^>]*/>` ALSO matched `<voice_profile_id/>`, which is
|
||||
// why TAKTALK b-t-f chats lost their TAKTALK-origin marker too.
|
||||
"""<__geofence[^>]*/>""", // geofence config
|
||||
"""<__geofence[^>]*>.*?</__geofence>""",
|
||||
"""<tog[^>]*/>""", // toggle state
|
||||
"""<archive[^>]*/>""", // archive marker
|
||||
"""<__shapeExtras[^>]*/>""", // shape extras
|
||||
"""<__shapeExtras[^>]*>.*?</__shapeExtras>""",
|
||||
"""<creator[^>]*/>""", // creator info
|
||||
"""<creator[^>]*>.*?</creator>""",
|
||||
"""<remarks[^>]*/>""", // empty remarks (self-closing)
|
||||
"""<remarks[^>]*></remarks>""", // empty remarks (paired)
|
||||
"""<strokeStyle[^>]*/>""", // stroke style (SDK uses color fields)
|
||||
"""<precisionlocation[^>]*/>""", // precision location metadata
|
||||
"""<precisionlocation[^>]*>.*?</precisionlocation>""",
|
||||
"""<precisionLocation[^>]*/>""", // iTAK camelCase variant
|
||||
"""<precisionLocation[^>]*>.*?</precisionLocation>""",
|
||||
)
|
||||
.map { Regex("(?s)$it") }
|
||||
|
||||
// Strip any attribute with value "???" — unknown/placeholder metadata
|
||||
private val UNKNOWN_ATTR_PATTERN = Regex("""\s+\w+\s*=\s*"[?]{3}"""")
|
||||
|
||||
// Strip specific named attributes that the SDK doesn't use (display-only)
|
||||
private val STRIP_ATTR_PATTERNS =
|
||||
listOf(
|
||||
"""\s+routetype\s*=\s*"[^"]*"""", // route display type (SDK doesn't use)
|
||||
"""\s+order\s*=\s*"[^"]*"""", // checkpoint order label (SDK doesn't use)
|
||||
"""\s+color\s*=\s*"[^"]*"""", // link_attr color (SDK uses strokeColor instead)
|
||||
"""\s+access\s*=\s*"[^"]*"""", // access control (not relevant for mesh)
|
||||
"""\s+callsign\s*=\s*""""", // empty callsign attributes (e.g. checkpoints)
|
||||
"""\s+phone\s*=\s*""""", // empty phone attributes
|
||||
)
|
||||
.map { Regex(it) }
|
||||
|
||||
// Route waypoint UID stripping — UIDs are full 36-char UUIDs that cost
|
||||
// ~40 bytes each in the proto wire format. The receiving TAK client derives
|
||||
// its own UIDs, so these are pure overhead. Only targets <link> elements
|
||||
// with a point= attribute (route waypoints / shape vertices).
|
||||
private val ROUTE_LINK_ELEM_RE = Regex("""<link\s[^>]*\bpoint="[^"]*"[^>]*/>""")
|
||||
private val LINK_UID_ATTR_RE = Regex("""\s+uid="[^"]*"""")
|
||||
|
||||
fun stripNonEssentialElements(xml: String): String {
|
||||
var result = xml
|
||||
for (pattern in STRIP_PATTERNS) {
|
||||
result = pattern.replace(result, "")
|
||||
}
|
||||
// Strip ??? attributes from remaining elements
|
||||
result = UNKNOWN_ATTR_PATTERN.replace(result, "")
|
||||
// Strip specific display-only attributes
|
||||
for (pattern in STRIP_ATTR_PATTERNS) {
|
||||
result = pattern.replace(result, "")
|
||||
}
|
||||
// Strip uid from route waypoint <link> elements (receiver derives UIDs)
|
||||
result = ROUTE_LINK_ELEM_RE.replace(result) { LINK_UID_ATTR_RE.replace(it.value, "") }
|
||||
return result
|
||||
}
|
||||
fun stripNonEssentialElements(xml: String): String = CotMeshSanitizer.stripNonEssentialForMesh(xml)
|
||||
}
|
||||
}
|
||||
|
||||
+21
-3
@@ -82,7 +82,8 @@ object TAKPacketV2Conversion {
|
||||
battery = battery,
|
||||
geo_src = GeoPointSource.GeoPointSource_GPS,
|
||||
alt_src = GeoPointSource.GeoPointSource_GPS,
|
||||
pli = true,
|
||||
// v0.4.0: PLI is implicit — no payload_variant is set (the bool pli
|
||||
// oneof arm was removed). An a-f-* packet with no variant IS a PLI.
|
||||
)
|
||||
}
|
||||
|
||||
@@ -170,8 +171,11 @@ object TAKPacketV2Conversion {
|
||||
val timeNow = Clock.System.now()
|
||||
val (senderUid, messageId) = TakConversionHelpers.parseDeviceCallsign(rawDeviceCallsign)
|
||||
|
||||
// PLI
|
||||
if (pli != null) {
|
||||
// PLI — v0.4.0: implicit (the `bool pli` oneof arm was removed). A packet
|
||||
// with NO typed payload_variant arm set is a position report. Every typed
|
||||
// arm must be excluded so a shape/marker/route/etc. isn't mis-rendered as a
|
||||
// PLI dot if it ever reaches this fallback path.
|
||||
if (!hasTypedPayload()) {
|
||||
val staleMinutes = if (stale_seconds > 0) (stale_seconds / 60) else DEFAULT_TAK_STALE_MINUTES
|
||||
// Restore the original CoT type and how from the packet — pli() defaults to
|
||||
// DEFAULT_PLI_COT_TYPE/"m-g" but the sending node may have been hostile (a-h-*),
|
||||
@@ -267,4 +271,18 @@ object TAKPacketV2Conversion {
|
||||
Logger.w { "Cannot convert TAKPacketV2 to CoTMessage: no PLI, chat, or raw_detail payload" }
|
||||
return null
|
||||
}
|
||||
|
||||
/** True when any typed payload_variant arm is set (i.e. NOT a bare PLI). */
|
||||
private fun TAKPacketV2.hasTypedPayload(): Boolean = chat != null ||
|
||||
taktalk != null ||
|
||||
taktalk_room != null ||
|
||||
aircraft != null ||
|
||||
shape != null ||
|
||||
marker != null ||
|
||||
rab != null ||
|
||||
route != null ||
|
||||
casevac != null ||
|
||||
emergency != null ||
|
||||
task != null ||
|
||||
raw_detail != null
|
||||
}
|
||||
|
||||
+33
@@ -359,6 +359,39 @@ class TAKMeshIntegrationTest {
|
||||
assertTrue(h.commandSender.sentPackets.isEmpty())
|
||||
}
|
||||
|
||||
// ── TAK-Talk strip preservation (regression) ────────────────────────────
|
||||
|
||||
@Test
|
||||
fun `stripNonEssentialElements preserves TAK-Talk voice and marti`() {
|
||||
// Regression guard: <voice/> (push-to-talk marker) and <marti><dest .../>
|
||||
// </marti> (directed routing) were once added to STRIP_PATTERNS, which
|
||||
// silently broke TAK-Talk end-to-end — ATAK received the m-t-t CoT but its
|
||||
// plugin could neither play (no <voice/>) nor route (no <marti/>) it. Both
|
||||
// MUST survive the send-side strip.
|
||||
val mtt =
|
||||
"""
|
||||
<event version="2.0" uid="TAKTALK-MESSAGE-test" type="m-t-t" how="null" time="t" start="t" stale="t">
|
||||
<point lat="0.0" lon="0.0" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<callsign>ASPEN</callsign><lang>English</lang><text>Testing 123</text>
|
||||
<chatroom-id>1</chatroom-id><takv version="x"/><voice/>
|
||||
<marti><dest callsign="ETHEL"/></marti>
|
||||
</detail>
|
||||
</event>
|
||||
"""
|
||||
.trimIndent()
|
||||
|
||||
val stripped = TAKMeshIntegration.stripNonEssentialElements(mtt)
|
||||
|
||||
assertTrue(stripped.contains("<voice/>"), "TAK-Talk <voice/> PTT marker must survive strip")
|
||||
assertTrue(
|
||||
stripped.contains("<marti>") && stripped.contains("dest callsign=\"ETHEL\""),
|
||||
"TAK-Talk <marti> directed-routing must survive strip",
|
||||
)
|
||||
// Sanity: genuinely non-essential elements are still stripped.
|
||||
assertTrue(!stripped.contains("<takv"), "non-essential <takv> should still be stripped")
|
||||
}
|
||||
|
||||
// ── Inbound mesh → TAK client (V1) ──────────────────────────────────────
|
||||
|
||||
@Test
|
||||
|
||||
+2
-1
@@ -64,7 +64,8 @@ class TAKPacketV2RawDetailTest {
|
||||
|
||||
// raw_detail must be populated; structured payloads must be null.
|
||||
assertNotNull(takPacketV2.raw_detail, "raw_detail must hold the detail bytes")
|
||||
assertNull(takPacketV2.pli, "PLI payload must not be set for u-d-c-c")
|
||||
// v0.4.0: the `bool pli` oneof arm was removed (PLI is implicit). A populated
|
||||
// raw_detail already proves this is NOT an implicit PLI.
|
||||
assertNull(takPacketV2.chat, "chat payload must not be set for u-d-c-c")
|
||||
assertEquals("u-d-c-c", takPacketV2.cot_type_str.ifEmpty { "u-d-c-c" })
|
||||
// Stripping must have fired: the raw_detail bytes must NOT contain the
|
||||
|
||||
+2
-1
@@ -66,7 +66,8 @@ class TakV2CompressorTaktalkTest {
|
||||
assertEquals("1", decompressed.taktalk!!.chatroom_id)
|
||||
assertEquals("English", decompressed.taktalk!!.lang)
|
||||
assertTrue(decompressed.taktalk!!.from_voice, "<voice/> marker must survive")
|
||||
assertNull(decompressed.pli, "must not fall back to Pli payload")
|
||||
// v0.4.0+: `bool pli` was removed (PLI is implicit). A populated `taktalk`
|
||||
// arm already proves this did not degrade to an (implicit) PLI.
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
+16
-15
@@ -97,8 +97,6 @@ internal actual object TakV2Compressor {
|
||||
|
||||
val payload =
|
||||
when {
|
||||
packet.pli != null -> TakPacketV2Data.Payload.Pli(true)
|
||||
|
||||
packet.chat != null ->
|
||||
TakPacketV2Data.Payload.Chat(
|
||||
message = packet.chat!!.message,
|
||||
@@ -174,11 +172,14 @@ internal actual object TakV2Compressor {
|
||||
fillColor = s.fill_color.value,
|
||||
fillArgb = s.fill_argb,
|
||||
labelsOn = s.labels_on,
|
||||
// v0.4.0: vertices are two packed sint32 delta columns
|
||||
// (vertex_lat_deltas / vertex_lon_deltas), zigzag deltas
|
||||
// from the event anchor; SDK data stores absolute lat/lon.
|
||||
vertices =
|
||||
s.vertices.map { v ->
|
||||
s.vertex_lat_deltas.zip(s.vertex_lon_deltas) { latD, lonD ->
|
||||
TakPacketV2Data.Payload.Vertex(
|
||||
latI = packet.latitude_i + v.lat_delta_i,
|
||||
lonI = packet.longitude_i + v.lon_delta_i,
|
||||
latI = packet.latitude_i + latD,
|
||||
lonI = packet.longitude_i + lonD,
|
||||
)
|
||||
},
|
||||
truncated = s.truncated,
|
||||
@@ -284,7 +285,10 @@ internal actual object TakV2Compressor {
|
||||
|
||||
packet.raw_detail != null -> TakPacketV2Data.Payload.RawDetail(packet.raw_detail!!.toByteArray())
|
||||
|
||||
else -> TakPacketV2Data.Payload.None
|
||||
// v0.4.0: PLI is implicit — a packet with no payload_variant set
|
||||
// is a position report (the bool pli oneof arm was removed).
|
||||
// Mirrors the SDK serializer's toData default.
|
||||
else -> TakPacketV2Data.Payload.Pli(true)
|
||||
}
|
||||
|
||||
return TakPacketV2Data(
|
||||
@@ -359,7 +363,8 @@ internal actual object TakV2Compressor {
|
||||
tak_os = data.takOs,
|
||||
endpoint = data.endpoint,
|
||||
phone = data.phone,
|
||||
pli = if (data.payload is TakPacketV2Data.Payload.Pli) true else null,
|
||||
// v0.4.0: PLI is implicit — no payload_variant is set for a PLI (the
|
||||
// bool pli oneof arm was removed). Pli/None simply set no oneof field.
|
||||
chat =
|
||||
(data.payload as? TakPacketV2Data.Payload.Chat)?.let { chat ->
|
||||
WireGeoChat(
|
||||
@@ -409,14 +414,10 @@ internal actual object TakV2Compressor {
|
||||
fill_color = WireTeam.fromValue(s.fillColor) ?: WireTeam.Unspecifed_Color,
|
||||
fill_argb = s.fillArgb,
|
||||
labels_on = s.labelsOn,
|
||||
// Delta-encode vertices relative to the event anchor.
|
||||
vertices =
|
||||
s.vertices.map { v ->
|
||||
WireCotGeoPoint(
|
||||
lat_delta_i = v.latI - data.latitudeI,
|
||||
lon_delta_i = v.lonI - data.longitudeI,
|
||||
)
|
||||
},
|
||||
// v0.4.0: delta-encode vertices into two packed sint32 columns
|
||||
// relative to the event anchor (was repeated CotGeoPoint).
|
||||
vertex_lat_deltas = s.vertices.map { it.latI - data.latitudeI },
|
||||
vertex_lon_deltas = s.vertices.map { it.lonI - data.longitudeI },
|
||||
truncated = s.truncated,
|
||||
bullseye_distance_dm = s.bullseyeDistanceDm,
|
||||
bullseye_bearing_ref = s.bullseyeBearingRef,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<event version="2.0" uid="ICAO000001" type="a-n-A-C-F" how="m-g" time="2026-03-15T17:45:00Z" start="2026-03-15T17:45:00Z" stale="2026-03-15T17:45:45Z">
|
||||
<point lat="15.00000" lon="160.00000" hae="3048" ce="9999999" le="9999999"/>
|
||||
<point lat="33.1320" lon="-107.2480" hae="3048" ce="9999999" le="9999999"/>
|
||||
<detail><contact callsign="TST100-NTEST1-A3"/><track speed="223.58" course="76.16"/><UID Droid="TST100-NTEST1-A3"/><_radio rssi="-19.4" gps="true"/><link uid="ANDROID-0000000000000003" type="a-f-G-U" relation="p-p"/><remarks>000001 ICAO: 000001 REG: NTEST1 Flight: TST100 Type: A321 Squawk: 3456 DO-260B Category: A3 #adsbreceiver</remarks><_flow-tags_ TAK-Server-00000000000000000000000000000001="2026-03-15T17:45:00Z"/></detail>
|
||||
</event>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<event version="2.0" uid="ICAO-000002" type="a-h-A-M-F-F" how="m-g" time="2026-03-15T18:20:00Z" start="2026-03-15T18:20:00Z" stale="2026-03-15T18:20:48Z">
|
||||
<point lat="15.00000" lon="160.00200" hae="10000" ce="9999999" le="9999999"/>
|
||||
<point lat="33.1248" lon="-107.2576" hae="10000" ce="9999999" le="9999999"/>
|
||||
<detail><contact callsign="TST200-NTEST2-HAWK"/><remarks>TST200 NTEST2 000002 Cat:A6 Type:HAWK sim-host@example.test</remarks><_aircot_ flight="TST200" reg="NTEST2" cat="A6" icao="000002" cot_host_id="sim-host@example.test" type="HAWK"/><_flow-tags_ TAK-Server-00000000000000000000000000000001="2026-03-15T18:20:00Z"/></detail>
|
||||
</event>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<event version="2.0" uid="alert-b3c4d5e6" type="b-a-o-opn" how="h-e" time="2026-03-15T20:30:00Z" start="2026-03-15T20:30:00Z" stale="2026-03-15T20:35:00Z">
|
||||
<point lat="18.00000" lon="140.00000" hae="150" ce="15" le="15"/>
|
||||
<point lat="33.1310" lon="-107.2490" hae="150" ce="15" le="15"/>
|
||||
<detail>
|
||||
<contact callsign="ALPHA-6"/>
|
||||
<remarks>Troops in contact, requesting support at grid reference</remarks>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<event version="2.0" uid="casevac-f7e6d5c4" type="b-r-f-h-c" how="h-e" time="2026-03-15T20:00:00Z" start="2026-03-15T20:00:00Z" stale="2026-03-15T20:10:00Z">
|
||||
<point lat="18.00000" lon="141.00000" hae="100" ce="10" le="10"/>
|
||||
<point lat="33.1258" lon="-107.2564" hae="100" ce="10" le="10"/>
|
||||
<detail>
|
||||
<contact callsign="CASEVAC-1"/>
|
||||
<link uid="ANDROID-0000000000000002" relation="p-p" type="a-f-G-U-C"/>
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="medevac-01" type="b-r-f-h-c" time="2026-03-15T20:00:00Z" start="2026-03-15T20:00:00Z" stale="2026-03-15T20:10:00Z" how="h-e">
|
||||
<point lat="17.99800" lon="140.00150" hae="100" ce="10" le="10"/>
|
||||
<point lat="33.1252" lon="-107.2570" hae="100" ce="10" le="10"/>
|
||||
<detail>
|
||||
<contact callsign="Casevac-1"/>
|
||||
<_medevac_ precedence="Urgent" hoist="true" extraction_equipment="true" ventilator="false" blood="false" litter="2" ambulatory="1" security="N" hlz_marking="Smoke" zone_prot_marker="Green smoke" us_military="2" us_civilian="0" non_us_military="1" non_us_civilian="0" epw="0" child="0" terrain_slope="true" terrain_rough="false" terrain_loose="true" terrain_trees="false" terrain_wires="false" terrain_other="false" freq="38.90"/>
|
||||
<_medevac_ title="M-1" medline_remarks="2 litter 1 amb" freq="38.90" precedence="Urgent" urgent="2" priority="1" hoist="true" extraction_equipment="true" ventilator="false" blood="false" litter="2" ambulatory="1" security="N" hlz_marking="Smoke" zone_prot_marker="Green smoke" us_military="2" us_civilian="0" non_us_military="1" non_us_civilian="0" epw="0" child="0" terrain_slope="true" terrain_slope_dir="NE" terrain_rough="false" terrain_loose="true" terrain_trees="false" terrain_wires="false" terrain_other="false">
|
||||
<zMistsMap>
|
||||
<zMist title="ZMIST-1" z="GSW" m="Penetrating" i="L thigh" s="Stable" t="TQ 1810Z"/>
|
||||
</zMistsMap>
|
||||
</_medevac_>
|
||||
<remarks/>
|
||||
<archive/>
|
||||
</detail>
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="receipt-d-01" type="b-t-f-d" time="2026-03-15T19:00:30Z" start="2026-03-15T19:00:30Z" stale="2026-03-15T19:01:30Z" how="h-g-i-g-o">
|
||||
<point lat="12.00000" lon="90.00000" hae="-22" ce="9999999" le="9999999"/>
|
||||
<point lat="33.1282" lon="-107.2526" hae="-22" ce="9999999" le="9999999"/>
|
||||
<detail>
|
||||
<contact callsign="TESTNODE-02"/>
|
||||
<link uid="GeoChat.ANDROID-0000000000000002.All Chat Rooms.d4e5f6a7" relation="p-p" type="b-t-f"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="receipt-r-01" type="b-t-f-r" time="2026-03-15T19:01:00Z" start="2026-03-15T19:01:00Z" stale="2026-03-15T19:02:00Z" how="h-g-i-g-o">
|
||||
<point lat="12.00000" lon="90.00000" hae="-22" ce="9999999" le="9999999"/>
|
||||
<point lat="33.1288" lon="-107.2532" hae="-22" ce="9999999" le="9999999"/>
|
||||
<detail>
|
||||
<contact callsign="TESTNODE-02"/>
|
||||
<link uid="GeoChat.ANDROID-0000000000000002.All Chat Rooms.d4e5f6a7" relation="p-p" type="b-t-f"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="6d09b6f6-720a-4eef-a197-183012512316" type="u-d-c-c" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-e">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.12578" lon="-107.26380" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<shape>
|
||||
<ellipse major="226.98" minor="226.98" angle="360"/>
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="67ebaf59-a216-4b0c-bd24-9ae5ee4d65e6" type="u-d-c-c" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-e">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.13060" lon="-107.24320" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<shape>
|
||||
<ellipse major="393.14" minor="393.14" angle="360"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="ellipse-01" type="u-d-c-e" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-e">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.12340" lon="-107.24580" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<shape>
|
||||
<ellipse major="250.0" minor="125.0" angle="45"/>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="c9e8b7a6-5d4c-4a3b-9e2f-018374659821" type="u-d-p" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-e">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.12940" lon="-107.25580" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<link point="33.12872,-107.25292"/>
|
||||
<link point="33.12889,-107.25230"/>
|
||||
<link point="33.12838,-107.25182"/>
|
||||
<link point="33.12785,-107.25246"/>
|
||||
<link point="33.12813,-107.25308"/>
|
||||
<link point="33.12972,-107.25592"/>
|
||||
<link point="33.12989,-107.25530"/>
|
||||
<link point="33.12938,-107.25482"/>
|
||||
<link point="33.12885,-107.25546"/>
|
||||
<link point="33.12913,-107.25608"/>
|
||||
<strokeColor value="-16711936"/>
|
||||
<strokeWeight value="3.0"/>
|
||||
<fillColor value="1090486528"/>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="f48ad69d-31de-4089-bbf0-6533cbb1aa77" type="u-d-r" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-e">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.12612" lon="-107.25905" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<link point="33.12952,-107.25352"/>
|
||||
<link point="33.12946,-107.25193"/>
|
||||
<link point="33.12727,-107.25208"/>
|
||||
<link point="33.12734,-107.25367"/>
|
||||
<link point="33.12724,-107.25977"/>
|
||||
<link point="33.12718,-107.25818"/>
|
||||
<link point="33.12499,-107.25833"/>
|
||||
<link point="33.12506,-107.25992"/>
|
||||
<strokeColor value="-1"/>
|
||||
<strokeWeight value="3.0"/>
|
||||
<fillColor value="-1761607681"/>
|
||||
|
||||
+5
-5
@@ -1,12 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="5f839e4c-0d95-4c5f-85a9-c8b4f914bc10" type="u-d-r" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-e">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.12940" lon="-107.24880" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<contact callsign="iPad.RectangleShape.1"/>
|
||||
<link point="33.12940, -107.25380"/>
|
||||
<link point="33.12940, -107.25180"/>
|
||||
<link point="33.12740, -107.25180"/>
|
||||
<link point="33.12740, -107.25380"/>
|
||||
<link point="33.13040, -107.24980"/>
|
||||
<link point="33.13040, -107.24780"/>
|
||||
<link point="33.12840, -107.24780"/>
|
||||
<link point="33.12840, -107.24980"/>
|
||||
<strokeColor value="-9601793"/>
|
||||
<fillColor value="2137881855"/>
|
||||
<strokeWeight value="1.0"/>
|
||||
|
||||
+41
-41
@@ -1,47 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="tele-01" type="u-d-f-m" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-e">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.12740" lon="-107.24880" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<link point="33.12840,-107.25130"/>
|
||||
<link point="33.12908,-107.25137"/>
|
||||
<link point="33.12961,-107.25159"/>
|
||||
<link point="33.12988,-107.25192"/>
|
||||
<link point="33.12983,-107.25234"/>
|
||||
<link point="33.12946,-107.25280"/>
|
||||
<link point="33.12886,-107.25326"/>
|
||||
<link point="33.12817,-107.25368"/>
|
||||
<link point="33.12752,-107.25401"/>
|
||||
<link point="33.12706,-107.25423"/>
|
||||
<link point="33.12690,-107.25430"/>
|
||||
<link point="33.12706,-107.25423"/>
|
||||
<link point="33.12752,-107.25401"/>
|
||||
<link point="33.12817,-107.25368"/>
|
||||
<link point="33.12886,-107.25326"/>
|
||||
<link point="33.12946,-107.25280"/>
|
||||
<link point="33.12983,-107.25234"/>
|
||||
<link point="33.12988,-107.25192"/>
|
||||
<link point="33.12961,-107.25159"/>
|
||||
<link point="33.12908,-107.25137"/>
|
||||
<link point="33.12840,-107.25130"/>
|
||||
<link point="33.12772,-107.25137"/>
|
||||
<link point="33.12719,-107.25159"/>
|
||||
<link point="33.12692,-107.25192"/>
|
||||
<link point="33.12697,-107.25234"/>
|
||||
<link point="33.12734,-107.25280"/>
|
||||
<link point="33.12794,-107.25326"/>
|
||||
<link point="33.12863,-107.25368"/>
|
||||
<link point="33.12928,-107.25401"/>
|
||||
<link point="33.12974,-107.25423"/>
|
||||
<link point="33.12990,-107.25430"/>
|
||||
<link point="33.12974,-107.25423"/>
|
||||
<link point="33.12928,-107.25401"/>
|
||||
<link point="33.12863,-107.25368"/>
|
||||
<link point="33.12794,-107.25326"/>
|
||||
<link point="33.12734,-107.25280"/>
|
||||
<link point="33.12697,-107.25234"/>
|
||||
<link point="33.12692,-107.25192"/>
|
||||
<link point="33.12719,-107.25159"/>
|
||||
<link point="33.12772,-107.25137"/>
|
||||
<link point="33.12740,-107.24730"/>
|
||||
<link point="33.12808,-107.24737"/>
|
||||
<link point="33.12861,-107.24759"/>
|
||||
<link point="33.12888,-107.24792"/>
|
||||
<link point="33.12883,-107.24834"/>
|
||||
<link point="33.12846,-107.24880"/>
|
||||
<link point="33.12786,-107.24926"/>
|
||||
<link point="33.12717,-107.24968"/>
|
||||
<link point="33.12652,-107.25001"/>
|
||||
<link point="33.12606,-107.25023"/>
|
||||
<link point="33.12590,-107.25030"/>
|
||||
<link point="33.12606,-107.25023"/>
|
||||
<link point="33.12652,-107.25001"/>
|
||||
<link point="33.12717,-107.24968"/>
|
||||
<link point="33.12786,-107.24926"/>
|
||||
<link point="33.12846,-107.24880"/>
|
||||
<link point="33.12883,-107.24834"/>
|
||||
<link point="33.12888,-107.24792"/>
|
||||
<link point="33.12861,-107.24759"/>
|
||||
<link point="33.12808,-107.24737"/>
|
||||
<link point="33.12740,-107.24730"/>
|
||||
<link point="33.12672,-107.24737"/>
|
||||
<link point="33.12619,-107.24759"/>
|
||||
<link point="33.12592,-107.24792"/>
|
||||
<link point="33.12597,-107.24834"/>
|
||||
<link point="33.12634,-107.24880"/>
|
||||
<link point="33.12694,-107.24926"/>
|
||||
<link point="33.12763,-107.24968"/>
|
||||
<link point="33.12828,-107.25001"/>
|
||||
<link point="33.12874,-107.25023"/>
|
||||
<link point="33.12890,-107.25030"/>
|
||||
<link point="33.12874,-107.25023"/>
|
||||
<link point="33.12828,-107.25001"/>
|
||||
<link point="33.12763,-107.24968"/>
|
||||
<link point="33.12694,-107.24926"/>
|
||||
<link point="33.12634,-107.24880"/>
|
||||
<link point="33.12597,-107.24834"/>
|
||||
<link point="33.12592,-107.24792"/>
|
||||
<link point="33.12619,-107.24759"/>
|
||||
<link point="33.12672,-107.24737"/>
|
||||
<strokeColor value="-65281"/>
|
||||
<strokeWeight value="2.5"/>
|
||||
<contact callsign="Telestration 1"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="emergency-01" type="b-a-o-tbl" time="2026-03-15T20:30:00Z" start="2026-03-15T20:30:00Z" stale="2026-03-15T20:35:00Z" how="h-e">
|
||||
<point lat="17.99950" lon="140.00050" hae="150" ce="15" le="15"/>
|
||||
<point lat="33.1316" lon="-107.2496" hae="150" ce="15" le="15"/>
|
||||
<detail>
|
||||
<contact callsign="TESTNODE-04-Alert"/>
|
||||
<link uid="ANDROID-0000000000000004" relation="p-p" type="a-f-G-U-C"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="emergency-cancel-01" type="b-a-o-can" time="2026-03-15T20:32:00Z" start="2026-03-15T20:32:00Z" stale="2026-03-15T20:37:00Z" how="h-e">
|
||||
<point lat="17.99950" lon="140.00050" hae="150" ce="15" le="15"/>
|
||||
<point lat="33.1316" lon="-107.2496" hae="150" ce="15" le="15"/>
|
||||
<detail>
|
||||
<contact callsign="TESTNODE-04"/>
|
||||
<link uid="ANDROID-0000000000000004" relation="p-p" type="a-f-G-U-C"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<event version="2.0" uid="GeoChat.ANDROID-0000000000000003.All Chat Rooms.a1b2c3d4" type="b-t-f" how="h-g-i-g-o" time="2026-03-15T19:00:00Z" start="2026-03-15T19:00:00Z" stale="2026-03-15T19:02:00Z">
|
||||
<point lat="18.05000" lon="140.05000" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.1286" lon="-107.2524" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<__chat parent="RootContactGroup" groupOwner="false" messageId="a1b2c3d4" chatroom="All Chat Rooms" id="All Chat Rooms" senderCallsign="ETHEL">
|
||||
<chatgrp uid0="ANDROID-0000000000000003" uid1="All Chat Rooms" id="All Chat Rooms"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<event version="2.0" uid="GeoChat.ANDROID-0000000000000003.ANDROID-0000000000000004.e5f6a7b8" type="b-t-f" how="h-g-i-g-o" time="2026-03-15T19:05:00Z" start="2026-03-15T19:05:00Z" stale="2026-03-15T19:06:00Z">
|
||||
<point lat="18.05000" lon="140.05000" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.1292" lon="-107.2518" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<__chat parent="RootContactGroup" groupOwner="false" messageId="e5f6a7b8" chatroom="ANDROID-0000000000000004" id="ANDROID-0000000000000004" senderCallsign="ETHEL">
|
||||
<chatgrp uid0="ANDROID-0000000000000003" uid1="ANDROID-0000000000000004" id="ANDROID-0000000000000004"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<event version="2.0" uid="GeoChat.ANDROID-0000000000000002.All Chat Rooms.d4e5f6a7" type="b-t-f" how="h-g-i-g-o" time="2026-03-15T19:00:00Z" start="2026-03-15T19:00:00Z" stale="2026-03-15T19:01:00Z">
|
||||
<point lat="12.00000" lon="90.00000" hae="-22" ce="9999999" le="9999999"/>
|
||||
<point lat="33.1280" lon="-107.2530" hae="-22" ce="9999999" le="9999999"/>
|
||||
<detail>
|
||||
<__chat senderCallsign="TESTNODE-01" chatRoom="All Chat Rooms" id="All Chat Rooms" parent="RootContactGroup">
|
||||
<chatgrp uid0="ANDROID-0000000000000002" uid1="All Chat Rooms"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="a0c524c6-0422-4382-9981-e39d1dc71730" type="a-u-G" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-g-i-g-o">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.13505" lon="-107.25444" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<status readiness="true"/>
|
||||
<archive/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="goto-01" type="b-m-p-w-GOTO" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-e">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.13090" lon="-107.24830" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<contact callsign="GoTo-1"/>
|
||||
<remarks/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e" type="b-m-p-w-GOTO" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-g-i-g-o">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.13340" lon="-107.24850" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<link uid="ANDROID-0000000000000003" type="a-f-G-U-C" parent_callsign="ETHEL" relation="p-p"/>
|
||||
<contact callsign="Rally Point Bravo"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="4a0f4f84-240c-4ff9-b7b0-d08beec900b3" type="a-u-G" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-g-i-g-o">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.13353" lon="-107.24224" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<status readiness="true"/>
|
||||
<archive/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="9405e320-9356-41c4-8449-f46990aa17f8" type="b-m-p-s-m" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-g-i-g-o">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.13446" lon="-107.24718" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<status readiness="true"/>
|
||||
<archive/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="tank-01" type="a-h-G-E-V-A-T" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-g-i-g-o">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.13240" lon="-107.24680" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<status readiness="true"/>
|
||||
<archive/>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<event version="2.0" uid="testnode" type="a-f-G-U-C" how="m-g" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-15T14:22:55Z">
|
||||
<point lat="37.7749" lon="-122.4194" hae="-22" ce="4.9" le="9999999"/>
|
||||
<point lat="33.1284" lon="-107.2528" hae="-22" ce="4.9" le="9999999"/>
|
||||
<detail><contact endpoint="*:-1:stcp" callsign="testnode"/><uid Droid="testnode"/><_flow-tags_ TAK-Server-00000000000000000000000000000001="2026-03-15T14:22:10Z"/></detail>
|
||||
</event>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<event version="2.0" uid="ANDROID-0000000000000002" type="a-f-G-U-C" how="h-e" time="2026-03-15T15:30:00Z" start="2026-03-15T15:30:00Z" stale="2026-03-15T15:30:45Z">
|
||||
<point lat="12.00000" lon="91.00000" hae="-29.667" ce="32.2" le="9999999"/>
|
||||
<point lat="33.1290" lon="-107.2534" hae="-29.667" ce="32.2" le="9999999"/>
|
||||
<detail><takv os="34" version="4.12.0.1 (00000000)[playstore].0000000000-CIV" device="Simulator" platform="ATAK-CIV"/><contact endpoint="*:-1:stcp" phone="+15550000001" callsign="TESTNODE-01"/><uid Droid="TESTNODE-01"/><precisionlocation altsrc="GPS" geopointsrc="GPS"/><__group role="Team Member" name="Cyan"/><status battery="88"/><track course="142.75" speed="1.2"/><_flow-tags_ TAK-Server-00000000000000000000000000000001="2026-03-15T15:30:00Z"/></detail>
|
||||
</event>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<event version="2.0" uid="23131970-4D02-4092-A30A-8A49EBD04AA0" type="a-f-G-U-C" how="m-g" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-15T14:24:10Z">
|
||||
<point lat="18.01200" lon="140.02300" hae="108.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.1272" lon="-107.2516" hae="108.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<contact callsign="iPad" phone="" endpoint="*:-1:stcp"/>
|
||||
<__group name="Cyan" role="Team Member"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<event version="2.0" uid="F7749720-1356-4A23-80F4-0010A587DF6C" type="a-f-G-U-C" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-15T14:27:10Z" how="m-g">
|
||||
<point lat="18.05000" lon="140.05000" hae="109.2" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.1296" lon="-107.2540" hae="109.2" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<contact endpoint="*:-1:stcp" callsign="iPadTAKAware"/>
|
||||
<uid Droid="iPadTAKAware"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<event version="2.0" uid="F7749720-1356-4A23-80F4-0010A587DF6C" type="a-f-G-U-C" how="m-g" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-15T14:27:10Z">
|
||||
<point lat="18.01500" lon="140.01800" hae="107.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.1302" lon="-107.2546" hae="107.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<contact callsign="iPadTAKAware" endpoint="*:-1:stcp"/>
|
||||
<__group role="Team Member" name="Cyan"/>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<event version="2.0" uid="d7e8f9a0-1b2c-3d4e-5f6a-7b8c9d0e1f2a" type="a-f-G-U-C-I" how="h-e" time="2026-03-15T16:10:00Z" start="2026-03-15T16:10:00Z" stale="2026-03-15T16:14:00Z">
|
||||
<point lat="12.00000" lon="91.00000" hae="999999" ce="999999" le="999999"/>
|
||||
<point lat="33.1278" lon="-107.2522" hae="999999" ce="999999" le="999999"/>
|
||||
<detail><contact callsign="TESTNODE-02" endpoint="*:-1:stcp"/><__group name="Cyan" role="Team Member"/><takv device="Chrome - 134" platform="WebTAK" os="Windows - 11" version="4.12.1"/><link relation="p-p" type="a-f-G-U-C-I" uid="d7e8f9a0-1b2c-3d4e-5f6a-7b8c9d0e1f2a"/><_flow-tags_ TAK-Server-00000000000000000000000000000001="2026-03-15T16:10:00Z"/></detail>
|
||||
</event>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="bc7a8f3e-2514-4d89-9a3b-d50128374691" type="u-r-b-bullseye" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-e">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.12340" lon="-107.24080" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<shape>
|
||||
<ellipse major="500.0" minor="500.0" angle="360"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="9655dd2a-a8ee-4ca0-aae4-ac3c0522e5e5" type="u-r-b-c-c" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-e">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.12540" lon="-107.26180" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<shape>
|
||||
<ellipse major="500.0" minor="500.0" angle="360"/>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="58df2fcd-e33e-414f-a718-b18b50cd3137" type="u-rb-a" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-e">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.12640" lon="-107.25580" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<link uid="anchor-1" relation="p-p" type="b-m-p-w" point="33.12840,-107.25280"/>
|
||||
<link uid="anchor-1" relation="p-p" type="b-m-p-w" point="33.12640,-107.25580"/>
|
||||
<range value="1250.5"/>
|
||||
<bearing value="135.0"/>
|
||||
<contact callsign="RB Line 1"/>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="a3f58c21-91e4-4b76-8d5f-6291704835ab" type="b-m-r" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-e">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.12040" lon="-107.24480" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<__routeinfo/>
|
||||
<link_attr method="Driving" direction="Infil" prefix="CP" stroke="3"/>
|
||||
<link uid="wp-a1b2c3d4-0001" type="b-m-p-w" callsign="CP1" point="33.12840,-107.25280"/>
|
||||
<link uid="wp-a1b2c3d4-0002" type="b-m-p-w" callsign="CP2" point="33.12960,-107.25130"/>
|
||||
<link uid="wp-a1b2c3d4-0003" type="b-m-p-w" callsign="CP3" point="33.13090,-107.25000"/>
|
||||
<link uid="wp-a1b2c3d4-0001" type="b-m-p-w" callsign="CP1" point="33.12040,-107.24480"/>
|
||||
<link uid="wp-a1b2c3d4-0002" type="b-m-p-w" callsign="CP2" point="33.12160,-107.24330"/>
|
||||
<link uid="wp-a1b2c3d4-0003" type="b-m-p-w" callsign="CP3" point="33.12290,-107.24200"/>
|
||||
<contact callsign="Route Alpha"/>
|
||||
<remarks/>
|
||||
<archive/>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<event version="2.0" uid="139a3009-681e-4b1a-8f23-dbb49a2c338d" type="b-m-r" how="h-e" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z">
|
||||
<point lat="33.12840" lon="-107.25280" hae="0.0" ce="0.0" le="0.0"/>
|
||||
<point lat="33.13640" lon="-107.24580" hae="0.0" ce="0.0" le="0.0"/>
|
||||
<detail>
|
||||
<contact callsign="Route Alpha"/>
|
||||
<link uid="d71306c3-93a5-41f4-b323-8a5b10f0e968" callsign="SP" type="b-m-p-w" point="33.12840, -107.25280"/>
|
||||
<link uid="06bdf9c8-bbdd-4ba6-80c5-f814855df756" callsign="" type="b-m-p-c" point="33.12640, -107.25580"/>
|
||||
<link uid="a5449578-97d2-4e33-b9d3-390b3155abd1" callsign="VDO" type="b-m-p-w" point="33.12890, -107.25240"/>
|
||||
<link uid="d71306c3-93a5-41f4-b323-8a5b10f0e968" callsign="SP" type="b-m-p-w" point="33.13640, -107.24580"/>
|
||||
<link uid="06bdf9c8-bbdd-4ba6-80c5-f814855df756" callsign="" type="b-m-p-c" point="33.13440, -107.24880"/>
|
||||
<link uid="a5449578-97d2-4e33-b9d3-390b3155abd1" callsign="VDO" type="b-m-p-w" point="33.13690, -107.24540"/>
|
||||
<link_attr color="-65281" method="Walking" prefix="CP" direction="Infil"/>
|
||||
</detail>
|
||||
</event>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="task-01" type="t-s" time="2026-03-15T21:00:00Z" start="2026-03-15T21:00:00Z" stale="2026-03-15T22:00:00Z" how="h-e">
|
||||
<point lat="17.99700" lon="140.00300" hae="80" ce="9999999" le="9999999"/>
|
||||
<point lat="33.1304" lon="-107.2502" hae="80" ce="9999999" le="9999999"/>
|
||||
<detail>
|
||||
<contact callsign="Task-Alpha"/>
|
||||
<task type="engage" priority="High" status="Pending" assignee="ANDROID-0000000000000005" note="cover by fire"/>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<event version="2.0" uid="f6926af1-deec-44f4-ae06-46065c829887" type="b-m-p-w" time="2026-03-15T14:22:10Z" start="2026-03-15T14:22:10Z" stale="2026-03-16T14:22:10Z" how="h-e">
|
||||
<point lat="33.12840" lon="-107.25280" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<point lat="33.12497" lon="-107.23137" hae="9999999.0" ce="9999999.0" le="9999999.0"/>
|
||||
<detail>
|
||||
<contact callsign="CP1"/>
|
||||
<remarks/>
|
||||
|
||||
Reference in New Issue
Block a user