51822的 BLE的设备地址 可以通过如下函数函数来获得

地址的设置可以调用如下函数设置。

官方的demo工程中,都是没有主动调用过 sd_ble_gap_address_set函数来设置设备地址的。所以 demo工程中使用的都是默认地址。

这个默认地址就是 芯片出厂是设置的,出厂时烧写在FICR寄存器中的。

所以蓝牙芯片启动后,如果你没有主动调用 sd_ble_gap_address_set函数来设置地址的话, 协议栈就会使用 FICR 中的寄存器DEVICEADDR 中的值来设置 BLE地址。但是并不是直接用,官方工程默认都是使用静态随机地址,所以地址的最高两位必须要是 1 1,所以协议栈会使用该寄存器中的地址,但是会将最高两bit的值都设置为1.

例如: 读取出来的

DEVICEADDR[0] = 0xD104B111

DEVICEADDR[1] = 0x691C89CF

根据手册说明

所以设备地址为 89 CF D1 04 B1 11

有官方demo默认使用静态随机地址,所以地址的最高 两bit需要为1.

所以协议栈将89 改为了C9

也就是最终的 BLE地址为C9 CF D1 04 B1 11

将设备随便烧录一个跑协议栈的程序,对比发现 其地址的设置就是和上面是一样的。

有兴趣的可以写个裸机程序 自己读一下这个寄存器里的值,在和BLE的广播地址比较下看是不是区别仅仅是最高两bit改为了1

明白了协议栈如何使用默认BLE地址后,再来看如果需要自己设置一些特定的蓝牙地址应该怎么使用sd_ble_gap_address_set  函数来设置自己的BLE地址。

首先需要介绍些 BLE各种设备地址的区别。

BLE地址主要分为两类:

公共地址和随机地址。

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

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

如图所示:

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

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

其中的TxAdd表示发送方的地址类型 (0为public,1为random)

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

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

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

但是这里有个问题,只是区分出了 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或者一个没找到。

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

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中该函数的说明就行了

BLE-NRF51822教程15-BLE地址相关推荐

  1. 认知BLE中多个MAC地址类型:Public Device Address、Random Device Address、Non-resolvable Private Address

    1. 前言 BLE设备有多种类型的设备地址,如Public Device Address.Random Device Address.Static Device Address.Private Dev ...

  2. 蓝牙BLE实用教程(转载)

    欢迎使用 小书匠(xiaoshujiang)编辑器,您可以通过 设置 里的修改模板来改变新建文章的内容. 1.蓝牙BLE常见问答 Q: Smart Ready 和 Smart 以及传统蓝牙之间是什么关 ...

  3. [嵌入式框架][nrf51822][SDK12.3] BLE分层设计 NUS 透传数据队列发送,提升带宽利用率

    接上一篇 [嵌入式框架][nrf51822][SDK12.3] BLE分层设计 集合(OTA.透传.电量.设备信息.HID) [单片机框架] [queue] 实现一个简易的消息队列 文章目录 一. 透 ...

  4. 泰凌微8258入门教程 BLE篇②——BLE Single Connection 蓝牙BLE 软件架构

    文章目录 一.前言 二.标准BLE软件架构 三.标准BLE数据流 四.Telink BLE 软件架构 一.前言 教程目录大纲请查阅:泰凌微8258入门教程--导读 开发环境搭建请查阅:泰凌微8258入 ...

  5. 安卓连接ble蓝牙设备教程(目录)

    安卓连接ble蓝牙设备教程(目录) 零.新建android工程(安卓蓝牙ble教程) 一.权限和build.gradle配置并开启蓝牙(安卓蓝牙ble教程) 二.搜索蓝牙并连接(安卓蓝牙ble教程) ...

  6. BLE简介和Android BLE编程

    http://www.aiuxian.com/article/p-1752155.html 一.BLE和BT区别 其实我知道许多程序员不太喜欢阅读除了代码以外的文档,因为有时这些过于冗长的文档对编程并 ...

  7. Android ble连接过程,Android BLE的一些基础知识及相关操作流程 - 全文

    前言: 本文主要描述Android BLE的一些基础知识及相关操作流程,不牵扯具体的业务实现,其中提供了针对广播包及响应包的解析思路,希望对正在或即将面临Android BLE开发的伙伴们有所引导. ...

  8. Kali Linux常用服务配置教程获取IP地址

    Kali Linux常用服务配置教程获取IP地址 下面以Kali Linux为例,演示获取IP地址的方法 (1)设置网络接口为自动获取IP地址.在Kali Linux的收藏夹中单击图标,将显示所有的程 ...

  9. [译][Tkinter 教程15] event 事件绑定

    已获原作者授权. 原系列地址: Python Tkinter 简介 一个 Tkinter 应用生命周期中的大部分时间都处在一个消息循环 (event loop) 中. 它等待事件的发生: 事件可能是 ...

  10. kali linux查询自己的ip,Kali Linux常用服务配置教程获取IP地址

    Kali Linux常用服务配置教程获取IP地址 下面以Kali Linux为例,演示获取IP地址的方法 (1)设置网络接口为自动获取IP地址.在Kali Linux的收藏夹中单击图标,将显示所有的程 ...

最新文章

  1. 女性程序员大会ghc_在女性科技大会上成为男人的感觉
  2. 凡人学习Linux之路
  3. signature=6e39b7285090b9748e35514dc5472d29,PXE常见错误代码表
  4. Jenkins与Docker的持续集成实践
  5. FreeRTOS系列第2篇---FreeRTOS入门指南
  6. 0225互联网新闻 | 《绿皮书》获奥斯卡最佳影片;华为发布5G折叠屏手机Mate X
  7. 02_Nginx基本配置与参数说明 + 辅助命令
  8. Node.js 可以和 Web 实现 HTTP 请求的跨平台兼容了!
  9. 深入浅出《设计模式》之工厂模式(C++)
  10. Flask第一篇——URL详解
  11. python 排列组合算法_排 列 组 合 公 式 及 排 列 组 合 算 法
  12. spring集成mybatis后,打印SQL语句
  13. 关于json包爆红我有话说
  14. 字符集及其存储方式(解决乱码问题)
  15. 安卓模拟器刷小米系统_小米5x原生rom系统刷机-小米5X MIUI10刷机包下载V9.7.21最新版-西西软件下载...
  16. Qt发布版权问题,是否需要公开源码?开源版与商业版的区别?
  17. 智能对话系统:Unit对话API
  18. 8.6 自制操作系统: risc-v Machine寄存器mcounteren/mcountinhibit
  19. 搜索引擎可搜到微信公众号内容?百度回应:不能
  20. axure RP文件如何找回_AXURE教程:管理后台页面框架

热门文章

  1. 不改表结构如何动态扩展字段
  2. 四年努力,梦归阿里,和大家聊聊成长感悟
  3. 【Scratch】青少年蓝桥杯_每日一题_7.09_加减大师
  4. h5中的结构元素header、nav、article、aside、section、footer详解
  5. Android --- 详细介绍透明式状态栏和沉浸式状态栏
  6. php多个参数伪静态,伪静态技术与页面多参数传送的处理办法
  7. 雷神开机logo更改_雷神911 pro-钛空版开售,陪你过一个不一样的520
  8. 组织应该采用集中式发电机吗?
  9. 数据中心架构有哪些组件?
  10. 多角度对比数据中心常见的三种走线方式