An ATAK plugin for forwarding CoT messages via a hardware layer. Currently supports Meshtastic devices.
Binaries signed for the Play Store version of ATAK are available here: Binaries
IMPORTANT NOTE: All configuration options / Tracker writing have been moved into ATAK's three button (kebab) menu under Settings > Tool Preferences > Specific Tool Preferences > ATAK Forwarder
The plugin has been tested with these versions of the Meshtastic dependencies. If you run into issues try installing these versions of the Meshtastic software to resolve them.
Dependency | Version |
---|---|
Meshtastic App | 2.2.16 |
Meshtastic Firmware | 2.2.16 |
The below instructions assume that you are cloning everything side-by-side in the same directory, so you should end up with a directory tree like:
workspace/
|
\--- Meshtastic-Android/
|
\--- AndroidTacticalAssaultKit-CIV/
|
\--- atak-forwarder/
+
icon, the app will ask for Bluetooh permissions, grant them.ATAK requires that plugins be signed with a whitelisted signature. In order to run your own builds of the plugin you will need to have a copy of ATAK that is signed with the same key you are using to sign your plugin build.
git clone git@github.com:deptofdefense/AndroidTacticalAssaultKit-CIV.git
.github/workflows
files or the instructions in AndroidTacticalAssaultKit-CIV/BUILDING.md
to build and install ATAK
local.properties
fileAndroidTacticalAssaultKit-CIV/atak-gradle-takdev
directory./gradlew assemble
git clone git@github.com:paulmandal/atak-forwarder.git
local.properties
file that you created while you were building ATAK to the atak-forwarder
directorylocal.properties
and add this line, remember to update the path to your correct path: sdk.path=/path/to/your/AndroidTacticalAssaultKit-CIV/atak/ATAK/app/build/libs
app
Run Configuration in atak-forwarder
and set the Launch Options to Nothing
atak-forwarder
plugin and install it on your devices (note: the environment variable ATAK_VERSION
can be used to override the target ATAK version found in app/build.gradle
)Pair a new device
Refresh Devices
Set Comm Device
and pick your device from the listSet Region
and pick the region you are currently inWe recommend using the Meshtastic App to manage channel settings, if you would like to use the Plugin to manage channel settings be sure to enable the "Plugin Manages Device" option at the bottom of the settings screen. If you are using Meshtastic to manage the device you do not need to follow the steps below.
Channel Name
and tap on it to set your channel name, max length is 11 charactersMode / Speed
and pick a mode, try Short Range / Fast
to start withGenerate PSK
to generate a new pre-shared key to encrypt your channel withShow QR
to show a QR code with your channel's settingsScan QR
to scan the channel settings
Broadcast Discovery
in the plugin settings menu (click the @)The ATAK Forwarder supports configuring Meshtastic devices that have a GPS but no phone controlling them to show up on the map with a configurable callsign, team, and icon. This can be useful for retrieving relay devices or use cases that only need to output location data (e.g. animal tracking)
Tracker
and configure your Team
, Role
, and other settingsWrite to Device
and pick your device from the dropdown, set a Callsign
and click OK
Message handling follows a few simple rules:
Messages from ATAK that are not chat are checked against a Recently Sent cache, if a message was recently sent it was dropped. This prevents spamming of auto-send map markers.
Messages are then queued in a prioritized queue, with the priority: chat = pli > marker
If a similar message already exists in the queue (e.g. PLI) it will be overwritten with the new message, this way a queued PLI won't be sent with out of date data if newer data is available
Messages are fetched from this queue by the CommHardware class and sent
The plugin will attempt to first use a "minimal" protobuf that saves space, but if it will result in dropped fields or a failed mapping on the receiving size it will fall back to the regular protobufs
When values appear more than once in a payload we attempt to replace subsequent appearances with a marker/placeholder that is swapped back for the value when rebuilding the original message
Areas I'd especially like help are:
detail.contact.endpoint
kills chat) -- check out https://github.com/paulmandal/libcotshrink for this effort