package main import ( "encoding/json" "fmt" "log/slog" "sort" MQTT "github.com/eclipse/paho.mqtt.golang" "github.com/jedib0t/go-pretty/v6/table" ) // mqttSetup creates a new MQTT client func mqttSetup(mqttBroker string, port int) MQTT.Client { // This JS style of creating a client is awfully verbose opts := MQTT.NewClientOptions(). AddBroker(fmt.Sprintf("tcp://%s:%d", mqttBroker, port)). SetClientID(mqttClientID). SetDefaultPublishHandler(mqttPublishHander).SetAutoReconnect(true) client := MQTT.NewClient(opts) if token := client.Connect(); token.Wait() && token.Error() != nil { panic(token.Error()) } slog.Debug("Connected to", "Broker", mqttBroker, "Port", port, "Client", mqttClientID) if token := client.Subscribe(mqttTopic+"/#", 0, nil); token.Wait() && token.Error() != nil { panic(token.Error()) } return client } // mqttDumpMsg displays the MQTT message func mqttDumpMsg(msg MQTT.Message) { var data map[string]interface{} err := json.Unmarshal(msg.Payload(), &data) if err != nil { slog.Error("Error decoding JSON %v", "err", err) } // sort keys keys := make([]string, 0, len(data)) for key := range data { keys = append(keys, key) } sort.Strings(keys) // dump keys tab := table.NewWriter() tab.SetTitle("MQTT update") tab.SetStyle(table.StyleRounded) for _, key := range keys { if key != "update" { tab.AppendRow(table.Row{key, data[key]}) } } fmt.Println(tab.Render()) }