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

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

据观察,外围设备的UUID属性在iOS设备之间有所不同,并且为了获得UUID,外围设备也必须至less连接到主设备一次。 由于我不得不处理登机手续,我不想build立连接。 当我通过蓝牙服务门户网站时,发现设备信息本身就是一项服务,除非主iOS设备和外设蓝牙低功耗设备之间已build立连接,否则无法检索到该服务。

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

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

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

任何帮助将不胜感激。

没有公共API来获取这些信息。

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

CBPeripheral的标识符属性将用于您的目的,可从CBCentralManager的didDiscoverPeripheral委托方法中仍未连接的设备中获取:

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

我正在尝试使用六个LE设备,其中包括多套相同的设备。 我只是确认,在两个iOS设备上,所有这些LE小部件的标识符都不相同,但是对于每个iOS设备,每个小部件的标识符都保留在应用程序启动之间,甚至跨应用程序删除和重新安装。 我可以说,这明确certificate了操作系统在内部存储了足够的信息,对于给定的iThing,您将能够区分和重新识别您的应用遇到的所有外设,而无需实际连接到它们。 还要注意的是,在连接之前也可用的advertisementData充满了像CBAdvertisementDataLocalNameKeyCBAdvertisementDataManufacturerDataKeyCBAdvertisementDataServiceUUIDsKeyCBAdvertisementDataSolicitedServiceUUIDsKey等有用的信息,尽pipe没有一个确定的可以唯一地标识设备是[peripheral identifier]。

我没有尝试做一个设备备份和恢复,以certificateUUID被保留,但我敢打赌,如果他们不是,这是苹果会考虑一个错误的东西。

低能量的外围设备可能使用隐藏MAC地址的隐私function,所以在连接或绑定之前不一定能得到地址。 如果您以某种方式获取MAC地址,您需要处理隐私或您有互操作性问题。

苹果使用UUID将这些隐私function抽象出来,因此用户不需要担心这些function。

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

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

iOS隐藏设备的MAC地址并生成一个UUID。 iOS上的UUID由iOS设备生成。 不同的iOS设备将得到不同的UUID的相同的外设。 MAC地址通常基于硬件。 如果我们都有iPhone并且扫描相同的外设,我们会看到不同的UUID。 iOS在设备上生成UUID并隐藏MAC地址。 总结 – iOS不会让你获得设备的MAC地址,它会给你一个随机的UUID。

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

根据上述研究,我发现到目前为止,没有一种独特的方式可以连接到电路板,每个电路板都有一个MAC地址,它不会在(仅)Android中更改和访问,而iOS不会“允许访问外设的MAC地址,但是iOS使用这个MAC地址来创build一个外设标识符(UUID),它只在(唯一)设备上是唯一的。 对于不同的iPhone设备,单个板卡的外设标识符是不同的(但在单个设备上是唯一的)。

但是我们可以通过searchPeripheral的蓝牙服务UUID来连接到电路板,但是这种服务UUID对于所有types的电路板都是一样的 – “Adafruit Feather M0”。 这意味着应用程序将环顾相同types的BLE板(“Adafruit羽毛M0”),并将连接到任何一个。 为了连接到一个特定的用户到一个特定的董事会似乎不可能到目前为止,由于无法访问的MAC和iOS中的随机UUID。