无法使用 chrome.bluetoothLowEnergy 从 iOS 外围设备获取服务

Posted

技术标签:

【中文标题】无法使用 chrome.bluetoothLowEnergy 从 iOS 外围设备获取服务【英文标题】:Failing to obtain services from iOS peripheral using chrome.bluetoothLowEnergy 【发布时间】:2016-06-03 17:31:32 【问题描述】:

我有一个 ios 应用程序,它使用 CBPeripheralManager 成功地宣传自己。在 Chrome 应用程序中,我成功地发现了设备(因此获得了它的地址)。

我已将具有自定义 UUID 的服务添加到外设管理器。 didAddService 被调用(在外围管理器上电后),所以我假设这部分是成功的。

我在 Chrome 应用中调用 chrome.bluetoothLowEnergy.connect(device address)。回调函数被调用没有问题,所以我相信连接是成功的。发生连接时,应用内没有调用任何函数 - 应该有吗?

然后我在 Chrome 应用程序中调用 chrome.bluetooth.getServices(device address)。返回一个服务数组,但该数组为空。我相信它应该返回一个长度为 1,而不是 0 的数组。

我是否忽略了什么?为什么没有服务被退回?在这些操作期间是否应该调用任何 peripheralManager 函数?

连接代码:

function connect(address) 

  /* Connect persistently to the device. */
  chrome.bluetoothLowEnergy.connect(address, persistent: true, function() 
    if(chrome.runtime.lastError) 

      /* If we click a green device, we get this. We should try and handle it
         earlier. e.g. by removing the listener, or instead using the click
         to disconnect the device. */
      if(chrome.runtime.lastError.message == 'Already connected')
        setDeviceConnected(address);

      /* Print error and exit. */
      console.log(chrome.runtime.lastError.message);
      return;
    

    console.log('Successfully connected to ' + address);
    setDeviceConnected(address);
    // getDeviceService();
    getDeviceServices(address);
  );

  return true;

获取服务代码:

function getDeviceServices(address) 
  chrome.bluetoothLowEnergy.getServices(address, function(services) 
    console.log('services.length: ' + services.length);
  );

外设设置代码:

- (void)setupPeripheral 
  _serviceName = SERVICE_NAME;
  _serviceUUID = [CBUUID UUIDWithString:SERVICE_UUID_STRING];
  _characteristicUUID = [CBUUID UUIDWithString:CHARACTERISTIC_UUID_STRING];

  _peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];

  _characteristic = [[CBMutableCharacteristic alloc] initWithType:_characteristicUUID
                                                     properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotify
                                                     value:nil
                                                     permissions:CBAttributePermissionsReadable];

  _service = [[CBMutableService alloc] initWithType:_serviceUUID primary:YES];
  _service.characteristics = @[_characteristic];


  NSLog(@"Peripheral set up");

开始广告(在我们开始广告之前添加服务):

/* Start advertising */
- (void)startAdvertising 
  NSLog(@"Starting advertising...");

  NSDictionary *advertisment = @
                                 CBAdvertisementDataServiceUUIDsKey : @[self.serviceUUID],
                                 CBAdvertisementDataLocalNameKey: self.serviceName
                                 ;
  [self addServices];
  [self.peripheralManager startAdvertising:advertisment];

在 didUpdateState 中调用开始广告:

/* Did update state */
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral 
  switch (peripheral.state) 
    case CBPeripheralManagerStatePoweredOn:
      NSLog(@"peripheralStateChange: Powered On");
      // When the bluetooth has turned on, start advertising.
      [self startAdvertising];
      break;

更新

在使用 OSX 应用 LightBlue 连接到外围应用时,应用上会显示一条警报以请求配对。然后 LightBlue 可以从应用程序中读取特征。连接 Chrome 应用时,不显示配对提示。

【问题讨论】:

您在哪里将您创建的服务添加到外围设备,例如 peripheral.addservice(service) 我在外设管理器开始广告之前添加服务,参见代码 sn -p 4,[self addServices]。这是一个简单的函数:[_peripheralManager addService:_service]; 【参考方案1】:

与 W3C 的网络蓝牙开发人员交谈后,我现在能够通过将 chrome 从 v51 更新到 v52(显然 v53 也可以)从设备中发现服务。

但是目前(尽管我还没有尝试过),OSX 目前不支持读取特性,如 here 所示。

(我还没有研究过,但this 可能会提供一些关于如何克服此处描述的问题的选项。)

【讨论】:

【参考方案2】:

我自己也遇到过这个问题。我开发了一个简单的应用程序来扫描设备及其服务,但所有找到的设备总是报告一个空的服务数组。我在 OsX 和 ChromeOS 上都有这个问题。

这有一个例外:当设备之前已配对时,我能够在 ChromeOS 上获取服务数组。这让我很困惑,因为我在任何地方读到的任何内容都没有说必须首先手动配对设备,并且没有编程方式来配对发现的设备。

编辑:升级到 Chrome 53 解决了这个问题。 louisdeb 的答案中链接的站点与 web-bluetooth 相关,而不是 chrome.bluetooth,因此特性可能确实有效。

【讨论】:

当您尝试连接未知设备时,操作系统本身会弹出配对通知。 我明白了。 chrome bluetoothLowEnergy 页面显示该 api 在 OSX、Windows 和 ChromeOS 上受支持,所以我希望这不是与操作系统相关的问题。 @BhavukJain 那是针对网络蓝牙的,问题与 Chrome 蓝牙有关。

以上是关于无法使用 chrome.bluetoothLowEnergy 从 iOS 外围设备获取服务的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 StorageClass 配置卷 - 无法获取存储帐户的存储密钥

Worklight Studio 和本地开发,有时无法使用 Java 类,有时无法使用 HTML 文件

ADB无法使用解决办法

Ubuntu 80端口无法使用-非root用户无法使用1024以下端口

无法在 SQL Server 视图中使用工作查询:“IS”无法识别“>”无法识别

LINUX下的mail\mailx为啥无法使用外部SMTP发邮件