nordic蓝牙地址获取

1.nordic蓝牙地址获取 代码

官方工程默认都是使用静态随机地址,地址的最高两位必须要是 1 1,原因下面会有解释

void ble_get_mac(void)
{
//	    uint8_t i;
//	  ble_gap_addr_t ble_mac;
//#if (NRF_SD_BLE_API_VERSION >= 3)
//    sd_ble_gap_addr_get(&ble_mac);
//#else
//    sd_ble_gap_address_get(&ble_mac);
//#endif

//    for(i=0; i<6; i++)
//    {
//        mac[i]=ble_mac.addr[5-i];
//    }

	
	 mac[0]=*((uint8_t*)(0x10000000+0xa9))|0x40|0x80;
	 mac[1]=*((uint8_t*)(0x10000000+0x0a8));
	 mac[2]=*((uint8_t*)(0x10000000+0x0a7));
	 mac[3]=*((uint8_t*)(0x10000000+0x0a6));
	 mac[4]=*((uint8_t*)(0x10000000+0x0a5));
	 mac[5]=*((uint8_t*)(0x10000000+0x0a4));
	

	
}

2.蓝牙地址规则

2.1BLE地址主要分为类

两类:

公共地址和随机地址。

而随机地址细分又有 静态随机地址和隐私地址(Private address)

而隐私地址又分为:可解析隐私地址,不可解析隐私地址。

在这里插入图片描述

2.2 如何区分各种地址类型

有那么多类型的地址,那么如何区分各种地址类型的呢。

广播通道PDU数据前面有2字节的头 格式如下

在这里插入图片描述
其中的TxAdd表示发送方的地址类型 (0为public,1为random)

RxAdd表示接收方的地址类型。

PS:这两个域并不是一直都有效的。比如对于普通广播来说,只有TxAdd的指示是有效的,表示广播发送者的第一类型。 而对于定向广播来说。TxAdd和RxAdd都是有效的,TxAdd表示广播发送者的地址类型,RxAdd表示广播接受者的地址类型。

所以 对于是 public类型地址还是Random类型地址,直接通过 广播通道PDU中的的 数据头 中的 TxAdd或者RxAdd来判断就可以了。

2.3 静态随机地址,还是可解析的隐私地址

但是这里有个问题,只是区分出了 Random地址后,又怎么知道是静态随机地址,还是可解析的隐私地址,或者不可解析的隐私地址呢。

这就要了解 各种地址类型的格式。

Public地址的格式比较简单,高24位是公司标示,低24位公司内部自己赋值。

在这里插入图片描述

静态随机地址的格式如下图所示,需要满足

1:最高2位为1

2:随机部分不能全0或者全1

另外对于静态随机地址,地址的设置是在设备上电初始化时进行的,一旦设置后本次运行过程中 自己的静态随机地址都不能再改变,除非重新上电。

在这里插入图片描述

不可解析的隐私地址格式如下图所示:需要满足

1:最高2位为0

2:随机部分不能为全1或全0
在这里插入图片描述

可解析的隐私地址格式如下图所示:需要满足

1:最高位0次高位为1

2:随机部分不能为全0或全1

在这里插入图片描述

可解析的随机地址的生成需要使用到 IRK, 地址由两部分组成,

hansh和prand(包含最高固定2位和22位随机部分)。

其中 hash = ah(IRK, prand) ah就是产生随机地址的函数。

既然是可解析地址,那么如何解析呢? 解析的过程也是一样的。接收方可能存在多个IRK,接收方收到一个地址类型是 随机地址,并且最高2位是01那么,接收方就会 用他有的IRK对接收到的地址的高24位做ah(IRK, prand)运算,得到localHash,然后将localHash和接收到地址的低24位的hash对比,如果相同则认为这个地址 和 该IRK是相关连的。

如果不同则继续 用下一个IRK做上面的过程,知道找到一个关联的IRK或者一个没找到。

2.4 总结一下

当一方收到一个地址后,对于地址的解析过程如下:

1:首先根据 收到的广播信道PDU中的数据头中的指示来判断是public类型地址还是Random类型地址。

2:如果是public那么地址类型就是确定的了,

3:如果是Random,则查看地址的最高两位,

如果是11就是静态随机地址,地址类型确定

如果是00表示为不可解析隐私地址,类型确定

如果是01表示为可解析的私有地址,并执行上面说过的ah方法,找到与该可 解析地址相关的IRK(可能找不到)。

最后 介绍一下 51822中怎么设置各种类型的地址。

uint32_t sd_ble_gap_address_set (uint8_t addr_cycle_mode, const ble_gap_addr_t * p_addr )

addr_cycle_mode 参数为:BLE_GAP_ADDR_CYCLE_MODE_AUTO:

该模式下,会忽略第二个地址参数p_addr 中给的地址addr。协议栈内部会自动周期性根据 p_addr中addr_type指定的地址类型来 生成可解析的或者不可解析的地址。

addr_cycle_mode 参数为:BLE_GAP_ADDR_CYCLE_MODE_NONE:

该模式下,可以使用public地址和自己设置的 static random地址。

如果第二个参数P_addr中的addr_type为staic random类型,则addr中存放的地址的最高2位必须为1,不然这个地址会被认为无效并自动替换,51822会自动替换为蓝牙mac地址。(跟没有调用sd_ble_gap_address_set函数的效果是一样的,看教程最上面的说明)

static random address 只有在每次 重新上电后才可改变。

可解析和不可解析的地址可在正常运行过程中周期性改变

其他使用该函数需要注意的地方看 sdk中该函数的说明就行了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章