Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

71 строка
1.4 KiB

  1. package utils
  2. import (
  3. "github.com/AFASystems/presence/internal/pkg/model"
  4. )
  5. // ParseADFast efficiently parses Advertising Data structures
  6. // Returns slice of [startIndex, endIndex] pairs for each AD structure
  7. func ParseADFast(b []byte) [][2]int {
  8. var res [][2]int
  9. i := 0
  10. for i < len(b) {
  11. l := int(b[i])
  12. if l == 0 || i+1+l > len(b) {
  13. break
  14. }
  15. res = append(res, [2]int{i, i + 1 + l})
  16. i += 1 + l
  17. }
  18. return res
  19. }
  20. // RemoveFlagBytes removes Bluetooth advertising flag bytes if present
  21. // Some beacons include flag bytes as the first AD structure
  22. func RemoveFlagBytes(b []byte) []byte {
  23. if len(b) > 1 && b[1] == 0x01 {
  24. l := int(b[0])
  25. if 1+l <= len(b) {
  26. return b[1+l:]
  27. }
  28. }
  29. return b
  30. }
  31. // Generate event based on the Beacon type
  32. func LoopADStructures(b []byte, i [][2]int, id string, parserRegistry *model.ParserRegistry) model.BeaconEvent {
  33. be := model.BeaconEvent{}
  34. for _, r := range i {
  35. ad := b[r[0]:r[1]]
  36. if !isValidADStructure(ad) {
  37. break
  38. }
  39. for _, parser := range parserRegistry.ParserList {
  40. if parser.CanParse(ad) {
  41. event, ok := parser.Parse(ad)
  42. if ok {
  43. event.ID = id
  44. event.Name = id
  45. return event
  46. }
  47. }
  48. }
  49. }
  50. return be
  51. }
  52. // IsValidADStructure validates if an AD structure is well-formed
  53. func isValidADStructure(data []byte) bool {
  54. if len(data) < 2 {
  55. return false
  56. }
  57. length := int(data[0])
  58. return length > 0 && int(length)+1 <= len(data)
  59. }