diff --git a/go.mod b/go.mod index 1a750e3ce9163666930b8eba50a2076189144aa6..97a60efbe837b4d6502015f98416ee8f90f056f6 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module jonasled.dev/jonasled/ems-esp-logger go 1.23.4 require ( + github.com/eclipse/paho.mqtt.golang v1.5.0 github.com/joho/godotenv v1.5.1 github.com/sirupsen/logrus v1.9.3 github.com/wind-c/comqtt/v2 v2.6.0 @@ -10,9 +11,10 @@ require ( ) require ( - github.com/gorilla/websocket v1.5.1 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/rs/xid v1.5.0 // indirect golang.org/x/net v0.27.0 // indirect + golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.22.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 31ffe23a8cd12b95a4a722cfad4df8ff9a022cd8..04b0286ab491326e40257bfeb9b34ed69e0ec4bc 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,10 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/eclipse/paho.mqtt.golang v1.5.0 h1:EH+bUVJNgttidWFkLLVKaQPGmkTUfQQqjOsyvMGvD6o= +github.com/eclipse/paho.mqtt.golang v1.5.0/go.mod h1:du/2qNQVqJf/Sqs4MEL77kR8QTqANF7XU7Fk0aOTAgk= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= @@ -21,6 +23,8 @@ github.com/wind-c/comqtt/v2 v2.6.0 h1:huLdOwYDrwMTrEwH7+mSs1GftHZ/tDqJw8nOz3iX7k github.com/wind-c/comqtt/v2 v2.6.0/go.mod h1:6O4VilBrTQ/cNIcmIgNdMLCK9DTiLRxkal00t0DLN64= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/helper/generateRandomString.go b/helper/generateRandomString.go new file mode 100644 index 0000000000000000000000000000000000000000..fdea325f5c29a87def0d545d982fbad98cf5c2d6 --- /dev/null +++ b/helper/generateRandomString.go @@ -0,0 +1,15 @@ +package helper + +import ( + "math/rand" +) + +func GenerateRandomString(length int) string { + const charset = "abcdefghijklmnopqrstuvwxyz0123456789" + // Generate random string + result := make([]byte, length) + for i := range result { + result[i] = charset[rand.Intn(len(charset))] + } + return string(result) +} diff --git a/main.go b/main.go index 1609ca92af4fbfd90345e4aa8145b79b21e655f7..26cb826c56625dd59de61e6af4bec586071a480b 100644 --- a/main.go +++ b/main.go @@ -2,16 +2,23 @@ package main import ( "os" + "time" _ "github.com/joho/godotenv/autoload" "jonasled.dev/jonasled/ems-esp-logger/log" + "jonasled.dev/jonasled/ems-esp-logger/mqttclient" "jonasled.dev/jonasled/ems-esp-logger/mqttserver" ) func main() { + log.Init() if os.Getenv("MQTT_SERVER_ENABLED") == "true" { log.Log.Info("Starting embedded MQTT server") mqttserver.Start() } + mqttclient.Init() + for { + time.Sleep(time.Second) + } } diff --git a/mqttclient/main.go b/mqttclient/main.go new file mode 100644 index 0000000000000000000000000000000000000000..77d1529d5110c959c40663bcbd71a313be6d3ae7 --- /dev/null +++ b/mqttclient/main.go @@ -0,0 +1,45 @@ +package mqttclient + +import ( + "fmt" + "os" + + mqtt "github.com/eclipse/paho.mqtt.golang" + "jonasled.dev/jonasled/ems-esp-logger/helper" + "jonasled.dev/jonasled/ems-esp-logger/log" +) + +var messagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) { + log.Log.Debugf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic()) +} + +var messagePubHandlerBoiler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) { + log.Log.Debugf("Received message for boiler: %s from topic: %s\n", msg.Payload(), msg.Topic()) + +} + +var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) { + log.Log.Info("Successfully connected to MQTT broker") +} + +var connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) { + log.Log.Error("Connection to MQTT broker lost: ", err.Error()) +} + +func Init() { + opts := mqtt.NewClientOptions() + opts.AddBroker(fmt.Sprintf("tcp://%s:%s", os.Getenv("MQTT_HOST"), os.Getenv("MQTT_PORT"))) + opts.SetClientID("ems-esp-logger_" + helper.GenerateRandomString(8)) + if os.Getenv("MQTT_USERNAME") != "" { + opts.SetUsername(os.Getenv("MQTT_USERNAME")) + opts.SetPassword(os.Getenv("MQTT_PASSWORD")) + } + opts.SetDefaultPublishHandler(messagePubHandler) + opts.OnConnect = connectHandler + opts.OnConnectionLost = connectLostHandler + client := mqtt.NewClient(opts) + if token := client.Connect(); token.Wait() && token.Error() != nil { + log.Log.Fatal("Failed connecting to MQTT server: ", token.Error()) + } + client.Subscribe(os.Getenv("MQTT_TOPTIC_BOILER"), 1, messagePubHandlerBoiler) +}