Version: 1.1.0
Adds reliable, targeted node-to-node file transfers to Meshtastic LoRa networks.
Contents:
AkitaMeshZmodem— Arduino library embedding a non-blocking ZModem engine.ZmodemModule— Meshtastic firmware module for in-firmware operation.
License: GNU GPLv3 — see LICENSE.
- Zero External Dependencies: The ZModem protocol stack is entirely built-in (
src/utility/ZModemEngine), eliminating reliance on external, unstable, or missing ZModem libraries. - Non-Blocking Operation: The implementation is designed to run seamlessly within the main Meshtastic firmware loop, ensuring the device remains responsive, routing packets, and managing the mesh network during transfers.
- Targeted Sending: Files are sent directly to a specified Node ID, not broadcast across the entire mesh, which is efficient and network-friendly.
- Reliable Protocol: Utilizes simplified ZModem state handling and CRC checks optimized for robust, 8-bit clean LoRa links.
- Dedicated Port Handling: Uses separate, configurable Meshtastic PortNums for command initiation and data transmission to prevent conflicts.
- Filesystem Agnostic: Uses the standard Arduino
FSAPI for compatibility with SPIFFS, LittleFS, or SD cards.
- Hardware: Meshtastic-compatible devices (ESP32-based recommended) with sufficient flash memory for the firmware and a filesystem (SPIFFS/LittleFS) to store files.
- Required Arduino Libraries (Minimal):
Meshtastic(Official Meshtastic device library/firmware source)StreamUtils(A common utility library, included in PlatformIO/Arduino)FS(Part of the ESP32 core)
- Install Dependencies: Ensure
MeshtasticandStreamUtilsare installed via the Arduino Library Manager or PlatformIO. - Install AkitaMeshZmodem Library:
- PlatformIO (Recommended): Add the library directly to your
platformio.inidependencies:lib_deps = meshtastic/Meshtastic bblanchon/ArduinoStreamUtils https://github.com/AkitaEngineering/Meshtastic-Zmodem.git - Arduino IDE: Download this repository as a ZIP and install it via the Arduino IDE's
Sketch->Include Library->Add .ZIP Library...option.
- PlatformIO (Recommended): Add the library directly to your
This is the preferred method for running file transfers as a service and requires building the Meshtastic firmware from source using PlatformIO.
- Prepare Files: Copy the files from the
src/directory into a library folder (lib/Akita_Meshtastic_Zmodem) within the Meshtastic firmware source tree. - Install Module: Copy
src/modules/ZmodemModule.handsrc/modules/ZmodemModule.cppinto the Meshtastic firmware'ssrc/modules/directory. - Register Module: Edit the main firmware file (
src/mesh-core.cppor similar) to include the module header and instantiate the module, allowing it to hook into the main loop:#include "modules/ZmodemModule.h" // ... modules.push_back(new ZmodemModule(*this));
Control is handled by sending specific text commands to the device on the Command Port (AKZ_ZMODEM_COMMAND_PORTNUM, default 250).
| Action | Format | Example (using CLI) |
|---|---|---|
| Start Send | SEND:!NodeID:/local/file.bin |
meshtastic --sendtext "SEND:!a1b2c3d4:/test.txt" --portnum 250 |
| Start Receive | RECV:/save/path.bin |
meshtastic --sendtext "RECV:/received.bin" --portnum 250 |
When integrating into custom code:
begin(mesh, Filesystem, &Serial): Initialize the engine and set up the transport streams.loop(): Must be called continuously in your main loop to process the ZModem state machine.processDataPacket(MeshPacket& packet): CRITICAL. This method is used to push raw data packets received on the Data Port (AKZ_ZMODEM_DATA_PORTNUM) directly into the ZModem engine's input buffer.
Two helper scripts have been added under tools/ to simplify exercising the
module on a host machine:
serial_proxy.py– creates a PTY and proxies it to a real serial device. Run your host-side XMODEM/SZ/SX tool against the PTY to talk to the board.auto_xmodem_test.py– automation harness that invokessz --xmodemand validates the received file. Useful for CI or sanity checks without hardware.
The internal ZModem engine now includes XMODEM compatibility (CRC or checksum), automatic retransmit/backoff, and a cached‑block sender mode to avoid file seeks on retry.
The PlatformIO project has been configured to allow the code to compile with
only stubbed versions of the Meshtastic and StreamUtils libraries (see
lib/…); this makes it possible to verify the ZModem engine builds even
when the real dependencies are not available. To perform a full build the
real Meshtastic package from the Arduino registry is required.
- Fixed several protocol/parser bugs in the internal ZModem engine (
src/utility/ZModemEngine.cpp) including proper ZDLE-escaping and header scanning for robustness over noisy links. - Resolved incorrect TransferState mappings and stream-handling issues in the library wrapper (
src/AkitaMeshZmodem.cpp). - The example sketch
examples/Basic_Transfer/Basic_Transfer.inowas corrected for proper packet handling and command parsing. - Stub headers and library stubs were improved so the library can be compiled and verified with PlatformIO even when the full Meshtastic firmware is not present.
These fixes were verified by building the project with PlatformIO on ESP32 (env: esp32dev). See the quick build steps in USAGE.md.