|
- package mqtthandler
-
- import (
- "context"
- "encoding/json"
- "fmt"
- "log"
- "os"
- "strconv"
- "strings"
- "time"
-
- "github.com/AFASystems/presence/internal/pkg/model"
- "github.com/segmentio/kafka-go"
- )
-
- func MqttHandler(writer *kafka.Writer, topicName []byte, message []byte) {
- hostname := strings.Split(string(topicName), "/")[1]
- msgStr := string(message)
-
- if strings.HasPrefix(msgStr, "[") {
- var readings []model.RawReading
- err := json.Unmarshal(message, &readings)
- if err != nil {
- log.Printf("Error parsing JSON: %v", err)
- return
- }
-
- for _, reading := range readings {
- if reading.Type == "Gateway" {
- continue
- }
- adv := model.BeaconAdvertisement{
- Hostname: hostname,
- MAC: reading.MAC,
- RSSI: int64(reading.RSSI),
- Data: reading.RawData,
- HSButtonCounter: parseButtonState(reading.RawData),
- }
-
- encodedMsg, err := json.Marshal(adv)
- if err != nil {
- fmt.Println("Error in marshaling: ", err)
- break
- }
-
- msg := kafka.Message{
- Value: encodedMsg,
- }
- err = writer.WriteMessages(context.Background(), msg)
- if err != nil {
- fmt.Println("Error in writing to Kafka: ", err)
- time.Sleep(1 * time.Second)
- break
- }
-
- fmt.Println("message sent: ", time.Now())
- }
- } else {
- s := strings.Split(string(message), ",")
- if len(s) < 6 {
- log.Printf("Messaggio CSV non valido: %s", msgStr)
- return
- }
-
- rawdata := s[4]
- buttonCounter := parseButtonState(rawdata)
- if buttonCounter > 0 {
- adv := model.BeaconAdvertisement{}
- i, _ := strconv.ParseInt(s[3], 10, 64)
- adv.Hostname = hostname
- adv.BeaconType = "hb_button"
- adv.MAC = s[1]
- adv.RSSI = i
- adv.Data = rawdata
- adv.HSButtonCounter = buttonCounter
-
- read_line := strings.TrimRight(string(s[5]), "\r\n")
- it, err33 := strconv.Atoi(read_line)
- if err33 != nil {
- fmt.Println(it)
- fmt.Println(err33)
- os.Exit(2)
- }
- }
- }
- }
-
- func parseButtonState(raw string) int64 {
- raw = strings.ToUpper(raw)
-
- if strings.HasPrefix(raw, "0201060303E1FF12") && len(raw) >= 38 {
- buttonField := raw[34:38]
- if buttonValue, err := strconv.ParseInt(buttonField, 16, 64); err == nil {
- return buttonValue
- }
- }
-
- if strings.HasPrefix(raw, "02010612FF590") && len(raw) >= 24 {
- counterField := raw[22:24]
- buttonState, err := strconv.ParseInt(counterField, 16, 64)
- if err == nil {
- return buttonState
- }
- }
-
- return 0
- }
|