I’m trying to use BLE (non ibeacon specific libraries) on android. Basically I receive a bunch of BLE packets from the BLE scanner class. I have a few questions about finding and then parsing the telemetry packets.
Based on the specifications listed on github I’m unsure of which packets are telemetry.
The “service data” is broadcast in each packet however there are two different telemetry packets? So two different BLE packets are sent, or a similar packet that just changes the service data?
I’m reading the Bluetooth specification here. From what I understand my telemetry data is in 0x16 Service data, while the service data UUID I want to match (Estimote’s is ‘fe9a’) is in 16bit service UUID at 0x16 aswell?
Telemetry data is split into two frames A and B. Parser should join data from those two frames to form a full telemetry report using short device ID.
You can recognise telemetry frame because is has service data under 0xFE9A UUID and lower 4 bits of first byte is 2.
BLE advertisements have fields called Complete/incomplete list of 16/32/128bit Service Class UUIDS. They are only to indicate that device has particular service.
There is other field in advertisement called Service Data, it also contains UUID but also extra data data. Estimote telemetry uses that extra data.
0x16 is advertisement field type. You don’t have access to raw field types unless you parse raw data from
You can get that service data using
ScanRecord sr = // get scan record
Map<ParcelUuid, byte> data = sr.getServiceData();
Why don’t you use our SDK that parses this data automatically and joins frames together?
Thanks for clarifying!
As for the SDK, I’m using Xamarin and the bindings for Estimote do not work properly, see here. So I’m going down a level and just using the android.bluetooth.le bindings instead. They work smoothly so far. I’m thinking about porting the Android Estimote SDK to Xamarin myself and see how it goes.