为什么手机APP读取的蓝牙地址和FICR->DEVICEADDR寄存器读出的地址不同?
弄清楚这个问题之前我们需要先了解一下蓝牙地址的类型,在蓝牙规格书上对于地址类型有较详细的说明(参看:Core v5.0-> Vol 6-> Part B ->1.3) 简单归类如下:
手机App 用nRF Connect 显示的地址是static Device Address 类型,如下图所示地址最高字节为FF
进一步验证地址是否正确,我们通过API函数sd_ble_gap_addr_get读取MAC address并打印出来, 代码如下:
对应的log信息中打印出的地址如下:
我们发现地址和APP上显示地址相同,最高字节都是FF 。
接下来我们用nrfjprog --memrd命令读出FICR中的DEVICEADDR,显示如下,如绿框所标示按6 Bytes MAC来看,最高地址是BF
在代码里直接读FICR->DEVICEADDR寄存器将MAC地址读出来看看,代码截图如下:
从对应log 信息中打印的地址发现按6 Bytes MAC看,最高字节也是BF, 而sd_ble_gap_addr_get读出的址址和手机APP上显示地址最高字节都是FF,
就这个地方存差别。
对照上面列出的地址类型进一步分析可以确定是蓝牙地址最高字节的两个bit位不同,蓝牙协议规格中对于这种地址类型是有要求的,如下图所示:
有一种情形要注意, 当用户需要通过MAC确定设备唯一性时,是用手机APP上显示的地址为准还是通过FICR-DEVICEADDR读出地址为准呢?需要注意两种地址的区别,可以做一个简单转换,例如: deviceaddr[1] |= 0xC000;
转换之后再打印log如下,两个地址显示相同了。
当然如果你购买了MAC地址,可以通过sd_ble_gap_addr_set 函数设置你的MAC,这样手机上自然是显示你所设置的MAC。