Introduction
This article discusses radio transceivers 7 that employ the Reticulum protocol. The Reticulum protocol defines the structure of bytes that are transmitted via radio, Ethernet, Bluetooth, and other forms of communication. Here, I’m addressing LoRa8 radio protocol only. Radio transceivers using Reticulum and its LoRa interface listen for and transmit radio signals which carry packets of digital bits much like a computer’s wifi or ethernet sends packets. LoRa operates on radio bands which governments have reserved for low power transmission. Hence, the power limitation of radio communication is that you cannot broadcast above a certain power threshold so your ability to exchange packets with another transceiver can vary greatly depending upon whether you can see the other person and what physical obstacles may be in between. I’ve found I can transmit from my basement and the signal can reach several houses down the street; my transmissions cannot traverse the City of Salem. Think of LoRa transmissions as being something akin to low power walkie talkies; many consumer brands are effective only for several city blocks and then the signal attenuates or becomes weaker 9 Here, I look into the concept of Mesh networking and testing Reticulum’s ability to move packets across several nodes.
Mesh Networking
A mesh network is a network topology in which the infrastructure nodes (i.e., bridges, switches, and other infrastructure devices) connect directly, dynamically and non-hierarchically to as many other nodes as possible and cooperate with one another to efficiently route data to and from clients. 10 The magic of a mesh network is that you can increase the overall transmission distance between you and another transceiver who would ordinarily be out of range, but if there are other participants in the same mesh network between the two of you, your packets could be delivered with the help of the intermediate participants who forward your packets through the network to your intended recipient.
A clever metaphor is a fire bucket brigade. Each person is a node passing a bucket of water to their neighbor. A person can only reach a couple of feet to the neighbor, it cannot reach 300 yards. So the the chain of people passing the bucket from one to the next give the brigade a far reach essentially transporting the water 300 yards.

For example, using Puget Mesh, a person in Port Angeles can communicate with a person in Olympia which is approximately 125 miles away as the crow flies.

A core concept of a Mesh networks is that the limitation of the transmission distance between two units, or “nodes”, can be expanded by having other nodes also serve as intermediaries, or “transport”. A transport node simply forwards packets and pass along messages destined to a recipient who would normally be out of reach by the sender. Using the above example, here is a possible route packets travel from Port Angeles to Olympia: there are 10 intermediate nodes passing the packets to the recipient.

Thus, a participant is not only a sender and receiver, it can serve as a “transport” or broker that passes someone else’s message onto another unit, which may also be a transport node, or the final destination.

In the illustration above, all three transmitters can reach about 1.2 miles before the signal is too weak to be useful or received. A is green and the green circle represents the perimeter of its transmission capability. Therefore,
- A (green) can reach B which is 1 mile away
- C (gold)can reach B which is 1 mile away
- B (blue) can reach A and C which are 1 mile away in opposite directions
- A cannot reach C, and C cannot reach A because they are out or range for each other.
1 Intermediary (single hop)
Suppose A & B can reach each other, and B & C can reach each other. But A & C cannot reach each other. That could be the case if radio transmissions where 1.2 miles and A, B & C are 2 miles apart from each other in a straight line. Given the nature of radio transmission, if I wanted to isolate A & C, I would need to place the units 2 or more miles away from each other. That requirement of distance being between two transceivers makes testing very problematic. I do not have 6 other people at my disposal to go out onto the streets and disperse whenever I want to perform a test.
So for lab testing, I can simulate a long distance, and thus inability to receive radio transmissions, using software and simply specify that A is prohibited from reading transmissions from C and C is prohibited from reading transmissions from A, even though they might be inches apart on my desktop. This artificial “block” that I program in for each unit simulates being out in the field and unable to reach each other. Using this software block technique, I can simulate a real time network with gaps between certain units as if they were too far apart and out of range.
Then, the next task is: define which pairs of of units should have software blocks. For a 3 unit test, that’s easy, just block A->C and C->A. But when we expand the field of testing to include more units, the task of defining what I call “blocking pairs” becomes more challenging.
I posed this issue to ChatGPT and it provided me with a Perl Script, line_topology_blocks.pl, where I can provide the names of my units and it will provide the blocking pair directives 11
Hence, to simulate that type of topography, here is a diagram:

Here is a Mermaid diagram:

