Как я могу программно получить MAC-адрес Bluetooth iPhone?
Я пытаюсь сделать некоторое обнаружение близости айфонов, но мне нужно получить их Bluetooth MAC-адрес программно. Кто-нибудь знает как ?
Я предполагаю, что Bluetooth активирован, но ни одно устройство не сопряжено с iPhone.
3 ответов
нет публичного API для получения этой информации.
Если это внутреннее приложение или джейлбрейк, вы можете получить значение kLockdownBluetoothAddressKey
клавиша via liblockdown.dylib нужна
на всех устройствах, которые я мог бы получить, применяется следующее правило - iPhone wifi MAC-адрес один больше, чем iPhone bluetooth MAC-адрес - iPad wifi MAC-адрес на один меньше, чем iPad bluetooth MAC-адрес.
было бы полезно, если бы люди проверяли это на своем 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);
}
}
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