Public Access
LoRa Scanner: MeshCore searches for nodes and their answers, read
The first two MeshCore packets heard were these: a search for repeaters and a repeater answering. Both are in clear; they are the test's bytes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0162FokPdvY2KsS4NBfwyWPk
This commit is contained in:
@@ -67,6 +67,27 @@ bool parseAdvert(const Packet& p, Advert& out) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool parseDiscover(const Packet& p, Discover& out) {
|
||||
if (p.type != Payload::Control || p.payloadLen < 6) return false;
|
||||
uint8_t sub = p.payload[0] >> 4;
|
||||
Discover d;
|
||||
d.tag = static_cast<uint32_t>(le32(p.payload + 2));
|
||||
if (sub == 0x8) {
|
||||
d.kinds = p.payload[1];
|
||||
} else if (sub == 0x9) {
|
||||
d.response = true;
|
||||
d.kind = p.payload[0] & 0x0F;
|
||||
d.snr = static_cast<int8_t>(p.payload[1]) / 4.0f;
|
||||
d.id = p.payload + 6;
|
||||
d.idLen = p.payloadLen - 6;
|
||||
if (d.idLen != 8 && d.idLen != 32) return false;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
out = d;
|
||||
return true;
|
||||
}
|
||||
|
||||
const char* routeName(Route r) {
|
||||
switch (r) {
|
||||
case Route::TransportFlood: return "flood in a region";
|
||||
|
||||
@@ -58,6 +58,18 @@ struct Advert {
|
||||
};
|
||||
bool parseAdvert(const Packet& p, Advert& out);
|
||||
|
||||
// Control packets that look for nodes nearby, and the answers: sent in clear, to neighbours only.
|
||||
struct Discover {
|
||||
bool response = false;
|
||||
uint8_t kinds = 0; // a request: one bit per kind of node wanted (bit 2: repeaters)
|
||||
uint8_t kind = 0; // a response: what answers, as in an advert
|
||||
float snr = 0; // a response: how well it heard the request, dB
|
||||
uint32_t tag = 0; // random in the request, repeated in its responses
|
||||
const uint8_t* id = nullptr; // a response: the node's key, or its first 8 bytes
|
||||
size_t idLen = 0;
|
||||
};
|
||||
bool parseDiscover(const Packet& p, Discover& out);
|
||||
|
||||
const char* routeName(Route r); // "flood", "direct", ...
|
||||
const char* payloadName(Payload t); // "advert", "text", ...
|
||||
const char* payloadShort(Payload t); // for a list row: "adv", "txt", ...
|
||||
|
||||
Reference in New Issue
Block a user