diff options
| author | xengineering <me@xengineering.eu> | 2025-12-20 13:27:42 +0100 |
|---|---|---|
| committer | xengineering <me@xengineering.eu> | 2025-12-20 13:27:42 +0100 |
| commit | 96299467958aaffdbef5cb8ae780d3abeddfcaba (patch) | |
| tree | 95e3ff2ccb6bdaffe0f1afedebb6794b72cd6865 /mqtt.go | |
| parent | faf9fb7a8c5e8b31e9c1104b42d7e550e986ca61 (diff) | |
| download | sia-server-96299467958aaffdbef5cb8ae780d3abeddfcaba.tar sia-server-96299467958aaffdbef5cb8ae780d3abeddfcaba.tar.zst sia-server-96299467958aaffdbef5cb8ae780d3abeddfcaba.zip | |
Separate MQTT logic
This reduces the coupling between the MQTT-related code and everything
else to a single `tx` channel of type `MQTTMessage`.
This improves the code quality significantly.
Diffstat (limited to 'mqtt.go')
| -rw-r--r-- | mqtt.go | 51 |
1 files changed, 51 insertions, 0 deletions
@@ -0,0 +1,51 @@ +package main + +import ( + "log" + "time" + + mqtt "github.com/eclipse/paho.mqtt.golang" +) + +const ( + BROKER = `tcp://127.0.0.1:1883` + CLIENT_ID = `siaserver` + TOPIC_PREFIX = `sia` + QOS = byte(1) + RETAINED = true + MQTT_CONNECT_TIMEOUT = 1 * time.Second + MQTT_DISCONNECT_TIMEOUT_US = 500 + MQTT_RECONNECT_PERIOD = 2 * time.Second +) + +type MQTTMessage struct { + Topic string + Payload []byte +} + +func MQTTRun(tx chan MQTTMessage) { + opts := mqtt.NewClientOptions() + opts.AddBroker(BROKER) + opts.SetClientID(CLIENT_ID) + opts.SetCleanSession(true) + opts.SetOnConnectHandler(MQTTOnConnectHandler) + + client := mqtt.NewClient(opts) + + token := client.Connect() + + success := token.WaitTimeout(MQTT_CONNECT_TIMEOUT) + if !success { + log.Printf("Timed out after %v.", MQTT_CONNECT_TIMEOUT) + return + } + defer client.Disconnect(MQTT_DISCONNECT_TIMEOUT_US) + + for message := range tx { + client.Publish(message.Topic, QOS, RETAINED, message.Payload) + } +} + +func MQTTOnConnectHandler(c mqtt.Client) { + log.Printf("Connected to MQTT broker (%s)", BROKER) +} |
