{"id":687,"date":"2026-05-16T12:20:12","date_gmt":"2026-05-16T20:20:12","guid":{"rendered":"https:\/\/salemdata.net\/johnpress\/?p=687"},"modified":"2026-05-16T12:32:19","modified_gmt":"2026-05-16T20:32:19","slug":"testing-reticulums-bluetooth-interface","status":"publish","type":"post","link":"https:\/\/salemdata.net\/johnpress\/?p=687","title":{"rendered":"Testing Reticulum&#8217;s Bluetooth Interface"},"content":{"rendered":"<p><strong>Highly Technical<\/strong><\/p>\n<p>GitHub user Torlando (<a href=\"https:\/\/github.com\/torlando-tech\">torlando-tech<\/a>) developed a <a href=\"https:\/\/github.com\/torlando-tech\/ble-reticulum\/blob\/main\/BLE_PROTOCOL_v2.2.md\">bluetooth protocol<\/a> for Reticulum.\u00a0 The protocol is implemented in Python.<br \/>\nI wanted to kick the tires and determine the interface&#8217;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&#8217;s project: <a href=\"https:\/\/github.com\/attermann\/microReticulum\">microReticulum<\/a>.<\/p>\n<p>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.<\/p>\n<p>So with ChatGPT, I developed a <a href=\"https:\/\/salemdata.net\/repo\/jlpoole\/ble-reticulum\/src\/branch\/dual_node_echo\/examples\/ble_dual_node_echo.py\">script<\/a> which could simulate two users and transmit and receive packets using the Reticulum bluetooth interface.\u00a0 The script succeeded sending &#8220;heartbeat&#8221; messages to and fro.<\/p>\n<p>Then I began wondering about time.\u00a0 How much time and how quickly can transmissions occur.\u00a0 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.\u00a0 I then stamp when a Reticulum payload is sent and received so I can later calculate how much time it takes.\u00a0 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.<\/p>\n<p>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.\u00a0 ChatGPT then created a Perl script which analyzes the times.\u00a0 Here are the results:<\/p>\n<blockquote>\n<pre>(rnsenv) jlpoole@jp \/usr\/local\/src\/ble-reticulum $ cat scripts\/reticulum_file_transfer_analysis_20260516_1130.txt\r\nReticulum BLE file transfer analysis\r\nGenerated: 2026-05-16 18:28:23 UTC\r\nInput files:\r\n\/mnt\/data\/20250516_1115_zerodev1.txt\r\n\/mnt\/data\/20250516_1115_zerodev2.txt\r\n\r\nLog provenance summary:\r\n20250516_1115_zerodev1.txt \u00a0\u00a0receiver=zerodev1 \u00a0\u00a0date='Sat May 16 11:12:57 PDT 2026' command_lines=15 post_marker_lines=589\r\n20250516_1115_zerodev2.txt \u00a0\u00a0receiver=zerodev2 \u00a0\u00a0date='Sat May 16 11:12:58 AM PDT 2026' command_lines=14 post_marker_lines=584\r\n\r\nChrony clock notes from logs:\r\n20250516_1115_zerodev1.txt\r\nSystem time \u00a0\u00a0\u00a0\u00a0: 0.000000009 seconds fast of NTP time\r\nSystem time \u00a0\u00a0\u00a0\u00a0: 0.000000008 seconds fast of NTP time\r\n20250516_1115_zerodev2.txt\r\nSystem time \u00a0\u00a0\u00a0\u00a0: 0.000114634 seconds slow of NTP time\r\nSystem time \u00a0\u00a0\u00a0\u00a0: 0.000105892 seconds slow of NTP time\r\n\r\nDeclared outbound sends observed in logs:\r\nsender=zerodev1 \u00a0\u00a0file=US_Constitution.txt \u00a0\u00a0\u00a0\u00a0\u00a0chunks= 140 bytes= \u00a044225 chunk_data_bytes=316\r\nsender=zerodev2 \u00a0\u00a0file=US_Constitution.txt \u00a0\u00a0\u00a0\u00a0\u00a0chunks= 148 bytes= \u00a044225 chunk_data_bytes=n\/a\r\n\r\nDirection: zerodev1-&gt;zerodev2\r\nfile \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0: US_Constitution.txt\r\nchunks received \u00a0\u00a0\u00a0\u00a0\u00a0: 140 of 140\r\ncompleteness \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0: 100.00%\r\nmissing chunks \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0: none\r\nduplicate chunks \u00a0\u00a0\u00a0\u00a0: none\r\npayload bytes RX \u00a0\u00a0\u00a0\u00a0: 44225\r\nfirst chunk RX \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0: 11:13:18.364\r\nlast chunk RX \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0: 11:13:55.318\r\nreceiver span \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0: 36.954 s\r\nsender span \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0: 14.300 s\r\npayload rate RX span : 1196.8 B\/s \u00a09574.1 bit\/s\r\npayload rate TX span : 3092.6 B\/s \u00a024741.1 bit\/s\r\none-way latency \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0min\/median\/mean\/p95\/max\/stddev: 244.725 \/ 12236.420 \/ 11924.860 \/ 21922.870 \/ 22898.637 \/ 6711.984 ms\r\nreceiver inter-chunk gap min\/median\/mean\/p95\/max\/stddev: 149.000 \/ 243.000 \/ 265.856 \/ 340.100 \/ 732.000 \/ 62.665 ms\r\nsender inter-chunk gap min\/median\/mean\/p95\/max\/stddev: 101.926 \/ 102.941 \/ 102.878 \/ 104.257 \/ 107.490 \/ 0.874 ms\r\n\r\nDirection: zerodev2-&gt;zerodev1\r\nfile \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0: US_Constitution.txt\r\nchunks received \u00a0\u00a0\u00a0\u00a0\u00a0: 148 of 148\r\ncompleteness \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0: 100.00%\r\nmissing chunks \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0: none\r\nduplicate chunks \u00a0\u00a0\u00a0\u00a0: none\r\npayload bytes RX \u00a0\u00a0\u00a0\u00a0: 44225\r\nfirst chunk RX \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0: 11:13:18.267\r\nlast chunk RX \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0: 11:13:53.760\r\nreceiver span \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0: 35.493 s\r\nsender span \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0: 15.482 s\r\npayload rate RX span : 1246.0 B\/s \u00a09968.2 bit\/s\r\npayload rate TX span : 2856.6 B\/s \u00a022852.9 bit\/s\r\none-way latency \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0min\/median\/mean\/p95\/max\/stddev: 212.914 \/ 10820.779 \/ 10497.937 \/ 19392.748 \/ 20224.292 \/ 5938.272 ms\r\nreceiver inter-chunk gap min\/median\/mean\/p95\/max\/stddev: 145.000 \/ 243.000 \/ 241.449 \/ 291.700 \/ 729.000 \/ 57.537 ms\r\nsender inter-chunk gap min\/median\/mean\/p95\/max\/stddev: 103.946 \/ 105.794 \/ 105.317 \/ 106.740 \/ 111.933 \/ 1.353 ms\r\n\r\nHello\/handshake RX records:\r\nzerodev2 \u00a0\u00a0-&gt; zerodev1 \u00a0\u00a0recv=11:13:18.032 latency= 163.721 ms message='hello'\r\nzerodev1 \u00a0\u00a0-&gt; zerodev2 \u00a0\u00a0recv=11:13:18.034 latency= 103.598 ms message='hello back'\r\n\r\nCaution: one-way latency assumes sender and receiver clocks are synchronized.\r\nYour chronyc tracking output helps bound this error, but it is not a substitute for ACK\/round-trip timing.\r\n(rnsenv) jlpoole@jp \/usr\/local\/src\/ble-reticulum<\/pre>\n<\/blockquote>\n<figure id=\"attachment_692\" aria-describedby=\"caption-attachment-692\" style=\"width: 1595px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-692\" src=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/05\/20260516_133017_Sat.png\" alt=\"2 Linux consoles, side by side\" width=\"1595\" height=\"950\" srcset=\"https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/05\/20260516_133017_Sat.png 1595w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/05\/20260516_133017_Sat-300x179.png 300w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/05\/20260516_133017_Sat-768x457.png 768w, https:\/\/salemdata.net\/johnpress\/wp-content\/uploads\/2026\/05\/20260516_133017_Sat-1536x915.png 1536w\" sizes=\"auto, (max-width: 1595px) 100vw, 1595px\" \/><figcaption id=\"caption-attachment-692\" class=\"wp-caption-text\">Consoles to two Pi Zero&#8217;s<\/figcaption><\/figure>\n<p><em>Access to my Forgejo repository requires registration; the AI bots were flooding the site so I&#8217;ve restricted access.\u00a0 Contact me if you wish access.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Highly Technical GitHub user Torlando (torlando-tech) developed a bluetooth protocol for Reticulum.\u00a0 The protocol is implemented in Python. I wanted to kick the tires and determine the interface&#8217;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++ [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":689,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24,121],"tags":[125],"class_list":["post-687","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-raspberry-pi-zero-2-w","category-t-beam","tag-reticulum"],"_links":{"self":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts\/687","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=687"}],"version-history":[{"count":5,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts\/687\/revisions"}],"predecessor-version":[{"id":694,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/posts\/687\/revisions\/694"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=\/wp\/v2\/media\/689"}],"wp:attachment":[{"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=687"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=687"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/salemdata.net\/johnpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}