RFCOMM提供基于L2CAP协议的串口仿真。
1: 字节序列
所有的二进制数据都是由低位到高位排列,从左向右读。(小端(little endian)排序)
2:RFCOMM 帧结构
There is always exactly one RFCOMM frame contained in each L2CAP frame.
RFCOMM中不使用GSM 07.10 中的打开关闭标志。仅仅使用包含在L2CAP层和RFCOMM层间交换标志中的那些域
2.1 地址字段
地址字段占用一个字节,包括data link connection identifier(DLCI),CR,EA。
EA表示地址扩展,为1表示:地址字段只有当前这个字节,为0表示:后续的一个字节也属于地址字段。目前还没有地址扩展的情况。
CR(command/response)表示:这个帧作为命令还是响应。
Table 1:Command/response bit usage
Command/response |
Direction |
C/Rvalue |
||
Command |
Initiator |
¾¾® |
Responder |
1 |
|
Responder |
¾¾® |
Initiator |
0 |
Response |
Initiator |
¾¾® |
Responder |
0 |
|
Responder |
¾¾® |
Initiator |
1 |
Initiator 是初始化多路复用器MUX的一方,Responder是响应MUX初始化的一方。
-----------------------------RFCOMM server channel分配 start------------------------
RFCOMM的server channel 编号是GSM 70.10的地址字段DLCI的bits位的子集。
服务器应用程序注册;一个RFCOMM 服务接口被分配的信道号在1-30之间。[0和31不能被使用,因为对应的DLCIs被保留在GSM70.10,0和31对应与DLCI1和DLCI63/DLCI62的高5位。server channel 占5个bit,0=00000,31=11111,分别对于DLCI1=000000,DLCI62=111110,DLCI63=111111的高5位。]
这个值应该被注册到SDP的数据库中。
对于一个initiating设备方向位D=1,反之为0.当在一个已经存在的RFCOMM session上建立数据链路的时候,方向位和sercer channel配合来确定DLCI连接到一个特定的应用,这个DLCI此后被两个端点之间两个方向上的数据包共用。也就是说D位+server channel就是GSM 70.10上的DLCI。
实际上,对于非发起方的服务器应用数据被路由到DLCIs 2,4...60。发起方被路由到3,5...61。【这个可以参照GSM 70.10 的DLCI分配】。
------------------------------RFCOMM server channel分配 start------------------------
------------------------------GSM 07.10 DLCI分配 start------------------------
DLCI被用来标志一个唯一的数据流,以及TE和MS之间的信道。DLCI 是动态分配的。
DLCI值域实际上分为两部分:非发起方设备上的应用使用DLCI偶数号(2,4,…,60)访问,发起方设备上的应用则使用DLCI奇数号(3,5,…,61)访问。
注意:对于一个支持多路同步RFCOMM会话的设备而言,方向位不一定在所有会话中都一致。
DLC0:控制信道,DLCI1,DLCI62,DLCI63保留.
DLCI分配表:
Table27: DLCI Assignments
Usage |
DLCInumber (decimal) |
Priority |
Multiplexercontrol channel |
0 |
0 |
ATcommands (07.07 and 07.05) |
1-7 |
7 |
ATcommands (07.07 and 07.05) |
8-15 |
15 |
ATcommands (07.07 and 07.05) |
16-23 |
23 |
ATcommands (07.07 and 07.05) |
24-31 |
31 |
ATcommands (07.07 and 07.05) |
32-39 |
39 |
ATcommands (07.07 and 07.05) |
40-47 |
47 |
ATcommands (07.07 and 07.05) |
48-55 |
55 |
ATcommands (07.07 and 07.05) |
56-61 |
61 |
Reserved |
62-63 |
|
------------------------------GSM 07.10 DLCI分配 end------------------------
2.2 控制字段
控制字段用于定义帧的类型:
2.3 长度字段
EA表示扩展位,1:只包含本字节,0表示包含后续一个字节。
长度字段应该包含在每个帧中,即使信息字段是空的帧。
2.4 信息字段
信息字段是帧的有效负载,承载用户信息(AT命令,ppp数据),信息字段仅包含在UIH帧,
2.5 FCS (frame check sequence)
对于不同的帧类型在不同的字段上进行计算。
• For SABM, DISC, UA, DM frames: on Address, Control and Length field.
• For UIH frames: on Address and Control field.
5.2 GSM 多路复用的打开的关闭流程
RFCOMM 不知值 GSM 07.10 规范中的5.7节定义的关闭/打开流程,也就是说不支持AT命令AT+CMUX和多路复用器的关闭指令。
在任一时间,两个配对的设备间最多有一个RFCOMM会话。
当建立一个新的DLC,发起方应当检查同远端设备之间是否存在一个RFCOMM Session,如果存在,在这个Session上建立新的DLC。一个RFCOMM session由两个通信终端的蓝牙地址唯一标示。
5.2.1 启动流程
建立两个设备间的第一个仿真串口连接的设备负责建立复用器的控制信道。
1):使用L2CAP service primitives和对端设备建立一条L2CAP信道。
2):在DLC0控制信道发送SABM命令开启RFCOMM多路复用器,等待对端设备的UA响应。
在这些步骤之后,用于用户数据传输的DLCx通道可以被建立起来了。
有可能在一个已经存在的基带连接上,两个设备之间同时去建立RFCOMM Session,体现为RFCOMM 实体在发出一个一个建立L2CAP请求后收到一个L2CAP的连接指示,在这个情况下RFCOMM实体应当拒绝(respond negatively不能确定翻译的是否正确)这个收到的连接指示。如何解决得看具体的实现(例如:在一定时间内重试或者由用户手动重试)。
5.2.2 关闭流程
关闭特定会话上最后一个连接(DLC)的设备通过关闭相应的L2CAP信道来负责关闭多路复用器。
在关闭L2CAP之前,关闭最后一个连接的设备可以在DLC0发送DISC命令,其他的设备响应这个DISC通过UA。
5.2.3 链路丢失
如果收到L2CAP链路丢失通知,本地的RFCOMM实体发送链接丢失通知给每一个激活的DLC上的端口仿真/代理实体,所有和此session相关的资源被释放。
端口仿真/代理实体的动作取决于上层的API,假设设备是DTE,对于一个仿真串口端口,将会撤销CD, DSR and CTS信号。
5.4DLCI的分配和RFCOMM server channel
请参考本节 2.1 地址字段
7 与其他实体的互操作性
7.1 端口仿真和端口代理
设备1是是像计算机,打印机这样的通信设备,设备2是通信段的一部分,例如:Modems
7.1.1 端口仿真实体
端口仿真实体映射系统特定的通信接口到RFCOMM服务
7.1.2 端口代理实体
端口代理实体从RFCOMM转发数据到连接着DCE设备的外部RS-232接口。
7.2 服务的注册的搜索
暂时略。。。
参考:bluetooth RFCOMM 协议
蓝牙协议及其源代码分析(金纯等)
GSM 07.10
GSM_MUX_AN_V1.00