Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 

68 wiersze
1.7 KiB

  1. package decoder
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/hex"
  6. "fmt"
  7. "log/slog"
  8. "strings"
  9. "github.com/AFASystems/presence/internal/pkg/common/appcontext"
  10. "github.com/AFASystems/presence/internal/pkg/common/utils"
  11. "github.com/AFASystems/presence/internal/pkg/kafkaclient"
  12. "github.com/AFASystems/presence/internal/pkg/model"
  13. "github.com/segmentio/kafka-go"
  14. )
  15. // ProcessIncoming decodes a beacon advertisement and writes the event to the writer if it changed.
  16. func ProcessIncoming(adv appcontext.BeaconAdvertisement, appState *appcontext.AppState, writer *kafka.Writer, registry *model.ParserRegistry) {
  17. if err := DecodeBeacon(adv, appState, writer, registry); err != nil {
  18. slog.Error("decoding beacon", "err", err, "id", adv.ID)
  19. }
  20. }
  21. // DecodeBeacon hex-decodes the payload, runs the parser registry, dedupes by event hash, and writes to writer.
  22. func DecodeBeacon(adv appcontext.BeaconAdvertisement, appState *appcontext.AppState, writer *kafka.Writer, registry *model.ParserRegistry) error {
  23. beacon := strings.TrimSpace(adv.Data)
  24. id := adv.ID
  25. if beacon == "" {
  26. return nil
  27. }
  28. b, err := hex.DecodeString(beacon)
  29. if err != nil {
  30. return err
  31. }
  32. b = utils.RemoveFlagBytes(b)
  33. indices := utils.ParseADFast(b)
  34. event := utils.LoopADStructures(b, indices, id, registry, beacon)
  35. if event.ID == "" {
  36. return nil
  37. }
  38. prevEvent, ok := appState.GetBeaconEvent(id)
  39. appState.UpdateBeaconEvent(id, event)
  40. if event.Type == "iBeacon" {
  41. event.BtnPressed = true
  42. }
  43. if ok && bytes.Equal(prevEvent.Hash(), event.Hash()) {
  44. return nil
  45. }
  46. eMsg, err := event.ToJSON()
  47. if err != nil {
  48. return err
  49. }
  50. if err := kafkaclient.Write(context.Background(), writer, kafka.Message{Value: eMsg}); err != nil {
  51. return fmt.Errorf("write alert: %w", err)
  52. }
  53. return nil
  54. }