在 iOS 蓝牙外设上查找 TxPower

Find TxPower on iOS Bluetooth Peripheral

我正在构建一个 iOS 应用程序(在 Swift 中),它既可以充当 Core Bluetooth 外围设备又可以充当中央设备。我需要确定外围设备的 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 的解决方案都非常棒。非常感谢!

根据我的经验,使用 CoreBluetooth API,根本无法从其他 iOS 外围设备获取 TX 功率级别或任何制造商数据,因为它已从扫描中剥离您在 didDiscoverPeripheral 回调中收到的结果。但是,您可以获得外围设备的 RSSI 值,也许您可​​以根据您想要实现的目标来使用它。

虽然我不确定您希望如何根据制造商数据确定 TX 功率级别。 BLE规范为其定义了一个单独的特性。

希望对您有所帮助!

- (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]);

在 advertisementData description log 中,您将获得具有如下描述的值的键:

{
    kCBAdvDataIsConnectable = 1;
    kCBAdvDataLocalName = givenName;
    kCBAdvDataManufacturerData = <given data>;
    kCBAdvDataServiceUUIDs = (0536);
    kCBAdvDataTxPowerLevel = some value ;
}

希望您找到了想要的东西。

txpower 是您将在 CBAdvertisementDataTxPowerLevelKey 下的设备上发布的广告。寻找这个

CB_EXTERN NSString * const CBAdvertisementDataTxPowerLevelKey;