Skip to content

Commit 85f10ce

Browse files
committed
refactor: move parsing of FindMy data into lib/findmy package
Signed-off-by: deadprogram <[email protected]>
1 parent 7c67301 commit 85f10ce

File tree

3 files changed

+65
-103
lines changed

3 files changed

+65
-103
lines changed

lib/findmy/parse.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package findmy
2+
3+
import (
4+
"errors"
5+
6+
"tinygo.org/x/bluetooth"
7+
)
8+
9+
const (
10+
// Apple, Inc.
11+
AppleCompanyID = 0x004C
12+
13+
// Offline Finding type
14+
FindMyPayloadType = 0x12
15+
16+
// Length of the payload
17+
FindMyPayloadLength = 0x19
18+
19+
// Hint byte
20+
FindMyHint = 0x00
21+
)
22+
23+
var (
24+
ErrorDataTooShort = errors.New("data is too short")
25+
ErrorInvalidPayloadType = errors.New("invalid payload type")
26+
ErrorInvalidPayloadLength = errors.New("invalid payload length")
27+
ErrorInvalidHint = errors.New("invalid hint")
28+
)
29+
30+
// ParseData parses the data from a FindMy device.
31+
// It returns the status byte, the advertising key, and an error if any.
32+
func ParseData(address bluetooth.Address, data []byte) (byte, []byte, error) {
33+
if len(data) < 27 {
34+
return 0, nil, ErrorDataTooShort
35+
}
36+
37+
if data[0] != FindMyPayloadType {
38+
return 0, nil, ErrorInvalidPayloadType
39+
}
40+
41+
if data[1] != FindMyPayloadLength {
42+
return 0, nil, ErrorInvalidPayloadLength
43+
}
44+
45+
if data[26] != FindMyHint {
46+
return 0, nil, ErrorInvalidHint
47+
}
48+
49+
findMyStatus := data[2]
50+
var key [28]byte
51+
copy(key[6:], data[3:25])
52+
53+
// turn address into key bytes
54+
key[0] = address.MAC[5]
55+
key[1] = address.MAC[4]
56+
key[2] = address.MAC[3]
57+
key[3] = address.MAC[2]
58+
key[4] = address.MAC[1]
59+
key[5] = address.MAC[0]
60+
61+
return findMyStatus, key[:], nil
62+
}

scan.go

Lines changed: 3 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,10 @@ package main
33
import (
44
"encoding/hex"
55

6-
"errors"
7-
6+
"github.com/hybridgroup/go-haystack/lib/findmy"
87
"tinygo.org/x/bluetooth"
98
)
109

11-
const (
12-
// Apple, Inc.
13-
appleCompanyID = 0x004C
14-
15-
// Offline Finding type
16-
findMyPayloadType = 0x12
17-
18-
// Length of the payload
19-
findMyPayloadLength = 0x19
20-
21-
// Hint byte
22-
findMyHint = 0x00
23-
)
24-
2510
func scanDevices(verboseFlag *bool) error {
2611
bluetooth.DefaultAdapter.Enable()
2712

@@ -30,8 +15,8 @@ func scanDevices(verboseFlag *bool) error {
3015
println("found device:", device.Address.String(), device.RSSI, device.LocalName())
3116
}
3217

33-
if device.ManufacturerData() != nil && device.ManufacturerData()[0].CompanyID == appleCompanyID {
34-
status, key, err := parseData(device.Address, device.ManufacturerData()[0].Data)
18+
if device.ManufacturerData() != nil && device.ManufacturerData()[0].CompanyID == findmy.AppleCompanyID {
19+
status, key, err := findmy.ParseData(device.Address, device.ManufacturerData()[0].Data)
3520
if err != nil {
3621
println("failed to parse data:", err)
3722
return
@@ -40,35 +25,3 @@ func scanDevices(verboseFlag *bool) error {
4025
}
4126
})
4227
}
43-
44-
func parseData(address bluetooth.Address, data []byte) (byte, []byte, error) {
45-
if len(data) < 27 {
46-
return 0, nil, errors.New("data is too short")
47-
}
48-
49-
if data[0] != findMyPayloadType {
50-
return 0, nil, errors.New("invalid payload type")
51-
}
52-
53-
if data[1] != findMyPayloadLength {
54-
return 0, nil, errors.New("invalid payload length")
55-
}
56-
57-
if data[26] != findMyHint {
58-
return 0, nil, errors.New("invalid hint")
59-
}
60-
61-
findMyStatus := data[2]
62-
var key [28]byte
63-
copy(key[6:], data[3:25])
64-
65-
// turn address into key bytes
66-
key[0] = address.MAC[5]
67-
key[1] = address.MAC[4]
68-
key[2] = address.MAC[3]
69-
key[3] = address.MAC[2]
70-
key[4] = address.MAC[1]
71-
key[5] = address.MAC[0]
72-
73-
return findMyStatus, key[:], nil
74-
}

tinyscan/findmy.go

Lines changed: 0 additions & 53 deletions
This file was deleted.

0 commit comments

Comments
 (0)