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

77 строки
1.6 KiB

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