5 GSM 07.10 Adaptations for RFCOMM
5.1 Media Adaptation
GSM 07.10的打开和关闭标志在RFCOMM中不再使用。取而代之的是RFCOMM层和L2CAP层之间交换的标志字段。通常每个L2CAP帧中都有一个RFCOMM帧,架构如下:
5.1.1 FCS calculation
GSM 07.10中,FCS对于不同命令,是根据不同字段计算的:
- SABM, DISC, UA, DM帧:基于address, control 和 length字段计算
- UIH帧:基于address和control字段计算
5.1.2 P/F-Bit
Control字段中有1bit位作为P/F-Bit. 根据GSM 07.10计算P/F-Bit值。当开启流控时,UIF帧的P/F-Bit会被重新定义。
5.1.3 CR Bit
GSM 07.10定义了2个C/R-bit,一个在frame level,一个在message level,2个相互独立。都是在GSM 07.10中定义的。
5.2 GSM 07.10 Multiplexer Start-up and Closedown Procedure
原GSM 07.10中的开启和关闭过程不再适用,这也意味着RFCOMM不支持AT-command和AT+CMUX,Close down(CLD)也不支持。
在任意时刻,配对过的设备之间都必须至少有一个RFCOMM会话。当需要建立新的DLC时,需要先检查与远端设备之间是否已经有RFCOMM会话,如果有,则建立一个新的DLC,会话是通过2端蓝牙地址来标识的。这也意味着当回复一个L2CAP的连接建立时,RFCOMM实体需要根据远端蓝牙地址来保存和标识这个新的RFCOMM会话,为后续建立DLC做准备。
5.2.1 Start-up Procedure
当2个设备之间第一次建立模拟串口连接时,需先建立多路控制信道:
-
建立一个L2CAP信道来peer RFCOMM实体
-
通过在DLCI 0上发送SABM命令来开启RFCOMM多路器,等到对方的UA回复
完成这些步骤后,用于用户通信的DLCs才能被建立。
当2个RFCOMM实体在一个baseband连接上同时发送建立RFCOMM会话时,RFCOMM实体会消极回复连接建立,后续措施由各家stack自己定(如后退随机时间,或是由用户决定是否重试)
5.2.2 Close-down Procedure
设备关闭最后的DLC时需要通过关闭L2CAP信道来关闭多路器。
在关闭L2CAP信道前,设备关闭连接时可以通过在DLCI 0 上发送DISC,远端设备回复UA。
5.2.3 Link Loss Handling
如果收到L2CAP的link loss信息,那本地RFCOMM实体需要一个连接loss信息给模拟实体发给所有进行中的DLC,然后相关的所有RFCOMM会话都会结束释放。
5.3 System Parameters
下表是GSM 07.10中的默认参数值:
timer T1只用于P/F-Bit设为1的帧,对于RFCOMM来说,就是SABM和DISC。timer T2用于DLCI 0 上的UIH消息。timer可以按上表任意设置,但是在发送SABM去建立新的DLC(DLCI > 0)时,T1必须设置为60 - 300s.
因为RFCOMM是有更底层来保证传输可靠性,所以超时默认关闭多路器会话。
做为接收方,如果已经有一个RFCOMM认证过程,那么在接收到SABM帧时必须结束,而不是收到配置命令准备DLC时。
5.4 DLCI allocation with RFCOMM Server Channels
由于RFCOMM会话两段都可以作为客户端和服务器,两段客户端发起的连接会话相互独立,所以DLCI值根据RFCOMM服务器信道和方向标识来区分。
RFCOMM服务器信道号是GSM 07.10中对应DLCI字段的其中几个bit位
RFCOMM分给服务器信道的信道号是从1到30,0和31号不能用,因为在GSM 07.10中已保留。信道号需登记在Service Discovery Database(第7章)中。
在RFCOMM会话中,初始设备的方向标识D=1,远端设备D=0。当在一个RFCOMM会话上建立一个新的DLC时,方向标识和服务器信道来共同决定DLCI。这个DLCI后期会用在这2个设备间的所有包的传输。
实际上,DLCI值在非初始设备上一般是DLCIs 2, 4, 6, ... , 60,初始设备上一般是DLCIs 3, 5, 7, ... , 61。
一个RFCOMM实体在一个已有的RFCOMM会话上建立一个新的DLC,它的DLCI由远端应用的服务器信道号和自身方向标识的反向来决定。
DLCIs 1和62-63 在RFCOMM中不可用。
5.5 Multiplexer Control Commands
在GSM 07.10中,当相关DLC还没建立起来的时候,一些多路器命令会转移到控制信道(DLCI 0),可以参考PN和RPN命令。当收到DISC命令后,所有的状态都需要恢复到默认值,来保证下次DLC的建立,不需要考虑历史遗留问题。
如果收到一个命令,它的相关DLCI并没有打开,那么多路器会回复一个DM帧,来表示相关DLCI没有开启,后续的DLCI建立命令也不会同意,即后续的SABM也还是会被回复DM。
在GSM 07.10中,可以将多个多路器控制信息放在一个帧中,只要没有达到最大帧长限制。但是在RFCOMM中,这样是不可以的。
5.5.1 Remote Port Negotiation Command(RPN)
RPN命令用在新的DLC建立之前和任意端口设置改变时。
RPN命令在GSM 07.10中是可选的,但是RFCOMM必须识别和回复它,但是对于设置改变的处理是可自定义的。
5.5.2 Remote Line Status Command(RLS)
这个命令用来指示远端端口状态。
RLS命令在GSM 07.10中是可选的,但是RFCOMM必须识别和回复它,但是对于设置改变的处理是可自定义的。
5.5.3 DLC Parameter Negotiation(PN)
PN命令在GSM 07.10中是可选的,但是RFCOMM必须可用。这个命令在建第一个DLC前必须用。
PN命令中的一些信息对RFCOMM并不适用,需要发送方提前设置为默认值,接收方会无视。
CL1-CL4字段完全重新定义。在RFCOMM中,蓝牙版本小于v1.0B,这个字段必须为0.
PN请求优先于DLC建立命令。
收到PN命令后回复PN回答或是DM。PN命令中包含最大帧长,如果接收方最大帧长小于发送方,接收方在回复PN命令时会更新其中的最大帧长。如果接收放不想建立连接,可以回复DM。发送方接收到更新过的最大帧长,如果接收则更将这个最大帧长作为后续实际发送的最大帧长,如果不接受不建立连接,则可发送DM或DISC。
如果在建立连接前没有通过PN命令交换信息,则双方都用RFCOMM默认值