蓝牙的L2CAP协议

摘要:
结构如下图所示:几个主要特征:协议/信道多路复用分段和重组错误控制和限制支持流化碎片和组合服务质量2。通用术语和概念L2CAPchannel:对等设备中两个端点之间的逻辑连接,其特征是信道标识符SDU,或L2CAPSDU:L2CAP和上层之间交换的数据单元不包含任何L2CAP协议信息。PDU或L2CAPPDU:协议数据单元,包含L2CAP协议信息。通常,它从aBasicL2CAP报头开始,由以下PDU组成:B帧、I帧、S帧、C帧和G帧。Length参数是除basicLCAPheader之外的总字节数。三种控制模式的格式如下:控制部分的相关参数解释如下:SAR:分段和重组,表示L2CAP是否分段。格式如下:TxSeq:SendSequenceNumber,它统计发送的I帧进行分段和重组。

1.概述

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

 几个主要特点:
(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两种。如下图所示:
蓝牙的L2CAP协议
需要注意的是,ALC-U或者LE-U Logical Link建立起来后,Fixed channel就已经处于有效状态了。如果几个远端设备具有相同的CID,本地设备依然可以识别。下图是建立CID的例子:
蓝牙的L2CAP协议
建立不同类型的L2CAP连接的CID规则如下:
蓝牙的L2CAP协议
 
4.Data Packet Format
首先,L2CAP有5种operation mode:
蓝牙的L2CAP协议
此外,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),格式如下:
蓝牙的L2CAP协议
Length参数指的是Information Field的字节数,Information payload 为0到65535字节。
 
情况B采用Group frame (G-frame),如下:
蓝牙的L2CAP协议
参数Length为PSM的字节数加上information的字节数,因为是CONNECTIONLESS DATA CHANNEL,所以CID为0x0002。
PSM为Protocol/Service Multiplexer,PSM至少是16bit,此外有限制条件,必须为以下这种格式:
|xxxxxxxx0||xxxxxxxx1|。PSM的定义如下:
蓝牙的L2CAP协议
可以看出分为连个range,第一个range是SIG分配的协议代表值,第二个range是动态分配的,用来与SDP通信,还可以用来支持特殊协议。
Information部分从0 to 65533字节。
 
情况C采用Information frame (I-frame)和Supervisory frame (S-frame)配合使用,如下:
蓝牙的L2CAP协议
这种情况较为复杂,先说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的格式如下图:
蓝牙的L2CAP协议
蓝牙的L2CAP协议
蓝牙的L2CAP协议
Control部分的相关参数解释如下:
SAR:Segmentation and Reassembly,指明该L2CAP是否是分段过的,格式如下:
蓝牙的L2CAP协议
TxSeq:Send Sequence Number,对发送的I-Frame计数,用于分段和重组。
ReqSeq:Receive Sequence Number,接受序号,用于重传等
R:Retransmission Disable Bit,用来实现Flow Control.
S:Supervisory function,表示S-Frame的type,定义如下:
蓝牙的L2CAP协议
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:
蓝牙的L2CAP协议
在signaling channel上定义的L2CAP PDU的格式如下:
蓝牙的L2CAP协议
结构和B-Frame是一样的。
signaling commands的根式如下:
蓝牙的L2CAP协议
参数的含义如下:
Code (1 octet):指定Command的type,一般有以下几种:
蓝牙的L2CAP协议
蓝牙的L2CAP协议

参数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):
蓝牙的L2CAP协议
蓝牙的L2CAP协议

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

CONFIGURATION REQUEST (CODE 0x04):建立L2CAP连接时需要的配置。
蓝牙的L2CAP协议
在这里,DCID就为接受这个req的Device的CID,
Flags不解释
Configuration Options提供所有的配置信息,如果是个empty Configuration,Length配置成0x0004.
Configuration Option的格式定义如下:
蓝牙的L2CAP协议
Type (1 octet):
配置成0:接收方无法识别option,则拒绝这个req
配置成1:接收方无法是被option,则skip这个req
Length (1 octet):定义option data中的字节数
 
CONFIGURATION RESPONSE (CODE 0X05):回应CONFIGURATION REQUST
蓝牙的L2CAP协议
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上)。
蓝牙的L2CAP协议
MTU:the maximum SDU size(字节数)
 
(2)FLUSH TIMEOUT OPTION;
Extended Flow Specification使用时不用该使用该option。
蓝牙的L2CAP协议
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协议》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇gitee推送报错error: failed to push some refs toActivator.CreateInstance 方法 (Type) 的用法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

db2 reorg详解

reorgchk,检查tableindex是否需要重组。reorg重组,重新放置数据位置。5)db.tb_reorg_req运行状况指示器处于ATTENTION状态。可以分为对系统表和用户表两部分分别进行REORGCHK:1)针对系统表进行REORGCHKdb2reorgchkupdatestatisticsontablesystem使用UPDATESTAT...

Nginx设置KeepAlive为close

以腾讯首页为例,就有很多是请求是在客户端发生请求后,服务器响应完就立即关闭了。nginx不像apache,直接有指令keep-aliveoff/on;它使用的是keepalive_timeout[time],默认的时长为75,可以在http、server、location使用此指令。...

【646】灰度图array转为RGB三通道array

可以使用两种方法:numpy可以通过cv2.cvtColor函数自行实现。灰度图像可以转换为RGB的所谓灰度图像,分成三个通道,这意味着三个通道都是相同的信息,相当于相同维度信息的重复。主要通过numpy实现。阵列,其可以类似于广播的形式实现。...

TabWidget修改tab颜色,自定义样式

您可以通过tabWidget-˃setStyleSheet方法设置样式,包括选项卡样式。...

Spring Boot 核心配置文件 bootstrap & application

boostrap由父ApplicationContext加载,比applicaton优先加载boostrap里面的属性不能被覆盖3、bootstrap/application的应用场景application配置文件这个容易理解,主要用于SpringBoot项目的自动化配置。这个父级的SpringApplicationContext是先加载的,在加载appli...

HTML中canvas的大小调整

今天用到canvas元素,发现它的大小不是像普通dom元素一样,直接设置css样式可以改变的,它会由自己原本的大小伸缩。例如,1.如果直接在canvas元素中添加style='300px;height:300px',这会导致伸缩,如图2.换种方式在css样式表中加入样式设置宽高产生的效果也是一样的。...