And here is the blocking rule:
# Blocking rules # -------------- ALLOW AMY <-> BOB ALLOW BOB <-> CY BLOCK AMY <-> CY
3 Intermediaries (hops)
Suppose AMY & BOB can reach each other, BOB & CY can reach each other, CY & DAN can reach each other and DAN & ED can reach each other. But AMY & ED cannot reach each other. In order to have the packet move through BOB->CY->DAN->ED, we have to create blocks so the packet doesn’t take a shorter route, e.g. CY->ED and bypass DAN.
5 units, 3 hopsHere are the blocking rules for a 3 hop, 5 unit test:
# Blocking rules # -------------- ALLOW AMY <-> BOB ALLOW BOB <-> CY ALLOW CY <-> DAN ALLOW DAN <-> ED BLOCK AMY <-> CY BLOCK AMY <-> DAN BLOCK AMY <-> ED BLOCK BOB <-> DAN BLOCK BOB <-> ED BLOCK CY <-> ED

5 Intermediaries (hops)
With 7 T-Beam, aka “nodes”, all within their respective transmissions ranges presents a network such as this. There would be no need for any node to serve as a transport node since all units have direct access.

Goal: is to isolate AMY from GUY. So this is the topology I want simulated: AMY’s packets must go through the other 5 nodes to reach GUY. This will force units BOB, CY, DAN, ED & FLO to act as transports.

With 7 units, I can force the AMY-GUY communication to route through 5 intermediaries using these blocking rules:
# Blocking rules # -------------- ALLOW AMY <-> BOB ALLOW BOB <-> CY ALLOW CY <-> DAN ALLOW DAN <-> ED ALLOW ED <-> FLO ALLOW FLO <-> GUY BLOCK AMY <-> CY BLOCK AMY <-> DAN BLOCK AMY <-> ED BLOCK AMY <-> FLO BLOCK AMY <-> GUY BLOCK BOB <-> DAN BLOCK BOB <-> ED BLOCK BOB <-> FLO BLOCK BOB <-> GUY BLOCK CY <-> ED BLOCK CY <-> FLO BLOCK CY <-> GUY BLOCK DAN <-> FLO BLOCK DAN <-> GUY BLOCK ED <-> GUY
Here’s an illustration of the 7 units with paths, in blue, that are allowed, and blockers, in gray, that are implemented.

Script To Create Blocking Diagram and Compiler Directives
Here is a session running line_topology_blocks.pl. The Mermaid portion is a technology that lets you build charts using text, in this instance, it is really helpful to quickly illustrate what is connected and what is blocked. Here is a screenshot showing my VSCodium 12 session, with the Markdown Preview Mermaid Support plugin displaying my markdown recipe.

