简体   繁体   English

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

[英]How can I programmatically get the Bluetooth MAC address of an iPhone?

I'm trying to do some proximity detection of iPhones but I need to get their Bluetooth MAC address programmatically. 我正在尝试对iPhone进行一些接近检测,但我需要以编程方式获取蓝牙 MAC地址。 Does anyone knows how ? 有谁知道怎么样?

I assume Bluetooth is activated but no device is paired with the iPhone. 我假设蓝牙已激活,但没有设备与iPhone配对。

On all devices I could get my hands on, the following rule seems to apply - iPhone wifi MAC address is one larger than iPhone bluetooth MAC address - iPad wifi MAC address is one less than iPad bluetooth MAC address. 在我可以得到的所有设备上,以下规则似乎适用 - iPhone wifi MAC地址比iPhone蓝牙MAC地址大一个 - iPad wifi MAC地址比iPad蓝牙MAC地址少一个。

It would be helpful if people check this on their iPhone or iPad, such that we can increase the confidence in the theory. 如果人们在他们的iPhone或iPad上检查这一点会很有帮助,这样我们就可以增加对理论的信心。 I've checked on a few iPhone4, iPhone3 and iPad1 devices. 我查了一些iPhone4,iPhone3和iPad1设备。

You can check it by opening Settings - General - About and looking at "Wi-Fi Address" and "Bluetooth" 您可以通过打开设置 - 常规 - 关于并查看“Wi-Fi地址”和“蓝牙”来查看它

If the theory is correct, the following legal code will retrieve your bluetooth mac address: 如果理论是正确的,以下合法代码将检索您的蓝牙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);
    }

}

There is no public API to get this information. 没有公共API来获取此信息。

If this is an internal or jailbreak application you can get the value of the kLockdownBluetoothAddressKey key via liblockdown.dylib 如果这是一个内部或越狱应用程序,您可以通过liblockdown.dylib获取kLockdownBluetoothAddressKey键的值

MAC Address for my iPhone4 iOS 5.0.1 was in the following order comparing their last digits: 我的iPhone4 iOS 5.0.1的MAC地址按照以下顺序比较它们的最后数字:

63 = Bluetooth
64 = WiFi

iPad2 v5.0.1 was:

0D = Bluetooth
0E = WiFi

The iPod-Touch 2nd Generation iOS 4.2.1 was totally different set. iPod-Touch第二代iOS 4.2.1完全不同。

??.FC = WiFi
xx.04 = Bluetooth

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM