[web-bluetooth] getPrimaryService(s) returns nothing (#451)

dodgePT has just created a new issue for https://github.com/WebBluetoothCG/web-bluetooth:

== getPrimaryService(s) returns nothing ==
Hi all!

I'm experimenting with web bluetooth, trying to access services and characteristics on a BLE device, namely a smartwatch.
I'm on Win10 64bit, using electron framework but I also used the samples page to test this.
Everything goes according to plan up until I try to get services. It connects, I get the name, ID and gatt connected status, but then, when I try to get services, there's no response. It just stalls there, with no timeout, nothing.

First I thought this could be something related to electron, but then I tested all samples, and while they connect to the watch (just like my app), none of the samples are able to get any services too.

I got all UUIDs for services and characteristics of the watch, obtained through nRF Connect on Android.

Here's the simple class I made:
`class BTHuawei {
  constructor() {
    this.device = null;
    this.onDisconnected = this.onDisconnected.bind(this);
    this.characts = {};
  }

  request() {
    let options = {
      filters: [
        {
          namePrefix: "HUAWEI"
        }
      ],
      optionalServices: [
        0x1800,
        0x1801,
        0x180a,
        0x2902,
        "0000fe86-0000-1000-8000-00805f9b34fb",
        "00003802-0000-1000-8000-00805f9b34fb"
      ]
    };
    return navigator.bluetooth
      .requestDevice(options)
      .then(device => {
        this.device = device;
        this.device.addEventListener(
          "gattserverdisconnected",
          this.onDisconnected
        );
      })
      .catch(error => {
        console.log(error.message);
      });
  }

  connect() {
    console.log("Connecting...");
    if (!this.device) {
      return Promise.reject("Device is not connected.");
    }
    return this.device.gatt.connect();
  }

  //////////////////////////////////////////////////////////////////////////////

  readCharacteristic(serviceUUID, characteristicUUID) {
    return this.device.gatt
      .getPrimaryService(serviceUUID)
      .then(service => {
        service
          .getCharacteristic(characteristicUUID)
          .then(characteristic => {
            characteristic.startNotifications();
          })
          .then(characteristic => {
            characteristic.addEventListener(
              "characteristicvaluechanged",
              handleCharacteristicValueChanged
            );
            characteristic.readValue();
          });
      });
  }

  discoverServicesAndCharacteristics() {
    return this.device.gatt
      .getPrimaryServices()
      .then(services => {
        let queue = Promise.resolve();
        services.forEach(service => {
          queue = queue.then(_ =>
            service.getCharacteristics().then(characteristics => {
              log("> Service: " + service.uuid);
              characteristics.forEach(characteristic => {
                console.log(
                  ">> Characteristic: " +
                    characteristic.uuid +
                    " " +
                    getSupportedProperties(characteristic)
                );
              });
            })
          );
        });
        return queue;
      })
      .catch(error => {
        console.log(error.message);
      });
  }

  //////////////////////////////////////////////////////////////////////////////

  disconnect() {
    if (!this.device) {
      return Promise.reject("Device is not connected.");
    }
    return this.device.gatt.disconnect();
  }

  onDisconnected() {
    console.log("Device is disconnected.");
  }
}`

And this is how I use it:

`bTHuawei
 .request()
  .then(_ => bTHuawei.connect())
  .then(_ => {
   console.log(bTHuawei.device.name);
   console.log(bTHuawei.device.id);
   console.log(bTHuawei.device.gatt.connected);

   bTHuawei.readCharacteristic(0x1800, 0x2AA6);
  })
  .catch(error => {
   console.log(error.message);
  });`

Am I missing some step or something?
I guess not because none of the examples work after successfuly connecting.

Thank you for your time. Let me know if I can improve my query with more information.

Please view or discuss this issue at https://github.com/WebBluetoothCG/web-bluetooth/issues/451 using your GitHub account

Received on Wednesday, 31 July 2019 11:29:36 UTC