Reticulum w HSWro

Co to jest Reticulum?

Reticulum jest narzędziem do budowy własnych sieci komputerowych, nie ograniczonych do stosu TCP/IP, gdzie dane domyślnie są szyfrowane, a adresami są przenośne hashe m.in. kluczy publicznych. Sam stos jest przystosowany do przesyłania danych w trudnych warunkach i poprzez bardzo wolne połączenia (np. LoRa). Z praktycznych zastosowań: jest dostępny kompunikator, proste “strony internetowe”, zdalny shell i inne rzeczy.

Uwaga: to jest soft względnie eksperymentalny i może okazać się, że nic nie działa.

O, LoRa? To takie coś jak Meshtastic?

Z daleka patrząc może wyglądać podobnie (i tu i tu można wysyłać wiadomości po LoRa), ale po zajrzeniu wgłąb widać różnice.

  • Meshtastic powstał aby rozwiązać praktyczny problem – komunikacji w terenach, gdzie dostęp do innych sieci jest utrudniony. Reticulum chce tworzyć niezależne, oddolne, alternatywne sieci.
  • Meshtastic sprawia wrażenie rozwiązania mającego podejście bardziej “od góry”, mającego problem do rozwiązania i próbującego go rozwiązać, Reticulum zdaje się podchodzić do sprawy “od dołu”, czyli autor pracuje nad standaryzowaniem protokołu i wzorcową implementacją, na której dopiero budują inni.
    • osobiście nie uważam, żeby jedno podejście było lepsze od drugiego, ale na pewno podejście Reticulum jest ciekawsze z perspektywy osoby chcącej coś pohackować :wink:
  • Meshtastic opiera się na LoRa z opcjonalnym MQTT po internecie. Dla Reticulum internet, LoRa, packet radio, połączenie po UART czy cokolwiek innego to generalnie równoważne media.

Inne pytania

Czy muszę być radioamatorem żeby się w to bawić?

Nie.

Czy też potrafi robić mesh, tzn routować pakiety między urządzeniami?

Tak.

Jak się podłączyć?

Aby podłączyć się przez internet należy skonfigurować klienta aby łączył się z conajmniej jednym node. Przykłady:

  [[dismails TCP Interface]]
    type = TCPClientInterface
    interface_enabled = true
    target_host = rns.dismail.de
    target_port = 7822
    name = dismails TCP Interface

  [[Sydney RNS]]
    type = TCPClientInterface
    enabled = true
    target_host = sydney.reticulum.au
    target_port = 4242
    name = Sydney RNS

  [[reticulum.n7ekb.net]]
    type = TCPClientInterface
    mode = gateway
    enabled = yes
    target_host = reticulum.n7ekb.net
    target_port = 48086

[[noDNS1]]
    type = TCPClientInterface
    interface_enabled = true
    target_host = 202.61.243.41
    target_port = 4965
    name = noDNS1

Można też połączyć się bezpośrednio z HSowym node. Na chwilę obecną nie jest wystawiony na świat, więc dostęp jest tylko z sieci wewnątrznej HSWro:

  [[hswro]]
    type = TCPClientInterface
    enabled = true
    target_host = hswro-reticulum.lan.hswro.org
    target_port = 4242

A co z LoRa?

Na chwilę obecną anteny są dość symboliczne, więc raczej wątpliwe żeby dało się połączyć z domu, natomiast testowanie wewnątrz HSu jest jak najbardziej zalecane.

Do połączenia potrzebna jest płytka z LoRa na 433 MHz lub 868 MHz z softem RNode: RNode | unsigned.io . Soft ten sam z siebie niewiele robi, działa tylko jako modem.

Parametry które powinny być ustawione do połączenia:

  [[lora433]]
    type = RNodeInterface
    interface_enabled = True
    port = ścieżka do portu gdzie podłączony jest RNode
    frequency = 433575000
    txpower = 15
    bandwidth = 125000
    spreadingfactor = 8
    codingrate = 7

  [[lora868]]
    type = RNodeInterface
    interface_enabled = True
    port = ścieżka do portu gdzie podłączony jest RNode
    frequency = 868000000
    bandwidth = 250000
    spreadingfactor = 8
    codingrate = 7

