BLE-NRF51822教程16-BLE地址
本教程基于 sdk9+sd8.0
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教程16-BLE地址的更多相关文章
- 蓝牙BLE实用教程
蓝牙BLE实用教程 Bluetooth BLE 欢迎使用 小书匠(xiaoshujiang)编辑器,您可以通过 设置 里的修改模板来改变新建文章的内容. 1.蓝牙BLE常见问答 Q: Smart Re ...
- 蓝牙BLE实用教程(转载)
欢迎使用 小书匠(xiaoshujiang)编辑器,您可以通过 设置 里的修改模板来改变新建文章的内容. 1.蓝牙BLE常见问答 Q: Smart Ready 和 Smart 以及传统蓝牙之间是什么关 ...
- 1_BLE nRF51822 UART 与 BLE转发
去年Noridc出了集成蓝牙4.0并能开口说话24L01通信芯片,这部电影可以非常小包装.和低功耗.非常适合于可穿戴设备,然后挖了一个免费的手在不久的将来AK II,又没了一个Becon的板子.先玩了 ...
- BLE简介和Android BLE编程
一.BLE和BT区别 其实我知道许多程序员不太喜欢阅读除了代码以外的文档,因为有时这些过于冗长的文档对编程并没有更多的好处,有了协议,接口,demo差不多很多人就能写出很好质量的代码了.但其实更深入的 ...
- 全套AutoCAD版本安装教程及下载地址
1:AutoCAD 2004 安装教程及下载地址 https://mp.weixin.qq.com/s/4So2zmJ6nWu6Z3bSo3W19Q 2:AutoCAD 2005 安装教程及下载地址 ...
- node-webkit教程(16)调试typescript
原文链接:node-webkit教程(16)调试typescript 本文所讲的内容同样适用于chrome浏览器. 在chrome的开发人员工具的配置项中,有一个sourcemap的选项,用来配置ja ...
- 物理地址为20位 如10000H 用段地址*16+偏移地址表示
段地质在cpu中,为16位 段地质*16则变成物理首地址20位,这个物理首地址必定是16的倍数. 偏移地址16位, 则表明一个段的大小为64k. 同时也表明16位地址的寻址能力为64kb
- 智能合约语言Solidity教程系列2 - 地址类型介绍
智能合约语言Solidity教程系列第二篇 - Solidity地址类型介绍. 写在前面 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你 ...
- Kali Linux常用服务配置教程获取IP地址
Kali Linux常用服务配置教程获取IP地址 下面以Kali Linux为例,演示获取IP地址的方法 (1)设置网络接口为自动获取IP地址.在Kali Linux的收藏夹中单击图标,将显示所有的程 ...
- testng入门教程16数据驱动(把数据写在xml)
testng入门教程16数据驱动(把数据写在xml) testng入门教程16数据驱动(把数据写在xml)把数据写在xml文件里面,在xml文件右键选择runas---testng执行 下面是case ...
随机推荐
- 微信SDK开发学习
public class MainActivity extends Activity { // 应用程序的id,就是在网上开发平台创建应用的appid public static final Stri ...
- [hive小技巧]使用limit查询变成抽样,而不是全盘扫描
将set hive.limit.optimize.enable=true 时,limit限制数据时就不会全盘扫,而是根据限制的数量进行抽样. 同时还有两个配置项需要注意: 1.hive.limit.r ...
- Laravel环境配置之安装Homestead
laravel requirements: PHP >= 5.5.9 (机器上yum安装的是5.3.3) OpenSSL PHP Extension PDO PHP Extension Mb ...
- BZOJ3830 : [Poi2014]Freight
首先为了保证发车时间都不同,T[i]=max(T[i],T[i-1]+1) 然后设f[i]表示前i列车回来的最早时刻 f[i]=min(max(T[i],f[j]+i-j-1)+s*2+i-j-1) ...
- GSS系列(1)——GSS1&&GSS3
题意:询问一个区间内的最大连续子段和(GSS1),并且有单点修改的操作(GSS2). 思路:这个题目在老人家的大白鼠里出现过,不过那个是求两个下标,并且相同取更小值.——传的东西更多,判断也稍微繁琐一 ...
- 生产环境下一定要开启mysqlbinlog
在没有备份数据库的情况下,可以用binlog进行恢复 在生产环境下安全第一,损失一点点效率换来的安全还是值得的. http://www.cnblogs.com/zc22/archive/2013/06 ...
- 【wikioi】1250 Fibonacci数列(矩阵乘法)
http://wikioi.com/problem/1250/ 我就不说这题有多水了. 0 1 1 1 矩阵快速幂 #include <cstdio> #include <cstri ...
- TinyMCE在线编辑器使用方法初探
首先,下载TinyMCE包,地址:http://www.tinymce.com/ 然后将下载后的包解压,放置到一个文件夹下,创建一个html文件,并在其中书写如下代码: <!DOCTYPE ht ...
- 以下是关于Controller的一些Hint
在经过路由分发之后,实际的应用Controller接管用户的所有请求,并负责与用户数据的交互.CI中所有的应用控制器都应该是CI_Controller的子类(除非你扩展了CI的核心,那么你的Contr ...
- .NET中资料库的设计与SQL
.NET中资料库的设计与SQL ADO.NET设计 先来说说资料库的设计 主要涉及 关联式资料库 资料库系统管理(DBMS) 结构化查询(SQL) 预储程序 一个资料库包含一个以上的资料表,每个资料表 ...