繁体   English   中英

在iOS蓝牙外围设备上查找TxPower

[英]Find TxPower on iOS Bluetooth Peripheral

我正在构建一个iOS应用程序(在Swift中),该应用程序既可以用作Core Bluetooth外围设备,也可以用作中央设备。 我需要确定外围设备的txPower,但不一定需要将其发送到另一台设备的中央设备(尽管那会很棒)。 我很乐意确定发送设备本身上的外围设备的txPower。

我知道我可以从制造商特定数据中确定txPower,但是我无法弄清楚如何读取设备的制造商特定数据,而我中心正在获取的adsData仅包括外围设备的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委托中得到的advertData 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]);

在advertiseData描述日志中,您将获得具有其值的键,如下所示:

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

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

txpower是您将从CBAdvertisementDataTxPowerLevelKey下的设备进行CBAdvertisementDataTxPowerLevelKey 寻找这个

CB_EXTERN NSString * const CBAdvertisementDataTxPowerLevelKey;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM