iOS CoreBluetooth:GAP外围设备和GATT客户端?

iOS CoreBluetooth:GAP外围设备和GATT客户端?,ios,bluetooth-lowenergy,core-bluetooth,gatt,Ios,Bluetooth Lowenergy,Core Bluetooth,Gatt,我们的系统由一个带有远程控制单元的主设备组成。主要设备是GAP中心和GATT服务器。远程控制单元通过BLE播发和连接,其中远程设备是GAP外围设备和GATT客户端。当按下遥控器上的按钮时,它会将按钮状态特征写入GATT服务器 我们想写一个iOS应用程序来代替遥控器。iOS核心蓝牙是否可以作为GAP外围设备同时作为GATT客户端运行?应用程序必须作为外围设备进行广告,然后在连接后进行服务发现。应用程序按钮将对主设备GAP中央GATT服务器上的特征执行写入请求 我们的配置与标准BLE模型略有不同,G

我们的系统由一个带有远程控制单元的主设备组成。主要设备是GAP中心和GATT服务器。远程控制单元通过BLE播发和连接,其中远程设备是GAP外围设备和GATT客户端。当按下遥控器上的按钮时,它会将按钮状态特征写入GATT服务器

我们想写一个iOS应用程序来代替遥控器。iOS核心蓝牙是否可以作为GAP外围设备同时作为GATT客户端运行?应用程序必须作为外围设备进行广告,然后在连接后进行服务发现。应用程序按钮将对主设备GAP中央GATT服务器上的特征执行写入请求


我们的配置与标准BLE模型略有不同,GATT DB通常位于GAP外围设备上。但是在我们的例子中,将主设备的设置存储在远程控制单元中在逻辑上是没有意义的。iOS是否具有足够的灵活性来支持此配置?

仅作澄清:您正在谈论的是BLE服务请求。不幸的是,CoreBluetooth只支持一个方向的服务请求,即iOS设备是GAP中心,而另一个GAP外围设备可以在iOS设备上发现GATT服务器。这就是Pebble等附件用来访问媒体控制()和通知()的基本原理。您可以在CBCentralManager上找到支持上述方案的专用字典键
CBCentralManager上的ConsolitedServiceUUIDSKey
,但在CBPeripheralManager上没有支持您的方案的等效项


希望这能有所帮助。

只是想澄清一下:您正在谈论的是可撤销的服务请求。不幸的是,CoreBluetooth只支持一个方向的服务请求,即iOS设备是GAP中心,而另一个GAP外围设备可以在iOS设备上发现GATT服务器。这就是Pebble等附件用来访问媒体控制()和通知()的基本原理。您可以在CBCentralManager上找到支持上述方案的专用字典键
CBCentralManager上的ConsolitedServiceUUIDSKey
,但在CBPeripheralManager上没有支持您的方案的等效项


希望这能有所帮助。

尽管有许多组合是有效的,但GAP和GATT的角色看起来很相似。因此,即使您的iOS应用程序将自己宣传为可扩展外围设备,您也可以使用它连接回中央设备。您可以使用或查找中央设备,而不是像在中央应用程序中那样进行扫描

不幸的是,中没有
didConnect
方法。如果要使用
检索外围设备(标识符:)
则需要添加虚拟服务和特征,并在连接后让您的中央设备访问该特征。当您收到
didReceiveRead
didSubscribeTo
事件时,您可以连接回
request.central.identifier
。使用
检索连接的外围设备(带有服务:)
更简单,但在我的测试中,它没有始终返回中央设备

检索连接的外围设备(使用服务:)示例

导入核心蓝牙
//iOS应用程序的GATT客户端,作为可编程外围设备运行。CoreBluetooth需要使用CBCentralManager
//使用远程GATT服务,但我们不必实际扫描远程设备。
类GattClient:NSObject、CBCentralManagerDelegate、cbperipheraldegate{
//替换为您的服务uuid
让RemoteServiceUUID=[CBUUID(字符串:“面”)]
var centralManager:CBCentralManager!
var远程设备:CBP外围设备?=无
变量计时器:计时器?=nil
重写init(){
super.init()
centralManager=CBCentralManager(代理:self,队列:nil)
}
func CentralManager数据状态(uCentral:CBCentralManager){
如果(central.state==.poweredOn){
//我们无法侦听'didConnect'事件,因此请轮询已连接的设备。
timer=timer.scheduledTimer(时间间隔:5,重复:true,块:findConnectedDevice)
}
}
func findConnectedDevice(计时器:计时器){
//不要扫描,只需连接到已经连接到我们提供正确服务的设备。
打印(“搜索连接的设备…”)
让connectedPeripherals=centralManager.retrieveConnectedPeripherals(使用服务:remoteServiceUUIDs)
打印(“找到的设备:\(connectedPeripherals.count)”)
if(connectedPeripherals.count==1){
remoteDevice=已连接的外围设备[0]
打印(“连接…”)
centralManager.connect(remoteDevice!,选项:无)
timer.invalidate()
}
}
func centralManager(uCentral:CBCentralManager,didConnect外围设备:CBPeripheral){
打印(“发现服务…”)
peripheral.delegate=self
外围.discoverServices(remoteServiceUUIDs)
}
...
}

尽管有许多组合是有效的,但GAP和GATT的角色看起来很相似。因此,即使您的iOS应用程序将自己宣传为可扩展外围设备,您也可以使用它连接回中央设备。您可以使用或查找中央设备,而不是像在中央应用程序中那样进行扫描

不幸的是,中没有
didConnect
方法。如果要使用
检索外围设备(标识符:)
则需要添加虚拟服务和特征,并在连接后让您的中央设备访问该特征。当您收到
didReceiveRead
didSubscribeTo
事件时,您可以连接回
request.central.identifier
。使用
检索连接的外围设备(w