蓝牙的L2CAP协议

Posted senior-engineer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝牙的L2CAP协议相关的知识,希望对你有一定的参考价值。

1.概述

    L2CAP能向上层提供面向连接的或者无连接的数据服务,拥有multiplexing capability and segmentation and reassembly operation。能够接受上层协议或者应用的数据,最大为64K byte,每一个通道都可以进行Flow Control和retransmission。结构如下图:
技术分享图片

 几个主要特点:
(1)Protocol/channel multiplexing
(2)Segmentation and reassembly
(3)Error control and retransmissions
(4)Support for Streaming
(5)Fragmentation and Recombination
(6)Quality of Service
 
2.常用术语与概念
L2CAP channel:The logical connection between two endpoints in peer devices, characterized
by their Channel Identifiers (CID).(两个设备之间的逻辑连接,以两端的CID标识该Channel)
SDU,or L2CAP SDU:L2CAP和上层交换的数据单元,不包含任何L2CAP的协议信息。
Segment,or SDU segment:Segmentation procedure产生,SDU的一部分。注意,在Basic L2CAp模式中不会使用,只会用在Enhanced Retransmission mode,Streaming mode,Retransmission Mode and Flow Control Mode。【这是显然的,Basic L2CAP没有Control Field嘛】
PDU, or L2CAP PDU:Protocol Data Unit,包含L2CAP协议信息。控制信息和上层的数据信息等。通常是由a Basic L2CAP header开始的,由以下几种PDU:
B-frames, I-frames, S-frames, C-frames and G-frames
B-Frame用在Basic L2CAP Mode中;I-Frame和S-Frame用在Enhanced Retransmission Mode,Streaming mode, Retransmission mode, and Flow Control Mode中;C-Frame专用在L2CAP signaling channel;G-Frame用在Connectionless L2CAP channel,也可用于广播。
 
3.CID
    CID(CHANNEL IDENTIFIERS),某一条L2CAP连接的两个端点的标识。有Fixed Channel 和Dynamically allocated Channel两种。如下图所示:
技术分享图片
需要注意的是,ALC-U或者LE-U Logical Link建立起来后,Fixed channel就已经处于有效状态了。如果几个远端设备具有相同的CID,本地设备依然可以识别。下图是建立CID的例子:
技术分享图片
建立不同类型的L2CAP连接的CID规则如下:
技术分享图片
 
4.Data Packet Format
首先,L2CAP有5种operation mode:
技术分享图片
此外,L2CAP有以下几种连接类型:
A:CONNECTION-ORIENTED CHANNELS in basic L2CAP mode(面向连接,采用基本L2CAP模式)
B: CONNECTIONLESS DATA CHANNEL in basic L2CAP mode(无连接的,采用基本L2CAP模式)
C:CONNECTION-ORIENTED CHANNELS的连接类型分为:BASIC L2CAP MODE和RETRANSMISSION/FLOWCONTROL/STREAMING MODES这两种(面向连接,重传/流量控制/流模式)
 
情况A采用Basic information frame (B-frame),格式如下:
技术分享图片
Length参数指的是Information Field的字节数,Information payload 为0到65535字节。
 
情况B采用Group frame (G-frame),如下:
技术分享图片
参数Length为PSM的字节数加上information的字节数,因为是CONNECTIONLESS DATA CHANNEL,所以CID为0x0002。
PSM为Protocol/Service Multiplexer,PSM至少是16bit,此外有限制条件,必须为以下这种格式:
|xxxxxxxx0||xxxxxxxx1|。PSM的定义如下:
技术分享图片
可以看出分为连个range,第一个range是SIG分配的协议代表值,第二个range是动态分配的,用来与SDP通信,还可以用来支持特殊协议。
Information部分从0 to 65533字节。
 
情况C采用Information frame (I-frame)和Supervisory frame (S-frame)配合使用,如下:
技术分享图片
这种情况较为复杂,先说S-Frame,S-Frame用来响应I-Frame。
 
Length参数为除了basic L2CAP header的总共字节数。
Control部分对应三种Control mode:
(1)Standard Control Field 
(2)the Enhanced Control Field, and the
(3)Extended Control Field
Standard Control Field:用于Retransmission mode and Flow Control mode;
Enhanced Control Field:用于Enhanced Retransmission mode and Streaming mode;
Extended Control Field:用于Enhanced Retransmission mode and Streaming mode。
三种Control Mode的格式如下图:
技术分享图片
技术分享图片
技术分享图片
Control部分的相关参数解释如下:
SAR:Segmentation and Reassembly,指明该L2CAP是否是分段过的,格式如下:
技术分享图片
TxSeq:Send Sequence Number,对发送的I-Frame计数,用于分段和重组。
ReqSeq:Receive Sequence Number,接受序号,用于重传等
R:Retransmission Disable Bit,用来实现Flow Control.
S:Supervisory function,表示S-Frame的type,定义如下:
技术分享图片
P:Poll,The P-bit is set to 1 to solicit a response from the receiver. The receiver shall
respond immediately with a frame with the F-bit set to 1.
F:Final(1 bit),The F-bit is set to 1 in response to an S-frame with the P bit set to 1.
 
