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.
 
 
 
 

70 wiersze
1.8 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. fmt.Println("beacon: ", beacon)
  29. b, err := hex.DecodeString(beacon)
  30. if err != nil {
  31. return err
  32. }
  33. b = utils.RemoveFlagBytes(b)
  34. indices := utils.ParseADFast(b)
  35. event := utils.LoopADStructures(b, indices, id, registry)
  36. if event.ID == "" {
  37. return nil
  38. }
  39. prevEvent, ok := appState.GetBeaconEvent(id)
  40. appState.UpdateBeaconEvent(id, event)
  41. if event.Type == "iBeacon" {
  42. event.BtnPressed = true
  43. }
  44. if ok && bytes.Equal(prevEvent.Hash(), event.Hash()) {
  45. return nil
  46. }
  47. eMsg, err := event.ToJSON()
  48. if err != nil {
  49. return err
  50. }
  51. if err := kafkaclient.Write(context.Background(), writer, kafka.Message{Value: eMsg}); err != nil {
  52. return fmt.Errorf("write alert: %w", err)
  53. }
  54. return nil
  55. }