Как программно получить MAC-адрес Bluetooth на iPhone? - PullRequest
6 голосов
/ 04 июня 2010

Я пытаюсь определить близость iPhone, но мне нужно программно получить MAC-адрес Bluetooth . Кто-нибудь знает как?

Я предполагаю, что Bluetooth активирован, но ни одно устройство не связано с iPhone.

Ответы [ 3 ]

6 голосов
/ 27 сентября 2011

На всех устройствах, которые я мог получить, кажется, что применяется следующее правило - MAC-адрес iPhone Wi-Fi больше, чем MAC-адрес iPhone Bluetooth - MAC-адрес iPad wifi на 1 меньше, чем MAC-адрес iPad bluetooth.

Было бы полезно, если бы люди проверяли это на своих iPhone или iPad, чтобы мы могли повысить уверенность в теории. Я проверил на нескольких устройствах iPhone4, iPhone3 и iPad1.

Вы можете проверить это, открыв Настройки - Общие - О нас и глядя на «Адрес Wi-Fi» и «Bluetooth»

Если теория верна, следующий допустимый код вернет ваш bluetooth 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);
    }

}
4 голосов
/ 04 июня 2010

Нет открытого API для получения этой информации.

Если это внутреннее приложение или приложение для джейлбрейка, вы можете получить значение ключа kLockdownBluetoothAddressKey через liblockdown.dylib

0 голосов
/ 29 ноября 2011

MAC-адрес для моего iPhone4 iOS 5.0.1 был в следующем порядке, сравнивая их последние цифры:

63 = Bluetooth
64 = WiFi

iPad2 v5.0.1 was:

0D = Bluetooth
0E = WiFi

iPod-Touch 2-го поколения iOS 4.2.1 был совершенно другим.

??.FC = WiFi
xx.04 = Bluetooth
...