L2CAP SDU Length(2byte)
如果L2CAP的SDU比较大,跨越了好几个I-Frame,则SDU Length表示总的SDU的长度。如果SDU没有分段的话,这个Field不用。需要注意的是,SDU Length只出现在Start I-Frame中,此时I-Frame的SAR=0x01。也就是说,在所有分段的I-Frame中,只有最开始的那个需要指明SDU Length,其余的I-Frame都不需要。
 
Information Payload Field
根据配置的MPS(MAX PUS)大小,可以填充这个Field。
 
FCS(2byte)
用来check这个Frame,计算比较复杂,不详述。
 
5.SIGNALING PACKET FORMATS
    前面讲了好几种类型的PDU,还有一种C-Frame。C-Frame专用在signaling channel(0x0001或者0x0005)上,signaling commands在上面传输。需要注意的是:0x0001通道的一个C-frame可以同时传输多个command,0x0005只能传输一个。payload Length不能超过MTUsig。下图为定义的Minimum Signaling MTU:
技术分享图片
在signaling channel上定义的L2CAP PDU的格式如下:
技术分享图片
结构和B-Frame是一样的。
signaling commands的根式如下:
技术分享图片
参数的含义如下:
Code (1 octet):指定Command的type,一般有以下几种:
技术分享图片
技术分享图片

参数Identifier (1 octet):标识一个req和res,相匹配。
参数Length (2 octets):指明data field字节数。
参数Data (0 or more octets):Command数据。
 
6.Command
    这段描述在Signaling Channel上的Command,共有19种Type.
COMMAND REJECT (CODE 0x01):
技术分享图片
技术分享图片

CONNECTION REQUEST (CODE 0x02):用来建立连个Device之间的L2CAP连接。
技术分享图片
source CID为发起这个Req的Device的CID。
 
CONNECTION RESPONSE (CODE 0x03):对应CONNECTION REQUEST 
技术分享图片
注意:参数Destination CID为发出这个res的Device的CID,而Source CID为接受这个Res的Device的CID。【可能是为了和CONNECTION REQUEST的定义相匹配吧】
Result (2 octets):
技术分享图片
技术分享图片
 
Status (2 octets):result为pending情况下有效。
技术分享图片

CONFIGURATION REQUEST (CODE 0x04):建立L2CAP连接时需要的配置。
技术分享图片
在这里,DCID就为接受这个req的Device的CID,
Flags不解释
Configuration Options提供所有的配置信息,如果是个empty Configuration,Length配置成0x0004.
Configuration Option的格式定义如下:
技术分享图片
Type (1 octet):
配置成0:接收方无法识别option,则拒绝这个req
配置成1:接收方无法是被option,则skip这个req
Length (1 octet):定义option data中的字节数
 
CONFIGURATION RESPONSE (CODE 0X05):回应CONFIGURATION REQUST
技术分享图片
SCID为接受者这个res的Device的CID
Flags (2 octets)不解释
其余的Command的结构和以上的类似,不一一叙述,参考Spec1425-1438.
 
7.一些Configuration Options
(1)MAXIMUM TRANSMISSION UNIT (MTU):
所有的L2CAP implementations需要支持最下48byte(ACL-U上)和23Byte(LE-U上)。
技术分享图片
MTU:the maximum SDU size(字节数)
 
(2)FLUSH TIMEOUT OPTION;
Extended Flow Specification使用时不用该使用该option。
技术分享图片
Flush Timeout以毫秒计算。
 
其余还有QUALITY OF SERVICE (QOS) OPTION,RETRANSMISSION AND FLOW CONTROL OPTION,FRAME CHECK SEQUENCE (FCS) OPTION,EXTENDED FLOW SPECIFICATION OPTION等,可参考4.0的Spec。
 
8.FRAGMENTATION AND RECOMBINATION
技术分享图片
未完待续。。。

 



























以上是关于蓝牙的L2CAP协议的主要内容,如果未能解决你的问题,请参考以下文章

蓝牙的L2CAP协议

一篇关于蓝牙SDP和L2CAP协议的文章

BLE主机之L2CAP

蓝牙核心技术概述

android蓝牙

蓝牙的OBEX协议