A frequency-hopping layer for MeshCore, designed to keep narrowband operation legal in the US. It was wrong, and this is the record of what was tried, what it ran into, and what is actually established about Part 15 for anyone tempted to try the same thing.
This design was published, reviewed, and withdrawn inside 24 hours. Its central claim, that it complied with 47 CFR 15.247(a)(1), was false. The specification and its source have been removed and should not be relied on or cited.
What is left here is the part worth keeping: a map of the three regulatory routes available in 902 to 928 MHz with primary sources, a catalogue of what the design ran into, and the one question that is still genuinely open. The aim is that the next person considering this does not spend a day rediscovering it.
Issue 945 is eleven months and 377 comments long. Its subject is that MeshCore's US preset, 62.5 kHz at SF7, fails 15.247(a)(2)'s 500 kHz minimum bandwidth, so most US nodes operate outside the rules. The obvious fix is to widen to 500 kHz, and the standing objection is that Seattle and Boston both measured utility meter traffic every 300 kHz across the whole band, against which a 500 kHz channel has nowhere to hide.
Frequency hopping looked like the way to have both. 15.247 permits narrow channels if you hop, so the idea was to keep a narrow signal, gain diversity against the meters, and satisfy the rules at the same time. The design that came out of that was 125 kHz at SF8, 50 channels spaced 200 kHz, 2000 ms dwell per channel, with every node computing its channel from a shared clock and a shared pseudorandom sequence so receivers hopped in lockstep with transmitters.
It was published, then attacked by four independent adversarial reviews, then withdrawn. The order of those first two steps was the original mistake and everything else followed from it.
Not because of the defects, which are catalogued in section 4 and were all individually fixable. It was abandoned because the case for building anything at all did not survive contact with the numbers. Three reasons, in descending order of how solidly established they are.
The design was pitched as 1 dB better than the 500 kHz alternative. That compared against SF10 and omitted SF11, which is what Philadelphia actually runs. At 500 kHz / SF11 the sensitivity is about 1 dB better than today's 62.5 kHz preset and 1.5 dB better than this design, with no network split, no shared clock, the full 255-byte packet size, and coverage under existing module grants. The omitted row was the entire argument.
FCC guidance KDB 558074 section 10(b) states that hybrid systems have neither a 500 kHz minimum bandwidth nor any minimum number of hopping channels, and Semtech puts the hybrid power ceiling at about 22 dBm for 125 kHz LoRa, which is what the radio does anyway. So 50 synchronised channels delivered zero dB over a handful of channels. The elaborate structure existed to reach a provision that gave it nothing.
The justification was dodging utility meters. Those meter networks are themselves frequency hopping systems, so a 300 kHz comb on a spectrum analyser is a max-hold of a hop pattern rather than fixed occupancy, and no static channel plan dodges a hopping interferer. What hopping actually offers against that is time diversity, which is a real but far smaller benefit, and not the one that was claimed. See section 6.
This is the part worth keeping. Issue 945 has spent a year arguing about which rule applies without anyone assembling the three routes side by side. Everything in this table is quoted or measured from a primary source, not inferred.
| Digital modulation (DTS) 15.247(a)(2) |
Frequency hopping 15.247(a)(1) |
Hybrid 15.247(f) |
|
|---|---|---|---|
| Minimum bandwidth | 6 dB BW ≥ 500 kHz | none | none |
| Minimum channels | n/a | 50 if 20 dB BW < 250 kHz 25 if ≥ 250 kHz |
none |
| Dwell limit | n/a | 0.4 s per channel per 20 s (narrow) per 10 s (wide) |
0.4 s per channel per 0.4 × N s |
| Channel separation | n/a | ≥ greater of 25 kHz or the 20 dB BW | same as (a)(1) |
| Power limit | 1 W | 1 W with ≥50 channels 0.25 W with 25 to 49 |
PSD-limited, about 22 dBm at BW125 |
| Power density | 8 dBm / 3 kHz | not applied | 8 dBm / 3 kHz, hopping off |
| Pseudorandom order, equal channel use |
n/a | required | required |
| Receiver hops in sync with transmitter |
n/a | required | required |
| 15.247(h) non-coordination |
applies | applies | does not apply |
| LoRa grants exist | yes, at 500 kHz (the common case) |
yes 2ARKMOBDLRA1, X94-0005922 |
yes, at 125 kHz VPYCMABZ, SQG-RM191, M82-WISE1510, RID-LT501 |
Catalogued because anyone attempting narrowband hopping on this stack will meet most of these. Each was verified against primary sources or against the MeshCore source, not merely asserted by a reviewer.
PAYLOAD_TYPE_MULTIPART carries only acknowledgements.
createMultiAck is the sole producer; the handler's other branch is a FUTURE comment.Both the hopping and hybrid routes require that receivers track the transmitter's sequence. 47 CFR 15.247(a)(1): "The system receivers shall have input bandwidths that match the hopping channel bandwidths of their corresponding transmitters and shall shift frequencies in synchronization with the transmitted signals." The natural escape is to claim the hybrid provision instead, since it has no bandwidth or channel-count minimum, but KDB 558074 section 10(b)(5) closes that:
"The hopping function must be a true frequency hopping system, as described in Section 15.247(a)(1). The specific requirements in Section 15.247(a)(1) are: i) a minimum channel separation; ii) pseudo-random hop sequence; iii) equal use of each frequency; and iv) receiver matching bandwidth and synchronization."
Every asynchronous scheme proposed in issue 945 therefore has an obstacle nobody there has raised: channel-activity sweeps, preamble sampling, and anything where the receiver hunts for a transmitter rather than meeting it at a known frequency. But two things stop this being a conclusion, and an earlier version of this page overstated it before they were checked.
First, the FCC never measures it. KDB 558074 section 9(c)(1) asks an applicant only to "Describe how the associated receiver(s) has the ability to shift frequencies in synchronization with the transmitted signals", and the verb has been "describe" in every version from 2000 to 2019, with no test setup and no pass criterion. Second, Texas Instruments published "Asynchronous channel hopping system for FCC 15.247 compliance" in 2015, describing exactly that architecture, and its review of the rule quotes 15.247(a)(1)'s first two sentences while omitting the receiver-synchronisation sentence, reducing the requirement to "50 hopping channels, 400 ms dwell time, 25 kHz minimum channel separation".
So it is a fork, and both branches tell you something:
Compliant narrowband hopping needs a shared clock, and a shared clock cannot be secured within MeshCore's key model. Narrowband by way of hopping is then not available to MeshCore as it stands, and the choice is 500 kHz or reduced power.
Asynchronous hopping is available, and much simpler than what was attempted here: a handful of channels, no clock, no flag day. But it rests on the same species of unreviewed reading of 15.247 that issue 945 has been arguing over for a year.
Neither branch is a compliance claim, and presenting one as settled is the specific error that got the original document withdrawn. Twice.
One empirical question would settle whether any hopping variant is worth considering, and it needs a software-defined radio and an evening rather than a protocol.
If the utility meter networks are themselves frequency hopping, then interference on any given narrow channel is bursty rather than continuous, and a retransmission two seconds later on a different channel may well succeed where an immediate retry on the same channel would not. That is time diversity, and it is the only benefit hopping plausibly delivers here. It is also measurable directly: capture a narrow channel in 902 to 928 MHz over hours and characterise the interference as burst length and gap distribution rather than as an average noise floor.
If the gaps are long relative to a packet, hopping buys something real and the case can be rebuilt on honest grounds. If the interference is effectively continuous, hopping buys nothing and 500 kHz is simply the answer. Either result is a contribution to issue 945, and neither requires forking anything.
The withdrawn design, the four adversarial reviews that found its errors, and this page were all produced with agentic coding. The design was published before the reviews ran, which was the wrong order and is the root cause of everything above: the architecture survived its author's scrutiny for hours and died in roughly twenty minutes of being attacked properly.
Regulatory text here is quoted from 47 CFR 15.247, 47 CFR 2.1, FCC KDB 558074 D01, and DA 12-839. Bandwidth and dwell figures come from accepted FCC test reports, identified by FCC ID so they can be checked. Read those rather than this page. Nothing here is legal advice, and compliance is the operator's responsibility.