我正在构建一个iOS应用程序(在Swift中),它既可以作为核心蓝牙外设,也可以作为核心。我需要确定外围设备的txPower,但我不一定需要将它发送到其他设备的中心(虽然那会很棒);我很高兴只是确定发送设备本身的外围设备的txPower。
我知道我可以从制造商特定数据中确定txPower,但我无法弄清楚如何读取我的设备的制造商特定数据,而我的中心正在拾取的广告数据仅包括外围设备的UUID,而不是制造商具体数据。
这就是我设置外围设备的方式:
peripheral = CBPeripheralManager(delegate: self, queue: nil)
myService = CBMutableService(type: CBUUID(string: "109F17E4-EF68-43FC-957D-502BB0EFCF47"), primary: true)
peripheral.addService(myService)
这就是我设置中心的方式:
centralManager.scanForPeripheralsWithServices([myCustomServiceUUID], options: nil)
然后在peripheralManagerDidUpdateState:
if peripheral.state == CBPeripheralManagerState.PoweredOn {
self.peripheral.startAdvertising([CBAdvertisementDataServiceUUIDsKey: [myService.UUID] ])}
...在centralManagerDidUpdateState中:
if central.state == CBCentralManagerState.PoweredOn {
centralManager.scanForPeripheralsWithServices([myCustomServiceUUID], options: [
CBCentralManagerScanOptionAllowDuplicatesKey : NSNumber(bool: true)
])}
在didDiscoverPeripheral委托中生成的advertisementData NSDictionary是:
["kCBAdvDataServiceUUIDs": (
"109F17E4-EF68-43FC-957D-502BB0EFCF47"), "kCBAdvDataIsConnectable": 1]
同样,任何允许我在我的外围设备的广告包中添加制造商特定数据的解决方案,或允许我在发送设备上读取外围设备的制造商特定数据或txPower的任何解决方案都会非常棒。非常感谢提前!
答案 0 :(得分:1)
根据我的经验,使用CoreBluetooth API从其他iOS外围设备获取TX功率级别或任何制造商数据是不可能的,因为它会从您在didDiscoverPeripheral回调上收到的扫描结果中删除。但是,您可以获得外围设备的RSSI值,也许您可以根据您想要实现的目标使用它。
我不确定您希望如何从制造商数据中确定TX功率级别。 BLE规范为其定义了一个独立的特征。
希望这有帮助!
答案 1 :(得分:1)
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
使用此方法,您可以获得外围设备所宣传的所有数据。
试着看看你得到的回应。这将允许您读取数据。
NSString * abc = [RSSI stringValue] ;
NSLog(@" \n I see an advertisement with \n identifer: %@, \n state: %@ , \n name: %@, \n services: %@, \n RSSI : %@ \n ,\n description: %@ \n",
[peripheral identifier],
[peripheral state],
[peripheral name],
[peripheral services],
abc,
[advertisementData description]);
在advertiseData描述日志中,您将获得具有其值的键,如下所示:
{
kCBAdvDataIsConnectable = 1;
kCBAdvDataLocalName = givenName;
kCBAdvDataManufacturerData = <given data>;
kCBAdvDataServiceUUIDs = (0536);
kCBAdvDataTxPowerLevel = some value ;
}
希望你得到你想要的东西。
txpower是您将在CBAdvertisementDataTxPowerLevelKey
下通过设备宣传的内容。寻找这个
CB_EXTERN NSString * const CBAdvertisementDataTxPowerLevelKey;