蓝牙开发-获取Mac地址
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝牙开发-获取Mac地址相关的知识,希望对你有一定的参考价值。
参考技术A 苹果在原生的CoreBluetooth中,将设备的Mac进行了封装(通过外设的Mac地址和手机的Mac地址进行了加密计算),最后对外提供了一个UUID,在一台手机上,一般情况,UUID就可以作为这个外设的唯一标识了,但是如果换了一台手机的话,可能就会发生变化,所以如果需求是需要在多台手机上的话,UUID可能就不太实用了。蓝牙的Mac地址可以加到蓝牙的广播包里,但是这样的话对硬件来说负担很大而且芯片也不稳定,也可以将蓝牙的Mac地址写在蓝牙设备系统的sevrice 里 。我们的需求是在通过Mac地址连接蓝牙设备,所以必须在连接蓝牙之前获取蓝牙的Mac地址。
通过广播包获取Mac地址
在这个代理方法我们可以拿到一个advertisementData,这个字典类型的就是广播包,这里面会有一些设备的属性,比如设备的名字啊,服务等。但是只有kCBAdvDataManufacturerData这个key是可以放入信息的,硬件工程师可以将Mac地址写到这个字段里去。
如何以编程方式获取 iPhone 的蓝牙 MAC 地址?
【中文标题】如何以编程方式获取 iPhone 的蓝牙 MAC 地址?【英文标题】:How can I programmatically get the Bluetooth MAC address of an iPhone? 【发布时间】:2010-06-03 20:20:59 【问题描述】:我正在尝试对 iPhone 进行一些接近检测,但我需要以编程方式获取它们的 蓝牙 MAC 地址。有谁知道怎么做?
我假设蓝牙已激活,但没有设备与 iPhone 配对。
【问题讨论】:
【参考方案1】:在我可以使用的所有设备上,以下规则似乎都适用 - iPhone wifi MAC地址比iPhone蓝牙MAC地址大一 - iPad wifi MAC 地址比 iPad 蓝牙 MAC 地址少一个。
如果人们在他们的 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 个十六进制数字不同。 在 iOS 7 及更高版本中,如果您询问 iOS 设备的 MAC 地址,系统返回值 02:00:00:00:00:00 developer.apple.com/news/?id=8222013a【参考方案2】:没有公共 API 可以获取此信息。
如果这是一个内部或越狱应用程序,您可以通过liblockdown.dylib 获取kLockdownBluetoothAddressKey
键的值
【讨论】:
谢谢。我希望我能或多或少地用我们检索 WiFi MAC 地址的方式来获得它...... 我认为如果 iPhone 通过蓝牙处于网络共享模式,这可能是可行的。 请发布代码 sn-p 以通过 liblockdown.dylib 使用 kLockdownBluetoothAddressKey 密钥【参考方案3】:我的 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
【讨论】:
以上是关于蓝牙开发-获取Mac地址的主要内容,如果未能解决你的问题,请参考以下文章