aboutsummaryrefslogtreecommitdiff
path: root/examples/radio/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'examples/radio/main.go')
-rw-r--r--examples/radio/main.go87
1 files changed, 87 insertions, 0 deletions
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")
+}