蓝⽛RFCOMM协议
零.概述
本⽂章主要讲下蓝⽛RFCOMM协议(bluetoothrfcomm)的帧格式,包括Address,Control,LengthIndicator,Information,FCS等
⼀.声明
本专栏⽂章我们会以连载的⽅式持续更新,本专栏计划更新内容如下:
第⼀篇:蓝⽛综合介绍,主要介绍蓝⽛的⼀些概念,产⽣背景,发展轨迹,市⾯蓝⽛介绍,以及蓝⽛开发板介绍。
第⼆篇:Transport层介绍,主要介绍蓝⽛协议栈跟蓝⽛芯⽚之前的硬件传输协议,⽐如基于UART的H4,H5,BCSP,基于USB的H2等
第三篇:传统蓝⽛controller介绍,主要介绍传统蓝⽛芯⽚的介绍,包括射频层(RF),基带层(baband),链路管理层(LMP)等
第四篇:传统蓝⽛host介绍,主要介绍传统蓝⽛的协议栈,⽐如
HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等⼀系列的协议吧。
第五篇:低功耗蓝⽛controller介绍,主要介绍低功耗蓝⽛芯⽚,包括物理层(PHY),链路层(LL)
第六篇:低功耗蓝⽛host介绍,低功耗蓝⽛协议栈的介绍,包括HCI,L2CAP,ATT,GATT,SM等
第七篇:蓝⽛芯⽚介绍,主要介绍⼀些蓝⽛芯⽚的初始化流程,基于HCIvendorcommand的扩展
第⼋篇:附录,主要介绍以上常⽤名词的介绍以及⼀些特殊流程的介绍等。
另外,开发板如下所⽰,对于想学习蓝⽛协议栈的最好⼈⼿⼀套。以便更好的学习蓝⽛协议栈,相信我,学完这⼀套视频你将拥有修改任何
协议栈的能⼒(⽐如Linux下的bluez,Android下的bluedroid)。
-------------------------------------------------------------------------------------------------------------------------
蓝⽛交流扣扣群:970324688
--------------------------------------------------------------------------------------------------------------------------
⼆.RFCOMM帧格式
2.1参数Address:
EA参数:这部分在蓝⽛RFCOMM协议中⼀直为1
C/R参数:此部分是代表RFCOMM的command还是respon,官⽅解释如下:
这个理解起来稍微我有绕,我翻译⼀下:
C/R(命令/响应)位表⽰帧是命令还是响应,它的值不仅取决于帧是否携带命令或响应,还有信道的哪⼀端发送帧。建⽴连接的设备(通过在
DLCI0上发送SABM命令)称为initiator。响应的设备(通过在DLCI0上发送UA响应)称为responder。⽹络上都对这个地⽅说明的模凌两
可,对于上⾯的这段话其实也说的模棱两可,我来总结下:
1)对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,initiator发送给responder,C/R=1,respon相应initiatorC/R也为1。
2)对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,respon发送给initiatorC/R为0,initiator响应给responder,C/R=0.
3)对于UIH帧,这个称为数据帧,initiator发送给responder,C/R=1,respon发送给initiatorC/R为0.
总结图标如下:
为了便于我上⾯的总结理解,那么加⼀个流程图,来加深你们的印象
下⾯我们⽤BTsnopp来⼀⼀看下以上个3ca:
1)对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,initiator发送给responder,C/R=1,respon相应initiatorC/R也为1。
分别解析如下:
从截图看出是对⽅来连接我们signaling,所以对⽅是initiator,所以对⽅发送SABM种的C/R是1,⽽我们回复的UA帧中的C/R也为1
以下例⼦都是以对⽅为initiator来说明
2)对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,respon发送给initiatorC/R为0,initiator响应给responder,C/R=0.
从1)中我们可以看到我们是responder,对⽅是initiator,所以按照我们发送给对⽅的SABM帧的C/R是0,对⽅回应我们的也是0
3)对于UIH帧,这个称为数据帧,initiator发送给responder,C/R=1,respon发送给initiatorC/R为0.
上图解析如下:
可以看到对⽅给我们的UIH帧C/R为1,我们给对⽅的UIH帧C/R为0
讲到这⾥你应该明⽩了C/R位了吧,我感觉我是全⽹在这⾥说明最清晰的。
D参数:这个同样⽐较绕,我们来看下官⽅解释
D其实就是DLCI中的directionbit
⽹上也没有⼀个特别明确的说明,我⾃⼰总结了下,感觉也是⽐较清晰:
建⽴连接的设备(通过在DLCI0上发送SABM命令)称为initiator。响应的设备(通过在DLCI0上发送UA响应)称为responder,这点在上⾯我
们也已经说明了。initiator⾃⼰的D=1,responder⾃⼰的D=0,所以如果在DLCI已经建⽴连接后,后续initiator连接responder某⼀个
profile的时候(⽐如HFP),那么应该是DCLI=0+rverchanel<<1,如果是responder连接initiator的某⼀个profile,那么应该是
DCLI=1+rverchannel<<1
后续交互封包的UIH的DCLI⼀直不变
举⼏个例⼦来说明下这⾥(remote是initiator,local是responder):
来⼀个initiator连接responder的btsnoop
可以发现rverchannel是9,那么按照算法应该是0+9<<1,所以DCLI应该是0x12
来⼀个responder连接initiator的btsnoop
可以发现rverchannel是13,那么按照算法应该是1+13<<1,所以DCLI应该是0x1B
Serverchannel:说⽩了就是上层profile的rfcommchannel
注册到SDP中,整个流程就是SDP问询对⽅的RFCOMMchannel,然后再发起RFCOMM的连接(⽐如HFP,HSP,SPP,OPP等),连接完毕
交互完参数,就相当于上层profile连接成功
2.2Control参数
主要是标⽰RFCOMMframetype是什么,截图如下:
帧分别作⽤如下:
SABM:异步平衡模式设置指令SABM命令可以⽤在异步平衡模式下,并且它的控制字段只能有⼀个字节。设备通过⾸先发送UA应答来
确认接收到SABM命令,DLC发送和接收状态变量都必须设定为0。⽤⼤⽩话讲就是连接命令
UA:未加编号的确认应答。UA应答⽤在设备对接收到SABM和DISC后的确认应答
DM:断开连接模式应答。DM应答是⽤来报告设备从数据链路逻辑地断开连接这么⼀种状态的。在断开模式下,不⽀持任何命令,直到收
到了SABM命令,然后停⽌断开模式。在断开模式下,接收到了DISC命令,则要向对⽅发送⼀个DM应答。
DISC:断开连接指令。⽤DISC命令可以⽤来结束⼀个正在运⾏或者刚刚开始的模式。它就是通知⼀⽅另⼀⽅悬置操作,设备必须假定⼀
个逻辑断开模式。在执⾏这个命令之前,接收设备要通过发送UA应答来确认接受DISC命令。在DLCI0中,DISC命令的发送也和其他
的DLCI具有同意的意思。
UIH:带头校验的未编号信息命令和应答⽤UIH命令/应答可以通过不影响V(S)或V(R)变量来相互发送信息。UIH是⽤在传输⼀些信息的
完整性没有它要在正确的DLCI上传输重要的情况下的。FCS只在地址和控制字段进⾏计算。UIH⽤于对差错码要求不是很⾼的场合,如
语⾳。
P/FBit:P/F是Poll/Final位
在Commands中,被称为P(poll)位;⽽在Respons中则被称为F(final)位,⼤概⽤法我⾃⼰总结如下:
1)对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,command跟respon都设置为1就好。
2)对于UIH帧,除了给对⽅credit设置为1外,UIHur帧以及UIH多路控制帧都设置为0就好了。
2.3LengthIndicator参数
L1到L7位表⽰数据字段的长度,其默认值为31字节。同样,它可以根据EA位进⾏扩展。当EA=0时,它接下来的字节如下表表⽰就
可以表⽰15个数字。也就是RFCOMM的后续len是32~32767byte的字节。
2.4InformationField参数
UIH帧数据,只对UIH帧有效,后续再⼀⼀介绍下UIH的格式
2.5FCS参数
帧校验序列(FCS)根据不同帧类型在不同域集上进⾏运算.下⾯列出需要进⾏帧运算的字段:
对于SABM、DISC、UA、DM帧:在地址、控制和长度标志字段上进⾏运算;
对于UIH帧:在地址和控制字段上进⾏运算
本文发布于:2022-12-28 07:43:03,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/45474.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |