forked from ctmesh/web
231 lines
8.6 KiB
HTML
231 lines
8.6 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
|
|
<title>CT Mesh Meshtastic Resources</title>
|
|
<link rel="shortcut icon" type="image/x-icon" href="favicon.png?3">
|
|
<link rel="icon" type="image/png" href="favicon.png?3">
|
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
<link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
|
|
<style>
|
|
html, body {
|
|
margin: 0;
|
|
padding: 0;
|
|
width: 100%;
|
|
min-height: 100%;
|
|
}
|
|
body {
|
|
font-family: "Roboto", sans-serif;
|
|
background: url('background.svg') no-repeat center center fixed;
|
|
background-size: cover;
|
|
background-color: #EBEBEB;
|
|
color: #2C2D3C;
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: center;
|
|
padding: 2em 0;
|
|
}
|
|
a,
|
|
a:visited {
|
|
color: #000000;
|
|
}
|
|
.overlay {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
background: rgba(87, 87, 87, 0.4);
|
|
pointer-events: none;
|
|
}
|
|
.content-box {
|
|
background-color: #EBEBEB;
|
|
border-radius: 30px;
|
|
padding: 2.5em 3em;
|
|
margin: 1em;
|
|
max-width: 820px;
|
|
width: 90%;
|
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
|
|
position: relative;
|
|
z-index: 1;
|
|
}
|
|
h1 {
|
|
margin-top: 0;
|
|
font-size: 28px;
|
|
}
|
|
h2 {
|
|
margin-top: 1.5em;
|
|
margin-bottom: 0.5em;
|
|
font-size: 20px;
|
|
}
|
|
h3 {
|
|
margin-top: 1em;
|
|
margin-bottom: 0.25em;
|
|
font-size: 16px;
|
|
}
|
|
p {
|
|
margin: 0.5em 0;
|
|
line-height: 1.4;
|
|
}
|
|
ul {
|
|
margin: 0.5em 0 0.5em 1.25em;
|
|
padding: 0;
|
|
line-height: 1.5;
|
|
}
|
|
.settings {
|
|
background: #F5F5F5;
|
|
border-radius: 12px;
|
|
padding: 1em;
|
|
border: 1px solid #D0D0D0;
|
|
margin: 0.75em 0;
|
|
}
|
|
.settings code {
|
|
font-family: monospace;
|
|
font-size: 0.95em;
|
|
}
|
|
.copy-btn {
|
|
background-color: #67EA94;
|
|
color: #000000;
|
|
border: none;
|
|
border-radius: 10px;
|
|
padding: 0.25em 0.6em;
|
|
font-size: 0.75em;
|
|
font-weight: bold;
|
|
cursor: pointer;
|
|
margin-left: 0.5em;
|
|
vertical-align: middle;
|
|
}
|
|
.btn {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
gap: 8px;
|
|
background-color: #67EA94;
|
|
color: #000000;
|
|
border: none;
|
|
padding: 0.75em 1.5em;
|
|
border-radius: 15px;
|
|
cursor: pointer;
|
|
font-weight: bold;
|
|
font-size: 15px;
|
|
text-decoration: none;
|
|
}
|
|
.community-tools {
|
|
margin-top: 0.75em;
|
|
padding-top: 0.5em;
|
|
}
|
|
.community-tools ul {
|
|
margin: 0.5em 0 0.5em 1.25em;
|
|
}
|
|
.community-tools li {
|
|
margin-bottom: 0.5em;
|
|
}
|
|
.back-link {
|
|
margin-top: 1.5em;
|
|
}
|
|
@media (max-width: 800px) {
|
|
body {
|
|
padding-top: calc(env(safe-area-inset-top, 1em));
|
|
}
|
|
.content-box {
|
|
padding: 2em;
|
|
}
|
|
}
|
|
@media (max-width: 480px) {
|
|
.content-box {
|
|
padding: 1.5em;
|
|
}
|
|
h1 {
|
|
font-size: 22px;
|
|
}
|
|
h2 {
|
|
font-size: 18px;
|
|
}
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="overlay"></div>
|
|
<div class="content-box">
|
|
<h1>Meshtastic Resources</h1>
|
|
|
|
<h2>Community-run Web Tools</h2>
|
|
<div class="community-tools">
|
|
<p><em>These tools use data reported to our MQTT server by nodes across the state.</em></p>
|
|
<ul>
|
|
<li><a href="https://map.ctmesh.org/?lat=41.6558113360196&lng=287.3377990722657&zoom=10" target="_blank">Meshtastic Map</a> - live map of Meshtastic nodes CT Mesh has heard</li>
|
|
<li><a href="https://meshtastic.liamcottle.net/?lat=26.58852714730864&lng=285.11718750000006&zoom=2" target="_blank">Global Map</a> - Meshtastic nodes around the world</li>
|
|
<li><a href="https://malla.ctmesh.org/" target="_blank">Malla</a> - deeper packet-level metrics and mesh performance insights fed from MQTT</li>
|
|
<li><a href="https://potato.ctmesh.org/" target="_blank">PotatoMesh</a> <strong>NEW!</strong> - packet, chat, node list, and map fed from RF on Box Mountain</li>
|
|
<li><a href="https://meshinfo.ctmesh.org/" target="_blank">MeshInfo</a> <em>legacy, partially broken</em> - MQTT gateway setup info, secondary map, graphs, message history, etc.</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<h2>Mesh Channels</h2>
|
|
<h3>Default (Primary) Channel</h3>
|
|
<p><em>Most CT chatter occurs on the default LongFast channel.</em></p>
|
|
<p>Name: <code id="channel-primary-name">LongFast</code> or (blank) <button class="copy-btn" type="button" data-copy-target="channel-primary-name">Copy</button></p>
|
|
<p>Key: <code id="channel-primary-key">AQ==</code> <button class="copy-btn" type="button" data-copy-target="channel-primary-key">Copy</button></p>
|
|
<p>Key size: Default or <code>1 byte</code></p>
|
|
|
|
<h3>CT's established community secondary channel</h3>
|
|
<p>Name: <code id="channel-secondary-name">ConnNet</code> <button class="copy-btn" type="button" data-copy-target="channel-secondary-name">Copy</button></p>
|
|
<p>Key: <code id="channel-secondary-key">pJgk5XqJY8Ar+jSqC5W81g==</code> <button class="copy-btn" type="button" data-copy-target="channel-secondary-key">Copy</button></p>
|
|
<p>Key size: 128 bit</p>
|
|
|
|
<h2>MQTT</h2>
|
|
<p>Our MQTT broker is <em>uplink-only</em> and designed for fixed nodes across the state to serve as gateway nodes. Its purpose is not to bridge gaps or extend mesh coverage, but to report local traffic to our own <a href="https://map.ctmesh.org" target="_blank">map</a> and other web-based tools for analytical data and metrics to assess the mesh's performance. <strong>This role is best suited for stable, well-placed nodes with reliable coverage.</strong> If that describes your setup, follow the steps at on <a href="https://meshinfo.ctmesh.org/" target="_blank">this page</a> to get set up.</p>
|
|
|
|
<h3>Key Settings</h3>
|
|
<div class="settings">
|
|
<p>MQTT > Enabled > ON</p>
|
|
<p>MQTT > Encryption Enabled > ON</p>
|
|
<p>MQTT > Map Report > OFF</p>
|
|
<p>MQTT > Root Topic > <code>msh/US/CT</code></p>
|
|
<p>MQTT > Address > <code>mqtt.ctmesh.org</code></p>
|
|
<p>MQTT > Username > <code>meshdev</code></p>
|
|
<p>MQTT > Password > <code>large4cats</code></p>
|
|
<p>MQTT > TLS Enabled > OFF</p>
|
|
<p>Channels > Primary Channel > Positions Enabled > ON</p>
|
|
<p>Channels > Primary Channel > Approximate Location > (set as desired)</p>
|
|
<p>Channels > Primary Channel > MQTT Uplink > ON</p>
|
|
<p>Channels > Primary Channel > MQTT Downlink > OFF</p>
|
|
<p>Settings > Modules > Neighbor Info > ON</p>
|
|
<p>LoRa > Ok to MQTT > ON</p>
|
|
</div>
|
|
|
|
<p><strong>Note:</strong> CT Mesh's MQTT server is bridged and uplinks to the MQTT servers for both <a href="https://meshtastic.liamcottle.net" target="_blank">meshtastic.liamcottle.net</a> and <a href="https://meshmap.net" target="_blank">meshmap.net</a>.</p>
|
|
|
|
<h2>Infrastructure Nodes</h2>
|
|
<p><strong>Important:</strong> Infrastructure roles like <code>ROUTER</code>, <code>REPEATER</code>, <code>ROUTER_CLIENT</code>, or <code>ROUTER_LATE</code> are rarely appropriate. Unless your node is sitting on top of one of the tallest buildings in Hartford with clear line-of-sight across the region, using these roles will hurt more than help. For almost everyone, the correct choice is <code>CLIENT</code>. If you think you've got a node that truly warrants an infrastructure role, reach out first - we'd rather make sure it benefits the mesh than inadvertently weakens it.</p>
|
|
|
|
<a class="btn back-link" href="index.html">← Back to CT Mesh</a>
|
|
</div>
|
|
<script>
|
|
const copyButtons = document.querySelectorAll("[data-copy-target]");
|
|
copyButtons.forEach((button) => {
|
|
const defaultLabel = button.textContent;
|
|
button.addEventListener("click", async () => {
|
|
const targetId = button.getAttribute("data-copy-target");
|
|
const target = document.getElementById(targetId);
|
|
if (!target) return;
|
|
try {
|
|
await navigator.clipboard.writeText(target.textContent);
|
|
button.textContent = "Copied";
|
|
setTimeout(() => {
|
|
button.textContent = defaultLabel;
|
|
}, 1500);
|
|
} catch (err) {
|
|
button.textContent = "Copy failed";
|
|
setTimeout(() => {
|
|
button.textContent = defaultLabel;
|
|
}, 1500);
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
</body>
|
|
</html>
|