25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
2.4 KiB

  1. package mqtthandler
  2. import (
  3. "fmt"
  4. "encoding/json"
  5. "strings"
  6. "log"
  7. "strconv"
  8. "os"
  9. "context"
  10. "time"
  11. "github.com/AFASystems/presence/internal/pkg/model"
  12. "github.com/segmentio/kafka-go"
  13. )
  14. func MqttHandler(writer *kafka.Writer, topicName []byte, message []byte) {
  15. hostname := strings.Split(string(topicName), "/")[1]
  16. msgStr := string(message)
  17. if strings.HasPrefix(msgStr, "[") {
  18. var readings []model.RawReading
  19. err := json.Unmarshal(message, &readings)
  20. if err != nil {
  21. log.Printf("Error parsing JSON: %v", err)
  22. return
  23. }
  24. for _, reading := range readings {
  25. if reading.Type == "Gateway" {
  26. continue
  27. }
  28. incoming := model.Incoming_json{
  29. Hostname: hostname,
  30. MAC: reading.MAC,
  31. RSSI: int64(reading.RSSI),
  32. Data: reading.RawData,
  33. HB_ButtonCounter: parseButtonState(reading.RawData),
  34. }
  35. encodedMsg, err := json.Marshal(incoming)
  36. if err != nil {
  37. fmt.Println("Error in marshaling: ", err)
  38. }
  39. msg := kafka.Message{
  40. Value: encodedMsg,
  41. }
  42. err = writer.WriteMessages(context.Background(), msg)
  43. if err != nil {
  44. fmt.Println("Error in writing to Kafka: ", err)
  45. }
  46. fmt.Println("message sent: ", time.Now())
  47. }
  48. } else {
  49. s := strings.Split(string(message), ",")
  50. if len(s) < 6 {
  51. log.Printf("Messaggio CSV non valido: %s", msgStr)
  52. return
  53. }
  54. rawdata := s[4]
  55. buttonCounter := parseButtonState(rawdata)
  56. if buttonCounter > 0 {
  57. incoming := model.Incoming_json{}
  58. i, _ := strconv.ParseInt(s[3], 10, 64)
  59. incoming.Hostname = hostname
  60. incoming.Beacon_type = "hb_button"
  61. incoming.MAC = s[1]
  62. incoming.RSSI = i
  63. incoming.Data = rawdata
  64. incoming.HB_ButtonCounter = buttonCounter
  65. read_line := strings.TrimRight(string(s[5]), "\r\n")
  66. it, err33 := strconv.Atoi(read_line)
  67. if err33 != nil {
  68. fmt.Println(it)
  69. fmt.Println(err33)
  70. os.Exit(2)
  71. }
  72. }
  73. }
  74. }
  75. func parseButtonState(raw string) int64 {
  76. raw = strings.ToUpper(raw)
  77. if strings.HasPrefix(raw, "0201060303E1FF12") && len(raw) >= 38 {
  78. buttonField := raw[34:38]
  79. if buttonValue, err := strconv.ParseInt(buttonField, 16, 64); err == nil {
  80. return buttonValue
  81. }
  82. }
  83. if strings.HasPrefix(raw, "02010612FF590") && len(raw) >= 24 {
  84. counterField := raw[22:24]
  85. buttonState, err := strconv.ParseInt(counterField, 16, 64)
  86. if err == nil {
  87. return buttonState
  88. }
  89. }
  90. return 0
  91. }