No dobra, ale co można z tym robić?

Wymiana wiadomości

W Reticulum przyjął się standard LXMF, dzięki czemu wszystkie wymienione wcześniej aplikacje są ze sobą kompatybilne i można między nimi rozmawiać.

Co ciekawe: mimo to, że jest to standard P2P, to nie ma konieczności żeby obie strony rozmowy były jednocześnie połączone. W tym celu wykorzystuje się Propagation Nodes, które przechowują wiadomości i synchronizują je między sobą.

NomadNet

Można tworzyć i przeglądać proste strony kojarzące się trochę z dawnymi BBSami (są takie bo są przystosowane do przesyłania m.in. po LoRa, więc wiele się nie ugra; tworzone są we własnym formacie zwanym Micron). nomadnet pozwala na tworzenie stron dynamicznych poprzez skrypty (jeśli strona jest wykonywalna, to on ją wykona i prześle stdout do klienta), i ludzie całkiem szaleją, tworząc fora i całe sieci społecznościowe.

Polecam uruchomić klienta, zostawić na trochę i zobaczyć co się ogłasza (w zakładce Announces w MeshChat, w nomadnet analogicznie). Niektóre to niezłe perełki.

Tej funkcjonalności niestety nie ma w androidowym Sidebandzie.

Można próbować tworzyć swoje strony. Z dokumentacją jest jak jest, ale bardzo pomocne jest to narzędzie: Micron Playground

Aktualny setup sprzętowy:

  • orange pi pc (bo leżało w szufladzie)
  • tt-go lora 433MHz podpięte po USB
  • Heltec v3 868MHz podpięty po USB

Na początku myślałem o tym żeby podpiąć płytki z LoRa pod GPIO Orange Pi, ale doszedłem do wniosku że nie ma z tego żadnego zysku a tylko jest trudniej.

Co jeszcze?

Standard jest rozszerzalny, więc można się bawić. Warto spojrzeć tu: Awesome Reticulum · markqvist/Reticulum Wiki · GitHub , gdzie jest dużo linków do różnego rodzaju wynalazków, również alternatywnych implementacji Reticulum (jest nawet jedna która chce działać od początku do końca na ESP32, bez konieczności dodatkowego kompa).

Na pewno polecam przeczytać manual: Reticulum Network Stack 1.0.0 documentation . Jest przystępnie napisany i porusza tematy od tego, jak w ogóle cokolwiek uruchomić, do pisania własnych aplikacji na Reticulum oraz implementacje transportów.

6 Likes

Update projektu

Przetestowałem dostęp po LoRa na 433 MHz. Działa, i nawet udało mi się sprawdzić pogodę używając jakiegoś randomowego bota wystawionego przez kogoś w internecie :smiling_face_with_three_hearts:

Oprócz tego strona w NomadNecie się rozwija. Pojawił się prosty shoutbox + prosty sposób na identyfikację – hasło jest wspólne dla wszystkich a nick wpisujesz jaki chcesz. Po hasło proszę się zgłosić do mnie.

Jedna kwestia odnośnie logowania: domyślnie przeglądarki NomadNetu nie wysyłają stronie swojego adresu, co pozwala zachować prywatność odwiedzającego i uniemożliwia śledzenie. Mimo to jednak chcąc się zalogować trzeba ten adres wysłać, bo inaczej strona nie będzie w stanie rozróżnić kto jest kim (coś w stylu reverse ciasteczek). Aby to zrobić:

  • W MeshChat trzeba kliknąć ikonkę odcisku palca w prawym górnym rogu okna,
  • W NomadNet trzeba:
    1. Zapisać node do ulubionych (na liście announce kliknąć node i wybrać <Save>),
    2. Następnie na liście ulubionych node kliknąć dany node, wybrać <Info>, zaznaczyć Identify when connecting i dać <Save>.
    3. Jeśli strona HSWro jest otwarta, to zfocusować (tzn kliknąć na) nią i rozłączyć się naciskając Ctrl+W.
    4. Po ponownym połączeniu (czyli otwarciu strony HSWro) powinno być możliwe zalogowanie się bez problemu.

