Initial commit: RNodeTHV4 boundary mode firmware for Heltec V4
Bridges LoRa mesh and TCP/WiFi backbone networks using microReticulum. Based on microReticulum_Firmware with boundary mode additions: - BoundaryMode.h: State management and EEPROM persistence - BoundaryConfig.h: WiFi captive portal for configuration - TcpInterface.h: TCP backbone interface with HDLC framing - Display.h: Custom OLED layout with network status indicators - Transport/Identity library patches for embedded memory constraints
47
Console/Makefile
Executable file
@@ -0,0 +1,47 @@
|
||||
PATH_RETICULUM_WEBSITE=../../sites/reticulum.network
|
||||
PATH_PACKAGES=../../dist_archive
|
||||
|
||||
clean:
|
||||
@echo Cleaning...
|
||||
@-rm -rf ./build
|
||||
|
||||
dirs:
|
||||
@mkdir -p ./build
|
||||
@mkdir -p ./build/3d
|
||||
@mkdir -p ./build/pkg
|
||||
@mkdir -p ./build/css
|
||||
@mkdir -p ./build/gfx
|
||||
@mkdir -p ./build/images
|
||||
|
||||
pages:
|
||||
python ./build.py
|
||||
|
||||
pages-debug:
|
||||
python ./build.py --no-gz --no-remap
|
||||
|
||||
sourcepack:
|
||||
@echo Packing firmware sources...
|
||||
zip --junk-paths -r build/pkg/rnode_firmware.zip ../arduino-cli.yaml ../BLESerial.cpp ../BLESerial.h ../Bluetooth.h ../Boards.h ../Config.h ../Console.h ../Device.h ../Display.h ../Framing.h ../Graphics.h ../LICENSE ../Makefile ../MD5.cpp ../MD5.h ../partition_hashes ../Power.h ../README.md ../release_hashes.py ../RNode_Firmware.ino ../ROM.h ../sx126x.cpp ../sx126x.h ../sx127x.cpp ../sx127x.h ../sx128x.cpp ../sx128x.h ../Utilities.h ../esp32_btbufs.py
|
||||
|
||||
data:
|
||||
@echo Including assets...
|
||||
@cp assets/css/* build/css/
|
||||
@cp assets/gfx/* build/gfx/
|
||||
@cp assets/images/* build/images/
|
||||
@cp assets/stl/* build/3d/
|
||||
#@cp assets/pkg/* build/pkg/
|
||||
# @cp assets/scripts/* build/scripts/
|
||||
# @cp -r ../../Reticulum/docs/manual/* build/reticulum_manual/
|
||||
# @cp -r ../../Reticulum/docs/Reticulum\ Manual.pdf build/reticulum_manual/
|
||||
|
||||
external:
|
||||
make -C $(PATH_RETICULUM_WEBSITE) clean website
|
||||
-rm -r $(PATH_PACKAGES)/reticulum.network
|
||||
cp -r $(PATH_RETICULUM_WEBSITE)/build $(PATH_PACKAGES)/reticulum.network
|
||||
|
||||
site: clean external dirs data sourcepack pages
|
||||
|
||||
local: clean external dirs data sourcepack pages-debug
|
||||
|
||||
serve:
|
||||
python -m http.server 7777 --bind 127.0.0.1 --directory ./build
|
||||
1009
Console/assets/css/water.css
Executable file
BIN
Console/assets/css/yond.woff2
Executable file
BIN
Console/assets/gfx/cs.webp
Executable file
|
After Width: | Height: | Size: 806 B |
BIN
Console/assets/gfx/icon.png
Executable file
|
After Width: | Height: | Size: 955 B |
BIN
Console/assets/gfx/nn.webp
Executable file
|
After Width: | Height: | Size: 9.9 KiB |
BIN
Console/assets/gfx/ph.png
Executable file
|
After Width: | Height: | Size: 747 B |
BIN
Console/assets/gfx/rnode_iso.webp
Executable file
|
After Width: | Height: | Size: 17 KiB |
BIN
Console/assets/gfx/sideband.webp
Executable file
|
After Width: | Height: | Size: 17 KiB |
BIN
Console/assets/images/3_conv.webp
Executable file
|
After Width: | Height: | Size: 17 KiB |
BIN
Console/assets/images/an1.webp
Executable file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
Console/assets/images/bg1ds1.webp
Executable file
|
After Width: | Height: | Size: 15 KiB |
BIN
Console/assets/images/bg1ds2.webp
Executable file
|
After Width: | Height: | Size: 17 KiB |
BIN
Console/assets/images/bg_h_1.webp
Executable file
|
After Width: | Height: | Size: 33 KiB |
BIN
Console/assets/images/bg_h_2.webp
Executable file
|
After Width: | Height: | Size: 21 KiB |
BIN
Console/assets/images/g1p.webp
Executable file
|
After Width: | Height: | Size: 23 KiB |
BIN
Console/assets/images/g2p.webp
Executable file
|
After Width: | Height: | Size: 32 KiB |
BIN
Console/assets/images/g3p.webp
Executable file
|
After Width: | Height: | Size: 20 KiB |
BIN
Console/assets/images/g4p.webp
Executable file
|
After Width: | Height: | Size: 24 KiB |
BIN
Console/assets/images/lora_rnodes.webp
Executable file
|
After Width: | Height: | Size: 35 KiB |
BIN
Console/assets/images/nn_an.webp
Executable file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
Console/assets/images/nn_conv.webp
Executable file
|
After Width: | Height: | Size: 14 KiB |
BIN
Console/assets/images/nn_init.webp
Executable file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
Console/assets/stl/Handheld_RNode_Parts.7z
Executable file
373
Console/build.py
Executable file
@@ -0,0 +1,373 @@
|
||||
import markdown
|
||||
import os
|
||||
import sys
|
||||
import shutil
|
||||
|
||||
packages = {
|
||||
"rns": "rns-1.0.3-py3-none-any.whl",
|
||||
"nomadnet": "nomadnet-0.9.1-py3-none-any.whl",
|
||||
"lxmf": "lxmf-0.9.3-py3-none-any.whl",
|
||||
"rnsh": "rnsh-0.1.5-py3-none-any.whl",
|
||||
}
|
||||
|
||||
DEFAULT_TITLE = "RNode Bootstrap Console"
|
||||
SOURCES_PATH="./source"
|
||||
BUILD_PATH="./build"
|
||||
PACKAGES_PATH = "../../dist_archive"
|
||||
RNS_SOURCE_PATH = "../../Reticulum"
|
||||
INPUT_ENCODING="utf-8"
|
||||
OUTPUT_ENCODING="utf-8"
|
||||
|
||||
LXMF_ADDRESS = "8dd57a738226809646089335a6b03695"
|
||||
|
||||
document_start = """
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="{ASSET_PATH}css/water.css?v=4">
|
||||
<link rel="shortcut icon" type="image/x-icon" href="{ASSET_PATH}gfx/icon.png">
|
||||
<meta charset="utf-8"/>
|
||||
<title>{PAGE_TITLE}</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
<body>
|
||||
<div id="load_overlay" style="background-color:#2a2a2f; position:absolute; top:0px; left:0px; width:100%; height:100%; z-index:2000;"></div>
|
||||
<span class="logo">RNode Console</span>
|
||||
{MENU}<hr>"""
|
||||
|
||||
document_end = """</body></html>"""
|
||||
|
||||
menu_md = """<center markdown=\"1\"><span class="menu">[Start]({CONTENT_PATH}index.html) | [Replicate]({CONTENT_PATH}replicate.html) | [Software]({CONTENT_PATH}software.html) | [Learn]({CONTENT_PATH}learn.html) | [Help](help.html) | [Contribute]({CONTENT_PATH}contribute.html)</span></center>"""
|
||||
|
||||
manual_redirect = """
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0; url=/m/index.html">
|
||||
</head>
|
||||
</html>
|
||||
"""
|
||||
help_redirect = """
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="refresh" content="0; url=/help.html">
|
||||
</head>
|
||||
</html>
|
||||
"""
|
||||
|
||||
url_maps = [
|
||||
# { "path": "", "target": "/.md"},
|
||||
]
|
||||
|
||||
def scan_pages(base_path):
|
||||
files = [file for file in os.listdir(base_path) if os.path.isfile(os.path.join(base_path, file)) and file[:1] != "."]
|
||||
directories = [file for file in os.listdir(base_path) if os.path.isdir(os.path.join(base_path, file)) and file[:1] != "."]
|
||||
|
||||
page_sources = []
|
||||
|
||||
for file in files:
|
||||
if file.endswith(".md"):
|
||||
page_sources.append(base_path+"/"+file)
|
||||
|
||||
for directory in directories:
|
||||
page_sources.extend(scan_pages(base_path+"/"+directory))
|
||||
|
||||
return page_sources
|
||||
|
||||
def get_prop(md, prop):
|
||||
try:
|
||||
pt = "["+prop+"]: <> ("
|
||||
pp = md.find(pt)
|
||||
if pp != -1:
|
||||
ps = pp+len(pt)
|
||||
pe = md.find(")", ps)
|
||||
return md[ps:pe]
|
||||
else:
|
||||
return None
|
||||
|
||||
except Exception as e:
|
||||
print("Error while extracting topic property: "+str(e))
|
||||
return None
|
||||
|
||||
def list_topic(topic):
|
||||
base_path = SOURCES_PATH+"/"+topic
|
||||
files = [file for file in os.listdir(base_path) if os.path.isfile(os.path.join(base_path, file)) and file[:1] != "." and file != "index.md"]
|
||||
|
||||
topic_entries = []
|
||||
for file in files:
|
||||
if file.endswith(".md"):
|
||||
fp = base_path+"/"+file
|
||||
f = open(fp, "rb")
|
||||
link_path = fp.replace(SOURCES_PATH, ".").replace(".md", ".html")
|
||||
|
||||
md = f.read().decode(INPUT_ENCODING)
|
||||
topic_entries.append({
|
||||
"title": get_prop(md, "title"),
|
||||
"image": get_prop(md, "image"),
|
||||
"date": get_prop(md, "date"),
|
||||
"excerpt": get_prop(md, "excerpt"),
|
||||
"md": md,
|
||||
"file": link_path
|
||||
})
|
||||
|
||||
topic_entries.sort(key=lambda e: e["date"], reverse=True)
|
||||
return topic_entries
|
||||
|
||||
def render_topic(topic_entries):
|
||||
md = ""
|
||||
for topic in topic_entries:
|
||||
md += "<a class=\"topic_link\" href=\""+str(topic["file"])+"\">"
|
||||
md += "<span class=\"topic\">"
|
||||
md += "<img class=\"topic_image\" src=\""+str(topic["image"])+"\"/>"
|
||||
md += "<span class=\"topic_title\">"+str(topic["title"])+"</span>"
|
||||
#md += "<span class=\"topic_date\">"+str(topic["date"])+"</span>"
|
||||
md += "<span class=\"topic_excerpt\">"+str(topic["excerpt"])+"</span>"
|
||||
md += "</span>"
|
||||
md += "</a>"
|
||||
|
||||
|
||||
return md
|
||||
|
||||
def generate_html(f, root_path):
|
||||
md = f.read().decode(INPUT_ENCODING)
|
||||
|
||||
page_title = get_prop(md, "title")
|
||||
if page_title == None:
|
||||
page_title = DEFAULT_TITLE
|
||||
else:
|
||||
page_title += " | "+DEFAULT_TITLE
|
||||
|
||||
tt = "{TOPIC:"
|
||||
tp = md.find(tt)
|
||||
if tp != -1:
|
||||
ts = tp+len(tt)
|
||||
te = md.find("}", ts)
|
||||
topic = md[ts:te]
|
||||
|
||||
rt = tt+topic+"}"
|
||||
tl = render_topic(list_topic(topic))
|
||||
print("Found topic: "+str(topic)+", rt "+str(rt))
|
||||
md = md.replace(rt, tl)
|
||||
|
||||
menu_html = markdown.markdown(menu_md.replace("{CONTENT_PATH}", root_path), extensions=["md_in_html", "markdown.extensions.fenced_code", "sane_lists"]).replace("<p></p>", "")
|
||||
page_html = markdown.markdown(md, extensions=["md_in_html", "markdown.extensions.fenced_code"]).replace("{ASSET_PATH}", root_path)
|
||||
page_html = page_html.replace("{LXMF_ADDRESS}", LXMF_ADDRESS)
|
||||
for pkg_name in packages:
|
||||
page_html = page_html.replace("{PKG_"+pkg_name+"}", "pkg/"+pkg_name+".zip")
|
||||
page_html = page_html.replace("{PKG_BASE_"+pkg_name+"}", pkg_name+".zip")
|
||||
page_html = page_html.replace("{PKG_NAME_"+pkg_name+"}", packages[pkg_name])
|
||||
|
||||
page_date = get_prop(md, "date")
|
||||
if page_date != None:
|
||||
page_html = page_html.replace("{DATE}", page_date)
|
||||
|
||||
return document_start.replace("{ASSET_PATH}", root_path).replace("{MENU}", menu_html).replace("{PAGE_TITLE}", page_title) + page_html + document_end
|
||||
|
||||
source_files = scan_pages(SOURCES_PATH)
|
||||
|
||||
mf = open(BUILD_PATH+"/m.html", "w")
|
||||
mf.write(manual_redirect)
|
||||
mf.close()
|
||||
mf = open(BUILD_PATH+"/h.html", "w")
|
||||
mf.write(help_redirect)
|
||||
mf.close()
|
||||
|
||||
def optimise_manual(path):
|
||||
pm = 180
|
||||
scale_imgs = [
|
||||
("_images/board_rnodev2.png", pm),
|
||||
("_images/board_rnode.png", pm),
|
||||
("_images/board_heltec32v20.png", pm),
|
||||
("_images/board_heltec32v30.png", pm),
|
||||
("_images/board_heltec32v4.png", pm),
|
||||
("_images/board_t3v21.png", pm),
|
||||
("_images/board_t3v20.png", pm),
|
||||
("_images/board_t3v10.png", pm),
|
||||
("_images/board_t3s3.png", pm),
|
||||
("_images/board_tbeam.png", pm),
|
||||
("_images/board_tdeck.png", pm),
|
||||
("_images/board_rak4631.png", pm),
|
||||
("_images/board_tbeam_supreme.png", pm),
|
||||
("_images/sideband_devices.webp", pm),
|
||||
("_images/nomadnet_3.png", pm),
|
||||
("_images/meshchat_1.webp", pm),
|
||||
("_images/radio_is5ac.png", pm),
|
||||
("_images/radio_rblhg5.png", pm),
|
||||
("_static/rns_logo_512.png", 256),
|
||||
("../images/bg_h_1.webp", pm),
|
||||
]
|
||||
|
||||
import subprocess
|
||||
import shlex
|
||||
for i,s in scale_imgs:
|
||||
fp = path+"/"+i
|
||||
input_file = fp
|
||||
output_file = input_file
|
||||
resize = "convert "+input_file+" -quality 25 -resize "+str(s)+" "+output_file
|
||||
print(resize)
|
||||
subprocess.call(shlex.split(resize), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||
# if output_file != input_file and os.path.isfile(input_file): os.unlink(input_file)
|
||||
|
||||
remove_files = [
|
||||
"objects.inv",
|
||||
"Reticulum Manual.pdf",
|
||||
"Reticulum Manual.epub",
|
||||
"_static/styles/furo.css.map",
|
||||
"_static/scripts/furo.js.map",
|
||||
"_static/jquery-3.6.0.js",
|
||||
"_static/jquery.js",
|
||||
"static/underscore-1.13.1.js",
|
||||
"_static/_sphinx_javascript_frameworks_compat.js",
|
||||
"_static/scripts/furo.js.LICENSE.txt",
|
||||
"_static/styles/furo-extensions.css.map",
|
||||
"_images/board_rak4631.png",
|
||||
"_images/board_rnodev2.png",
|
||||
"_images/board_t114.png",
|
||||
"_images/board_t3s3.png",
|
||||
"_images/board_t3v10.png",
|
||||
"_images/board_t3v20.png",
|
||||
"_images/board_t3v21.png",
|
||||
"_images/board_tbeam.png",
|
||||
"_images/board_tdeck.png",
|
||||
"_images/board_techo.png",
|
||||
"_images/board_tbeam_supreme.png",
|
||||
"_images/board_opencomxl.png",
|
||||
"_images/board_heltec32v20.png",
|
||||
"_images/board_heltec32v30.png",
|
||||
# "_static/pygments.css",
|
||||
# "_static/language_data.js",
|
||||
# "_static/searchtools.js",
|
||||
# "searchindex.js",
|
||||
]
|
||||
for file in remove_files:
|
||||
fp = path+"/"+file
|
||||
print("Removing file: "+str(fp))
|
||||
try:
|
||||
os.unlink(fp)
|
||||
except Exception as e:
|
||||
print("An error occurred while attempting to unlink "+str(fp)+": "+str(e))
|
||||
|
||||
remove_dirs = [
|
||||
"_sources",
|
||||
]
|
||||
for d in remove_dirs:
|
||||
fp = path+"/"+d
|
||||
print("Removing dir: "+str(fp))
|
||||
shutil.rmtree(fp)
|
||||
|
||||
shutil.move(path, BUILD_PATH+"/m")
|
||||
|
||||
def fetch_reticulum_site():
|
||||
r_site_path = BUILD_PATH+"/r"
|
||||
if not os.path.isdir(r_site_path):
|
||||
shutil.copytree(PACKAGES_PATH+"/reticulum.network", r_site_path)
|
||||
if os.path.isdir(r_site_path+"/manual"):
|
||||
optimise_manual(r_site_path+"/manual")
|
||||
remove_files = [
|
||||
"gfx/reticulum_logo_512.png",
|
||||
]
|
||||
for file in remove_files:
|
||||
fp = r_site_path+"/"+file
|
||||
print("Removing file: "+str(fp))
|
||||
os.unlink(fp)
|
||||
replace_paths()
|
||||
|
||||
def replace_paths():
|
||||
repls = [
|
||||
("gfx/reticulum_logo_512.png", "/m/_static/rns_logo_512.png")
|
||||
]
|
||||
for root, dirs, files in os.walk(BUILD_PATH):
|
||||
for file in files:
|
||||
fpath = root+"/"+file
|
||||
if fpath.endswith(".html"):
|
||||
print("Performing replacements in "+fpath+"")
|
||||
f = open(fpath, "rb")
|
||||
html = f.read().decode("utf-8")
|
||||
f.close()
|
||||
for s,r in repls:
|
||||
html = html.replace(s,r)
|
||||
f = open(fpath, "wb")
|
||||
f.write(html.encode("utf-8"))
|
||||
f.close()
|
||||
|
||||
# if not os.path.isdir(BUILD_PATH+"/d"):
|
||||
# os.makedirs(BUILD_PATH+"/d")
|
||||
# shutil.move(fpath, BUILD_PATH+"/d/")
|
||||
|
||||
|
||||
def remap_names():
|
||||
for root, dirs, files in os.walk(BUILD_PATH):
|
||||
for file in files:
|
||||
fpath = root+"/"+file
|
||||
spath = fpath.replace(BUILD_PATH, "")
|
||||
if len(spath) > 31:
|
||||
print("Path "+spath+" is too long, remapping...")
|
||||
if not os.path.isdir(BUILD_PATH+"/d"):
|
||||
os.makedirs(BUILD_PATH+"/d")
|
||||
shutil.move(fpath, BUILD_PATH+"/d/")
|
||||
|
||||
|
||||
|
||||
def gz_all():
|
||||
import gzip
|
||||
for root, dirs, files in os.walk(BUILD_PATH):
|
||||
for file in files:
|
||||
fpath = root+"/"+file
|
||||
print("Gzipping "+fpath+"...")
|
||||
f = open(fpath, "rb")
|
||||
g = gzip.open(fpath+".gz", "wb")
|
||||
g.writelines(f)
|
||||
g.close()
|
||||
f.close()
|
||||
os.unlink(fpath)
|
||||
|
||||
from zipfile import ZipFile
|
||||
for pkg_name in packages:
|
||||
pkg_file = packages[pkg_name]
|
||||
pkg_full_path = PACKAGES_PATH+"/"+pkg_file
|
||||
if os.path.isfile(pkg_full_path):
|
||||
print("Including "+pkg_file)
|
||||
z = ZipFile(BUILD_PATH+"/pkg/"+pkg_name+".zip", "w")
|
||||
z.write(pkg_full_path, pkg_full_path[len(PACKAGES_PATH+"/"):])
|
||||
z.close()
|
||||
# shutil.copy(pkg_full_path, BUILD_PATH+"/"+pkg_name)
|
||||
|
||||
else:
|
||||
print("Could not find "+pkg_full_path)
|
||||
exit(1)
|
||||
|
||||
for um in url_maps:
|
||||
with open(SOURCES_PATH+"/"+um["target"], "rb") as f:
|
||||
of = BUILD_PATH+um["target"].replace(SOURCES_PATH, "").replace(".md", ".html")
|
||||
root_path = "../"
|
||||
html = generate_html(f, root_path)
|
||||
|
||||
print("Map path : "+str(um["path"]))
|
||||
print("Map target : "+str(um["target"]))
|
||||
print("Mapped root path: "+str(root_path))
|
||||
|
||||
if not os.path.isdir(BUILD_PATH+"/"+um["path"]):
|
||||
os.makedirs(BUILD_PATH+"/"+um["path"], exist_ok=True)
|
||||
|
||||
with open(BUILD_PATH+"/"+um["path"]+"/index.html", "wb") as wf:
|
||||
wf.write(html.encode(OUTPUT_ENCODING))
|
||||
|
||||
for mdf in source_files:
|
||||
with open(mdf, "rb") as f:
|
||||
of = BUILD_PATH+mdf.replace(SOURCES_PATH, "").replace(".md", ".html")
|
||||
root_path = "../"*(len(of.replace(BUILD_PATH+"/", "").split("/"))-1)
|
||||
html = generate_html(f, root_path)
|
||||
|
||||
if not os.path.isdir(os.path.dirname(of)):
|
||||
os.makedirs(os.path.dirname(of), exist_ok=True)
|
||||
|
||||
with open(of, "wb") as wf:
|
||||
wf.write(html.encode(OUTPUT_ENCODING))
|
||||
|
||||
fetch_reticulum_site()
|
||||
if not "--no-gz" in sys.argv:
|
||||
gz_all()
|
||||
|
||||
if not "--no-remap" in sys.argv:
|
||||
remap_names()
|
||||
8
Console/source/builds/ap.md
Executable file
@@ -0,0 +1,8 @@
|
||||
[date]: <> (2023-01-12)
|
||||
[title]: <> (Outdoor RNode)
|
||||
[image]: <> (gfx/cs.webp)
|
||||
[excerpt]: <> (An outdoor-mountable RNode suitable for Access Point or network extension operation. Also supports high-capacity batteries and solar charging.)
|
||||
## Outdoor AP RNode
|
||||
This RNode comes with a weather-proof case and convenient cable management options, suitable for outdoor mounting and operation. It is possible to mount this RNode directly to masts and antennas, and it supports high-capacity batteries and solar charging.
|
||||
|
||||
This build recipe will be released soon. Please [support the project]({ASSET_PATH}contribute.html) to help realise it!
|
||||
168
Console/source/builds/handheld.md
Executable file
@@ -0,0 +1,168 @@
|
||||
[date]: <> (2023-01-14)
|
||||
[title]: <> (Handheld RNode)
|
||||
[image]: <> (gfx/rnode_iso.webp)
|
||||
[excerpt]: <> (This RNode is suitable for mobile and handheld operation, and offers both wireless and wired connectivity to host devices. A good all-round unit. It is also suitable for permanent installation indoors.)
|
||||
## Handheld RNode Recipe
|
||||
*Version 2.1*
|
||||
|
||||
This build recipe will help you create an RNode that is suitable for mobile and handheld operation, and offers both wireless and wired connectivity to host devices. It is also useful for permanent installation indoors, or even outdoors, as long as it is protected from water ingress and direct sunlight.
|
||||
|
||||
Depending on the board you use, it will offer a workable frequency range between **420 and 520 MHz**, or **820 and 1020 MHz**, and a maximum TX power of **17 dBm** (50 mW).
|
||||
|
||||
<img alt="Completed Handheld RNode" src="{ASSET_PATH}images/bg_h_1.webp" style="width: 100%;"/>
|
||||
<center>*A completed Handheld RNode*</center>
|
||||
|
||||
### Table of Contents
|
||||
|
||||
1. [Preparation](#prep)
|
||||
2. [Supported Boards](#devboard)
|
||||
3. [Materials](#materials)
|
||||
4. [Print Parts](#parts)
|
||||
5. [Install Tools](#tools)
|
||||
6. [Firmware Setup](#firmware)
|
||||
7. [Assembly](#assembly)
|
||||
|
||||
|
||||
### <a name="prep"></a>Step 1: Preparation
|
||||
|
||||
When you have completed this recipe, you will end up with a fully-featured RNode device, similar to the one pictured above. To make it as easy as possible to complete this guide, make sure to read it all in its entirity *before* starting. I also recommend you familiarise yourself with the required materials, and the software tools needed for the setup.
|
||||
|
||||
To complete this build recipe, you will need access to the following items:
|
||||
|
||||
- A computer with a functional operating system, such as Linux, BSD or macOS
|
||||
- One of the [supported development boards](#devboard) for this recipe
|
||||
- A suitable USB cable for connecting the development board to your computer
|
||||
- A 3D printer and the necessary amount of material for printing the [device parts](#parts)
|
||||
- 6 pieces of M2x6mm screws to assemble the case
|
||||
- A suitable antenna
|
||||
- An optional NeoPixel RGB LED
|
||||
- An optional [battery](#battery)
|
||||
- This build can use any single-cell (3.7v) lithium battery with a 1.25mm JST connector, provided it will fit in the case. Please see [this section](#battery) for details on battery sizes.
|
||||
|
||||
### <a name="devboard"></a>Step 2: Supported Development Boards
|
||||
|
||||
This RNode design is using a **LilyGO LoRa32 v2.1** board, in either the **433 MHz**, **868 MHz**, **915 MHz** or **923 MHz** variants. It seems that the 868, 915 and 923 MHz variants are in fact completely identical, and all offer a frequency range between 820 and 1020 MHz. The 433MHz variants offer a frequency range between 420 and 520 MHz.
|
||||
|
||||
These boards are also sold under many different "brand" names other than LilyGO, but using the images below, you should be able to identify the correct ones.
|
||||
|
||||
It is easiest to obtain the version of the board with an **u.FL** (sometimes also labeled *IPX* or *IPEX*) antenna connector, instead of the **SMA** connector. This version comes with an SMA to u.FL pigtail, which is installed into the 3D-printed case. If it is not possible to obtain this version, you can use the one with an **SMA** connector, either as is, or by removing the **SMA** connector, and using the on-board **u.FL** connector instead.
|
||||
|
||||
If you do not wish to use the 3D-printable case included in this guide, it does not matter which version you get. There is **no functional difference** between the boards with **SMA** and **u.FL** connectors.
|
||||
|
||||
<img alt="Compatible board" src="{ASSET_PATH}images/bg_h_2.webp" style="width: 100%;"/>
|
||||
<center>*The correct board version for this RNode build recipe*</center>
|
||||
|
||||
If you want to use the case provided for this build guide, and you have the version with an *SMA* connector, you will have to desolder the **SMA** connector, and activate the *u.FL* connector instead (it's already installed on all the boards, just not activated on the **SMA** connector versions).
|
||||
|
||||
To activate the **u.FL** connector, you will just have to "rotate" the small resistor next to the antenna connectors by 90 degrees, so it "points" at the connector you wish to use.
|
||||
|
||||
Please note that the "resistor" is actually just a zero-ohm jumper. If you don't feel like fiddling around with small components, you can simply remove it, and bridge the relevant gap with a blob of solder.
|
||||
|
||||
Refer to the following two pictures to locate the resistor that needs moving:
|
||||
|
||||
<img alt="Before desoldering" src="{ASSET_PATH}images/bg1ds1.webp" style="display: inline-block;width: 48.7%; margin-right:1%;"/>
|
||||
<img alt="After desoldering" src="{ASSET_PATH}images/bg1ds2.webp" style="display: inline-block;width: 48.7%; margin-left: 1%;"/>
|
||||
<center>*Before and after removing the SMA connector and moving the resistor*</center>
|
||||
|
||||
You will also need to dismount the OLED display from the small acrylic riser on the board, and unscrew and discard the riser. Be careful not to damage the display or ribbon cable while doing this. The OLED display will be mounted directly into a matching slot in the 3D-printed case.
|
||||
|
||||
As before, if you do not want to use the 3D printed case supplied here, it's probably much easier to keep the display on the board, and you can simply skip this step.
|
||||
|
||||
### <a name="materials"></a>Step 3: Obtain Materials
|
||||
|
||||
In addition to the board, you will need a few other components to build this RNode.
|
||||
|
||||
- A suitable **antenna**. Most boards purchased online include a passable antenna, but you may want to upgrade it to a better one.
|
||||
- 6 pieces of **M2x6mm screws** for assembling the case. Can be bought in most hardware stores or from online vendors.
|
||||
- An optional **NeoPixel RGB LED** for displaying status, and TX/RX activity. If you do not want to add this, it can simply be omitted.
|
||||
- The easiest way is to use the PCB-mounted NeoPixel "mini-buttons" manufactured by [adafruit.com](https://www.adafruit.com/product/1612). These fit exactly into the slot in the mounting position in the 3D-printed case, and are easy to connect cables to.
|
||||
- An optional **lithium-polymer battery**.
|
||||
- This RNode supports **3.7v**, **single-cell** LiPo batteries with a **1.25mm JST connector**
|
||||
- The standard case can fit up to a 700mAh LP602248 battery
|
||||
- Maximum battery dimensions for this case is 50mm x 25mm x 6mm
|
||||
- There is a larger bottom casing available that fits 1100mAh batteries
|
||||
- Maximum battery dimensions for this case is 50mm x 25mm x 12mm
|
||||
|
||||
### <a name="parts"></a>Step 4: 3D Print Parts
|
||||
|
||||
To complete the build of this RNode, you will need to 3D-print the parts for the casing. Download, extract and slice the STL files from the [parts package]({ASSET_PATH}3d/Handheld_RNode_Parts.7z) in your preferred software.
|
||||
|
||||
- Two of the parts are LED light-guides, and should be printed in a semi-translucent material:
|
||||
- The `LED_Window.stl` file is a light-guide for the NeoPixel LED, mounted in the circular cutout at the top of the device.
|
||||
- The `LED_Guide.stl` file is a light-guide for the power and charging LEDs, mounted in the rectangular grove at the bottom of the device.
|
||||
- The rest of the parts can be printed in any material, but for durability and heat-resistance, PETG is recommended.
|
||||
- The `Power_Switch.stl` file is a small power-switch slider, mounted in the matching grove on the bottom-left of the device.
|
||||
- The `Case_Top.stl` file is the top shell of the case. It holds the OLED display and NeoPixel RGB LED, and mounts to the bottom shell of the case with 6 M2 screws. The screw holes in both the top and bottom shells of the case are dimensioned to be self-threading when screws are inserted for the first time. Do not over-tighten.
|
||||
- The `Case_Bottom_Small_Battery.stl` file is the default bottom shell of the case. It holds batteries up to approximately 700mAh.
|
||||
- The `Case_Bottom_Large_Battery.stl` file is an alternative bottom shell for the case. It holds batteries up to approximately 1100mAh.
|
||||
- The `Case_Bottom_No_Battery.stl` file is an alternative bottom shell for the case. It does not have space for a battery, but results in a very compact device.
|
||||
- The `Case_Battery_Door.stl` file is the door for the battery compartment of the device. It snap-fits tightly into place in the bottom shell, and features a small slot for opening with a flathead screwdriver or similar.
|
||||
|
||||
All files are dimensioned to fit together perfectly without any scaling on a well-tuned 3D-printer.
|
||||
|
||||
The recommended layer height for all files is 0.15mm for FDM printers.
|
||||
|
||||
### <a name="tools"></a>Step 5: Install Tools
|
||||
|
||||
To install and configure the RNode Firmware on the device, you will need to install the `rnodeconf` program on your computer. This is included in the `rns` package, that can be [installed directly from this RNode]({ASSET_PATH}s_rns.html). Please carry out the installation instructions on [this page]({ASSET_PATH}s_rns.html), and continue to the next step when the `rnodeconf` program is installed.
|
||||
|
||||
|
||||
### <a name="firmware"></a>Step 6: Firmware Setup
|
||||
|
||||
Once the `rnodeconf` program is installed, we will use it to install the RNode Firmware on your device, and do the initial provisioning of configuration parameters. This process can be completed automatically, by using the auto-installer. Run the `rnodeconf` auto-installer with the following command:
|
||||
|
||||
```
|
||||
rnodeconf --autoinstall
|
||||
```
|
||||
|
||||
1. The program will ask you to connect your device to an USB-port on your computer. Do so, and hit enter.
|
||||
2. Select the serial port the device is connected as.
|
||||
3. You will now be asked what device this is, select the option **A Specific Kind of RNode**.
|
||||
4. The installer will ask you what model your device is. Select the **Handheld RNode v2.x** option that matches the frequency band of your device.
|
||||
5. The installer will display a summary of your choices. If you are satisfied, confirm your selection.
|
||||
6. The installer will now automatically install and configure the firmware and prepare the device for use.
|
||||
|
||||
> **Please Note!** If you are connected to the Internet while installing, the autoinstaller will automatically download any needed firmware files to a local cache before installing.
|
||||
|
||||
> If you do not have an active Internet connection while installing, you can extract and use the firmware from this device instead. This will **only** work if you are building the same type of RNode as the device you are extracting from, as the firmware has to match the targeted board and hardware configuration.
|
||||
|
||||
If you need to extract the firmware from an existing RNode, run the following command:
|
||||
|
||||
```
|
||||
rnodeconf --extract
|
||||
```
|
||||
|
||||
If `rnodeconf` finds a working RNode, it will extract and save the firmware from the device for later use. You can then run the auto-installer with the `--use-extracted` option to use the locally extracted file:
|
||||
|
||||
```
|
||||
rnodeconf --autoinstall --use-extracted
|
||||
```
|
||||
|
||||
This also works for updating the firmware on existing RNodes, so you can extract a newer firmware from one RNode, and deploy it onto other RNodes using the same method. Just use the `--update` option instead of `--autoinstall`.
|
||||
|
||||
### <a name="assembly"></a>Step 7: Assembly
|
||||
|
||||
With the firmware installed and configured, and the case parts printed, it's time to put it all together.
|
||||
|
||||
1. Insert the **SMA to u.FL** pigtail adatper into the matching **slot** in the top part of the bottom shell. Make sure it lines up with the internal hex-nut cut-out in the bottom shell, as the hex nut of the adapter will get pulled into this cut-out, and thereby self-lock, when an antenna is connected. You can optionally mount a locking nut on the exterior thread of the SMA connector when the case has been completely assembled.
|
||||
2. Thread the cable of the **SMA to u.FL** pigtail adapter into the matching grove, and run it out of the bottom opening.
|
||||
3. Mount the **power-switch slider** into the matching slot, in the bottom-left part of the bottom shell.
|
||||
4. With the SMA connector and power switch mounted, slide the **board** into the bottom shell, such that the **power switch** of the **board** mates with the slot in the already installed power-switch slider. Click the **board** into place in the bottom shell.
|
||||
5. Optionally mount the **NeoPixel LED**:
|
||||
- Measure out cables that matches lenghts between the NeoPixel mounting slot, and the corresponding pins on the board.
|
||||
- Solder the **V+**, **GND** and **DATA** cables to the NeoPixel.
|
||||
- Solder the **V+** cable to the **3.3v** pin on the board.
|
||||
- Solder the **GND** cable to the **GND** pin on the board.
|
||||
- Solder the **DATA** cable to **IO Pin 12** on the board.
|
||||
- Mount the **NeoPixel** in the circular slot in the top part of the top shell.
|
||||
6. Carefully mount the OLED display in the rectangular slot in the middle part of the top shell.
|
||||
7. While ensuring that all internal cables stay within their routing groves, place the **top shell** on top of the **bottom shell**, making sure that the screw-mounting holes line up.
|
||||
8. Mount the 6 **M2x6mm screws** into the mounting holes, until the two shells of the case are tightly and securely connected.
|
||||
9. Flip over the device.
|
||||
10. Connect the male **u.FL** connector to the female **u.FL** socket on the **board**.
|
||||
11. Optionally, connect the male JST connector of the **battery** to the female JST connector on the **board**.
|
||||
12. Fit the **battery door** into place.
|
||||
|
||||
Congratulations, Your Handheld RNode is now complete!
|
||||
|
||||
Flip the power switch, and start using it!
|
||||
8
Console/source/builds/micropylon.md
Executable file
@@ -0,0 +1,8 @@
|
||||
[date]: <> (2023-01-09)
|
||||
[title]: <> (Reticulum MicroPylon)
|
||||
[image]: <> (gfx/cs.webp)
|
||||
[excerpt]: <> (A powerful, solar-powered multi-transceiver RNode-based radio system for autonomous and self-configuring Reticulum network deployments.)
|
||||
## Reticulum MicroPylon
|
||||
This radio system is a powerful and flexible multi-transceiver radio system, designed for rapidly deploying autonomous and self-configuring Reticulum networks over wide areas.
|
||||
|
||||
This build recipe will be released soon. Please [support the project]({ASSET_PATH}contribute.html) to help realise it!
|
||||
6
Console/source/builds/wallmount.md
Executable file
@@ -0,0 +1,6 @@
|
||||
[date]: <> (2023-01-10)
|
||||
[title]: <> (Wall-Mount RNode)
|
||||
[image]: <> (gfx/cs.webp)
|
||||
[excerpt]: <> (A sleek, wall-mountable RNode, suitable for permanent installation and operation indoors, or in a semi-protected environment outdoors.)
|
||||
## Wall-Mount RNode
|
||||
This build recipe will be released soon. Please [support the project]({ASSET_PATH}contribute.html) to help realise it!
|
||||
20
Console/source/contact.md
Executable file
@@ -0,0 +1,20 @@
|
||||
[title]: <> (Contact)
|
||||
# Contact Me
|
||||
|
||||
**Hello!** I am the creator of the RNode ecosystem.
|
||||
|
||||
If you have any general questions or comments about any of the projects I maintain, I encourage you to post it in one of the following places:
|
||||
|
||||
- The [discussion forum](https://github.com/markqvist/Reticulum/discussions) on GitHub
|
||||
- The [Reticulum Matrix Channel](#reticulum:matrix.org) at `#reticulum:matrix.org`
|
||||
- The [Reticulum subreddit](https://reddit.com/r/reticulum)
|
||||
|
||||
To get in touch with me personally, you can use one of the following methods, in order of preference:
|
||||
|
||||
- LXMF at `8dd57a738226809646089335a6b03695`
|
||||
- Matrix using `@unsignedmark:matrix.org`
|
||||
- Email by using the address mark at unsigned dot io
|
||||
|
||||
Please use the public forums and channels for support and help requests. I receive a lot of messages, and while I try to answer everyone (eventually), this is not always possible.
|
||||
|
||||
<center>`3502`</center>
|
||||
39
Console/source/contribute.md
Executable file
@@ -0,0 +1,39 @@
|
||||
[title]: <> (Donate)
|
||||
## Keep Communications Free and Open
|
||||
Please take part in keeping the continued development, maintenance and distribution of the RNode ecosystem possible by donating via one of the following channels:
|
||||
|
||||
- Monero<br/>
|
||||
```
|
||||
84FpY1QbxHcgdseePYNmhTHcrgMX4nFfBYtz2GKYToqHVVhJp8Eaw1Z1EedRnKD19b3B8NiLCGVxzKV17UMmmeEsCrPyA5w
|
||||
```
|
||||
<br/><br/>
|
||||
- Ethereum<br/>
|
||||
```
|
||||
0xFDabC71AC4c0C78C95aDDDe3B4FA19d6273c5E73
|
||||
```
|
||||
<br/><br/>
|
||||
- Bitcoin<br/>
|
||||
```
|
||||
35G9uWVzrpJJibzUwpNUQGQNFzLirhrYAH
|
||||
```
|
||||
<br/><br/>
|
||||
- Ko-Fi<br/>
|
||||
<a href="https://ko-fi.com/markqvist">`https://ko-fi.com/markqvist`</a>
|
||||
|
||||
## Spread Knowledge and Awareness
|
||||
Another great way to contribute, is to spread awareness about the RNode project. Here's some ideas:
|
||||
|
||||
- Introduce the concepts of Free & Open Communications Systems to your community
|
||||
- Teach others to build and use RNodes, and how to set up resilient and private communications systems
|
||||
- Learn about using Reticulum to set up resilient communications networks, and teach these skills to people in your area that need them
|
||||
|
||||
## Contribute Code & Material
|
||||
If you like to write, build and design, there are plenty of oppertunities to take part in the community around RNode, and the wider Reticulum community as well.
|
||||
|
||||
There's always plenty of work to do, from writing code, tutorials and guides, to designing parts, devices and integrations, and translating material to other languages.
|
||||
|
||||
You can find us the following places:
|
||||
|
||||
- The [Reticulum Matrix Channel](element://room/!TRaVWNnQhAbvuiSnEK%3Amatrix.org?via=matrix.org) at `#reticulum:matrix.org`
|
||||
- The [discussion forum](https://github.com/markqvist/Reticulum/discussions) on GitHub
|
||||
- The [Reticulum subreddit](https://reddit.com/r/reticulum)
|
||||
123
Console/source/guides/install_firmware.md
Executable file
@@ -0,0 +1,123 @@
|
||||
[date]: <> (2023-01-12)
|
||||
[title]: <> (Installing RNode Firmware on Supported Devices)
|
||||
[image]: <> (images/g2p.webp)
|
||||
[excerpt]: <> (If you have a T-Beam or LoRa32 device handy, it is very easy to get it set up for all the things that the RNode firmware allows you to do.)
|
||||
<div class="article_date">{DATE}</div>
|
||||
# Installing RNode Firmware on Supported Devices
|
||||
|
||||
Do you have one of the devices available that the RNode Firmware supports? In that case, it is very easy to turn it into a working RNode by using the `rnodeconf` autoinstaller.
|
||||
|
||||
With the firmware installed, you can use your newly created RNode as:
|
||||
|
||||
- A [LoRa interface for Reticulum]({ASSET_PATH}m/interfaces.html#rnode-lora-interface)
|
||||
- A LoRa packet sniffer with [LoRaMon](https://unsigned.io/loramon/)
|
||||
- A Linux network interface using the [tncattach program]({ASSET_PATH}pkg/tncattach.zip)
|
||||
- A LoRa-based TNC for almost any amateur radio packet application
|
||||
|
||||
So let's get started! You will need either a **LilyGO T-Beam v1.1**, a **LilyGO LoRa32 v2.0**, a **LilyGO LoRa32 v2.1** or a **Heltec LoRa32 v2** device. More supported devices are added regularly, so it might be useful to check the latest [list of supported devices]({ASSET_PATH}supported.html) as well.
|
||||
|
||||
It is currently recommended to use one of the following devices: A **LilyGO LoRa32 v2.1** (also known as **TTGO T3 v1.6.1**) or a **LilyGO T-Beam v1.1**.
|
||||
|
||||

|
||||
<center>*Some of the device types compatible with this installation guide*</center>
|
||||
|
||||
## Device Variations
|
||||
|
||||
Some devices come with transceiver chips that are currently unsupported by the RNode Firmware. Currently devices with an **SX1276** or **SX1278** chip are supported. Support for **SX1262**, **SX1268** and **SX1280** is being added. Please support the development with [donations]({ASSET_PATH}donate.html), if you would like to see these chips supported.
|
||||
|
||||
> **Beware!** Some devices, like the T-Beam, use SiLabs USB chips. These may need [additional drivers](https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers) to work well on macOS and Windows. Linux usually has up-to-date drivers pre-installed. The SiLabs driver may also experience conflicts with earlier, pre-installed versions of the driver, causing a *resource busy* error, which can be fixed by [removing the old driver](https://community.platformio.org/t/mac-usb-port-detected-but-won-t-upload/20663/2).
|
||||
|
||||
## Preparations
|
||||
|
||||
To get started, you will need to install at least version 2.1.0 of the [RNode Configuration Utility]({ASSET_PATH}m/using.html#the-rnodeconf-utility).
|
||||
|
||||
The `rnodeconf` program is included in the `rns` package. Please read [these instructions]({ASSET_PATH}s_rns.html) for more information on how to install it from this repository, or from the Internet. If installation goes well, you can now move on to the next step.
|
||||
|
||||
## Install The Firmware
|
||||
|
||||
We are now ready to start installing the firmware. To install the RNode Firmware on your devices, run the RNode autoinstaller using this command:
|
||||
|
||||
```txt
|
||||
rnodeconf --autoinstall
|
||||
```
|
||||
|
||||
The installer will now ask you to insert the device you want to set up, scan for connected serial ports, and ask you a number of questions regarding the device. When it has the information it needs, it will install the correct firmware and configure the necessary parameters in the device EEPROM for it to function properly.
|
||||
|
||||
If the install goes well, you will be greated with a success message telling you that your device is now ready.
|
||||
|
||||
> **Please Note!** If you are connected to the Internet while installing, the autoinstaller will automatically download any needed firmware files to a local cache before installing.
|
||||
|
||||
> If you do not have an active Internet connection while installing, you can extract and use the firmware from this device instead. This will **only** work if you are building the same type of RNode as the device you are extracting from, as the firmware has to match the targeted board and hardware configuration.
|
||||
|
||||
If you need to extract the firmware from an existing RNode, run the following command:
|
||||
|
||||
```
|
||||
rnodeconf --extract
|
||||
```
|
||||
|
||||
If `rnodeconf` finds a working RNode, it will extract and save the firmware from the device for later use. You can then run the auto-installer with the `--use-extracted` option to use the locally extracted file:
|
||||
|
||||
```
|
||||
rnodeconf --autoinstall --use-extracted
|
||||
```
|
||||
|
||||
This also works for updating the firmware on existing RNodes, so you can extract a newer firmware from one RNode, and deploy it onto other RNodes using the same method. Just use the `--update` option instead of `--autoinstall`.
|
||||
|
||||
## Verify Installation
|
||||
To confirm everything is OK, you can query the device info with:
|
||||
|
||||
```txt
|
||||
rnodeconf --info /dev/ttyUSB0
|
||||
```
|
||||
|
||||
Remember to replace `/dev/ttyUSB0` with the actual port the installer used in the previous step. You should now see `rnodeconf` connect to your device and show something like this:
|
||||
|
||||
```txt
|
||||
[20:11:22] Opening serial port /dev/ttyUSB0...
|
||||
[20:11:25] Device connected
|
||||
[20:11:25] Current firmware version: 1.26
|
||||
[20:11:25] Reading EEPROM...
|
||||
[20:11:25] EEPROM checksum correct
|
||||
[20:11:25] Device signature validated
|
||||
[20:11:25]
|
||||
[20:11:25] Device info:
|
||||
[20:11:25] Product : LilyGO LoRa32 v2.0 850 - 950 MHz (b0:b8:36)
|
||||
[20:11:25] Device signature : Validated - Local signature
|
||||
[20:11:25] Firmware version : 1.26
|
||||
[20:11:25] Hardware revision : 1
|
||||
[20:11:25] Serial number : 00:00:00:02
|
||||
[20:11:25] Frequency range : 850.0 MHz - 950.0 MHz
|
||||
[20:11:25] Max TX power : 17 dBm
|
||||
[20:11:25] Manufactured : 2022-01-27 20:10:32
|
||||
[20:11:25] Device mode : Normal (host-controlled)
|
||||
```
|
||||
|
||||
On the hardware side, you should see the status LED flashing briefly approximately every 2 seconds. If all of the above checks out, congratulations! Your RNode is now ready to use. If your device has a display, it should also come alive and show you various information related to the device state.
|
||||
|
||||
If you want to use it with [Reticulum]({ASSET_PATH}s_rns.html), [Nomad Network]({ASSET_PATH}s_nn.html), [LoRaMon](https://unsigned.io/loramon), or other such applications, leave it in the default `Normal (host-controlled)` mode.
|
||||
|
||||
If you want to use it with legacy amateur radio applications that work with KISS TNCs, you should [set it up in TNC mode]({ASSET_PATH}guides/tnc_mode.html).
|
||||
|
||||
## External RGB LED
|
||||
If you are using a **LilyGO LoRa32 v2.1** device, you can connect an external **NeoPixel RGB LED** for device status using the following setup:
|
||||
|
||||
- Connect the NeoPixel **V+** pin to the **3.3v** pin on the board.
|
||||
- Connect the NeoPixel **GND** pin to the **GND** pin on the board.
|
||||
- Connect the NeoPixel **DATA** pin to **IO Pin 12** on the board.
|
||||
|
||||
For the firmware to activate the NeoPixel LED, you must also make specific choices in the autoinstaller guide:
|
||||
|
||||
- When asked what type of device you have, select **A specific kind of RNode**.
|
||||
- When asked what model the device is, select the **Handheld v2.x RNode** that matches the frequency of your board.
|
||||
|
||||
## External Display & LEDs
|
||||
If you are using a **LilyGO T-Beam** device, you can connect an external **SSD1306 OLED** display using the following setup:
|
||||
|
||||
- The **SSD1306**-based display must be set to use **I2C** and address `0x3D`
|
||||
- Connect display **GND** to T-Beam **GND**
|
||||
- Connect display **Vin** to suitable power-supplying pin on the T-Beam
|
||||
- Connect display **RST** to T-Beam **Pin 13**
|
||||
- Connect display **I2C CLK** to T-Beam **SCL** / **Pin 22**
|
||||
- Connect display **I2C DATA** to T-Beam **SDA** / **Pin 21**
|
||||
|
||||
On **T-Beam** devices, you can also connect external RX/TX LEDs to **Pin 2** and **Pin 4**.
|
||||
237
Console/source/guides/loracomms.md
Executable file
@@ -0,0 +1,237 @@
|
||||
[date]: <> (2023-01-14)
|
||||
[title]: <> (Private, Secure and Uncensorable Messaging Over a LoRa Mesh)
|
||||
[image]: <> (images/g1p.webp)
|
||||
[excerpt]: <> (Or: How to set up a completely private, independent and encrypted communication system in half an hour, using stuff you can buy for under $100.)
|
||||
<div class="article_date">{DATE}</div>
|
||||
# Private, Secure and Uncensorable Messaging Over a LoRa Mesh
|
||||
*Or: How to set up a completely private, independent and encrypted communication system in half an hour, using stuff you can buy for under $100.*
|
||||
|
||||

|
||||
|
||||
In this post, we will explore how two people, Alice and Bob, can set up a LoRa mesh communication system for their use that has the following characteristics:
|
||||
|
||||
- Allows both real-time and asynchronous text message communication between Alice and Bob.
|
||||
- Works *completely* indpendently of any infrastructure outside the control of Alice and Bob. Even if the Internet, cellular networks and the power grid fails, Alice and Bob must still be able to communicate.
|
||||
- Is completely private and outside the reach of automated surveillance, and does not reveal any identifying information about Alice or Bob, nor any contents of or information about their conversations.
|
||||
|
||||
In later parts of this series, we will expand the system to provide these oppertunities to an entire community, and add other mediums like Packet Radio, but for now we will focus on learning the basics by just establishing a Free Communications System between Alice and Bob.
|
||||
|
||||
To accomplish this, we will be building a small and simple system based on freely available and Open Source software. To realise our system we will need the following components:
|
||||
|
||||
- A networking system that can function reliably and efficiently even without any functional Internet infrastructure available. This will be provided by [Reticulum]({ASSET_PATH}r/index.html).
|
||||
- Software that Alice and Bob can interact with on their computers and mobile devices to actually communicate with each other. This will be provided by the programs [Nomad Network]({ASSET_PATH}s_nn.html) and [Sideband]({ASSET_PATH}s_sideband.html).
|
||||
- Radio hardware that Reticulum can use to cover the 7 kilometer distance between Bobs apartment and Alices house. This will be provided by installing the [RNode Firmware]({ASSET_PATH}guides/install_firmware.html) on a couple of small LoRa radio modules that can be purchased cheaply off Amazon or similar online vendors.
|
||||
|
||||
As you might have already guessed, the "magic glue" that acutally makes this entire system possible is [Reticulum]({ASSET_PATH}r/index.html).
|
||||
|
||||
Reticulum is a complete networking stack that was designed to handle challenging situations and requirements like this. Reticulum is an incredibly flexible networking platform, that can use almost anything as a carrier for digital information transfer, and it can automatically form secure mesh networks with very minimal resources, infrastructure and setup.
|
||||
|
||||
Please do keep in mind though, that at the time of writing this, Reticulum is still in beta. There might be bugs and security issues that have not yet been discovered. You can keep up with such things, and get updates on the general development and releases, over on the [Reticulum GitHub page](https://github.com/markqvist/reticulum).
|
||||
|
||||
The user-facing software that Alice and Bob will be installing already includes Reticulum, so there is no complicated installation and configuration setups, and getting everything up and running will be quite simple. The requirements are also very minimal, and everything can run on hardware they already have available, be that an old computer, a Raspberry Pi, or an Android phone.
|
||||
|
||||
Let's get started.
|
||||
|
||||
# LoRa Radio Setup
|
||||
The first step is to get the LoRa radios prepared and installed. I have written in more length and details about these subjects in other posts on this site ([Installing RNode Firmware on Supported Devices]({ASSET_PATH}guides/install_firmware.html) and [How To Make Your Own RNodes]({ASSET_PATH}guides/make_rnodes.html), so this article will just quickly guide you through the basics required to get up and running. For much more information, read the above articles.
|
||||
|
||||
First of all, Alice and Bob need to get a compatible piece of radio hardware to use. Had they been living closer to each other, they might have just been able to use WiFi, but they need to cover a distance of more than 7 kilometers, so they decide to go with a couple of LoRa radios.
|
||||
|
||||
They take a look at the RNode Firmware [Supported Devices List]({ASSET_PATH}supported.html), and decide to go with a couple of LilyGO T-Beam devices. They could have also used others, and they don't need to choose the same device, as long as they are within the same frequency range, all compatible devices work with Reticulum and can communicate with each other, as soon as the RNode Firmware has been installed on them.
|
||||
|
||||

|
||||
|
||||
Once the devices arrive, it is time to get the firmware installed. For this they will need a computer running some sort of Linux. Alice has a computer with Ubuntu installed, so they decide to use that. Since Python3 came installed as standard with the OS, Alice can go ahead and install the RNode configuration program by simply opening a terminal and typing:
|
||||
|
||||
```
|
||||
pip install rnodeconf
|
||||
```
|
||||
|
||||
The above command installs the program they need to flash the LoRa radios with the right firmware. If for some reason Python3 had not already been installed on Alices computer, she would have had to install it first with the command `sudo apt install python python-pip`.
|
||||
|
||||
Now that the firmware installer is ready, it is time to actually get the firmware on to the devices. Alice launches the installer with the following command:
|
||||
|
||||
```
|
||||
rnodeconf --autoinstall
|
||||
```
|
||||
|
||||
After this she is greated with an interactive guide that asks a few questions about the device type, grabs the latest firmware files, and installs them onto the device. After repeating with the second device, that is all there is to it, and the LoRa radios are now ready for use with Reticulum.
|
||||
|
||||
# Installation at Alices House
|
||||
To get a better signal, Alice mounts her LoRa radio in the attic of her house. She then runs a USB cable from the mounting location to the computer she wants to use for messaging, and plugs the cable into the computer. The LoRa radio is now directly connected to her computer via USB, and receives power from it when the computer is on.
|
||||
|
||||
At her computer (running Ubuntu Linux), she installs the Nomad Network program by entering the following command in a terminal:
|
||||
|
||||
```
|
||||
pip install nomadnet
|
||||
```
|
||||
|
||||
After a few seconds, Nomad Network and Reticulum is installed and ready to use. She can now run the Nomad Network client by entering the following command:
|
||||
|
||||
```
|
||||
nomadnet
|
||||
```
|
||||
|
||||
All required directories and configuration files will now be created, and the client will start up. After a few seconds, Alice will be greeted with a screen like this:
|
||||
|
||||

|
||||
|
||||
Confirming that everything is installed and working, it is time to add the LoRa radio as an interface that Reticulum can use. To do this, she opens up the Reticulum configuration file (located at `˜/.reticulum/config`) in a text editor.
|
||||
|
||||
By referring to the [RNode LoRa Interface]({ASSET_PATH}m/interfaces.html#rnode-lora-interface) section of the [Reticulum Manual]({ASSET_PATH}m), she can just copy-and-paste in a new configuration section for the interface, and edit the radio parameters to her requirements. She ends up with a configuration file that looks like this in it's entirity:
|
||||
|
||||
```
|
||||
[reticulum]
|
||||
enable_transport = False
|
||||
share_instance = Yes
|
||||
|
||||
shared_instance_port = 37428
|
||||
instance_control_port = 37429
|
||||
|
||||
panic_on_interface_error = No
|
||||
|
||||
[logging]
|
||||
loglevel = 4
|
||||
|
||||
[interfaces]
|
||||
[[Default Interface]]
|
||||
type = AutoInterface
|
||||
interface_enabled = True
|
||||
|
||||
[[RNode LoRa Interface]]
|
||||
type = RNodeInterface
|
||||
interface_enabled = True
|
||||
port = /dev/ttyUSB0
|
||||
frequency = 867200000
|
||||
bandwidth = 125000
|
||||
txpower = 7
|
||||
spreadingfactor = 8
|
||||
codingrate = 5
|
||||
```
|
||||
|
||||
*Please note that the assignment and use of radio frequency spectrum is completely outside the scope of this exploratory post. Laws and regulations about spectrum use vary greatly around the world, and you will have to do your own research for what frequencies and modes you can use in your location, and what licenses, if any, are required for any given use case.*
|
||||
|
||||
Alice can now start the Nomad Network client again, and this time around it will initialise and use the LoRa radio installed in her attic. Having completed Alices part of the setup, lets move on to Bobs apartment.
|
||||
|
||||
# Installation at Bobs Apartment
|
||||
Bob likes his messaging to happen on a handy device like a phone, so he decides to go with the [Sideband]({ASSET_PATH}s_sideband.html) app instead of Nomad Network. He goes to the [download page](https://github.com/markqvist/Sideband/releases/latest) and installs the APK on his Android phone. He now needs a way to connect to the LoRa radio already running at Alices house to establish communication.
|
||||
|
||||
Since he doesn't want to walk around with the LoRa radio constantly dangling by a USB cable from his phone, he decides to set up a Reticulum gateway in his apartment using a Raspberry Pi he had lying around. The RNode LoRa radio will connect via USB to the Raspberry Pi, and the Raspberry Pi will be connected to the WiFi network in his apartment.
|
||||
|
||||
This way, any device on his WiFi network (including his Android phone) will be able to route information through the LoRa radio as well. Reticulum takes care of everything automatically, and there is no need to configure addresses, subnet, routing rules or anything.
|
||||
|
||||
Both his WiFi router and the Rasperry Pi is powered by a small battery system, so even if the power goes out, the system will be able to stay on for several days on the battery, and indefinitely if he props up a solar panel on his balcony.
|
||||
|
||||
Bob installs a fresh copy of Raspberry Pi OS on the small computer, and in the terminal issues the following command to install Reticulum:
|
||||
|
||||
```
|
||||
pip install rns
|
||||
```
|
||||
|
||||
In this case, Bob will not be running any user-facing software on the Raspberry Pi itself, so instead he starts Reticulum as a service, by running the `rnsd` program, to check that everything installed correctly:
|
||||
|
||||
```
|
||||
rnsd
|
||||
```
|
||||
|
||||
After a moment, the following output is shown from the `rnsd` program, signalling that everything is working properly, but that a new, default configuration file has just been created:
|
||||
|
||||
```
|
||||
[2022-03-26 17:14:05] [Notice] Could not load config file, creating default configuration file...
|
||||
[2022-03-26 17:14:05] [Notice] Default config file created. Make any necessary changes in /home/bob/.reticulum/config and restart Reticulum if needed.
|
||||
[2022-03-26 17:14:09] [Notice] Started rnsd version 0.3.3
|
||||
```
|
||||
|
||||
Bob terminates the `rnsd` program, and then connects the LoRa radio to the Raspberry Pi with a USB cable. Since he doesn't have any particular access to the roof or attic of the building, he just sticky-tapes the LoRa radio to a window facing in the general direction of Alices house.
|
||||
|
||||
He then proceeds to add the same interface configuration to his Reticulum configuration file as Alice did, so that the radio parameters of their respective LoRa radios match each other.
|
||||
|
||||
To allow other devices on his network to route through his new Reticulum gateway, he also adds the line `enable_transport = yes` to his Reticulum config file, so the file in it's entirity looks like this:
|
||||
|
||||
```
|
||||
[reticulum]
|
||||
enable_transport = Yes
|
||||
share_instance = Yes
|
||||
|
||||
shared_instance_port = 37428
|
||||
instance_control_port = 37429
|
||||
|
||||
panic_on_interface_error = No
|
||||
|
||||
[logging]
|
||||
loglevel = 4
|
||||
|
||||
[interfaces]
|
||||
[[Default Interface]]
|
||||
type = AutoInterface
|
||||
interface_enabled = True
|
||||
|
||||
[[RNode LoRa Interface]]
|
||||
type = RNodeInterface
|
||||
interface_enabled = True
|
||||
port = /dev/ttyUSB0
|
||||
frequency = 867200000
|
||||
bandwidth = 125000
|
||||
txpower = 7
|
||||
spreadingfactor = 8
|
||||
codingrate = 5
|
||||
```
|
||||
|
||||
After starting the program again, this time using `rnsd -vvv` to get more verbose output, he can now see that the LoRa radio is correctly configured and used by Reticulum:
|
||||
|
||||
```
|
||||
[2022-03-26 18:17:43] [Debug] Bringing up system interfaces...
|
||||
[2022-03-26 18:17:43] [Verbose] AutoInterface[Default Interface] discovering peers for 1.8 seconds...
|
||||
[2022-03-26 18:17:45] [Notice] Opening serial port /dev/ttyUSB0...
|
||||
[2022-03-26 18:17:47] [Notice] Serial port /dev/ttyUSB0 is now open
|
||||
[2022-03-26 18:17:47] [Verbose] Configuring RNode interface...
|
||||
[2022-03-26 18:17:47] [Verbose] Wating for radio configuration validation for RNodeInterface[RNode LoRa Interface]...
|
||||
[2022-03-26 18:17:47] [Debug] RNodeInterface[RNode LoRa Interface] Radio reporting frequency is 867.2 MHz
|
||||
[2022-03-26 18:17:47] [Debug] RNodeInterface[RNode LoRa Interface] Radio reporting bandwidth is 125 KHz
|
||||
[2022-03-26 18:17:47] [Debug] RNodeInterface[RNode LoRa Interface] Radio reporting TX power is 7 dBm
|
||||
[2022-03-26 18:17:47] [Debug] RNodeInterface[RNode LoRa Interface] Radio reporting spreading factor is 8
|
||||
[2022-03-26 18:17:47] [Debug] RNodeInterface[RNode LoRa Interface] Radio reporting coding rate is 5
|
||||
[2022-03-26 18:17:47] [Verbose] RNodeInterface[RNode LoRa Interface] On-air bitrate is now 3.1 kbps
|
||||
[2022-03-26 18:17:47] [Notice] RNodeInterface[RNode LoRa Interface] is configured and powered up
|
||||
[2022-03-26 18:17:48] [Debug] System interfaces are ready
|
||||
[2022-03-26 18:17:48] [Verbose] Configuration loaded from /home/bob/.reticulum/config
|
||||
[2022-03-26 18:17:50] [Verbose] Loaded 0 path table entries from storage
|
||||
[2022-03-26 18:17:50] [Verbose] Loaded 0 tunnel table entries from storage
|
||||
[2022-03-26 18:17:50] [Verbose] Transport instance <a5dc367015b30f2d7b59> started
|
||||
[2022-03-26 18:17:50] [Notice] Started rnsd version 0.3.3
|
||||
```
|
||||
|
||||
Everything is ready, and when Bob launches the Sideband appplication on his phone, Alice and him will now be able to communicate securely and independently of any other infrastructure.
|
||||
|
||||
# Communication
|
||||
Both the [Nomad Network]({ASSET_PATH}s_nn.html) program and the [Sideband]({ASSET_PATH}s_sidband.html) application use a cryptographic message delivery system named [LXMF]({ASSET_PATH}s_lxmf.html), that in turn uses Reticulum for encryption and privacy guarantees. Both Nomad Network and Sideband are *LXMF clients*.
|
||||
|
||||
Much like many different e-mail clients exist, so can many different LXMF clients, and they can all communicate with each other, which is why Alice and Bob can message each other even though they prefer to use very different kinds of user-facing software.
|
||||
|
||||
An LXMF addresses consist of 32 hexadecimal characters, and are usually encapsulated in single angle quotation marks like this: `<9824f6367015b30f2d7b8a24bc6205d7>`.
|
||||
|
||||
Nobody controls the allocation of addresses, and since the address space is so huge, and governed by cryptographic principles, you can create as many or as few adresses as you need.
|
||||
|
||||
Since you can just create them with freely avaible software, and without any sort of permission from anyone, they are never linked to any personally identifiable information either. They are completely and truly anonymous from the beginning, and you control how much or how little of your identity you associate with them.
|
||||
|
||||
For an LXMF address to be reachable for direct-delivery instant messaging on a Reticulum network, it must announce it's public keys on the network. Both Sideband and Nomad Network allows you to send an announce on the network, and both programs can be configured to do so automatically when they start. If you only want to use the system for "email-style" communication (via LXMF propagation nodes), you don't *need* to send any announces on the network, but to learn how it all works, it is a good idea to just set the programs to automatically announce at start up.
|
||||
|
||||
To make sure his public cryptographic key is known by the network, Bob taps the **Announce** button in the Sideband app:
|
||||
|
||||
<center><p><img src="{ASSET_PATH}images/an1.webp"/></p></center>
|
||||
|
||||
After a few seconds, Bobs announce shows up in the **Announce Stream** section of the Nomad Network program on Alices computer:
|
||||
|
||||
<center><p><img src="{ASSET_PATH}images/nn_an.webp"/></p></center>
|
||||
|
||||
Using the received announce, Alice starts a conversation with Bob. Either one of them could also have started the conversation by manually typing in the others LXMF address in their program, but in many cases it can be convenient to use the announces. Now that everything is ready, they exchange a few messages to test the system. On Bobs Android phone, this looks like this:
|
||||
|
||||
<center><p><img style="max-width: 100%; width: 300px;" src="{ASSET_PATH}images/3_conv.webp"/></p></center>
|
||||
|
||||
And on Alices computer running Nomad Network, it looks like this:
|
||||
|
||||
<center><p><img src="{ASSET_PATH}images/nn_conv.webp"/></p></center>
|
||||
|
||||
Although pretty useful, what we have explored here does not even begin to scratch the surface of what is possible with Reticulum and associated software. I hope you will find yourself inspired to explore and read deeper into the documentation and available software.
|
||||
|
||||
To learn more, take a look at the [Learn]({ASSET_PATH}learn.html) section.
|
||||
111
Console/source/guides/make_rnodes.md
Executable file
@@ -0,0 +1,111 @@
|
||||
[date]: <> (2023-01-10)
|
||||
[title]: <> (How To Make Your Own RNodes)
|
||||
[image]: <> (images/g3p.webp)
|
||||
[excerpt]: <> (This article will outline the general process, and provide the information you need, for building your own RNode from a few basic modules. The RNode will be functionally identical to a commercially purchased board.)
|
||||
# How To Make Your Own RNodes
|
||||
|
||||
This article will outline the general process, and provide the information you need, for building your own RNode from a few basic modules. The RNode will be functionally identical to a purchased device.
|
||||
|
||||
Once you have learned the put together a custom RNode with your own choice of components, you can use these skills to create your own RNode designs from scratch, using either a custom-designed PCB, or simply by mounting your choice of modules in a enclosure or case.
|
||||
|
||||
If you haven't already, you migh also want to check out how to [install the RNode firmware directly on pre-made LoRa development boards]({ASSET_PATH}guides/install_firmware.html).
|
||||
|
||||

|
||||
<center>*A homemade RNode, based on an ESP32 board and a transceiver module, ready for use*</center>
|
||||
|
||||
Since there is not *one right way* to cut this pie, this article will probably not give the *exact* steps for the combination of components you choose, but will instead attempt to provide you with the information you need to build RNodes from a wide variety of microcontroller boards and LoRa modules. Generally speaking, you will need three things to construct a working RNode:
|
||||
|
||||
- A supported microcontroller board
|
||||
- A supported transceiver module
|
||||
- A way to mount and connect the two
|
||||
|
||||
## Preparing the Hardware
|
||||
|
||||
Currently, the RNode firmware supports a variety of different microcontrollers, and more are being added regurlarly. That means that there is a *lot* of boards to choose from. You can probably use most boards that are based on either the **ATmega1284P**, **ATmega2560** or **ESP32** microcontrollers. Regarding microcontroller boards there is a few key points to take note of:
|
||||
|
||||
- You will need to connect the transceiver module over the SPI bus. This means that the board should have SPI pins for exposed for you to connect to. UART-only modules will **not** work.
|
||||
- Logic voltage levels must match the transceiver module you are using, or you will have to add a voltage level converter in between the two devices, that is fast enough for the clock of the SPI bus (usually 8 or 10MHz). I recommend using a microcontroller and transceiver module with matching logic levels. Most will be 3.3 volts.
|
||||
- Apart from the SPI pins for *clock*, *chip select*, *MOSI* and *MISO*, you will also need an output pin for a *reset* line to the transceiver module, and one **interrupt-capable** input pin for the interrupt signal from the transceiver module. Almost all boards should have plenty of IO available for this, but you might as well make sure before ordering anything.
|
||||
- You need to choose a board that can provide enough power on it's internal regulators to power the transceiver module while it is transmitting. This can draw quite a bit of power, and some boards only have very small 3.3v regulators, which will not cut it while driving the transmitter at full tilt.
|
||||
|
||||
Regarding the LoRa transceiver module, there is going to be an almost overwhelming amount of options to choose from. To narrow it down, here are the essential characteristics to look for:
|
||||
|
||||
- The RNode firmware needs a module based on the **Semtech SX1276**, **Semtech SX1278**, **SX1262**, **SX1268** and **SX1280** LoRa transceiver ICs. These come in several different variants, for all frequency bands from about 150 MHz to 2500 MHz.
|
||||
- The module *must* expose the direct SPI bus to the transceiver chip. UART based modules that add their own communications layer will not work.
|
||||
- The module must also expose the *reset* line of the chip, and provide the **DIO0** (or other relevant) interrupt signal *from* the chip.
|
||||
- As mentioned above, the module must be logic-level compatible with the microcontroller you are using, unless you want to add a level-shifter. Resistor divider arrays will most likely not work here, due to the bus speeds required.
|
||||
|
||||
Keeping those things in mind, you should be able to select a suitable combination of microcontroller board and transceiver module.
|
||||
|
||||
## Assembling the RNode
|
||||
|
||||
Ok, having gone through the endless combinations and selected a board and a module, you are actually almost done. Connecting the devices together is pretty simple, and should only take a few minutes. I recommend that you place both devices in a solderless breadboard initially, to make sure everything is working as expected. Once you have a working setup, you can make it more durable and permanent by soldering it to a prototyping board, and connecting permanent lines between the devices.
|
||||
|
||||
In the photo above I used an Adafruit Feather ESP32 board and a ModTronix inAir4 module. That will result in an RNode suitable for the 420 MHz to 520 MHz range. To complete the device I did the following:
|
||||
|
||||
1. Connect the GND pin of the microcontroller board to the GND rail of the breadboard.
|
||||
2. Connect the GND pin of the transceiver module to the GND rail of the breadboard.
|
||||
3. Connect the 3.3 volt output line of the microcontroller board to the V_IN pin of the transceiver module.
|
||||
4. Connect the *chip select* pin of the microcontroller board to the *chip select* pin of the transceiver module.
|
||||
5. Connect the *SPI clock* pin of the microcontroller board to the *SPI clock* pin of the transceiver module.
|
||||
6. Connect the *MOSI* pin of microcontroller board to the *MOSI* pin of the transceiver module.
|
||||
7. Connect the *MISO* pin of the microcontroller board to the *MISO* pin of the transceiver module.
|
||||
8. Connect the *transceiver reset* pin of the microcontroller board to the *reset* pin of the transceiver module.
|
||||
9. Connect the *DIO0* pin of the transceiver module to the *DIO0 interrupt pin* of the microcontroller board.
|
||||
10. You can optionally connect transmit and receiver LEDs to the corresponding pins of the microcontroller board.
|
||||
|
||||
The pin layouts of your transceiver module and microcontroller board will vary, but you can look up the correct pin assignments for your processor type and board layout in the [Config.h](https://github.com/markqvist/RNode_Firmware/blob/master/Config.h) file of the [RNode Firmware](https://unsigned.io/rnode_firmware).
|
||||
|
||||
### Loading the Firmware
|
||||
Once the hardware is assembled, you are ready to load the firmware onto the board and configure the configuration parameters in the boards EEPROM. Luckily, this process is completely automated by the [RNode Configuration Utility](https://markqvist.github.io/Reticulum/manual/using.html#the-rnodeconf-utility). To prepare for loading the firmware, make sure that `python` and `pip` is installed on your system, then install the `rns` package (which includes the `rnodeconf` program) by issuing the command:
|
||||
|
||||
|
||||
```txt
|
||||
pip install rns
|
||||
```
|
||||
|
||||
If installation goes well, you can now move on to the next step.
|
||||
|
||||
> *Take Care*: A LoRa transceiver module **must** be connected to the board for the firmware to start and accept commands. If the firmware does not verify that the correct transceiver is available on the SPI bus, execution is stopped, and the board will not accept commands. If you find the board unresponsive after installing the firmware, or EEPROM configuration fails, double-check your transceiver module wiring!
|
||||
|
||||
Having double-checked that everything is connected correctly, it is time to power up the board and install the firmware. Run the `rnodeconf` autoinstaller by executing the command:
|
||||
|
||||
```txt
|
||||
rnodeconf --autoinstall
|
||||
```
|
||||
|
||||
The installer will now ask you to insert the device you want to set up, scan for connected serial ports, and ask you a number of questions regarding the device. When it has the information it needs, it will install the correct firmware and configure the necessary parameters in the device EEPROM for it to function properly.
|
||||
|
||||
If the install goes well, you will be greated with a success message telling you that your device is now ready. To confirm everything is OK, you can query the device info with:
|
||||
|
||||
```txt
|
||||
rnodeconf --info /dev/ttyUSB0
|
||||
```
|
||||
|
||||
Remember to replace `/dev/ttyUSB0` with the actual port the installer used in the previous step. You should now see `rnodeconf` connect to your device and show something like this:
|
||||
|
||||
```txt
|
||||
[2022-01-27 20:11:22] Opening serial port /dev/ttyUSB0...
|
||||
[2022-01-27 20:11:25] Device connected
|
||||
[2022-01-27 20:11:25] Current firmware version: 1.26
|
||||
[2022-01-27 20:11:25] Reading EEPROM...
|
||||
[2022-01-27 20:11:25] EEPROM checksum correct
|
||||
[2022-01-27 20:11:25] Device signature validated
|
||||
[2022-01-27 20:11:25]
|
||||
[2022-01-27 20:11:25] Device info:
|
||||
[2022-01-27 20:11:25] Product : LilyGO LoRa32 v2.0 850 - 950 MHz (b0:b8:36)
|
||||
[2022-01-27 20:11:25] Device signature : Validated - Local signature
|
||||
[2022-01-27 20:11:25] Firmware version : 1.26
|
||||
[2022-01-27 20:11:25] Hardware revision : 1
|
||||
[2022-01-27 20:11:25] Serial number : 00:00:00:02
|
||||
[2022-01-27 20:11:25] Frequency range : 850.0 MHz - 950.0 MHz
|
||||
[2022-01-27 20:11:25] Max TX power : 17 dBm
|
||||
[2022-01-27 20:11:25] Manufactured : 2022-01-27 20:10:32
|
||||
[2022-01-27 20:11:25] Device mode : Normal (host-controlled)
|
||||
```
|
||||
|
||||
On the hardware side, you should see the status LED flashing briefly approximately every 2 seconds. If all of the above checks out, congratulations! Your RNode is now ready to use.
|
||||
|
||||
If you want to use it with [Reticulum]({ASSET_PATH}s_rns.html), [Nomad Network]({ASSET_PATH}s_nn.html), [LoRaMon](https://unsigned.io/loramon), or other such applications, leave it in the default `Normal (host-controlled)` mode.
|
||||
|
||||
If you want to use it with legacy amateur radio applications that work with KISS TNCs, you should [set it up in TNC mode]({ASSET_PATH}guides/tnc_mode.html).
|
||||
22
Console/source/guides/tnc_mode.md
Executable file
@@ -0,0 +1,22 @@
|
||||
[date]: <> (2023-01-07)
|
||||
[title]: <> (Using an RNode With Amateur Radio Software)
|
||||
[image]: <> (images/g4p.webp)
|
||||
[excerpt]: <> (If you want to use an RNode with amateur radio applications, like APRS or a packet radio BBS, you will need to put the device into TNC Mode. In this mode, an RNode will behave exactly like a KISS-compatible TNC, which will make it usable with any amateur radio software.)
|
||||
<div class="article_date">{DATE}</div>
|
||||
# Using an RNode With Amateur Radio Software
|
||||
|
||||
If you want to use an RNode with amateur radio applications, like APRS or a packet radio BBS, you will need to put the device into *TNC Mode*. In this mode, an RNode will behave exactly like a KISS-compatible TNC, which will make it usable with any amateur radio software that can talk to a KISS TNC over a serial port.
|
||||
|
||||
You can use the [RNode Configuration Utility]({ASSET_PATH}m/using.html#the-rnodeconf-utility) to change settings on your device, including putting it into TNC mode.
|
||||
|
||||
The `rnodeconf` program is included in the `rns` package. Please read [these instructions]({ASSET_PATH}s_rns.html) for more information on how to install it from this repository, or from the Internet.
|
||||
|
||||
With the `rnodeconf` program installed, you can put your RNode into TNC mode simply by entering the command:
|
||||
|
||||
```
|
||||
rnodeconf -T /dev/ttyUSB0
|
||||
```
|
||||
|
||||
Remember to replace `/dev/ttyUSB0` with the actual port your RNode is connected to. The program will now ask you for the channel configuration parameters, like frequency, bandwidth, transmission power and so on. It is also possible to specify all the parameters at once on the command line, see the `rnodeconf --help` for information on how to do this.
|
||||
|
||||
That's all there is to it! Your RNode is now configured in TNC mode, and ready for use with amateur radio applications.
|
||||
14
Console/source/help.md
Executable file
@@ -0,0 +1,14 @@
|
||||
[title]: <> (Get Help)
|
||||
## Get Help
|
||||
If you are having trouble, or if something is not working, this RNode contains a number of useful resources.
|
||||
|
||||
- Read [Questions & Answers](qa.html) section
|
||||
- Read the [Reticulum Manual](m/index.html) stored on this RNode
|
||||
- Browse a copy of the [Reticulum Website](r/index.html) stored on this RNode
|
||||
|
||||
## Community & Support
|
||||
If things still aren't working as expected here are some great places to ask for help:
|
||||
|
||||
- The [discussion forum](https://github.com/markqvist/Reticulum/discussions) on GitHub
|
||||
- The [Reticulum Matrix Channel](element://room/!TRaVWNnQhAbvuiSnEK%3Amatrix.org?via=matrix.org) at `#reticulum:matrix.org`
|
||||
- The [Reticulum subreddit](https://reddit.com/r/reticulum)
|
||||
28
Console/source/index.md
Executable file
@@ -0,0 +1,28 @@
|
||||
## Hello!
|
||||
<table style="margin-bottom: 1.5em;">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="vertical-align:middle;padding-left: 0;">
|
||||
You have connected to the <b>RNode Bootstrap Console</b>.<br/>
|
||||
<br/>
|
||||
The tools and information contained in this RNode will allow you to replicate the RNode design, build more RNodes and grow your communications ecosystems.<br/>
|
||||
<br/>
|
||||
This repository also contains tools, software and information necessary to bootstrap networks and communications systems based on RNodes and Reticulum.
|
||||
</td>
|
||||
<td width="33%" style="vertical-align:middle;padding-right: 0;">
|
||||
<img src="{ASSET_PATH}gfx/rnode_iso.webp" width="100%"/></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr>
|
||||
<center>
|
||||
<h3>What would you like to do?</h3>
|
||||
<div style="width:66%">You can browse this repository freely, or jump straight into a task-oriented workflow by selecting one of the starting points below.</div>
|
||||
<a href="./replicate.html"><button type="button" id="task-replicate">Create RNodes</button></a>
|
||||
<a href="./software.html"><button type="button" id="task-rns">Install Software</button></a>
|
||||
<a href="./learn.html"><button type="button" id="task-rns">Learn More</button></a>
|
||||
<a href="./m/networks.html"><button type="button" id="task-rns">Build A Network</button></a>
|
||||
<a href="./help.html"><button type="button" id="task-rns">Get Help</button></a>
|
||||
<a href="https://unsigned.io/shop"><button type="button" id="task-rns">Buy an RNode</button></a>
|
||||
<a href="./contribute.html"><button type="button" id="task-rns">Contribute</button></a>
|
||||
</center>
|
||||
14
Console/source/learn.md
Executable file
@@ -0,0 +1,14 @@
|
||||
[title]: <> (Learn More)
|
||||
## Learn More
|
||||
This RNode contains a selection of tutorials and guides on setting up communications, creating RNodes, building networks and using Reticulum. You can learn more by:
|
||||
|
||||
- Reading the [What is an RNode?](rnode.html) page
|
||||
- Checking the [Questions & Answers](qa.html) section
|
||||
- Reading the [Reticulum Manual](m/index.html) stored on this RNode
|
||||
- Browsing a copy of the [Reticulum Website]({ASSET_PATH}r/index.html) stored on this RNode
|
||||
- Visiting the [unsigned.io](https://unsigned.io/) website
|
||||
- You can also find **unsigned.io** on Nomad Network, at `ec58b0e430cd9628907383954feea068`
|
||||
|
||||
## Guides
|
||||
|
||||
{TOPIC:guides}
|
||||
20
Console/source/qa.md
Executable file
@@ -0,0 +1,20 @@
|
||||
[title]: <> (Questions & Answers)
|
||||
## Questions & Answers
|
||||
This section contains a list of common questions, and associated answers.
|
||||
|
||||
- **What are the system requirements for running Reticulum?**
|
||||
Practically any system that can run Python3 can also run Reticulum. Any computer made since the early 2000's should work, provided it has a reasonably up-to-date operating system installed. Even low-power embedded devices with 256 megabytes of RAM will run Reticulum.
|
||||
- **Does Reticulum work without the Internet?**
|
||||
Yes. Reticulum *is* itself both a networking, and an inter-net protocol. A key difference between Reticulum and IPv4/v6, however, is that Reticulum does not require any central coordination or authority to work. As soon as two devices running Reticulum can talk to each other, they form a network. That network can dynamically grow to planetary-scale nets, split up, re-connect and heal in any number of ways, while still continuing to function. As long as there is *some sort of physical way* for two or more devices to communicate, Reticulum will allow them to form a secure and reliable network.
|
||||
- **Who owns and controls the addresses I use on a Reticulum network?**
|
||||
You do. Every address is in complete ownership and control of the person that created it.
|
||||
- **If nobody centrally controls the addresses, will my address still be globally reachable?**
|
||||
Yes. Reticulum ensures end-to-end connectivity. All addresses are globally and directly reachable. Reticulum has no concept of "private address spaces" and NAT, as you might be suffering from with IPv4.
|
||||
- **Is communication over Reticulum encrypted?**
|
||||
Yes. All traffic is end-to-end encrypted. Reticulum *is fundamentally unable to route unencrypted traffic*. Links established over Reticulum networks offer forward secrecy, by using ephemeral encryption keys.
|
||||
- **Could you build a global Internet with Reticulum instead of IP?**
|
||||
Yes. In theory this is completely possible, but it will take a lot of refinement, development, hardware support and adoption to transition the global base-layer for communication to Reticulum. Please [help us]({ASSET_PATH}contribute.html) towards this goal!
|
||||
- **Is Reticulum as fast and optimised as my favorite TCP/IP stack?**
|
||||
Currently not, but we are working towards being much faster than IP. The primary focus of Reticulum has been to build an understandable and well-documented *reference implementation*, that works exceptionally well over medium-bandwidth to extremely low-bandwidth forms of communication. This focus is very valuable, since it allows people to build secure communications networks that span vast areas, with very simple hardware, and very little cost.
|
||||
- **Who created all of this?**
|
||||
The Reticulum protocol, and the RNode system was created by [Mark Qvist]({ASSET_PATH}contact.html), of [unsigned.io](https://unsigned.io).
|
||||
5
Console/source/recipes.md
Executable file
@@ -0,0 +1,5 @@
|
||||
[title]: <> (RNode Recipes)
|
||||
## RNode Build Recipes
|
||||
This section contains a library of build recipes for various types of RNodes. All the recipes contain necessary plans, instructions and 3D-printable files for completing the build.
|
||||
|
||||
{TOPIC:builds}
|
||||
27
Console/source/replicate.md
Executable file
@@ -0,0 +1,27 @@
|
||||
[title]: <> (Replicate)
|
||||
## Create RNodes
|
||||
This section contains the tools and guides necessary to create more RNodes. Creating any number of RNodes is **completely free and unrestricted** for all personal, non-commercial and humanitarian purposes. If doing so provides value to you or your community, you are encouraged to [contribute](./contribute.html) whatever you find to be reasonable.
|
||||
|
||||
If you want to create RNodes for sale or commercial purposes, please read the [selling RNodes]({ASSET_PATH}sell_rnodes.html) section for more details.
|
||||
|
||||
### Firmware Source Code
|
||||
If you would like to inspect or compile the RNode Firmware source code yourself, you can download a copy of the [RNode Firmware source-code]({ASSET_PATH}pkg/rnode_firmware.zip) stored in this RNode.
|
||||
|
||||
### Getting Started
|
||||
To create your own RNodes, there are generally three distinct paths you can take:
|
||||
|
||||
- The first, and easiest option, is to [create a basic RNode]({ASSET_PATH}guides/install_firmware.html) from one of the supported development boards. This option allows you to simply acquire a board from any online or local vendor that sells them, and then use the `rnodeconf` program to automatically turn it into an RNode. Such an RNode will be functionally equivalent to the other options, but might lack some niceties.
|
||||
- The second option is to use one of the [RNode Build Recipes]({ASSET_PATH}recipes.html) included here. These recipes contain all the resources needed to build a specific type of RNode, such as a handheld device, or an outdoor-mountable, solar-powered access point.
|
||||
- The third option is to [create your own RNode design]({ASSET_PATH}guides/make_rnodes.html) from scratch. This offers unlimited flexibility, but is a bit more involved.
|
||||
|
||||
If you already have some experience with 3D-printing and electronics projects, the recommended path is to pick a [build recipe]({ASSET_PATH}recipes.html) for the RNode type you want. That way, you will get a neat and portable unit that's ready for real-world use.
|
||||
|
||||
If you are just getting started, it might be nice to get a working "proof-of-concept" with minimal effort first, though. In such a case, [creating a basic RNode]({ASSET_PATH}guides/install_firmware.html) is a good starting point.
|
||||
<br/><br/>
|
||||
<center>
|
||||
<h3>Choose a path to get started</h3>
|
||||
<br/>
|
||||
<a href="{ASSET_PATH}guides/install_firmware.html"><button type="button" id="task-rns">Basic Build</button></a>
|
||||
<a href="{ASSET_PATH}recipes.html"><button type="button" id="task-rns">Build Recipes</button></a>
|
||||
<a href="{ASSET_PATH}guides/make_rnodes.html"><button type="button" id="task-rns">New Design</button></a>
|
||||
</center>
|
||||
11
Console/source/rnode.md
Executable file
@@ -0,0 +1,11 @@
|
||||
[title]: <> (What is an RNode?)
|
||||
## What is an RNode?
|
||||
An RNode is an open, free and unrestricted digital radio transceiver. It enables anyone to send and receive any kind of data over both short and very long distances. RNodes can be used with many different kinds of programs and systems, but they are especially well suited for use with Reticulum.
|
||||
|
||||
RNode is not a product, and not any one specific device in particular. It is a system that is easy to replicate across space and time, that produces highly functional communications tools, which respects user autonomy and empowers individuals and communities to protect their sovereignty and privacy.
|
||||
|
||||
The RNode system is primarily software, which *transforms* available hardware devices into functional, physical RNodes, which can then be used to solve a wide range of communications tasks. Such RNodes can be modified and build to suit the specific time, locale and environment they need to exist in.
|
||||
|
||||
If you notice the presence of a circularity in the naming of the system as a whole, and the physical devices, it is no coincidence. Every RNode contains the seeds necessary to reproduce the system, and create more RNodes, and even to bootstrap entire communications networks, completely independently of existing infrastructure, or the lack thereof.
|
||||
|
||||
The production of one particular RNode device is not an end, but the potential starting point of a new branch of devices on the tree of the RNode system as a whole. This tree fits into the larger biome of Free & Open Communications Systems, which I hope that you - by using communications tools like RNode - will help grow and prosper.
|
||||
23
Console/source/s_lxmf.md
Executable file
@@ -0,0 +1,23 @@
|
||||
[title]: <> (LXMF)
|
||||
## LXMF
|
||||
LXMF is a simple and flexible messaging format and delivery protocol that allows a wide variety of implementations, while using as little bandwidth as possible. It is built on top of [Reticulum](https://reticulum.network) and offers zero-conf message routing, end-to-end encryption and Forward Secrecy, and can be transported over any kind of medium that Reticulum supports.
|
||||
|
||||
LXMF is efficient enough that it can deliver messages over extremely low-bandwidth systems such as packet radio or LoRa. Encrypted LXMF messages can also be encoded as QR-codes or text-based URIs, allowing completely analog *paper message* transport.
|
||||
|
||||
Installing this LXMF library allows other programs on your system, like Nomad Network, to use the LXMF messaging system. It also includes the `lxmd` program that you can use to run LXMF propagation nodes on your network.
|
||||
|
||||
**Local Installation**
|
||||
|
||||
If you do not have access to the Internet, or would prefer to install LXMF directly from this RNode, you can use the following instructions.
|
||||
|
||||
- If you do not have an Internet connection while installing make sure to install the [Reticulum](./s_rns.html) package first
|
||||
- Download the [{PKG_BASE_lxmf}]({ASSET_PATH}{PKG_lxmf}) package from this RNode and unzip it
|
||||
- Install it with the command `pip install ./{PKG_NAME_lxmf}`
|
||||
- Verify the installed Reticulum version by running `lxmd --version`
|
||||
|
||||
**Online Installation**
|
||||
|
||||
If you are connected to the Internet, you can try to install the latest version of LXMF via the `pip` package manager.
|
||||
|
||||
- Install Nomad Network by running the command `pip install lxmf`
|
||||
- Verify the installed Reticulum version by running `lxmd --version`
|
||||
27
Console/source/s_nn.md
Executable file
@@ -0,0 +1,27 @@
|
||||
[title]: <> (Nomad Network)
|
||||
## Nomad Network
|
||||
Off-grid, resilient mesh communication with strong encryption, forward secrecy and extreme privacy.
|
||||
|
||||
Nomad Network Allows you to build private and resilient communications platforms that are in complete control and ownership of the people that use them. No signups, no agreements, no handover of any data, no permissions and gatekeepers.
|
||||
|
||||

|
||||
|
||||
Nomad Network is build on [LXMF](lxmf.html) and [Reticulum]({ASSET_PATH}r/), which together provides the cryptographic mesh functionality and peer-to-peer message routing that Nomad Network relies on. This foundation also makes it possible to use the program over a very wide variety of communication mediums, from packet radio to fiber optics.
|
||||
|
||||
Nomad Network does not need any connections to the public internet to work. In fact, it doesn't even need an IP or Ethernet network. You can use it entirely over packet radio, LoRa or even serial lines. But if you wish, you can bridge islanded networks over the Internet or private ethernet networks, or you can build networks running completely over the Internet. The choice is yours.
|
||||
|
||||
### Local Installation
|
||||
|
||||
If you do not have access to the Internet, or would prefer to install Nomad Network directly from this RNode, you can use the following instructions.
|
||||
|
||||
- If you do not have an Internet connection while installing make sure to install the [Reticulum](./s_rns.html) and [LXMF](./s_lxmf.html) packages first
|
||||
- Download the [{PKG_BASE_nomadnet}]({ASSET_PATH}{PKG_nomadnet}) package from this RNode and unzip it
|
||||
- Install it with the command `pip install ./{PKG_NAME_nomadnet}`
|
||||
- Verify the installed Nomad Network version by running `nomadnet --version`
|
||||
|
||||
### Online Installation
|
||||
|
||||
If you are connected to the Internet, you can try to install the latest version of Nomad Network via the `pip` package manager.
|
||||
|
||||
- Install Nomad Network by running the command `pip install nomadnet`
|
||||
- Verify the installed Nomad Network version by running `nomadnet --version`
|
||||
33
Console/source/s_rns.md
Executable file
@@ -0,0 +1,33 @@
|
||||
[title]: <> (Reticulum)
|
||||
## Reticulum
|
||||
The cryptographic networking stack for building resilient networks anywhere. The vision of Reticulum is to allow anyone to operate their own sovereign communication networks, and to make it cheap and easy to cover vast areas with a myriad of independent, interconnectable and autonomous networks. Reticulum is Unstoppable Networks for The People.
|
||||
|
||||
<p align="center"><img width="30%" src="{ASSET_PATH}m/_static/rns_logo_512.png"></p>
|
||||
|
||||
This packages requires you have `python` and `pip` installed on your computer. This should come as standard on most operating systems released since 2020.
|
||||
|
||||
### Local Installation
|
||||
If you do not have access to the Internet, or would prefer to install Reticulum directly from this RNode, you can use the following instructions.
|
||||
|
||||
- Download the [{PKG_BASE_rns}]({ASSET_PATH}{PKG_rns}) package from this RNode and unzip it
|
||||
- Install it with the command `pip install ./{PKG_NAME_rns}`
|
||||
- Verify the installed Reticulum version by running `rnstatus --version`
|
||||
|
||||
### Online Installation
|
||||
If you are connected to the Internet, you can try to install the latest version of Reticulum via the `pip` package manager.
|
||||
|
||||
- Install Reticulum by running the command `pip install rns`
|
||||
- Verify the installed Reticulum version by running `rnstatus --version`
|
||||
|
||||
### Dependencies
|
||||
If the installation has problems resolving dependencies, first try installing the `python-cryptography`, `python-netifaces` and `python-pyserial` packages from your systems package manager.
|
||||
|
||||
If this fails, or is simply not possible in your situation, you can make the installation of Reticulum ignore the resolution of dependencies using the command:
|
||||
|
||||
`pip install --no-dependencies ./{PKG_NAME_rns}`
|
||||
|
||||
This will allow you to install Reticulum on systems, or in circumstances, where one or more dependencies cannot be resolved. This will most likely mean that some functionality will not be available, which may be a worthwhile tradeoff in some situations.
|
||||
|
||||
If you use this method of installation, it is essential to read the [Pure-Python Reticulum]({ASSET_PATH}m/gettingstartedfast.html#pure-python-reticulum) section of the Reticulum Manual, and to understand the potential security implications of this installation method.
|
||||
|
||||
For more detailed information, please read the entire [Getting Started section of the Reticulum Manual]({ASSET_PATH}m/gettingstartedfast.html).
|
||||
20
Console/source/s_rnsh.md
Executable file
@@ -0,0 +1,20 @@
|
||||
[title]: <> (Shell Over Reticulum)
|
||||
## Shell Over Reticulum
|
||||
|
||||
The `rnsh` program lets you establish fully interactive remote shell sessions over Reticulum. It also allows you to pipe any program to or from a remote system, and is similar to how the ``ssh`` program works.
|
||||
|
||||
### Local Installation
|
||||
|
||||
If you do not have access to the Internet, or would prefer to install `rnsh` directly from this RNode, you can use the following instructions.
|
||||
|
||||
- If you do not have an Internet connection while installing make sure to install the [Reticulum](./s_rns.html) package first
|
||||
- Download the [{PKG_BASE_rnsh}]({ASSET_PATH}{PKG_rnsh}) package from this RNode and unzip it
|
||||
- Install it with the command `pip install ./{PKG_NAME_rnsh}`
|
||||
- Verify the installed `rnsh` version by running `rnsh --version`
|
||||
|
||||
### Online Installation
|
||||
|
||||
If you are connected to the Internet, you can try to install the latest version of `rnsh` via the `pip` package manager.
|
||||
|
||||
- Install `rnsh` by running the command `pip install rnsh`
|
||||
- Verify the installed `rnsh` version by running `rnsh --version`
|
||||
12
Console/source/s_sideband.md
Executable file
@@ -0,0 +1,12 @@
|
||||
[title]: <> (Sideband)
|
||||
## Sideband
|
||||
Sideband is an LXMF client for Android, Linux, Windows and macOS. It has built-in support for communicating over RNodes, and many other mediums, such as Packet Radio, WiFi, I2P, or anything else Reticulum supports.
|
||||
|
||||
Sideband also supports voice calls, file transfers, and exchanging messages through encrypted QR-codes on paper, or through messages embedded directly in lxm:// links.
|
||||
|
||||

|
||||
|
||||
The installation files for the Sideband program is too large to be included on this RNode, but downloads for Linux, Android and macOS can be obtained from following sources:
|
||||
|
||||
- The [Sideband page](https://unsigned.io/sideband/) on [unsigned.io](https://unsigned.io/)
|
||||
- The [GitHub release page for Sideband](https://github.com/markqvist/Sideband/releases/latest)
|
||||
9
Console/source/sell_rnodes.md
Executable file
@@ -0,0 +1,9 @@
|
||||
[title]: <> (Sell RNodes)
|
||||
## Build & Sell RNodes
|
||||
Creating any number of RNodes is completely free and unrestricted for all personal, non-commercial and humanitarian purposes. Feel free to use all the resources provided here, and on the [unsigned.io](https://unsigned.io/) website. If doing so provides value to you or your community, you are encouraged to [contribute]({ASSET_PATH}contribute.html) whatever you find to be reasonable.
|
||||
|
||||
The RNode Ecosystem is free and non-proprietary, and actively seeks to distribute it's ownership and control. If you want to build RNodes for commercial purposes, including selling them, you must do so adhering to the Open Source licenses that the various parts of the RNode project is released under, and under your own responsibility.
|
||||
|
||||
The RNode Firmware is released under GPLv3, and basing commercial works on it means (among other things), that you must also make your derivatives open source and available under the same terms.
|
||||
|
||||
In practice, this means that you can use the firmware commercially, but you should understand your obligation to provide all future users of the system the same rights that you have been provided by the GPLv3.
|
||||
23
Console/source/software.md
Executable file
@@ -0,0 +1,23 @@
|
||||
[title]: <> (Software)
|
||||
## Software
|
||||
This RNode contains a repository of downloadable software and utilities, that are useful for bootstrapping communications networks, and for replicating RNodes.
|
||||
|
||||
**Please Note!** Whenever you install software onto your computer, there is a risk that someone modified this software to include malicious code. Be extra careful installing anything from this RNode, if you did not get it from a source you trust, or if there is a risk it was modified in transit.
|
||||
|
||||
If possible, you can check that the `SHA-256` hashes of any downloaded files correspond to the list of release hashes published on the [Reticulum Release page](https://github.com/markqvist/Reticulum/releases).
|
||||
|
||||
**You Have The Source!** Due to the size limitations of shipping all this software within an RNode, we don't include separate source-code archives for the below programs, but *all the source code is included within the Python .whl files*!
|
||||
|
||||
You can simply unzip any of them with any program that understands `zip` files, and you will find the source code inside the unzipped directory (for some zip programs, you may need to change the file ending to `.zip`).
|
||||
|
||||
You can also download the copy of the [RNode Firmware source-code]({ASSET_PATH}pkg/rnode_firmware.zip) that is stored in this RNode.
|
||||
<br/><br/>
|
||||
<center>
|
||||
<h3>Choose a software package to get started</h3>
|
||||
<br/>
|
||||
<a href="./s_rns.html"><button type="button" id="task-rns">Reticulum</button></a>
|
||||
<a href="./s_lxmf.html"><button type="button" id="task-rns">LXMF</button></a>
|
||||
<a href="./s_nn.html"><button type="button" id="task-rns">Nomad Network</button></a>
|
||||
<a href="./s_rnsh.html"><button type="button" id="task-rns">RN Shell</button></a>
|
||||
<a href="./s_sideband.html"><button type="button" id="task-rns">Sideband</button></a>
|
||||
</center>
|
||||
17
Console/source/supported.md
Executable file
@@ -0,0 +1,17 @@
|
||||
[title]: <> (Supported Hardware)
|
||||
## Supported Boards & Devices
|
||||
The RNode Firmware supports the following boards:
|
||||
|
||||
- Handheld v2.x RNodes from [unsigned.io](https://unsigned.io/shop/product/handheld-rnode)
|
||||
- Original v1.x RNodes from [unsigned.io](https://unsigned.io/shop/product/rnode)
|
||||
- LilyGO T-Beam v1.1 devices
|
||||
- LilyGO LoRa32 v2.0 devices
|
||||
- LilyGO LoRa32 v2.1 devices
|
||||
- Heltec LoRa32 v2 devices
|
||||
- Homebrew RNodes based on ATmega1284p boards
|
||||
- Homebrew RNodes based on ATmega2560 boards
|
||||
- Homebrew RNodes based on Adafruit Feather ESP32 boards
|
||||
- Homebrew RNodes based on generic ESP32 boards
|
||||
|
||||
## Supported Transceiver Modules
|
||||
The RNode Firmware supports all transceiver modules based on **Semtech SX1276** or **Semtech SX1278** chips, that have an **SPI interface** and expose the **DIO_0** interrupt pin from the chip.
|
||||