2010-06-03 6 views

Répondre

4

Il n'y a pas d'API publique pour obtenir cette information.

Si cela est une application interne ou jailbreak, vous pouvez obtenir la valeur de la clé kLockdownBluetoothAddressKey via liblockdown.dylib

+0

Merci. J'espérais que je pourrais l'obtenir plus ou moins de la même façon que nous pouvons récupérer l'adresse MAC WiFi ... – drkbrd

+0

Je pense que cela pourrait être réalisable si l'iPhone est en mode tethering via Bluetooth. – rpetrich

+3

Veuillez poster un extrait de code pour l'utilisation de la clé kLockdownBluetoothAddressKey via liblockdown.dylib –

6

Sur tous les appareils que je pourrais obtenir mes mains sur, la règle suivante semble appliquer - adresse MAC iPhone wifi est un plus grand que l'adresse MAC bluetooth de l'iPhone - L'adresse MAC de l'iPad wifi est inférieure à l'adresse MAC de l'iPad bluetooth.

Il serait utile que les gens vérifient cela sur leur iPhone ou iPad, de sorte que nous puissions augmenter la confiance dans la théorie. J'ai vérifié sur quelques appareils iPhone4, iPhone3 et iPad1.

Vous pouvez le vérifier par des paramètres d'ouverture - General - A propos de et regarder « Wi-Fi Adresse » et « Bluetooth »

Si la théorie est correcte, le code juridique suivant récupérerez votre bluetooth mac adresse:

#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); 
    } 

} 
+0

Théorie également corriger sur mon iPad 3 –

+0

Théorie correcte sur mon iPhone 4, mais pas sur l'iPod 4 - là les 5 derniers chiffres hexagonaux sont différents. – newenglander

+3

Dans iOS 7 et versions ultérieures, si vous demandez l'adresse MAC d'un appareil iOS, le système renvoie la valeur 02: 00: 00: 00: 00: 00 https://developer.apple.com/news/?id= 8222013a –

0

adresse MAC pour mon iPhone4 iOS 5.0.1 était dans l'ordre suivant la comparaison de leurs derniers chiffres:

63 = Bluetooth 
64 = WiFi 

iPad2 v5.0.1 was: 

0D = Bluetooth 
0E = WiFi 

L'iPod-Touch 2ème génération iOS 4.2.1 était totalement différent.

??.FC = WiFi 
xx.04 = Bluetooth