在 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;
我正在构建一个 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;