Kod strony dostępny jest na fleg/nomadnet-website - Hackerspace Wrocław , więc każdy może sobie uruchomić kopię u siebie i na niej haksować. Pull requesty bardzo mile widziane. Also: to jest programowanie rekreacyjne, więc nie oczekujcie enterprise jakości kodu.

1 Like

Zrobiłem prostą bibliotekę plików tekstowych, pliki te można podejrzeć bezpośrednio albo pobrać. Jak widać nie za bardzo mam pomysł co tam umieścić, ale trudno :smiley:

Wszelkie zmiany wylądowały w repo na fleg/nomadnet-website - Hackerspace Wrocław , jak również cały czas jest żywe pod adresem c4e05039498407c9d04efd67b3991d9b:/page/index.mu

Party line bot jest dostępny pod adresem b5f506603637b932bb4b2df61e0b9e49 (rozmowa LXMF, więc trzeba zagadać z nomadneta, sidebanda itp). Po zalogowaniu wiadomości wysłane do niego są przekazywane do wszystkich zalogowanych do bota użytkowników, więc jest to taka biedacka konferencja. Hasło: k0moda.

Kod można znaleźć w repo: nomadnet-website/groupchatbot w main - fleg/nomadnet-website - Hackerspace Wrocław

Postawiłem nowy eksperymantalny node Reticulum w HSie – podłączony tylko i wyłącznie za pomocą LoRa, bez jakiejkolwiek innej łączności.

Node składa się z RPi Zero i Helteca na 868MHz. Schemat połączeń poniżej (200h w kolourpaint), niestety nie jest idealny – na tak podłączonej płytce nie można flashować FW. Nie chciało mi się tego rozkminiać, ale na przyszłość warto by było się temu przyjrzeć. Co prawda na obrazku jest RPi Zero 2W (wg opisu w necie), ale takie zdjęcie tylko znalazłem w internecie, a pinout jest taki sam.

Obudowa samodzielnie zaprojektowana w OpenSCAD za pomocą YAPPgeneratora. Nic szczególnego (nie miałem jak chwycić helteca rozsądnie więc leży swobodnie oddzielony ścianką od RPi), ale jak ktoś chce to źródło jest tu.

Wnioski

  • Najważniejszą rzeczą której się nauczyłem to ustawianie odpowiednich interface modes. Konkretnie to ustawienie gateway na interfejsie który dawał dostęp do szerszego świata (czyli: interfejsu lorowego na node podłączonym do internetu) sprawiło, że rzeczy nagle zaczęły działać.
  • Podłączenie było w sumie zaskakująco proste. Na samym node wyniesionym do serwerowni jedyne co musiałem ustawić to:
    • uruchomić usługi które chciałem, żeby działały
    • skonfigurować rnsd żeby używał płytki lorowej oraz ustawić na niej odpowiednią częstotliwość itp.
    • Po tych dwóch krokach rzeczy zaczęły w sumie działać jak rozgłoszenia poszły w sieć.
  • rnsh (czyli bieda-ssh po reticulum) przez LoRa działa strasznie wolno i ledwo używalnie, ale jednak działa – w sytuacji awaryjnej może się przydać.
  • Co w sumie nie powinno zaskakiwać, ale konfiguracja rnode w trakcie gdy używa się go do połączenia nie działa :smiley: więc żeby po zainstalowaniu urządzenia w serwerowni wyłączyć wyświetlacz bez fizycznego podłączania się do płytki musiałem w detached tmuksie odpalić następujący skrypt:
sleep 30
systemctl stop rnsd
sleep 10
/home/reticulum/venv/bin/rnodeconf --timeout 5
sleep 10
systemctl start rnsd

sleepy może i nie były potrzebne, ale uznałem że nie będę ryzykował :grin:

Usługi działające na tym node

  • Strona Nomadnet (prawie taka sama jak na głównym node podłączonym do internetu): f8c8759f6d3f51e5751512137b4869ca
  • Party Line bot (do rozmów grupowych): rozmowa LXMF (sideband, meshchat, nomadnet etc.) pod 3a5aedd0b00eed70b082fa59d7d68a79
