如何以编程方式获取iPhone的蓝牙MAC地址?

6

我正在尝试对iPhone进行一些接近检测,但是我需要通过编程方式获取它们的蓝牙 MAC地址。有人知道如何做吗?

我假设蓝牙已经启用,但没有任何设备与iPhone配对。

3个回答

6
在我手头上的所有设备上,似乎都适用以下规则: - iPhone wifi MAC地址比iPhone蓝牙MAC地址大1 - iPad wifi MAC地址比iPad蓝牙MAC地址小1。
如果人们在他们的iPhone或iPad上检查这一点,将有助于增加对该理论的信心。我已经在几个iPhone4、iPhone3和iPad1设备上进行了检查。
您可以通过打开 设置 - 通用 - 关于 来检查它,并查看“Wi-Fi地址”和“蓝牙”。 如果该理论是正确的,下面的合法代码将检索您的蓝牙MAC地址:
#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);
    }

}

在我的 iPhone 4 上理论是正确的,但在 iPod 4 上不正确——最后5个十六进制数字不同。 - newenglander
3
在iOS 7及以后的版本中,如果你请求获取iOS设备的MAC地址,系统会返回值02:00:00:00:00:00。https://developer.apple.com/news/?id=8222013a - Sjoerd Perfors

4

目前还没有公共的API可以获取此信息。

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


谢谢。我希望能以获取WiFi MAC地址的方式更多或更少地得到它... - drkbrd
如果iPhone处于蓝牙共享模式下,我认为这可能是可行的。 - rpetrich
3
请提供使用liblockdown.dylib通过kLockdownBluetoothAddressKey密钥的代码片段。 - Ali El-sayed Ali

0

我的iPhone4 iOS 5.0.1的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接