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

Feb*_*Sam 45 bluetooth ios bluetooth-lowenergy

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

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

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

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

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

任何帮助将不胜感激.

Tar*_*ryn 29

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

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

CBPeripheral *peripheral ...

NSUUID* serverId = [peripheral identifier];
Run Code Online (Sandbox Code Playgroud)

我有六个正在试验的LE设备,包括多套相同的设备.我刚刚确认,在两个iOS设备上,所有这些LE小部件的标识符都不同,但对于每个iOS设备,每个小部件的标识符在应用程序启动时保留,甚至跨应用程序删除和重新安装.我想说这最终证明操作系统在内部存储了足够的信息,对于给定的iThing,您将能够区分并重新识别您的应用程序遇到的所有外围设备,而无需实际连接到它们.还要注意的是advertisementData,也可在连接之前,充满等是有用的信息 CBAdvertisementDataLocalNameKey,CBAdvertisementDataManufacturerDataKey,CBAdvertisementDataServiceUUIDsKey,CBAdvertisementDataSolicitedServiceUUIDsKey,和其他人,尽管没有如某些唯一地标识该设备作为[外设标识符]是.

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

  • 您谈到的UUID由Apple内部生成,然后存储.所以是的,它对于设备来说是独一无二的,并且它一直用于该设备.但对于相同的设备,它在一个iPhone/iPad和另一个iPhone之间有所不同,这就是OP所追求的. (7认同)
  • 另请注意,否则唯一生成的UUID CAN会发生变化(极少数情况但肯定会发生变化),因此如果必须永久识别给定的外设,则需要自己的方法 (3认同)
  • @AirsourceLtd在BT连接中有一个中央和外围设备,你已经知道了,如果你的广告外围设备端是一个iOS应用程序,而不是简单地关闭再打开设备BT连接,你会看到新发现的设备中心端将有一个不同的新外设UUID (2认同)

Jog*_*Com 14

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

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

  • 它并不意味着是一个越狱的应用程序.因此,除非配对,否则似乎无法在iOS中获取外围设备的MAC地址.这是一个很大的缺点.如果我们获得唯一标识符会更容易.可能是苹果必须要调查它. (2认同)

小智 12

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

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

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


Moh*_* G. 8

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

" 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则没有t允许访问外围设备的MAC地址,但iOS使用此MAC地址创建外围设备标识符(UUID),该标识符仅在(唯一)设备上是唯一的.对于不同的iPhone设备,单个板的外围设备标识符是不同的(但在单个设备上是唯一的).

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