use gatt
func (d *Device) IsQcyDevice() (bool, error) {
// get manufacturer
var manufacturer map[uint16]dbus.Variant
busObj := d.client.conn.Object("org.bluez", dbus.ObjectPath(d.client.path+"/dev_"+utils.MacToPath(d.address)))
err := busObj.Call("org.freedesktop.DBus.Properties.Get", 0, "org.bluez.Device1", "ManufacturerData").Store(&manufacturer)
if err != nil {
//println(err.Error())
return false, nil
}
// check if manufacturer is QCY
// Manufacturer specific advertisement data. Keys are 16 bits Manufacturer ID followed by its byte array value
// 0x521c is QCY, how parse it?
if _, ok := manufacturer[0x521c]; ok {
return true, nil
}
return false, nil
}character: 00001001-0000-1000-8000-00805f9b34fb
Prefix(2byte): FF 03
CMD(1byte): 0C(Noise canceling option), 16(Balance), 09(Game mode), FE(Firmware???)
Arg size(1byte): always 1?
FF 03 0C 01 63: ANC ON(noise lv 3)
FF 03 0C 01 62: ANC ON(noise lv 2)
FF 03 0C 01 61: ANC ON(noise lv 1)
FF 03 0C 01 53: ANC ON(work lv 3)
FF 03 0C 01 52: ANC ON(work lv 2)
FF 03 0C 01 51: ANC ON(work lv 1)
FF 03 0C 01 43: ANC ON(slient lv 3)
FF 03 0C 01 42: ANC ON(slient lv 2)
FF 03 0C 01 41: ANC ON(slient lv 1)
FF 03 0C 01 A6: PASSTHROUGH(lv 6)
FF 03 0C 01 A0: PASSTHROUGH(voice increase)
FF 03 0C 01 02: ANC OFF
FF 03 16 01 00: left 100%, right 0%
FF 03 16 01 32: middle(left 50%, right 50%)
FF 03 16 01 64: left 0%, right 100%
FF 03 09 01 01: Game mode on
FF 03 09 01 02: Game mode off
FF 03 FE 01 16: Firmware version?
character: 00000008-0000-1000-8000-00805f9b34fb
Left (1byte): Percent
Right (1byte): Percent
Case (1byte): Percent