写在前面:本文参考了 BLE4.0 低功耗蓝牙 协议 总结 ,对其进行了缩减,整理出了个人能理解的感觉比较基本的内容,有问题请随时跟我沟通 个人QQ:993650814.
1、射频信道:
频率分布图:
即最小频率是2402MHz,最大频率是2480MHz.一共有40个信道,信道的宽度是2MHz,其中37个信道为自适应调频数据通道,用来两个链接的设备进行数据通信,3个固定通道37、38、39信道为广播信道用来广播数据。
三个广播信道分布在SIM频段的不同区域,如果他们集中在某个频段的话,有可能这个频段深度衰落导致广播无法进行,所以广播信道之间至少差24MHz,数据信道在广播信道之间排布,间隔2Mhz。数据信道编号0~36,广播信道编号37~39.
自适应调频:在传输数据过程中,并不能保证每个信道都是好的信道,自适应调频能够将已知的坏信道映射到已知的好信道上来,防止传输干扰。
2、发射功率
2.4GHz频道对无需授权的的设备有发射功率的限制,BLE 4.0限制如下:
最低发射功率为-20dBm即10uW,最大发射功率10dBm,10000uW。
3、bit数据流格式
协议中PDU都是以Little Endian Format(小端模式)存放的,即内存中的高地址对应高字节,低地址对应低字节,数据传输时最低字节的最低bit最先发送的空中,例如 发送0xD即(0b)1101,则先发送1,接着0,然后1,最后1.
然而,数据包中的CRC和MIC( Message Integrity Check 信息完整性检查)不是以小端模式存放,并以小端模式发送数据的,而是最先发送的高字节,例如CRC =0x123456,则发送顺序为0x12、0x34、0x56
4、LL链路层数据包结构分析
4.1前导码Preamble:
前导码为1Byte,要么01010101b,要么10101010b,如果可接入地址Access Address最低位为1时,前导码为01010101b,如果Access Address最低位为0时,前导码为10101010b,目的是为了保证报文的前9bit都是0和1的交替位(理解这句话一定要站在小端模式场景下)。
4.2接入地址 Accress Address:
接入地址4Bytes,分为广播接入地址和数据接入地址。
广播接入地址:固定为 0x8e89bed6,发送到空中的格式:
数据接入地址:数据通道接入地址是一个随机数,由主机产生,但满足如下条件:
(1)、不是广播通道接入地址;
(2)、不能超过连续的6个0或者1;
(3)、4个Bytes必须互不相等;
(4)、不能超过24bit的翻转,即不能010101010101010101010101;
(5)、地址的最高 6bits 至少有两次的翻转
4.3 广播通道下的PDU
报文类型(最低4bit):共有7种广播报文类型,如下:
ADV_IND——通用广播
ADV_DIRECT_IND——定向连接广播
ADV_NONCONN_IND——不可连接广播
ADV_SCAN_IND——可扫描广播
SCAN_REQ——主动扫描请求
SCAN_RSP——主动扫描应答
CONNECT_REQ——连接请求
发送地址(TXADDR)和接收地址(RXADDR),用来说明设备的地址类型,为1时表示Random Addr(随机地址),为0时表示Public Addr(公共地址)。
净荷长度6bit:用来表示净荷数据的长度,LL PDU的最大长度为37Bytes。
RFU:保留将来用的意思,Reserve for future
广播通道下PDU的数据净荷(PayLoad)的格式
4.4 数据通道下的PDU
注意:这里的数据净荷为什么是216bits也就是27Bytes了,即使加上4Bytes的MIC也只有31Bytes另外6Bytes去哪了?实际上BLE4.0协议规范就是这么规定的,这6Bytes在广播通道下作为蓝牙地址,在数据通道中只有27Bytes。在我的另一篇博客中也有讲到这里 ,可参考如下链接
Nordic Ble 4.0为什么上层应用每次最多能透传20Bytes的有效数据
5、非连接状态:就绪态、广播态、扫描状态、发起状态
就绪态是默认的状态,直接略过。
5.1 广播态:
5.1.1广播通道选择:在广播态下,LL层通过广播信道发送PDU,广播事件分为 四中:
非定向可连接事件(ADV_IND)
定向可连接事件(ADV_DIRECT_IND)
非定向不可连接事件(ADV_NONCONN_IND)
非定向扫描事件(ADV_DISCOVER_IND/ADV_SCAN_IND)
广播事件来了之后,PDU依次从37.38.39三个信道传输数据
5.1.2 广播间隔: 所有的非定向广播事件,两个连续广播事件之间的时间就是广播间隔。
advInterval:0.625ms的倍数,在20ms~10.24s之间。advDelay 是个随机数在0~10ms之间,由于设备之间的时钟会有不同程度的漂移,advDelay不但能消除设备之间时间的漂移,还能避免同一信道及时间节点上的冲突。
5.1.3 非定向可连接广播事件(ADV_IND)
链路层通过广播信道发送(ADV_IND PDU)通用广播报文,这个报文发出之后可以接受由扫描者发送的(SCAN_REQ PDU)扫描请求或者由发起者发送的(CONNECT_REQ PDU)连接请求。广播者接受之后,需要在同一信道上进行扫描着或者广播者的应答。 如果接受到的SCAN_REQ PDU通过了滤波,那么广播者需要在接受通道上发送SCAN_RSP PDU扫描应答报文。 如果 接收到CONN_REQ,那么久进入连接态了。
5.1.4 定向可连接广播事件(ADV_DIRECT_IND)
这个广播的目的是为了快速连接,这种报文包含了两个地址:广播者地址和发起者地址。发起者收到发送给自己的广播报文之后,可以快速发起连接请求事件,从而进入连接态。
5.1.5 非定向不可连接事件(ADV_NOCONN_IND)
只有自己广播,不允许连接。
5.2 扫描态
扫描窗口:是链路层监听广播数据通道的持续的时间。
扫描间隔:是连续两个扫描窗口开始的时间之差。
5.3 发起态
发起态进入连接之后成为主机设备。
5.4 连接态
进入连接态后,两个设备就担任了不同的角色。 发送CONNECT REQ的设备成为主机,接受CONNEXT REQ的设备成为从机。
5.4.1 连接事件
跟广播事件一样,每隔一段时间的连接事件都会由主机通过数据信道发送给从机一个数据包,这时候如果从机有数据要回应给主机,就会在150±2us内给主机一个应答。也就是说每个连接事件,都会至少包含主机发送给从机的一个数据包,从机可以不发送给主机。
连接事件的时间由两个参数决定:connect event interval (connInterval 连接间隔)和slave latency(connSlaveLatency 从机潜伏 周期)。解释一下从机潜伏周期:这是一个次数而不是时间,例如connSlaveLatency=5,则连续5个连接事件,从机可以不发数据给主机,主机也不会认为此时断连。
锚点(anchor point):连接事件开始的时间叫做锚点,主机在锚点开始连接事件,从机在锚点开始进入侦听状态。
5.4.2 监管超时
在连接状态下,长时间的没有连接事件或者长时间主机给从机发送数据,从机没有回应,这时候可以认为连接已经出了问题,这个时间就叫做连接监管超时(connect supervision timeout connSupervisionTimeout)。这个事件一定要大于(connInterval)*(1+connSlaveLatency),并且得是10ms的倍数,并且在100ms~30s之间。