如何以编程方式获取iPhone的蓝牙MAC地址?
我试图做一些iPhone的接近检测,但我需要以编程方式获取其蓝牙 MAC地址。有谁知道如何?如何以编程方式获取iPhone的蓝牙MAC地址?
我假设蓝牙已启动,但没有设备与iPhone配对。
得到kLockdownBluetoothAddressKey
键的值在所有设备上我能得到我的手,下面的规则似乎也适用 - iPhone的WiFi MAC地址是一个比iPhone大的蓝牙MAC地址 - iPad wifi MAC地址是比iPad蓝牙MAC地址少一个。
如果人们在iPhone或iPad上检查这些信息会有帮助,这样我们就可以增加对理论的信心。我检查了一些iPhone4,iPhone3和iPad1设备。
您可以通过打开设置检查 - 通用 - 关于 ,看着“Wi-Fi地址”和“蓝牙”
如果理论是正确的,下面法律代码将检索您的蓝牙MAC地址:我的iPhone4的iOS 5.0.1
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>
#include <netdb.h>
#include <net/if_dl.h>
#include <string.h>
#if ! defined(IFT_ETHER)
#define IFT_ETHER 0x6/* Ethernet CSMACD */
#endif
void doMacTest() {
BOOL success;
struct ifaddrs * addrs;
const struct ifaddrs * cursor;
const struct sockaddr_dl * dlAddr;
const uint8_t * base;
// We look for interface "en0" on iPhone
success = getifaddrs(&addrs) == 0;
if (success) {
cursor = addrs;
while (cursor != NULL) {
if ((cursor->ifa_addr->sa_family == AF_LINK)
&& (((const struct sockaddr_dl *) cursor->ifa_addr)->sdl_type == IFT_ETHER)
&& (strcmp(cursor->ifa_name, "en0") == 0)) {
dlAddr = (const struct sockaddr_dl *) cursor->ifa_addr;
base = (const uint8_t *) &dlAddr->sdl_data[dlAddr->sdl_nlen];
if (dlAddr->sdl_alen == 6) {
fprintf(stderr, ">>> WIFI MAC ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n", base[0], base[1], base[2], base[3], base[4], base[5]);
fprintf(stderr, ">>> IPHONE BLUETOOTH MAC ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n", base[0], base[1], base[2], base[3], base[4], base[5]-1);
fprintf(stderr, ">>> IPAD BLUETOOTH MAC ADDRESS: %02x:%02x:%02x:%02x:%02x:%02x\n", base[0], base[1], base[2], base[3], base[4], base[5]+1);
} else {
fprintf(stderr, "ERROR - len is not 6");
}
}
cursor = cursor->ifa_next;
}
freeifaddrs(addrs);
}
}
理论也适用于我的iPad 3 – 2012-11-06 14:17:18
理论在我的iPhone 4上正确,但不在iPod 4上 - 最后5个十六进制数字不同。 – newenglander 2013-03-21 15:34:21
在iOS 7及更高版本中,如果您要求输入iOS设备的MAC地址,系统将返回值02:00:00:00:00:00 https://developer.apple.com/news/?id= 8222013a – 2013-09-27 14:44:24
MAC地址是按以下顺序比较它们的最后一位数字:
63 = Bluetooth
64 = WiFi
iPad2 v5.0.1 was:
0D = Bluetooth
0E = WiFi
iPod Touch第二代iOS 4.2.1完全不同。
??.FC = WiFi
xx.04 = Bluetooth
谢谢。我希望可以像我们检索WiFi MAC地址一样获得它... – drkbrd 2010-06-04 07:22:34
我认为,如果iPhone通过蓝牙进行共享模式,则可行。 – rpetrich 2010-06-04 18:51:19
请通过liblockdown.dylib发布使用kLockdownBluetoothAddressKey密钥的代码片段 – 2012-02-16 15:16:53