首页 文章

获取蓝牙低功耗外设的MAC地址

提问于
浏览
37

我目前正在开发基于蓝牙低功耗设备的iOS应用程序 . 为了获得唯一的标识符来比较外设,我必须得到外设的MAC地址 .

据观察,外围设备的UUID属性在iOS设备上不同,并且外围设备也需要获得UUID,它必须至少连接一次主设备 . 由于我必须处理登记入住,我不想 Build 连接 . 当我浏览蓝牙服务门户时,我发现设备信息本身就是一项服务,除非在主iOS设备和外围蓝牙低功耗设备之间 Build 了连接,否则无法检索该服务 .

我发现在Android中我们获取设备的全部信息,包括其MAC地址(使用getAddress()),当我们从扫描设备获得响应时 .

我没有在CBPeripheral类中找到与设备地址相关的任何属性 . 获得唯一参数的另一种方式是定制广告数据以发送关于设备的附加信息,这需要在固件方面进行更多工作 .

那么在iOS中有什么办法可以在不 Build 连接的情况下获得蓝牙低能耗外设的MAC地址吗?

任何帮助将不胜感激 .

4 回答

  • 12

    没有公共API来获取此信息 .

    如果这是内部或越狱应用程序,您可以通过liblockdown.dylib获取kLockdownBluetoothAddressKey键的值

  • 10

    CBPeripheral的标识符属性将满足您的目的,可通过CBCentralManager的didDiscoverPeripheral委托方法中的仍未连接的设备获得:

    - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
    
    CBPeripheral *peripheral ...
    
    NSUUID* serverId = [peripheral identifier];
    

    我有六个LE设备,我可以区分并重新识别您的应用程序遇到的所有外围设备,而无需实际连接它们 . 另请注意, advertisementData (在连接之前也可用)充满了有用的信息,例如 CBAdvertisementDataLocalNameKeyCBAdvertisementDataManufacturerDataKeyCBAdvertisementDataServiceUUIDsKeyCBAdvertisementDataSolicitedServiceUUIDsKey 等,尽管没有人确定将设备唯一地标识为[外设标识符] .

    我没有尝试进行设备备份和恢复以证明UUID被保留,但是我打赌他们是,如果他们不是,那么Apple会认为这是一个bug .

  • 24

    低能耗外设可以使用隐藏MAC地址的隐私功能,因此在连接或绑定之前甚至不可能获得地址 . 如果你以某种方式获得无线电的MAC地址,你需要处理隐私或你有互操作性问题 .

    Apple使用UUID来抽象出这些隐私功能,因此用户无需担心这些问题 .

    像你写的那样正确的方法是将一些特定于供应商的数据添加到广告包或使用设备信息服务 .

  • 3

    我代表其他专业人士的讨论发现了一些事实 -

    “iOS隐藏设备的MAC地址并生成UUID . iOS上的UUID由iOS设备生成 . 不同的iOS设备将为同一外设获得不同的UUID . MAC地址通常基于硬件 . 如果我们都有iPhone并扫描相同的外围设备,我们可以让你获得设备的MAC地址,它会为你提供一个随机的UUID . “

    来源 - https://github.com/don/cordova-plugin-ble-central/issues/77

    根据上面的研究,我发现到目前为止还没有一种独特的方式可以连接到主板,每个主板都有一个MAC地址,这个地址不会改变,也很容易在(只有)Android中访问,而iOS则没有t允许访问外围设备的MAC地址,但iOS使用此MAC地址创建外围设备标识符(UUID),该标识符仅在(唯一)设备上是唯一的 . 对于不同的iPhone设备,单个板的外围设备标识符是不同的(但在单个设备上是唯一的) .

    然而,我们可以通过使用Peripheral的蓝牙服务UUID进行搜索来连接到电路板,但是这种服务UUID对于所有类型的电路板都是相同的 - “Adafruit Feather M0” . 这意味着应用程序将环顾相同类型的BLE板(“Adafruit Feather M0”),并将连接到其中任何一个 . 到目前为止,由于MAC不可访问并在iOS中提供随机UUID,为了将特定用户连接到特定的电路板似乎不可能 .

相关问题