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

时间:2016-10-06 16:40:01

标签: ios bluetooth-lowenergy core-bluetooth gatt

我们的系统包括一个带遥控器的主设备。主要设备是GAP Central和GATT Server。远程控制单元通过BLE进行通告和连接,其中远程是GAP外围设备和GATT客户端。当按下遥控器上的按钮时,它会将按钮状态特征写入GATT服务器。

我们想要编写一个iOS应用程序来充当和更换遥控器。 iOS CoreBluetooth是否可以作为GAP外设运行,同时也是GATT客户端?应用程序必须作为外围设备进行广告,然后在连接后进行服务发现。应用程序按钮将对主设备的GAP Central GATT服务器上的特征执行写入请求。

我们的配置与GATT DB通常位于GAP外设上的标准BLE模型略有不同。但在我们的情况下,将主设备的设置存储在遥控器中是没有道理意义的。 iOS是否足够灵活以支持此配置?

2 个答案:

答案 0 :(得分:0)

只是为了澄清:您正在谈论BLE服务请求。不幸的是,CoreBluetooth只支持一个方向的服务请求,即iOS设备是GAP Central,另一个GAP Peripheral可以在iOS设备上发现GATT服务器。这基本上是Pebble用来访问媒体控制(Apple Media Service)和通知(Apple Notification Center Service)的附件。您将在CBCentralManager上找到特殊字典键CBCentralManagerScanOptionSolicitedServiceUUIDsKey以支持上述方案,但CBPeripheralManager上没有相应的支持您的方案。

希望有所帮助。

答案 1 :(得分:0)

尽管许多组合有效,但看起来CoreBluetooth扮演了GAP和GATT角色。因此,即使您的iOS应用将自己宣传为BLE外设,您也可以使用CBCentralManager连接回中央设备。您可以使用retrieveConnectedPeripherals(withServices:)retrievePeripherals(withIdentifiers:)来查找中央设备,而不必像在中央应用程序中那样进行扫描。

很遗憾,CBPeripheralManagerDelegate中没有class Repository(models.Model): source = models.TextField(db_column='source', blank=True, null=True) # Field name made lowercase. indicator = models.TextField(db_column='indicator', blank=True, null=True) # Field name made lowercase. key_aspect = models.TextField(db_column='key_aspect', blank=True, null=True) category = models.TextField(db_column = 'category') table_id = models.TextField(db_column='table_id', blank=True, null=True) data_returning = models.TextField(db_column='data_returning', blank=True, null=True) data_source = models.TextField(db_column='data_source', blank=True, null=True) value = models.TextField(db_column='value', blank=True, null=True) # Field name made lowercase. year = models.TextField(db_column='year', blank=True, null=True) # Field name made lowercase. location = models.TextField(db_column='location', blank=True, null=True) # Field name made lowercase. def __str__(self): return self.indicator 方法。如果要使用didConnect,则需要添加虚拟服务和特征,并在连接后让中央设备访问该特征。当您收到retrievePeripherals(withIdentifiers:)didReceiveRead事件时,可以重新连接到didSubscribeTo。使用request.central.identifier比较简单,但是在我的测试中并没有始终返回中央设备。

获取ConnectedPeripherals(withServices :)示例

retrieveConnectedPeripherals(withServices:)