1 Like

Konfiguracja node HSWro

Nie uważam tego za konfigurację idealną, ale może komuś posłużyć za punkt wyjściowy.

Instalacja oprogramowania

Pod Linuksem stworzyłem użytkownika o nazwie reticulum i praktycznie wszystko robiłem z jego poziomu.

python3 -m venv /home/reticulum/venv --system-site-packages
source /home/reticulum/venv/bin/activate
pip install rns nomadnet

Oprócz tego do moich skryptów potrzebna jest instalacja pakietów valkey python3-redis, ale jeśli z nich nie korzystasz to nie są one do niczego potrzebne.

Pliki konfiguracyjne

Komentarze usunąłem żeby oszczędzić miejsca, i tak od siebie nowych nie dodawałem.

/home/reticulum/.reticulum/config

[reticulum]
  enable_transport = True
  share_instance = Yes
  instance_name = default
panic_on_interface_error = Yes

[logging]
  loglevel = 6

[interfaces]
  [[Default Interface]]
    type = AutoInterface
    enabled = Yes

  [[Backbone Listener]]
  	type = BackboneInterface
  	enabled = yes
  	listen_on = 0.0.0.0
  	port = 4242
  	name = Backbone Interface

  [[dismails TCP Interface]]
    type = TCPClientInterface
    interface_enabled = true
    target_host = rns.dismail.de
    target_port = 7822
    mode = boundary
    name = dismails TCP Interface

  [[Sydney RNS]]
    type = TCPClientInterface
    enabled = true
    target_host = sydney.reticulum.au
    target_port = 4242
    name = Sydney RNS
    mode = boundary

  [[reticulum.n7ekb.net]]
    type = TCPClientInterface
    mode = gateway
    enabled = yes
    target_host = reticulum.n7ekb.net
    target_port = 48086

  [[lora433]]
    type = RNodeInterface
    port = /dev/serial/by-id/usb-1a86_USB_Single_Serial_5185009521-if00
    frequency = 433575000
    txpower = 15
    bandwidth = 125000
    spreadingfactor = 8
    codingrate = 7
    id_callsign = sp6hack
    id_interval = 600
    mode = gateway
    name = LoRa 433.454MHz

  [[lora868]]
    type = RNodeInterface
    port = /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0
    frequency = 868000000
    txpower = 11
    bandwidth = 250000
    spreadingfactor = 8
    codingrate = 7
    id_callsign = sp6hack
  	id_interval = 600
    mode = gateway
    name = LoRa 868 MHz

/home/reticulum/.nomadnetwork/config

[logging]
loglevel = 6
destination = console

[client]
enable_client = yes
user_interface = text
downloads_path = ~/Downloads
notify_on_new_message = yes
announce_at_start = yes
try_propagation_on_send_fail = yes
periodic_lxmf_sync = yes
lxmf_sync_interval = 360
lxmf_sync_limit = 8
required_stamp_cost = 10
accept_invalid_stamps = False
max_accepted_size = 50
compact_announce_stream = yes

[textui]
intro_time = 1
theme = dark
colormode = 256
glyphs = unicode
mouse_enabled = True
editor = micro
hide_guide = no

[node]
enable_node = yes
node_name = HSWro
announce_interval = 60
announce_at_start = Yes
disable_propagation = Yes
message_storage_limit = 20
max_transfer_size = 256
page_refresh_interval = 5
file_refresh_interval = 5

[printing]
print_messages = No
print_command = lp

Unity systemd

Po stworzeniu plików trzeba te serwisy włączyć i uruchomić:

sudo systemctl daemon-reload
sudo systemctl enable rnsd.service
sudo systemctl enable nomadnet.service
sudo systemctl start rnsd.service
sudo systemctl start nomadnet.service

/etc/systemd/system/rnsd.service

[Unit]
Description=Reticulum Network Stack Daemon
After=multi-user.target

