feat(firmware): announce as an LXMF delivery destination (messageable)

- switch the Reticulum announce from a plain "archy.messh" destination to
  "lxmf.delivery" so the bridge shows up as a messageable contact in
  Reticulum/LXMF clients; app_data is the display name "Archy-Messh"
- name_hash/dest_hash construction verified byte-identical to
  RNS.Destination.hash(id, "lxmf", "delivery")
- bump R-window LoRa preamble 16 -> 18 to match RNode firmware

Note: an RNode peer (.116) is not yet demodulating the bridge's R-PHY TX
(rxb stays flat) though the bridge decodes the RNode's announces fine and the
bridge's TX works on the MeshCore PHY — an asymmetric RadioLib-TX/RNode-RX
issue still to chase. Receiving LXMF message *content* is a further build.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dorian 2026-07-01 22:19:07 +01:00
parent 649f196171
commit d882458885

View File

@ -76,7 +76,7 @@ static const PhyConfig CONFIGS[] = {
{ "meshcore", 'C', 869.618f, 62.5f, 8, 5, 0x12, 16 }, { "meshcore", 'C', 869.618f, 62.5f, 8, 5, 0x12, 16 },
// Reticulum RNode PHY (operator-configured) — user's RNS interface: // Reticulum RNode PHY (operator-configured) — user's RNS interface:
// 869.525 MHz / 125 kHz / SF8 / CR4:5. Sync word 0x12 is RNode's default. // 869.525 MHz / 125 kHz / SF8 / CR4:5. Sync word 0x12 is RNode's default.
{ "reticulum", 'R', 869.525f, 125.0f, 8, 5, 0x12, 16 }, { "reticulum", 'R', 869.525f, 125.0f, 8, 5, 0x12, 18 },
}; };
static const size_t NUM_CONFIGS = sizeof(CONFIGS) / sizeof(CONFIGS[0]); static const size_t NUM_CONFIGS = sizeof(CONFIGS) / sizeof(CONFIGS[0]);
static const uint32_t DWELL_MS = 3000; // camp long enough to sit through a static const uint32_t DWELL_MS = 3000; // camp long enough to sit through a
@ -443,8 +443,11 @@ static uint8_t rnsEdSeed[32], rnsEdPrv[64], rnsEdPub[32]; // Ed25519 (signing)
static uint8_t rnsPub[64]; // X25519_pub || Ed25519_pub static uint8_t rnsPub[64]; // X25519_pub || Ed25519_pub
static uint8_t rnsNameHash[10]; // SHA256(app name)[:10] static uint8_t rnsNameHash[10]; // SHA256(app name)[:10]
static uint8_t rnsDestHash[16]; // SHA256(name_hash||ident_hash)[:16] static uint8_t rnsDestHash[16]; // SHA256(name_hash||ident_hash)[:16]
static const char* RNS_APP_NAME = "archy.messh"; // Announce an LXMF *delivery* destination so we show up as a messageable
static const char* RNS_APP_DATA = "archy-messh"; // contact in Reticulum/LXMF clients (app "lxmf", aspect "delivery"). app_data
// is the display name. Verified against RNS.Destination.hash().
static const char* RNS_APP_NAME = "lxmf.delivery";
static const char* RNS_APP_DATA = "Archy-Messh";
static uint32_t lastRnsAnnounceMs = 0; static uint32_t lastRnsAnnounceMs = 0;
static const uint32_t RNS_ANNOUNCE_INTERVAL_MS = 30000; static const uint32_t RNS_ANNOUNCE_INTERVAL_MS = 30000;