RFCOMM 协议学习

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被用来标志一个唯一的数据流,以及TEMS之间的信道。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 控制字段

控制字段用于定义帧的类型:



P/F 表示Poll/Final(具体用法还不清楚) 

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值