mirror of
https://github.com/dpup/meshstream.git
synced 2026-08-07 17:22:54 +02:00
feat(topology): track mesh node connections and render as map polylines
Add passive topology tracking from four sources with confidence ranking: - Zero-hop MQTT observations (continuous, per-gateway, highest frequency) - Traceroute replies (RouteDiscovery, full path + SNR data) - NeighborInfo packets (self-reported neighbor SNR) - relay_node inferred links (1-hop packets with known relay) Backend: add rx_snr (field 62) and rx_rssi (field 63) to meshstream Data proto; extract from MeshPacket in decoder.go; regenerate Go bindings. Frontend: - topologySlice: LinkObservation model, per-direction confidence merge, 24h TTL pruning, 2000-edge cap, Redux-pure (timestamp from payload) - aggregatorSlice: add hopsFromGateway to NodeData - __root.tsx: dispatch processTopologyPacket after each SSE message - NetworkMap: render polylines colored by SNR (green/yellow/red/gray), dimmed at 0.4 opacity for viaMqtt edges; Links toggle button in legend - NodeDetail: Connections section showing per-edge SNR, source badge, viaMqtt badge, and last-seen time 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -38,8 +38,8 @@
|
||||
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: google/protobuf/descriptor.proto
|
||||
|
||||
package descriptorpb
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshstream/meshstream.proto
|
||||
|
||||
package meshtreampb
|
||||
@@ -222,7 +222,10 @@ type Data struct {
|
||||
// Error tracking
|
||||
DecodeError string `protobuf:"bytes,60,opt,name=decode_error,json=decodeError,proto3" json:"decode_error,omitempty"`
|
||||
// Reception timestamp (added by decoder)
|
||||
RxTime uint64 `protobuf:"varint,61,opt,name=rx_time,json=rxTime,proto3" json:"rx_time,omitempty"`
|
||||
RxTime uint64 `protobuf:"varint,61,opt,name=rx_time,json=rxTime,proto3" json:"rx_time,omitempty"`
|
||||
// RF reception quality (measured at gateway)
|
||||
RxSnr float32 `protobuf:"fixed32,62,opt,name=rx_snr,json=rxSnr,proto3" json:"rx_snr,omitempty"` // SNR at receiving gateway (dB)
|
||||
RxRssi int32 `protobuf:"varint,63,opt,name=rx_rssi,json=rxRssi,proto3" json:"rx_rssi,omitempty"` // RSSI at receiving gateway (dBm)
|
||||
unknownFields protoimpl.UnknownFields
|
||||
sizeCache protoimpl.SizeCache
|
||||
}
|
||||
@@ -663,6 +666,20 @@ func (x *Data) GetRxTime() uint64 {
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *Data) GetRxSnr() float32 {
|
||||
if x != nil {
|
||||
return x.RxSnr
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *Data) GetRxRssi() int32 {
|
||||
if x != nil {
|
||||
return x.RxRssi
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type isData_Payload interface {
|
||||
isData_Payload()
|
||||
}
|
||||
@@ -852,7 +869,7 @@ const file_meshstream_meshstream_proto_rawDesc = "" +
|
||||
"\aversion\x18\x03 \x01(\tR\aversion\x12\x16\n" +
|
||||
"\x06format\x18\x04 \x01(\tR\x06format\x12\x18\n" +
|
||||
"\achannel\x18\x05 \x01(\tR\achannel\x12\x17\n" +
|
||||
"\auser_id\x18\x06 \x01(\tR\x06userId\"\x94\x0e\n" +
|
||||
"\auser_id\x18\x06 \x01(\tR\x06userId\"\xc4\x0e\n" +
|
||||
"\x04Data\x12\x1d\n" +
|
||||
"\n" +
|
||||
"channel_id\x18\x01 \x01(\tR\tchannelId\x12\x1d\n" +
|
||||
@@ -916,7 +933,9 @@ const file_meshstream_meshstream_proto_rawDesc = "" +
|
||||
"\x06source\x186 \x01(\rR\x06source\x12#\n" +
|
||||
"\rwant_response\x187 \x01(\bR\fwantResponse\x12!\n" +
|
||||
"\fdecode_error\x18< \x01(\tR\vdecodeError\x12\x17\n" +
|
||||
"\arx_time\x18= \x01(\x04R\x06rxTimeB\t\n" +
|
||||
"\arx_time\x18= \x01(\x04R\x06rxTime\x12\x15\n" +
|
||||
"\x06rx_snr\x18> \x01(\x02R\x05rxSnr\x12\x17\n" +
|
||||
"\arx_rssi\x18? \x01(\x05R\x06rxRssiB\t\n" +
|
||||
"\apayloadB(Z&proto/generated/meshstream;meshtreampbb\x06proto3"
|
||||
|
||||
var (
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/admin.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/apponly.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/atak.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/cannedmessages.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/channel.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/clientonly.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/config.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/connection_status.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/device_ui.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/deviceonly.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/interdevice.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/localonly.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/mesh.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/module_config.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/mqtt.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/nanopb.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/paxcount.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/portnums.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/powermon.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/remote_hardware.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/rtttl.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/storeforward.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/telemetry.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.36.6
|
||||
// protoc v5.29.3
|
||||
// protoc-gen-go v1.36.11
|
||||
// protoc v4.25.1
|
||||
// source: meshtastic/xmodem.proto
|
||||
|
||||
package meshtastic
|
||||
|
||||
Reference in New Issue
Block a user