Link layer 1.3- 蓝牙地址
蓝牙地址介绍...
今天开始记录下Linklayer中各个小节的学习笔记。
蓝牙地址有两大种类:Public Device Address 和 Random Device Address,他们的长度都是48bit,一个设备至少需要一种类型的地址,也可以同时拥有两种地址。
1.3.1 Public Device Address
这类地址需要花钱跟IEEE(http://standards.ieee.org/develop/regauth/oui/)买,IEEE它的客户公司分配一个地址范围(Company_assigned)避免地址冲突,也是做了好事。48 bit地址中的前24bit是company assigned),company_assigned有三种,最便宜的也需要2655 美元,IEEE光卖这个就赚死了。2的24次方个2665美元啊,天文数字。后24位就是各个公司自由发挥的了。
有一种company_assigned会list到这个网址http://standards-oui.ieee.org/oui/oui.txt供大家查询,比如我查到Apple申请的ID中有一个是下图这个,在我的iPhone4s里Wifi和蓝牙的地址都是以这个开头的。
当然如果只是自己开发使用,那就无须去购买了,自己设置一个地址就好了。只要保证自己的设备地址不重复就好。要是发布产品的话还是最好有个这样的地址。
1.3.2 Random Device Address
这类地址由分为两种:Static address、Private address
1.3.2.1 Static Device Address
Static address的48个bit是随机生成的,而且需要满足三个条件:
- 最后两位是1;
- 所有随机生成的bit不能都是1;
- 所有随机生成bit不能都是0。
地址可以在每次开机(each power cycle)的时候初始化,但初始化后就不能再变,除非再开关一次(power cycle)电源。注:假如static address改动了,那么远端设备存储的地址就会变为无效,而且用这个地址做的连线动作也会失败。
1.3.2.2 Private Device Address Generation
Private Device Address又分类下面两个子类
- Non-resolvable private address
- Resolvable private address生成的Non-resolvable private address要满足下面四个条件:
所有随机生成的bit不能全是0
所有随机生成的bit不能全是1
地址不能跟public address相同
生成Resolvable Private Address,必须已经拥有Local IRK (Identity Resolving Key)或是Peer IRK。RPA是由IRK 和随机生成的24bit数字来生成的。随机生成的数字称作prand,prand应该满足下面的条件:
最后两位是0和1
所有随机生成的bit不能全是0
所有随机生成的bit也不能全是1
上图中的Hash是用一个函数来生成的(函数定义在Vol3.partH。2.2.2),输入参数是IRK和prand:hash = ah(IRK,prand),之后prand和hash组合成RPA
randomAddress = hash||prand
Hash的LSB会成为RPA的LSB,prand的MSB变成RPA的MSB。
1.3.2.3 Private Device Address Resolution
RPA是可以被resolved的,如果对方设备有IRK的话。如果RPA被resolve,那么远端设备和该设备就可以通信。
RPA分成24bit的prand和24bit的hash。在本地再用同样的算法再计算一次hash value:
localHash = ah(IRK,prand)
把localHash跟hash做对比,如果一样的话,那这个RPA就resolve了。
如果一个设备有多个已存的IRK,那它就只能把每个IRK都重复上面的算法来算一次,然后看是否能跟hash match上。
注:如果resolve 这个地址需要很久时间,超过了T_IFS(Time Inter Frame Space,Time interval between consecutive
packets on same channel index , 150us)的话,设备是可以回应下一个event的。
关注 蓝牙笔记
微信扫一扫关注公众号