two Raspberry Pi Zero 2W boards on a table

Testing Reticulum’s Bluetooth Interface

Highly Technical

GitHub user Torlando (torlando-tech) developed a bluetooth protocol for Reticulum.  The protocol is implemented in Python.
I wanted to kick the tires and determine the interface’s resiliency. My interest in this is that if the protocol works (which I am satisfied it does), then I would then implement a Reticulum interface in C++ and/or Rust to be used on the LilyGo! T-Beam SUPREME and Chad Attermann’s project: microReticulum.

The Raspberry Pi Zero 2W, a $17 board, has bluetooth capability as well as a full Linux operating system (Trixie) and makes an ideal testing platform.

So with ChatGPT, I developed a script which could simulate two users and transmit and receive packets using the Reticulum bluetooth interface.  The script succeeded sending “heartbeat” messages to and fro.

Then I began wondering about time.  How much time and how quickly can transmissions occur.  That, in turn, mandated that I discipline the clocks on the Pi Zeros to my stratum 1 time server so that both have almost identical time.  I then stamp when a Reticulum payload is sent and received so I can later calculate how much time it takes.  Then comes the big question: what if I swamp the connection by having both senders transmit the text of the United States Constitution to each other; the text is 44k.

I ran both instances with a timeout of 60 seconds and both were able to send the complete text to the other within that time.  ChatGPT then created a Perl script which analyzes the times.  Here are the results:

(rnsenv) jlpoole@jp /usr/local/src/ble-reticulum $ cat scripts/reticulum_file_transfer_analysis_20260516_1130.txt
Reticulum BLE file transfer analysis
Generated: 2026-05-16 18:28:23 UTC
Input files:
/mnt/data/20250516_1115_zerodev1.txt
/mnt/data/20250516_1115_zerodev2.txt

Log provenance summary:
20250516_1115_zerodev1.txt   receiver=zerodev1   date='Sat May 16 11:12:57 PDT 2026' command_lines=15 post_marker_lines=589
20250516_1115_zerodev2.txt   receiver=zerodev2   date='Sat May 16 11:12:58 AM PDT 2026' command_lines=14 post_marker_lines=584

Chrony clock notes from logs:
20250516_1115_zerodev1.txt
System time     : 0.000000009 seconds fast of NTP time
System time     : 0.000000008 seconds fast of NTP time
20250516_1115_zerodev2.txt
System time     : 0.000114634 seconds slow of NTP time
System time     : 0.000105892 seconds slow of NTP time

Declared outbound sends observed in logs:
sender=zerodev1   file=US_Constitution.txt      chunks= 140 bytes=  44225 chunk_data_bytes=316
sender=zerodev2   file=US_Constitution.txt      chunks= 148 bytes=  44225 chunk_data_bytes=n/a

Direction: zerodev1->zerodev2
file                 : US_Constitution.txt
chunks received      : 140 of 140
completeness         : 100.00%
missing chunks       : none
duplicate chunks     : none
payload bytes RX     : 44225
first chunk RX       : 11:13:18.364
last chunk RX        : 11:13:55.318
receiver span        : 36.954 s
sender span          : 14.300 s
payload rate RX span : 1196.8 B/s  9574.1 bit/s
payload rate TX span : 3092.6 B/s  24741.1 bit/s
one-way latency       min/median/mean/p95/max/stddev: 244.725 / 12236.420 / 11924.860 / 21922.870 / 22898.637 / 6711.984 ms
receiver inter-chunk gap min/median/mean/p95/max/stddev: 149.000 / 243.000 / 265.856 / 340.100 / 732.000 / 62.665 ms
sender inter-chunk gap min/median/mean/p95/max/stddev: 101.926 / 102.941 / 102.878 / 104.257 / 107.490 / 0.874 ms

Direction: zerodev2->zerodev1
file                 : US_Constitution.txt
chunks received      : 148 of 148
completeness         : 100.00%
missing chunks       : none
duplicate chunks     : none
payload bytes RX     : 44225
first chunk RX       : 11:13:18.267
last chunk RX        : 11:13:53.760
receiver span        : 35.493 s
sender span          : 15.482 s
payload rate RX span : 1246.0 B/s  9968.2 bit/s
payload rate TX span : 2856.6 B/s  22852.9 bit/s
one-way latency       min/median/mean/p95/max/stddev: 212.914 / 10820.779 / 10497.937 / 19392.748 / 20224.292 / 5938.272 ms
receiver inter-chunk gap min/median/mean/p95/max/stddev: 145.000 / 243.000 / 241.449 / 291.700 / 729.000 / 57.537 ms
sender inter-chunk gap min/median/mean/p95/max/stddev: 103.946 / 105.794 / 105.317 / 106.740 / 111.933 / 1.353 ms

Hello/handshake RX records:
zerodev2   -> zerodev1   recv=11:13:18.032 latency= 163.721 ms message='hello'
zerodev1   -> zerodev2   recv=11:13:18.034 latency= 103.598 ms message='hello back'

Caution: one-way latency assumes sender and receiver clocks are synchronized.
Your chronyc tracking output helps bound this error, but it is not a substitute for ACK/round-trip timing.
(rnsenv) jlpoole@jp /usr/local/src/ble-reticulum
2 Linux consoles, side by side
Consoles to two Pi Zero’s

Access to my Forgejo repository requires registration; the AI bots were flooding the site so I’ve restricted access.  Contact me if you wish access.


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *