讲述设备间如何实现无线通信
5.1 背景
5.2 模拟调制
5.3 数字调制
5.4 频段
5.5 调制
最小频偏约为180kHz
5.6 射频信道
低功耗蓝牙使用40个无线信道传输信息。
5.7 发射功率
规范规定最大发射功率为+10dBm,最小发射功率不应低于-20dBm
5.8 容限
对于低功耗蓝牙,整个报文的中心频率的容限是+/-150kHz,在报文发送过程中,中心频率的漂移不允许超过50kHz
5.9 接收机灵敏度
低功耗蓝牙的接口机灵敏度要高于-70dBm。低功耗蓝牙选择的误比特率为0.1%
5.10 通信距离
path loss = 40+25log(d)
如果发射功率是-20dBm,接收机灵敏度为-70dBm,允许路径损耗为50dB,相当于2.5m的距离。这是最短通信距离
如果发射功率是0dBm,接收机灵敏度是-80dBm,允许路径损耗为80dB,相当于40m的距离。这是低功耗蓝牙在常见的发射功率和接收灵敏度情况下所达到的通信距离。
强调直接测试模式及其在执行低成本、高效的无线电测试时所起的作用
6.1 背景
直接测试模式需要三个设备
6.3 硬件接口
6.4 使用HCI的直接测试模式
直接测试模式可以复用已有的HCI传输层和逻辑接口访问控制器。
介绍有关报文格式、广播和连接建立等的底层协议
链路层状态机定义了5种状态
扫描态有两个子状态:主动扫描和被动扫描。
连接态也有两个子状态:主、从
低功耗蓝牙有两类报文:广播报文和数据报文。设备利用广播报文来发现、连接其他设备。一旦连接建立之后,则开始使用数据报文,两者的区别在于,数据报文只能被连接中的两个主从设备所理解,而广播报文则可以广播给多个侦听设备或者只发送给某个特定设备。
FSK在接收连续相同的比特的能力比较差,白化就是用来随机化发送的数据的。
白化随机化序列通过线性反馈移位寄存器生成,生成多项式是
W h i t e n e r = x 7 + x 4 + x 0 Whitener = x^7+x^4+x^0 Whitener=x7+x4+x0
广播报文类型有7种。每种类型都具有不同的净荷格式和行为。
名字 | id | 说明 |
---|---|---|
ADV_IND | 0x0 | 通用广播指示 |
ADV_DIRECT_IND | 0x1 | 定向连接指示 |
ADB_NONCONN_IND | 0x2 | 不可连接指示 |
ADB_SACN_IND | 0x6 | 可扫描指示 |
SCAN_REQ | 0x3 | 主动扫描请求 |
SCAN_RSP | 0x4 | 主动扫描响应 |
CONNECT_REQ | 0x5 | 连接请求 |
C R C = x 24 + x 10 + x 9 + x 6 + x 4 + x 3 + x 1 + x 0 CRC= x^{24}+x^{10}+x^9+x^6+x^4+x^3+x^1+x^0 CRC=x24+x10+x9+x6+x4+x3+x1+x0
广播信道频点的选择原则上是为了远离wifi等接入点的严重干扰。
f n + 1 = ( f n + h o p ) m o d 37 f_{n+1}= (f_n+hop)mod37 fn+1=(fn+hop)mod37
低功耗蓝牙通过广播信道发现其他设备。一个设备进行广播,而另一个设备进行扫描。共有四种类型的广播:通用的、定向的、不连续的、可发现的。
设备每次广播时,会在3个广播信道上发送相同的报文。这些报文被称为一个广播事件。除了定向报文以外,其他广播事件均可以选择20ms-10.28s不等的间隔。通常一个广播中的设备会每一秒广播一次。
扫描是低功耗蓝牙广播的重要组成部分。扫描用于接收广播事件。扫描事件取决于有多少时间用于扫描以及需要多快发现其他设备。
通过四种广播事件的三种可以进行广播:通用广播、不可连接广播、可发现广播。
进行广播时,需要在广播报文中给数据打上标签。L(length)T(type)V(value)
发起者收到正确的广播报文时,将向广播者发送一个连接请求,其中包括了连接开始时需要的所有信息,包括下面:
7.8.1 数据报头
7.8.2 逻辑链路标识符 LLID,用于判断数据报文属于哪种类型。
LLID | 描述 |
---|---|
11 | 链路层控制报文,用于管理连接 |
10 | 高层报文开始,也可用于一个完整报文 |
01 | 高层报文延续 |
7.8.3 序列号SN
7.8.4 确认 NESN
7.8.5 更多数据 MD
7.8.6 例子
n o n c e = P a c k e t C o u n t e r ∣ ∣ D i r e c t i o n ∣ I V C M I C = E k e y ( 0 x 01 ∣ ∣ n o n c e ∣ ∣ 0 x 0000 ) C B l o c k 1 = E k e y ( 0 x 01 ∣ ∣ n o n c e ∣ ∣ 0 x 0001 ) C B l o c k 2 = E k e y ( 0 x 01 ∣ ∣ n o n c e ∣ ∣ 0 x 0002 ) B 0 = 0 x 49 ∣ ∣ n o n c e ∣ ∣ l e n g t h B 1 = 0 x 0001 ∣ ∣ h e a d e r m a s k e d ∣ ∣ 0 x 00000000000000000000000000 X 0 = E k e y ( B 0 ) X 1 = E k e y ( X 0 ⨁ B 1 ) X 2 = E k e y ( X 1 ⨁ B 2 ) w h e r e B 2 = P a y l o a d [ 0..127 ] M I C = E k e y ( x 2 ⨁ B 3 ) [ 128..96 ] w h e r e B 2 = P a y l o a d [ 128..215 ] e n c r y p t e d = C B l o c k 1 ⨁ B l o c k 1 ∣ ∣ C B l o c k 1 ⨁ B l o c k 2 ⨁ M I C nonce = Packet Counter||Direction|IV \\ C_{MIC} = E_{key}(0x01||nonce||0x0000) \\ C_{Block1} = E_{key}(0x01||nonce||0x0001) \\ C_{Block2} = E_{key}(0x01||nonce||0x0002) \\ B_0 = 0x49||nonce||length \\ B_1 = 0x0001||header_{masked}||0x00 0000 0000 0000 0000 0000 0000 \\ X_0 = E_{key}(B_0) \\ X_1 = E_{key}(X_0 \bigoplus B_1) \\ X_2 = E_{key}(X_1 \bigoplus B_2) where B_2=Payload_{[0..127]} \\ MIC = E_{key}(x_2 \bigoplus B_3)_{[128..96]} where B_2=Payload_{[128..215]} \\ encrypted = C_{Block1} \bigoplus Block1 || C_{Block1} \bigoplus Block2 \bigoplus MIC nonce=PacketCounter∣∣Direction∣IVCMIC=Ekey(0x01∣∣nonce∣∣0x0000)CBlock1=Ekey(0x01∣∣nonce∣∣0x0001)CBlock2=Ekey(0x01∣∣nonce∣∣0x0002)B0=0x49∣∣nonce∣∣lengthB1=0x0001∣∣headermasked∣∣0x00000000000000000000000000X0=Ekey(B0)X1=Ekey(X0⨁B1)X2=Ekey(X1⨁B2)whereB2=Payload[0..127]MIC=Ekey(x2⨁B3)[128..96]whereB2=Payload[128..215]encrypted=CBlock1⨁Block1∣∣CBlock1⨁Block2⨁MIC
其中Packet Counter表示包计数器,Direction表示方向位,IV表示初始化向量。Block1表示加密块1,是加密净荷的前16个字节。Block2表示加密块2,是加密净荷的后11个字节。length是验证数据的原始长度。
如何实现低功耗的
描述主机与控制器进行交互的接口,以及如何用其执行一些有用的操作
主机控制器接口HCI是主机和控制器之间的接口,主要完成两个任务:
蓝牙规范中定义了4种物理接口
8.3.1 HCI信道
一旦控制器与其他设备建立了连接,控制器的底层HCI接口就创建一个HCI信道,我们使用一个连接句柄来标识这个信道。
8.3.2 命令数据包
在低功耗蓝牙中一共有三种基本命令类型:
8.3.3 事件数据包
低功耗蓝牙主要有下面三种基本事件类型:
8.3.6 数据流控
一般 主机到控制器的数据流控是必须的,而控制器到主机的流控可以忽略。