紧接着上面的内容。
(6)、链路层中的建立连接:
设备创建连接的过程如下图所示。
简言之,设备首先广播可连接广播事件,其他设备收到之后即可发起连接。在此过程中,广播者发送的事件类型要么是通用广播事件,要么是直接广播事件。发起者收到正确的广播报文时,将向广播者发送一个连接请求,其中包括
了连接开始时需要的所有信息,包括下列各项:
(*)连接中使用的接人地址
(*)CRC初始值
(*)发送窗口大小
(*)发进窗口偏穆
(*)连接间隔
(*)从设备延迟
接入地址:连接使用的接人地址总是由主设备来提供。地址通过随机生成,但是需要遵循一些规则。如果主设备有多个从设备,它会为每个从设备选择不同的随机接人地址。地址的随机性确保了在不同的主从设备之间发生的碰撞概率会降低。随机性也增强了隐私,扫描者无法得知是哪两个设备正在通信。CRC初始化:CRC初始值是另一个由主设备提供的随机数。随机的意义在于,如果在同一区域有两个主设备正在和不同从设备通信,那么使用相同的接人地址的概率将会很低。如果确实发生了这种情况,从设备会从错误的主设备收到干扰数据包。因此,为每个从设备设置随机的CRC初始值,主从设备既有相同的接人地址又有相同的CRC初始值的概率就会变得微乎其微。
发送窗口:从设备可以自行决定广播的时间,它们是最需要保存电量的设备,这样的设计并无不妥。但是,如果主设备已经在做其他事情,也许是一些更重要的事情,那么它必须让低功耗蓝牙断开当前的活动。在连接建立期间,有两个参数用来传递上述信息:窗口大小和窗口间隔。
连接事件:在一个连接当中,主设备会在每个连接事件里向从设备发送数据包。一个连接事件是指主设备和从设备之间相互发送数据包的过程。连接事件的进行始终位于一个频率,每个数据包会在上个数据包发完之后等待150ps再发送。
(7)、链路层中的发送数据:
在一个连接里,设备通过在连接事件中发送数据包来相互通信。数据报文和广播报文不同,前者是单独进行的通信,后者则是对所有的侦听设备发送广播。广播报文和数据报文之间的最大差别在于报头的格式和净荷的长度。数据报文的净荷的可以为。0 ~31字节不等。净荷长度为零的数据包是一个空包,它不含应用程序的数撂,但仍然可以在报文的头部包含一些信息。净荷的最大长度(31字节)小于广播报文的最大长度。通常只有加密报文才会使用。无论链路层加密与否,传给控制器的未加密数据包最多只能携带27个字节的数据。
数据报头:数据报文的报头如图所示,包含下面四个字段:
(*)逻辑链路标识符(LLID)
(*)序列号( SN)
(*)下一个预期序列号(NESN)
(*)更多数据(MD)
逻辑链路标识符:逻辑链路标识符( LLID)用于判断数据报文属于下列哪种类型:
(*)链路层控制报文(11)——用于管理连接
(*)高层报文开始(10) ——也可用于一个完整报文
(*)高层报文延续(01)
序列号:为了使数据传输变得可靠,所有的数据包均带有序列号。连接建立后,第一个数据包的序号为0;每次发送新的数据包时,其序列号与上个数据包的序列号不同。这使得接收装置能够判断接收的数据包的性质:如果序列号与之前的一样,则为重传报文,姐果序列号和之前的不同,则为新报文。
确认:数据包的确认需要用到另一个比特,即所谓的下一个预期序列号( NESN)。NESN的发送方用其通知对方自己期望接收的数据包的序列号。如果设备成功接收序列号为0的报文,在其确认报文中,应将下一个预期序列号设为l,否则序列号为O的数据包将被重传。因此,可以将NESN作为一个标志来判断数据包是被正确接收还是需要重传。下图说明了这一点
更多数据:数据信道报文的报头里还有最后一位——更多数据位,用来通知对端设备自己还有其他的数据准备发送。如果收到设置了更多数据位的数