Script started on 2026-06-13 01:39:45-07:00 [TERM="xterm-256color" TTY="/dev/pts/3" COLUMNS="178" LINES="26"] [ rnsenv|script ] jlpoole@jp
"ansi1 ansi34"> /usr/local/src/microreticulum/microReticulumTbeam/exercises/205_sustained_link/scripts $ date Sat Jun 13 01:39:47 PDT 2026 [ rnsenv|script ] jlpoole@jp /usr/local/src/microreticulum/microReticulumTbeam/exercises/205_sustained_link/scripts $ date makescript topology_block./line_topology_block.pl AMY BOB CY DAN ED FLO GUY # Blocking rules # -------------- ALLOW AMY <-> BOB ALLOW BOB <-> CY ALLOW CY <-> DAN ALLOW DAN <-> ED ALLOW ED <-> FLO ALLOW FLO <-> GUY BLOCK AMY <-> CY BLOCK AMY <-> DAN BLOCK AMY <-> ED BLOCK AMY <-> FLO BLOCK AMY <-> GUY BLOCK BOB <-> DAN BLOCK BOB <-> ED BLOCK BOB <-> FLO BLOCK BOB <-> GUY BLOCK CY <-> ED BLOCK CY <-> FLO BLOCK CY <-> GUY BLOCK DAN <-> FLO BLOCK DAN <-> GUY BLOCK ED <-> GUY # platformio.ini block directives # ------------------------------- ; Declare any blocked physical pairs here. The build script converts all ; enabled SIM_PHY_BLOCK_<UNIT>_<UNIT> definitions into a generic matrix. -D SIM_PHY_BLOCK_AMY_CY=1 -D SIM_PHY_BLOCK_AMY_DAN=1 -D SIM_PHY_BLOCK_AMY_ED=1 -D SIM_PHY_BLOCK_AMY_FLO=1 -D SIM_PHY_BLOCK_AMY_GUY=1 -D SIM_PHY_BLOCK_BOB_DAN=1 -D SIM_PHY_BLOCK_BOB_ED=1 -D SIM_PHY_BLOCK_BOB_FLO=1 -D SIM_PHY_BLOCK_BOB_GUY=1 -D SIM_PHY_BLOCK_CY_ED=1 -D SIM_PHY_BLOCK_CY_FLO=1 -D SIM_PHY_BLOCK_CY_GUY=1 -D SIM_PHY_BLOCK_DAN_FLO=1 -D SIM_PHY_BLOCK_DAN_GUY=1 -D SIM_PHY_BLOCK_ED_GUY=1 # Mermaid # ------- ```mermaid flowchart LR AMY talk_001@<-- Talk --> BOB BOB talk_002@<-- Talk --> CY CY talk_003@<-- Talk --> DAN DAN talk_004@<-- Talk --> ED ED talk_005@<-- Talk --> FLO FLO talk_006@<-- Talk --> GUY AMY blocked_007@-. Blocked .-CY AMY blocked_008@-. Blocked .-DAN AMY blocked_009@-. Blocked .-ED AMY blocked_010@-. Blocked .-FLO AMY blocked_011@-. Blocked .-GUY BOB blocked_012@-. Blocked .-DAN BOB blocked_013@-. Blocked .-ED BOB blocked_014@-. Blocked .-FLO BOB blocked_015@-. Blocked .-GUY CY blocked_016@-. Blocked .-ED CY blocked_017@-. Blocked .-FLO CY blocked_018@-. Blocked .-GUY DAN blocked_019@-. Blocked .-FLO DAN blocked_020@-. Blocked .-GUY ED blocked_021@-. Blocked .-GUY classDef talk stroke:blue,stroke-width:2px,color:green; classDef blocked stroke:#A9A9A9,stroke-width:2px,color:#A9A9A9,stroke-dasharray:5 5; class talk_001,talk_002,talk_003,talk_004,talk_005,talk_006 talk class blocked_007,blocked_008,blocked_009,blocked_010,blocked_011,blocked_012,blocked_013,blocked_014,blocked_015,blocked_016,blocked_017,blocked_018,blocked_019,blocked_020,blocked_021 blocked ``` [ rnsenv|script ] jlpoole@jp /usr/local/src/microreticulum/microReticulumTbeam/exercises/205_sustained_link/scripts $ exit exit Script done on 2026-06-13 01:39:55-07:00 [COMMAND_EXIT_CODE="0"]
- A transceiver is an electronic device which is a combination of a radio transmitter and a receiver, hence the name. <a href="https://en.wikipedia.org/wiki/Transceiver">Wikipedia.</a>
- LoRa (from “long range”) is a physical proprietary radio communication technique based on spread spectrum modulation. LoRa can be thought of as a radio signal technology, similar to Wi-Fi or cellular. Wikipedia
- In physics, attenuation is the gradual loss of flux intensity [radio power] through a medium. For instance, dark glasses attenuate sunlight, lead attenuates X-rays, and water and air attenuate both light and sound at variable attenuation rates. <a href="https://en.wikipedia.org/wiki/Attenuation">Wikipedia</a>
- <a href="https://en.wikipedia.org/wiki/Mesh_networking">Wikipedia: Mesh Networking</a>
- I use “directive” to mean a compile time flag telling the compiler to do something special, e.g. create a software block between two units. An example of such a flag is to cause BOB and CY not to see each other’s packets is: “-D SIM_PHY_BLOCK_BOB_CY=1”. When the compiler is presented with such a directive, it will enact a block of both of the corresponding unit on each named unit, so BOB will block DAN’s transmissions and DAN will block BOB’s transmissions.
- An opensource alternative to Microsoft’s Visual Studio Code.
- A transceiver is an electronic device which is a combination of a radio transmitter and a receiver, hence the name. Wikipedia.
- LoRa (from “long range”) is a physical proprietary radio communication technique based on spread spectrum modulation. LoRa can be thought of as a radio signal technology, similar to Wi-Fi or cellular. Wikipedia
- In physics, attenuation is the gradual loss of flux intensity [radio power] through a medium. For instance, dark glasses attenuate sunlight, lead attenuates X-rays, and water and air attenuate both light and sound at variable attenuation rates. Wikipedia
- Wikipedia: Mesh Networking
- I use “directive” to mean a compile time flag telling the compiler to do something special, e.g. create a software block between two units. An example of such a flag is to cause BOB and CY not to see each other’s packets is: “-D SIM_PHY_BLOCK_BOB_CY=1”. When the compiler is presented with such a directive, it will enact a block of both of the corresponding unit on each named unit, so BOB will block DAN’s transmissions and DAN will block BOB’s transmissions.
- An opensource alternative to Microsoft’s Visual Studio Code.
Leave a Reply