通过服务uuid​​发现Web蓝牙

时间:2016-03-16 23:08:01

标签: google-chrome bluetooth-lowenergy web-bluetooth

我正在尝试编写一个与Eddystone信标交互的网络应用程序。信标通告应用程序的URL并公开服务和2个特征。

我的设备具有以下服务和特性,如linux上的gatttool所示

$ gatttool -I 
[00:1A:7D:DA:71:15][LE]> connect 00:1A:7D:DA:71:15 
Attempting to connect to 00:1A:7D:DA:71:15 
Connection successful 
[00:1A:7D:DA:71:15][LE]> primary 
attr handle: 0x0001, end grp handle: 0x0005 uuid: 00001800-0000-1000-8000-00805f9b34fb 
attr handle: 0x0006, end grp handle: 0x0009 uuid: 00001801-0000-1000-8000-00805f9b34fb 
attr handle: 0x000a, end grp handle: 0x0012 uuid: ba42561b-b1d2-440a-8d04-0cefb43faece 
[00:1A:7D:DA:71:15][LE]> characteristics 
handle: 0x0002, char properties: 0x02, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb 
handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb 
handle: 0x0007, char properties: 0x20, char value handle: 0x0008, uuid: 00002a05-0000-1000-8000-00805f9b34fb 
handle: 0x000b, char properties: 0x1a, char value handle: 0x000c, uuid: 6bcb06e2-7475-42a9-a62a-54a1f3ce11e6 
handle: 0x000f, char properties: 0x1a, char value handle: 0x0010, uuid: 6bcb06e2-7475-42a9-a62a-54a1f3ce11e5 
[00:1A:7D:DA:71:15][LE]

我正在使用示例here

if (navigator.bluetooth) {
  console.log("bluetooth found");
  navigator.bluetooth.requestDevice({
    filters: [{
      services: ['ba42561b-b1d2-440a-8d04-0cefb43faece']
    }]
  })
  .then(device => {
    bluetoothDevice = device;
    console.log(device.name);
    console.log(device.uuids);
    device.connectGATT();
  })
  .then(server => {
    return server.getPrimaryService('ba42561b-b1d2-440a-8d04-0cefb43faece');
  })
  .then(service => {
    return service.getCharacteristic('6bcb06e2-7475-42a9-a62a-54a1f3ce11e6');
  })
  .then( characteristic => {
    var toggleOn = new Uint8Array([1]);
    return characteristic.writeValue(toggleOn);
  })
  .catch(error => { 
    console.log("error:- " + error); 
  });
}

此代码永远不会找到该设备。如果我更改过滤器以使用namePrefix,它会找到设备,但只会列出其中一项服务而不是我感兴趣的服务。

有人知道我在发现和找到合适的服务时遇到了什么问题吗?

1 个答案:

答案 0 :(得分:2)

filters参数主要根据发送的广告包过滤设备,而不是设备的gatt服务器实际暴露的服务。因此,如果信标只是通告了网址及其名称,则您不太可能通过过滤特定服务UUID来找到它。

我说“不太可能”而不是“你不会”,因为如果你已经连接到设备一次,你的系统可能会缓存设备实际暴露的服务集,然后使用它们来匹配过滤器。 / p>

如果您切换到namePrefix参数,则需要记住列出要在optionalServices中使用的所有服务:

navigator.bluetooth.requestDevice({
  filters: [{
    namePrefix: 'something',
  }],
  optionalServices: ['ba42561b-b1d2-440a-8d04-0cefb43faece']
});