无法使用 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 文件
Ubuntu 80端口无法使用-非root用户无法使用1024以下端口