[Service]
Type=simple
Restart=always
RestartSec=3
User=reticulum
ExecStart=/home/reticulum/venv/bin/rnsd --verbose

[Install]
WantedBy=multi-user.target

/etc/systemd/system/nomadnet.service

[Unit]
Description=Nomad Network
After=multi-user.target rnsd.service
Requires=rnsd.service

[Service]
Type=simple
Restart=always
RestartSec=3
User=reticulum
ExecStart=/home/reticulum/venv/bin/nomadnet -d -c

[Install]
WantedBy=multi-user.target
1 Like

Nowy węzeł RNS

@fleg zapoczątkował fazę na RNS, którą łyknąłem jak młody pelikan. Od tamtej pory również zacząłem działać w sieci Reticulum oraz przy ogromnej pomocy @majabojarska pisać Conference Bota do wykorzystanie w HSWro, ale i nie tylko.


W RNS mamy różne typy urządzeń w sieci: Client, Transport Node i Propagation Node:

  • Client to tak jak sama nazwa wskazuje - klient końcowy: nasz telefon podłączony po sieci WiFi, albo po LoRa, wysyła wiadomości i ew. telemetrię
  • Transport Node - węzeł transportowy, który najpierw sprawdza, czy pakiet nie wygasł, po czym pcha dalej go w sieć i przedłuża jej zasięg. To jest ważne dla na przykład sprzęgnięcia sieci LoRa z Ethernetem i innymi mediami
  • Propagation Node - chyba najbardziej rozbudowany element sieci - ma w sobie transport i propagację pakietów w sieci - Propagation Node umożliwiają przechowywanie i przekazywanie wiadomości do użytkowników lub punktów końcowych, które nie są bezpośrednio dostępne w momencie wysyłania wiadomości. Takie węzły mogą również zapewniać infrastrukturę dla rozproszonych biuletynów, wiadomości lub forów dyskusyjnych.
    Gdy w sieci Reticulum istnieją węzły propagacyjne, domyślnie łączą się one ze sobą i synchronizują wiadomości, automatycznie tworząc zaszyfrowany, rozproszony magazyn wiadomości. Użytkownicy i inne punkty końcowe mogą pobierać wiadomości przeznaczone dla nich z dowolnego dostępnego węzła propagacyjnego w sieci.

Ale dobra, co takiego robiłem przez ostatni czas w sieci:

Udoskonaliłem bota Michała o dodatkowe funkcje, takie jak pogodynka z internetu (rozszerzenie o własną stację pogodową też zaczyna powoli nabierać tempa), wyszukiwanie po adresie LXMF następnego skoku, skrzynkę mailową oraz parę innych rzeczy. Bot zostanie wdrożony do spejsu jak zostanie udoskonalony do granic cierpliwości. W tej chwili cały ruch z HSWro idzie stricte po LoRa do mojego węzła transportowego, który mieści się w akademiku po drugiej stronie. Na razie węzeł jest dostępny tylko na 433MHz, ale jak wrócę do Wrocławia to czeka go upgrade o płytkę i antenę na 868. Kod do bota zostanie udostępniony na GitHubie, jak tylko będzie on jakoś wyglądać i posiadać jeszcze jakieś kozackie funkcje.

Dodatkowo od dzisiaj (tj. 28.12.2025) został uruchomiony Propagation Node i nawet już jest widoczny w sieci. Śmiało można korzystać i pobierać informację o innych użytkownikach w sieci i trasach. A tak wygląda na tą chwilę całe zestawienie:

Jestem dostępny w RNS tutaj: ae27b9e8b8d9e738fdd37170c83f3844, można się testować.

Mój bot jest dostępny tutaj: f202ae6541f5e69c204d0b2bcbfcd273, jako że jest to dalej WIP to po hasło należy kontaktować się ze mną. Ustawienia LoRa to na tą chwilę 433.575MHz CR7 SF8. Bot dostępny jest również poprzez Internet pod tym samym adresem.

Propagation Node do ustawienia na swoim urządzeniu (Sideband, Meshchat, Nomadnet): 92f3b505b9dcdae8196d440e14677a46

3 Likes