aboutsummaryrefslogtreecommitdiff
path: root/examples/radio
diff options
context:
space:
mode:
authorWheresAlice <[email protected]>2024-04-08 19:27:53 +0100
committerWheresAlice <[email protected]>2024-04-08 19:27:53 +0100
commitb6d925cca7d9bb8b9ca264d85fa86da938d4c30d (patch)
treed348d191a54bcee8798608051d9afcc56d5222b7 /examples/radio
parent212cf4831ca61c57e07df5635f41ea75354cdbea (diff)
provide mqtt example and document radio example
Diffstat (limited to 'examples/radio')
-rw-r--r--examples/radio/README.md6
-rw-r--r--examples/radio/main.go87
2 files changed, 93 insertions, 0 deletions
diff --git a/examples/radio/README.md b/examples/radio/README.md
new file mode 100644
index 0000000..4a6bec5
--- /dev/null
+++ b/examples/radio/README.md
@@ -0,0 +1,6 @@
+This example connects to a Meshtastic device connected to a serial port, decodes received messages, and logs them out
+
+```shell
+go run main.go # search for first device connected to a serial port
+go run main.go /dev/ttyUSB0 # explicitly provide a port to connect to
+```
diff --git a/examples/radio/main.go b/examples/radio/main.go
new file mode 100644
index 0000000..feda4bd
--- /dev/null
+++ b/examples/radio/main.go
@@ -0,0 +1,87 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ "github.com/charmbracelet/log"
+ pb "github.com/meshnet-gophers/meshtastic-go/meshtastic"
+ "github.com/meshnet-gophers/meshtastic-go/transport"
+ "github.com/meshnet-gophers/meshtastic-go/transport/serial"
+ "google.golang.org/protobuf/proto"
+ "os"
+ "os/signal"
+ "time"
+)
+
+var port string
+
+func main() {
+ ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
+ defer cancel()
+
+ log.SetLevel(log.DebugLevel)
+
+ if len(os.Args) > 1 {
+ port = os.Args[1]
+ } else {
+ port = serial.GetPorts()[0]
+ }
+ serialConn, err := serial.Connect(port)
+ if err != nil {
+ panic(err)
+ }
+ streamConn, err := transport.NewClientStreamConn(serialConn)
+ if err != nil {
+ panic(err)
+ }
+ defer func() {
+ if err := streamConn.Close(); err != nil {
+ panic(err)
+ }
+ }()
+
+ client := transport.NewClient(streamConn, false)
+ client.Handle(new(pb.MeshPacket), func(msg proto.Message) {
+ pkt := msg.(*pb.MeshPacket)
+ data := pkt.GetDecoded()
+ log.Info("Received message from radio", "msg", processMessage(*data), "from", pkt.From, "portnum", data.Portnum.String())
+ })
+ ctxTimeout, cancelTimeout := context.WithTimeout(ctx, 10*time.Second)
+ defer cancelTimeout()
+ if client.Connect(ctxTimeout) != nil {
+ panic("Failed to connect to the radio")
+ }
+
+ log.Info("Waiting for interrupt signal")
+ <-ctx.Done()
+}
+
+func processMessage(message pb.Data) string {
+ if message.Portnum == pb.PortNum_NODEINFO_APP {
+ var user = pb.User{}
+ proto.Unmarshal(message.Payload, &user)
+ return user.String()
+ }
+ if message.Portnum == pb.PortNum_POSITION_APP {
+ var pos = pb.Position{}
+ proto.Unmarshal(message.Payload, &pos)
+ return pos.String()
+ }
+ if message.Portnum == pb.PortNum_TELEMETRY_APP {
+ var t = pb.Telemetry{}
+ proto.Unmarshal(message.Payload, &t)
+ return t.String()
+ }
+ if message.Portnum == pb.PortNum_NEIGHBORINFO_APP {
+ var n = pb.NeighborInfo{}
+ proto.Unmarshal(message.Payload, &n)
+ return n.String()
+ }
+ if message.Portnum == pb.PortNum_STORE_FORWARD_APP {
+ var s = pb.StoreAndForward{}
+ proto.Unmarshal(message.Payload, &s)
+ return s.String()
+ }
+
+ return fmt.Sprintf("unknown message type")
+}