The .NET binding of TAKPacket-SDK: convert ATAK
Cursor-on-Target (CoT) XML to Meshtastic's TAKPacketV2 protobuf and compress it with zstd
dictionary compression for LoRa mesh transport (237-byte MTU, port 78). Wire payloads are
byte-interoperable with the Kotlin, Swift, Python, and TypeScript bindings.
Targets .NET 9. Depends on Google.Protobuf and ZstdSharp.Port.
dotnet add package Meshtastic.TAKusing Meshtastic.TAK;
var parser = new CotXmlParser();
var compressor = new TakCompressor();
var builder = new CotXmlBuilder();
// Sanitize raw ATAK CoT XML before parsing.
var clean = CotMeshSanitizer.NormalizeCotXml(cotXmlString);
clean = CotMeshSanitizer.StripNonEssentialForMesh(clean);
var packet = parser.Parse(clean);
byte[] wirePayload = compressor.Compress(packet); // [flags][zstd body], ≤ 237 B
// Receive side
var received = compressor.Decompress(wirePayload);
string cotXml = builder.Build(received);| Class | Responsibility |
|---|---|
CotMeshSanitizer |
Mesh hygiene on raw CoT XML before parsing |
CotXmlParser |
CoT XML → TakPacketV2Data |
CotXmlBuilder |
TakPacketV2Data → CoT XML |
TakCompressor |
TakPacketV2Data ↔ compressed wire payload |
CotTypeMapper |
CoT type string ↔ enum, aircraft classification |
AtakPalette |
ATAK 14-color palette ↔ Team enum |
DictionaryProvider |
Selects and loads the embedded zstd dictionaries |
TakCompressor.Decompress throws on a malformed frame or one that would expand past 4096 bytes
(decompression-bomb guard). The parser rejects DTD/entity declarations (XXE hardening).
cd csharp
dotnet build
dotnet test
dotnet tool install -g docfx && docfx docfx.json # API docs → _site/See the repository CONTRIBUTING guide and WIRE_FORMAT.md.