mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-07-03 14:06:34 +02:00
a04a261b80
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: jamesarich <2199651+jamesarich@users.noreply.github.com> Co-authored-by: James Rich <james.a.rich@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
4.5 KiB
4.5 KiB
Quickstart: TAK v2 Protocol Integration
Prerequisites
- JDK 21
- Android Studio (latest stable)
ANDROID_HOMEenvironment variable set- Git submodule initialized:
git submodule update --init local.propertiesexists:cp secrets.defaults.properties local.properties
Build & Test
# Full verification
./gradlew spotlessApply spotlessCheck detekt assembleDebug :core:takserver:allTests :feature:settings:allTests
# TAK module tests only
./gradlew :core:takserver:allTests
# Quick compile check (no tests)
./gradlew :core:takserver:compileKotlinJvm
Module Overview
The TAK v2 implementation lives primarily in core/takserver/:
| Layer | Location | Purpose |
|---|---|---|
| Business Logic | core/takserver/src/commonMain/ |
All conversion, compression, parsing, server management |
| Platform (JVM) | core/takserver/src/jvmAndroidMain/ |
TLS server, zstd compression, cert loading |
| Platform (Android) | core/takserver/src/androidMain/ |
File writer (SAF) |
| Platform (iOS) | core/takserver/src/iosMain/ |
Stubs (uncompressed mode) |
| UI | feature/settings/.../TAKConfigItemList.kt |
Config screen |
| Wake Lock | core/service/.../MeshService.kt |
CPU keepalive |
| Version Gate | core/model/.../Capabilities.kt |
supportsTakV2 flag |
Key Entry Points
Starting the TAK Server
The TAK server is started via TAKMeshIntegration.start(scope) which is called from MeshService when a device connects. The lifecycle:
MeshService.onStartCommand()→ acquires wake lockTAKMeshIntegration.start(scope)→ wires up three collection jobs:- Inbound: TAK client → mesh
- Outbound: mesh → TAK clients
- Config: team/role sync
TAKServerManager.start(scope)→ starts TLS listener on port 8089
Adding a New CoT Type
- Add enum value to
TakV2TypeMapperbidirectional map - Add test fixture XML in
src/jvmAndroidMain/resources/tak_test_fixtures/ - Verify round-trip in
TAKPacketV2RawDetailTestorCoTConversionTest - Run:
./gradlew :core:takserver:allTests
Testing with ATAK
- Enable TAK server in Settings → Module Configuration → TAK
- Tap "Export Data Package" → share to ATAK
- In ATAK: Settings → Network → TAK Servers → Import
- Verify connection count shows 1 in Meshtastic UI
Architecture Flow
ATAK Client ──TLS──▶ TAKServer (port 8089)
│
▼
TAKServerManager
│
▼ inboundMessages
TAKMeshIntegration
│ │
┌─────────┘ └──────────┐
▼ ▼
sendCoTToMeshV2() sendCoTToMeshV1()
(fw ≥ 2.8.0) (fw < 2.8.0)
│ │
▼ ▼
TakV2Compressor TAKPacketConversion
(zstd + dict) (raw protobuf)
│ │
▼ ▼
Port 78 (ATAK_PLUGIN_V2) Port 72 (ATAK_PLUGIN)
│ │
└────────────┬────────────────────┘
▼
Mesh Network (LoRa)
Test Fixtures
38 XML fixture files in src/jvmAndroidMain/resources/tak_test_fixtures/ covering:
- PLI: 6 variants (basic, full, itak, stationary, takaware, webtak)
- GeoChat: 3 variants (broadcast, DM, simple)
- Markers: 6 variants (2525, goto, goto-itak, icon-set, spot, tank)
- Drawings: 7 variants (circle, ellipse, freeform, polygon, rectangle, rectangle-itak, telestration)
- Routes: 2 variants (3wp, itak-3wp)
- Aircraft: 2 variants (ADSB, hostile)
- Ranging: 3 variants (bullseye, circle, line)
- Others: casevac (2), emergency (2), alert (1), delete (1), chat-receipt (2), task (1), waypoint (1)
Dependency Graph
core:takserver
├── core:repository (mesh packet access)
├── core:common (dispatchers, utilities)
├── core:di (Koin module registration)
├── core:model (Capabilities, domain models)
├── core:proto (protobuf definitions)
├── xmlutil (XML parsing/serialization)
├── TAKPacket-SDK v0.1.3 (zstd compression, JVM only)
├── zstd-jni 1.5.7-7 (native zstd, platform-specific)
├── okio (I/O)
├── ktor-network (TCP)
├── kotlinx-datetime
└── kermit (logging)