feat: device state checker

This commit is contained in:
2026-01-12 11:19:58 +01:00
parent 66ba68c39f
commit b706a9ce14
2 changed files with 216 additions and 2 deletions
+17 -2
View File
@@ -16,6 +16,7 @@ import (
_ "github.com/go-sql-driver/mysql"
"git.piskot.si/SeminarM2/lambdaiot-core/internal/config"
"git.piskot.si/SeminarM2/lambdaiot-core/internal/devicecheck"
"git.piskot.si/SeminarM2/lambdaiot-core/internal/handler"
"git.piskot.si/SeminarM2/lambdaiot-core/internal/middleware"
mqttclient "git.piskot.si/SeminarM2/lambdaiot-core/internal/mqtt"
@@ -54,6 +55,8 @@ func main() {
// connect to MQTT broker (best-effort)
var mq *mqttclient.Client
var checker *devicecheck.Checker
var checkCancel context.CancelFunc
// initialize sqlite for state messages
var stateDB *storage.DB
{
@@ -77,17 +80,26 @@ func main() {
mq = mqc
mqttclient.SetDefault(mqc)
// start device state checker when MQTT is available
checkCtx, checkCancel = context.WithCancel(context.Background())
checker = devicecheck.New(sqlDB, mq, cfg.MQTT.Topic, 0, 0)
checker.Start(checkCtx)
// subscribe to the configured topic and log incoming messages
if cfg.MQTT.Topic != "" {
if err := mq.Subscribe(cfg.MQTT.Topic, func(t string, p []byte) {
handlerFn := func(t string, p []byte) {
log.Printf("mqtt recv on %s: %s", t, string(p))
if checker != nil {
checker.HandleMessage(p)
}
// if topic starts with state: -> store in sqlite
if strings.HasPrefix(t, "state:") {
if storage.Default != nil {
_ = storage.Default.InsertMessage(string(p), time.Now())
}
}
}); err != nil {
}
if err := mq.Subscribe(cfg.MQTT.Topic, handlerFn); err != nil {
log.Printf("warning: mqtt subscribe failed: %v", err)
}
}
@@ -173,6 +185,9 @@ func main() {
if mq != nil {
mq.Close()
}
if checkCancel != nil {
checkCancel()
}
if stateDB != nil {
stateDB.Close()
}