No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 

70 líneas
1.7 KiB

  1. package decoder
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/hex"
  6. "fmt"
  7. "strings"
  8. "github.com/AFASystems/presence/internal/pkg/common/appcontext"
  9. "github.com/AFASystems/presence/internal/pkg/common/utils"
  10. "github.com/AFASystems/presence/internal/pkg/model"
  11. "github.com/segmentio/kafka-go"
  12. )
  13. // processIncoming processes incoming beacon advertisements
  14. func processIncoming(adv model.BeaconAdvertisement, appState *appcontext.AppState, writer kafkaWriter, parserRegistry *model.ParserRegistry) {
  15. err := decodeBeacon(adv, appState, writer, parserRegistry)
  16. if err != nil {
  17. eMsg := fmt.Sprintf("Error in decoding: %v", err)
  18. fmt.Println(eMsg)
  19. return
  20. }
  21. }
  22. // decodeBeacon decodes beacon data and publishes events
  23. func decodeBeacon(adv model.BeaconAdvertisement, appState *appcontext.AppState, writer kafkaWriter, parserRegistry *model.ParserRegistry) error {
  24. beacon := strings.TrimSpace(adv.Data)
  25. id := adv.ID
  26. if beacon == "" {
  27. return nil
  28. }
  29. b, err := hex.DecodeString(beacon)
  30. if err != nil {
  31. return err
  32. }
  33. b = utils.RemoveFlagBytes(b)
  34. indeces := utils.ParseADFast(b)
  35. event := utils.LoopADStructures(b, indeces, id, parserRegistry)
  36. if event.ID == "" {
  37. return nil
  38. }
  39. prevEvent, ok := appState.GetBeaconEvent(id)
  40. appState.UpdateBeaconEvent(id, event)
  41. if ok && bytes.Equal(prevEvent.Hash(), event.Hash()) {
  42. return nil
  43. }
  44. eMsg, err := event.ToJSON()
  45. if err != nil {
  46. return err
  47. }
  48. if err := writer.WriteMessages(context.Background(), kafka.Message{Value: eMsg}); err != nil {
  49. return err
  50. }
  51. return nil
  52. }
  53. // kafkaWriter interface defines the methods we need from kafka.Writer
  54. type kafkaWriter interface {
  55. WriteMessages(ctx context.Context, msgs ...kafka.Message) error
  56. }