简体   繁体   中英

How to access ManufacturerData from a Polar heart rate sensor using Bluez and C

Question: Phrased another way. My Intel Bluetooth controller accepts data from my Polar Bluetooth LE device and places the data on the D-bus system bus. How do I use the bluez API and D-Bus to read my Polar sensors heart rate data?

In an attempt to at least see the Polar sensor, I ran c code written by Parthiban Nallathambi at www.linumiz.com : https://www.linumiz.com/bluetooth-list-devices-using-gdbus/ . Providing this for credit and background.

The code accurately displayed the Polar sensor attributes, but no data. FYI, the 1st few executions it actually did display ManufacturerData:

        Address : D2:9C:2A:C8:F9:CA
        AddressType : random
        Name : Polar H9 ADAC102E
        Alias : Polar H9 ADAC102E
        Appearance : Other
        Paired : 1
        Trusted : 1
        Blocked : 0
        LegacyPairing : 0
        Connected : 0
        UUIDs : 
                00001800-0000-1000-8000-00805f9b34fb
                00001801-0000-1000-8000-00805f9b34fb
                0000180a-0000-1000-8000-00805f9b34fb
                0000180d-0000-1000-8000-00805f9b34fb
                0000180f-0000-1000-8000-00805f9b34fb
                0000181c-0000-1000-8000-00805f9b34fb
                0000feee-0000-1000-8000-00805f9b34fb
                6217ff4b-fb31-1140-ad5a-a45545d7ecf3
        Adapter : Other
        ServicesResolved : 0 

Then I ran bluetoothctl to display vendor data in ManufacturerData:

steven@DEVELOPMENT-JETSON:~$ bluetoothctl
[NEW] Device D2:9C:2A:C8:F9:CA Polar H9 ADAC102E
[NEW] Primary Service
        /org/bluez/hci0/dev_D2_9C_2A_C8_F9_CA/service0045
        0000feee-0000-1000-8000-00805f9b34fb
        Polar Electro Oy
[NEW] Characteristic
        /org/bluez/hci0/dev_D2_9C_2A_C8_F9_CA/service000e/char000f
        00002a37-0000-1000-8000-00805f9b34fb
        Heart Rate Measurement
[bluetooth]# **connect D2:9C:2A:C8:F9:CA**
Attempting to connect to D2:9C:2A:C8:F9:CA
[CHG] Device D2:9C:2A:C8:F9:CA Connected: yes
Connection successful
[CHG] Device D2:9C:2A:C8:F9:CA ServicesResolved: yes

[Polar H9 ADAC102E]# scan on
Discovery started

[CHG] Device D2:9C:2A:C8:F9:CA RSSI: -67
[CHG] Device D2:9C:2A:C8:F9:CA ManufacturerData Key: 0x006b
[CHG] Device D2:9C:2A:C8:F9:CA ManufacturerData Value: 33 1e 33 33        3.33

I'm just baffled, I can't find any examples of c code that does the following (pseudo code):

  1. Pair to device given device ID or address
  2. Iteratively/continually read ManufacturerData where key = 0x006b
  3. Pull out heart rate data from array

Not looking for someone to write the code, but for someone to point me at the bluez/dbus functions or code if you have it:-), that will accomplish this. Thanks for you time. I'm just stumped.

I have already looked at the Bluetooth for Linux Developers Study Guide, but its in Python and I'm looking for a C guide.

Try https://github.com/weliem/bluez_inc

The Central example shows how to scan. The resulting Device object has the manufacturer data you are looking for.

If you followed the example in here then you should have a function named bluez_property_value , in here you need to compare the key param with "ManufacturerData" and then extract that information using GVariant in this case is an a{qv} an array of dictionaries containing a q id and a v variant where this variant is an array of bytes ay .

void bluez_property_value(const gchar *key, GVariant *value) {
  if (g_strcmp0(key, "ManufacturerData") {
    const guint16 id;
    GVariant *manufacturing_data;
    GVariantIter *iter;

    g_variant_get(value, "a{qv}", &iter);
    while(g_variant_iter_loop(iter, {qv}, &id, &manufacturing_data) {
      const guint8 byte;
      GVariantIter *bytes;
      
      g_variant_get(manufacturing_data, "ay", &bytes);
      while (g_variant_iter_next(bytes, "y", &byte))
        fprintf(stdout, "%02X", byte);
      fflush(stdout);
    }
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM