精华内容
下载资源
问答
  • 本文章主要讲下蓝牙RFCOMM协议(bluetooth rfcomm)的概念以及在整个蓝牙协议栈中的起的作用 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的...

    零. 概述

    本文章主要讲下蓝牙RFCOMM协议(bluetooth rfcomm)的帧格式,包括Address,Control,Length Indicator,Information,FCS等

    一. 声明

    本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

    第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

    第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等

    第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(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等

    第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展

    第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。

    另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。

    -------------------------------------------------------------------------------------------------------------------------

    CSDN学院链接(进入选择你想要学习的课程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144

    蓝牙交流扣扣群:970324688

    Github代码:https://github.com/sj15712795029/bluetooth_stack

    入手开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708

    蓝牙学习目录https://blog.csdn.net/XiaoXiaoPengBo/article/details/107727900

    --------------------------------------------------------------------------------------------------------------------------

    二.RFCOMM帧格式

    2.1 参数Address:

    EA参数:这部分在蓝牙RFCOMM协议中一直为1

    C/R参数:此部分是代表RFCOMM的command还是response,官方解释如下:

    这个理解起来稍微我有绕,我翻译一下:

    C/R(命令/响应)位表示帧是命令还是响应,它的值不仅取决于帧是否携带命令或响应,还有信道的哪一端发送帧。建立连接的设备(通过在DLCI 0上发送SABM命令)称为initiator。响应的设备(通过在DLCI 0上发送UA响应)称为responder。网络上都对这个地方说明的模凌两可,对于上面的这段话其实也说的模棱两可,我来总结下:

    1)对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,initiator发送给responder,C/R=1,response相应initiator C/R也为1。

    2)对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,response发送给initiator C/R为0,initiator响应给responder,C/R=0.

    3)对于UIH帧,这个称为数据帧,initiator发送给responder,C/R=1,response发送给initiator C/R为0.

    总结图标如下:

    为了便于我上面的总结理解,那么加一个流程图,来加深你们的印象

    下面我们用BTsnopp来一一看下以上个3case:

    1)对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,initiator发送给responder,C/R=1,response相应initiator C/R也为1。

    分别解析如下:

    从截图看出是对方来连接我们signaling,所以对方是initiator,所以对方发送SABM种的C/R是1,而我们回复的UA帧中的C/R也为1

    以下例子都是以对方为initiator来说明

    2)对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,response发送给initiator C/R为0,initiator响应给responder,C/R=0.

    从1)中我们可以看到我们是responder,对方是initiator,所以按照我们发送给对方的SABM帧的C/R是0,对方回应我们的也是0

    3)对于UIH帧,这个称为数据帧,initiator发送给responder,C/R=1,response发送给initiator C/R为0.

    上图解析如下:

    可以看到对方给我们的UIH帧C/R为1,我们给对方的UIH帧C/R为0

    讲到这里你应该明白了C/R位了吧,我感觉我是全网在这里说明最清晰的。

    D参数:这个同样比较绕,我们来看下官方解释

    D其实就是DLCI中的direction bit

    网上也没有一个特别明确的说明,我自己总结了下,感觉也是比较清晰:

    建立连接的设备(通过在DLCI 0上发送SABM命令)称为initiator。响应的设备(通过在DLCI 0上发送UA响应)称为responder,这点在上面我们也已经说明了。initiator自己的D=1,responder自己的D=0,所以如果在DLCI已经建立连接后,后续initiator连接responder某一个profile的时候(比如HFP),那么应该是DCLI=0+ server chanel<<1,如果是responder连接initiator的某一个profile,那么应该是DCLI=1+ server channel<<1

    后续交互封包的UIH的DCLI一直不变

    举几个例子来说明下这里(remote是initiator,local是responder):

    来一个initiator连接responder的btsnoop

    可以发现server channel是9,那么按照算法应该是0+9<<1,所以DCLI应该是0x12

    来一个responder连接initiator的btsnoop

    可以发现server channel是13,那么按照算法应该是1+13<<1,所以DCLI应该是0x1B

    Server channel:说白了就是上层profile的rfcomm channel

    注册到SDP中,整个流程就是SDP问询对方的RFCOMM channel,然后再发起RFCOMM的连接(比如HFP,HSP,SPP,OPP等),连接完毕交互完参数,就相当于上层profile连接成功

    2.2 Control参数

    主要是标示RFCOMM frame type是什么,截图如下:

    帧分别作用如下:

    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/F Bit:P/F是Poll/Final位

    在Commands中,被称为P(poll)位;而在Responses中则被称为F(final)位,大概用法我自己总结如下:

    1)对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,command跟response都设置为1就好。

    2)对于UIH帧,除了给对方credit设置为1外,UIH user帧以及UIH多路控制帧都设置为0就好了。

    2.3 Length Indicator参数

    L1 到 L7 位表示数据字段的长度,其默认值为 31 字节。同样,它可以根据 EA位进行扩展。当 EA=0 时,它接下来的字节如下表表示就可以表示 15 个数字。也就是RFCOMM的后续len是32~32767 byte的字节。

    2.4 Information Field参数

    UIH帧数据,只对UIH帧有效,后续再一一介绍下UIH的格式

    2.5 FCS参数

    帧校验序列(FCS)根据不同帧类型在不同域集上进行运算.下面列出需要进行帧运算的字段:

    对于 SABM、DISC、UA、DM 帧:在地址、控制和长度标志字段上进行运算;

    对于 UIH 帧:在地址和控制字段上进行运算。

    展开全文
  • 本文章主要讲下蓝牙RFCOMM协议部分流控介绍 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,...

    零. 概述

    本文章主要讲下蓝牙协议栈RFCOMM协议部分流控介绍

    一. 声明

    本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

    第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

    第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等

    第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(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等

    第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展

    第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。

    另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。

    -------------------------------------------------------------------------------------------------------------------------

    CSDN学院链接(进入选择你想要学习的课程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144

    蓝牙交流扣扣群:970324688

    Github代码:https://github.com/sj15712795029/bluetooth_stack

    入手开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708

    蓝牙学习目录https://blog.csdn.net/XiaoXiaoPengBo/article/details/107727900

    --------------------------------------------------------------------------------------------------------------------------

    二. RFCOMM流程介绍

    我们来介绍下一个例子,从RFCOMM signaling通道的连接到其他server channel的连接,数据交互,以及断开的流程来整个分析下,分别会包含flow以及raw data介绍,主要是达到回顾下上面说的内容,对知识点做一个巩固

    整个交互流程如下:

    主要步骤整理如下:

    1)RFCOMM对方(之所以成为对方,是因为那个箭头)来来连接signaling通道,我们回应

    2)交互PN UIH封包

    3)对方来连接server channel 9

    4)发送UIH给对方credit card

    5)交互MSC UIH封包

    6)交互UIH帧

    7)我们主动断开server channel13

    8)我们主动断开server channel13

    9)我们主动断开server channel9

    由于对方来连接signaling channel,也就是rfcomm channel0,所以对方是initiator,我方是responser.这是大前提要记住!

    另外,我们再来贴下整个rfcomm的封包结构

    其中address格式为:

    control格式为:

    Length的格式如下:

    多路控制通道的格式为:

    步骤1)RFCOMM对方来来连接signaling通道,我们回应

    ①对方来连接我们,rfcomm raw data为03 3F 01 1C(hex数据)

    03 = 0000 0011b 那么EA=1,C/R=1,也就是command,DLCI为0,也就是signaling channel

    3F = 0011 1111b ,也就是SABM,P/F为1

     

    01 = 0000 0001b,EA=1,也就是只有1个byte,也就是L1~L7标示后续封包的长度,也就是0

    1C ,FCS

    为了验证下,我们来跟btsnoop对比下

    ②我们回应对方的signaling channel的连接,rfcomm raw data为03 73 01 D7(hex数据)

    03 = 0000 0011b,那么EA=1,C/R=1,也就是command,DLCI为0,也就是signaling channel

    73 = 0111 0011,UA帧,p/f为1

     

    01 = 0000 0001b,EA=1,也就是只有1个byte,也就是L1~L7标示后续封包的长度,也就是0

    1c也就是fcs

    为了验证下,我们来跟btsnoop对比下

    步骤2)交互PN UIH封包

    ①对方发PN UIH,rfcomm raw data为03 EF 15 83 11 12 F0 00 00 FA 03 00 00 70(hex data)

    03 = 0000 0011b,那么EA=1,C/R=1,也就是command,DLCI为0,也就是signaling channel

    EF = 0111 1111b,UIH帧,P/F为1

     

    15 = 0001 0101 ,EA=1,所以只有1个byte代表长度,0001 010b代表长度,也就是10byte

    83 = 1000 0011,是多路控制的type,可以看到EA=1,C/R=1,type是PN

    11 = 0001 0001b ,EA=1,len = 0001 000,也就是8byte

    剩下的就是PN具体的格式,先列一下格式再分析raw data

    12 = 0001 0010b,也就是DLCI为01 0010b,DLCI为0x12,server channel为0x12>>1,也就是9

    F0 = 1111 0000b,也就是UIH帧,CL为0

    00 = 0000 0000b,priority为0,也就是最高优先级

    00 = 0000 0000b,T为0

    FA 03, N也就是0x3FA,也就是最大的frame size为1018byte(上层协议会用到此部分)

    00 ,NA为0

    00,K为0

    70->FCS

    我们来看下btsnoop是否跟我们分析的一样

    可以看到完全一致

    ②我们发PN UIH

    参照①所讲,都是PN分包,不做具体分析

    步骤3)对方来连接server channel 9,我们回应

    ①对方来连接server channel9,rfcomm raw data为4B 3F 01 32(hex data)

    4B = 0100 1011b,那么EA=1,C/R=1,也就是command,DLCI为0100 10,也就是0x12,由于我们前面讲了DLCI是D+server channel,initiator连接responder算法应该是DCLI=0+ server chanel<<1,所以部分就是signaling channel应该为9,D=0

    3F = 0011 1111b,P/F为1,是SABM帧

     

    01 = 0000 0001b,EA=1,也就是只有1个byte,也就是L1~L7标示后续封包的长度,也就是0

    32也就是fcs

    我们来看下btsnoop

    ②我们回应对方的连接,rfcomm raw data为4B 73 01 F9(hex data)

    4B = 0100 1011b,那么EA=1,C/R=1,也就是command,DLCI为0100 10,也就是0x12,server channel为9

    73 = 0111 0011b,P/F=1,UA帧

     

    01 = 0000 0001b,EA=1,也就是只有1个byte,也就是L1~L7标示后续封包的长度,也就是0

    F9也就是fcs

    我们来看下btsnoop

    步骤4)发送UIH给对方credit card

    在这里又回牵扯到一个知识点,credit,如果UIH是在signaling通道发送,并且P/F=0那么就会普通的user数据,如果P/F=1,那么就是给对方credit,credit给对方10,那么在我们不补充的情况下,对方只能发送10包rfcomm数据,同样道理,对方也会给我们credit

    Raw data为49 FF 01 07 08(hex数据)

    49 = 0100 1001b,那么EA=1,C/R=0,也就是response,DLCI为0100 10,也就是0x12,server channel为9

    FF = 1111 1111b,P/F=1,UIH帧,也就是给对方补充credit card

     

    01 = 0000 0001b,EA=1,也就是只有1个byte,也就是L1~L7标示后续封包的长度,也就是0

    07 也就是给对方补充7个credit

    08也就是fcs

    Btsnoop如图

    可以看到给对方补充了7个credit

    另外,raw data解析如图:

    步骤5)交互MSC UIH封包

    ①我方发送MSC封包,rfcomm raw data为01 EF 09 E3 05 4B 8D AA(hex data)

    01 = 0000 0001b,那么EA=1,C/R=0,DLCI为0

    EF = 1110 1111b,P/F=0,为UIH帧类型

     

    09 = 0000 1001b,EA=1,length为0000 100b也就是只有4个byte

    E3 = 1110 0011b,也就是MSC帧

    05 = 0000 0101b,EA=1,length为0000 010b,也就是2个byte

    4B = 0100 1011b,EA=1 CR=1,D=0,server channel=9

    8D = 1000 1101b,此部分为V.24的格式,如图

    可以对比看到EA=1,FC=0,RTC=1,RTR=1 IC=0,DV=1

    截个btsnoop看下

    ②对方回复MSC UIH

    此部分不再做raw data说明,一样的分析流程

    步骤6)交互UIH帧

    前面已经讲过,我们就不做介绍

    步骤7)我们主动断开server channel13

    ①我们主动断开server chanel13,rfcomm raw data为6D 53 01 A5(hex data)

    6D = 0110 1101b,EA=1,C/R=0,DLCI=0110 11,D=1,server channel = 13

    53 = 0101 0011b,P/F=1,为DISC帧

    01 = 0000 0001b,EA=1,也就是只有1个byte,也就是L1~L7标示后续封包的长度,也就是0

    A5也就是fcs

    我们来看下btsnoop

    ②对方回应我们发送的断开消息,rfcomm raw data为6D 73 01 8F(hex data)

    6D = 0110 1101b,EA=1,C/R=0,DLCI=0110 11,D=1,server channel = 13

    73 = 0111 0011b ,P/F=1,UA帧

    01 = 0000 0001b,EA=1,也就是只有1个byte,也就是L1~L7标示后续封包的长度,也就是0

    8f也就是fcs

    我们来贴下btsnoop

    步骤8)我们主动断开server channel9

    可以直接参照步骤7

    展开全文
  • 本文章主要讲下蓝牙RFCOMM协议多路控制通道(MULTIPLEXOR FRAMES),包括一下几种 • PN—DLC parameter negotiation. • Test—Checks communication link. • FCon / FCoff—Aggregate flow control on all ...

    零. 概述

    本文章主要讲下蓝牙RFCOMM协议多路控制通道(MULTIPLEXOR FRAMES),包括一下几种

    • PN—DLC parameter negotiation.

    • Test—Checks communication link.

    • FCon / FCoff—Aggregate flow control on all connections.

    • MSC—Modem status, used for flow control per connection.

    • RPN—Remote Port Negotiation.

    • RLS—Remote Line Status.

    • NSC—Non-Supported Command (response only).

    一. 声明

    本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

    第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

    第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等

    第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(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等

    第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展

    第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。

    另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。

    -------------------------------------------------------------------------------------------------------------------------

    CSDN学院链接(进入选择你想要学习的课程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144

    蓝牙交流扣扣群:970324688

    Github代码:https://github.com/sj15712795029/bluetooth_stack

    入手开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708

    蓝牙学习目录https://blog.csdn.net/XiaoXiaoPengBo/article/details/107727900

    --------------------------------------------------------------------------------------------------------------------------

    二. 多路控制帧(MULTIPLEXOR FRAMES)

    多路控制通道主要在DLCI=0发送的,主要用来控制RFCOMM的连接,来协商一些参数,主要有以下类型:

    • PN—DLC parameter negotiation.

    • Test—Checks communication link.

    • FCon / FCoff—Aggregate flow control on all connections.

    • MSC—Modem status, used for flow control per connection.

    • RPN—Remote Port Negotiation.

    • RLS—Remote Line Status.

    • NSC—Non-Supported Command (response only).

    主要基于UIH control frame来发送,多路控制的数据格式如下,红框为多路控制帧的格式

    Type参数格式如下图所示:

    当EA为1时表示这是最后一个字节,当为0时则表示有扩展的字节表述,如下图:

    T位代表类型编码下面我们就来一一说下每个command。

    2.1 PN—DLC Parameter Negotiation

    在 DLC 建立之前,要用 PN 进行参数协商,整个PN的封包格式如下:

    Length一直为8

    后续的value格式如下:

    其中D1~D6是DLCI

    I1~I4定义了在指定 DLC 上传输信息帧的类型,如下,但是我们此部分只选择UIH帧

    CL 1~4位定义了在指定 DLCI 上的汇聚层类型,如下表所示:

    P1~P6位表示在指定 DLC 上所分配的优先级,范围从 0 到 63,0 的优先级最高:

    T 位表示 acknowledgement timer (T1)的值

    N 位表示 maximum frame size (N1)的值。

    NA-位表示 maximum number of retransmissions (N2)

    K 位表示纠错模式下窗口大小

    来一个sample后续的value如下:

    2 .2 Test Command (Test)

    测试命令,类型代码是 000100,长度字节为 0,后面没有参数。

    2.3 Flow Control On Command (FCon)

    流控开启命令,类型代码为 000101,长度字节为 0,后面没有参数

    2.4 Flow Control Off Command (FCoff)

    流控关闭命令,类型代码为 000110,长度字节为 0,后面没有参数

    2.3/2.4的命令都没有参数,格式如下:

    2.5 Modem Status Command (MSC)

    用 MSC 命令来传输 V.24 控制信号,它在基本选项下面使用。MSC 命令包含一个 mandatory control signal(强制的控制信号)字节和一个 break signal(暂停信号)字节。在建立了 DLC 之后,发送用户数据之前,发送 MSC 命令。

    参数有address以及V.24,address已经在前面介绍,我们来看下V.24的格式

    EA:扩展位,功能如前所述。

    FC:flow control,当设备不能接受帧数据的时候,设定为 1。

    RTC:ready to communicate,当设备准备好通信时,把这位设定为 1。

    RTR:ready to receive,设备准备好接收数据时,设定为 1。

    IC:incoming call indicator,当有呼入时,设定为 1。

    DV:data valid,发送了合法数据,设定为 1。

    其他位保留。我们来看个btsnoop截图:

    2.6 Non Supported Command Response (NSC)

    当接收实体接收到了一个不支持的命令类型时,对发方发送 NSC。其类型代码为 001000,当只有一个不支持的命令类型时,长度字节为 1,后面的参数是代表不支持的命令类型的代码,其格式为:

    2.7 Remote Port Negotiation Command (RPN)

    我们来贴下

    在来贴下从Baud rate的结构:

    B1-B7 代表的是波特率,其具体含义见下表:

    D1-D2 表示数据位的长度。 00 表示 5bit,01 表示 6bit,10 表示 7bit,11 表示 8bit。

    S 表示停止位

    P 表示校验,P=0 有校验,P=0 无校验

    PT1-PT2 表示校验类型

    FLC1-FLC6 D 默认值为 0, 没有流控制

    Bit1 XON/XOFF on input

    Bit2 XON/XOFF on output

    Bit3 RTR on input

    Bit4 RTR on output

    Bit5 RTC on input

    Bit6 RTC on output

    XON1-XON8 XON character (default DC1)

    XOF1-XOF8 XOFF character.(default DC3)

    PM1-PM8 parameter mask

    用parameter mask来表示对方的哪个参数需要进行协商。如果是命令, parameter

    mask用0表示不改变,1表示要改变。如果是应答,0表示不接受建议值,1表示接

    受并并使用建议值

    第 7、8 个字节的 bit mask 表示

    Bit1 bit rate

    Bit2 data bits

    Bit3 stop bits

    Bit4 Parity

    Bit5 parity type

    Bit6 XON character

    Bit7 XOF character

    Bit8 reserved

    PM9-PM18: Parameter mask continued

    Bit1 XON/XOFF on input

    Bit2 XON/XOFF on output

    Bit3 RTR on input

    Bit4 RTR on output

    Bit5 RTC on input

    Bit6 RTC on output

    所有的参数默认为 0,接收方接到后对此忽略。

    Mask整理如下

    2.8 Remote Line Status Command (RLS)

    类型代码为 001010,长度字节的值为 2,有两个参数。第一个参数为 DCLI的值,具体格式跟一般的 DCLI 格式一样。第二个参数的格式入下表所示:

    L1-L4 表示链路状态,如果 L1 为 0,则表示没有错误发生,若 L1=1,则表示发生了错误

    如下:

    • 0b1100—Overrun error, a received character has overwritten a character which had

    not yet been read.

    • 0b1010—Parity error, the parity was wrong on a received character.

    • 0b1001—Framing error, a character did not end with a stop bit.

    展开全文
  • 蓝牙RFCOMM协议

    2021-01-14 19:15:02
    本文章主要讲下蓝牙RFCOMM协议(bluetooth rfcomm)的帧格式,包括Address,Control,Length Indicator,Information,FCS等 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:...

    零. 概述

    本文章主要讲下蓝牙RFCOMM协议(bluetooth rfcomm)的帧格式,包括Address,Control,Length Indicator,Information,FCS等

    一. 声明

    本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

    第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

    第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等

    第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(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等

    第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展

    第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。

    另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。

    -------------------------------------------------------------------------------------------------------------------------

    CSDN学院链接(进入选择你想要学习的课程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144

    蓝牙交流扣扣群:970324688

    Github代码:https://github.com/sj15712795029/bluetooth_stack

    入手开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708

    蓝牙学习目录:https://blog.csdn.net/XiaoXiaoPengBo/article/details/107727900

    --------------------------------------------------------------------------------------------------------------------------

    二.RFCOMM帧格式

    2.1 参数Address:

    EA参数:这部分在蓝牙RFCOMM协议中一直为1

    C/R参数:此部分是代表RFCOMM的command还是response,官方解释如下:

    这个理解起来稍微我有绕,我翻译一下:

    C/R(命令/响应)位表示帧是命令还是响应,它的值不仅取决于帧是否携带命令或响应,还有信道的哪一端发送帧。建立连接的设备(通过在DLCI 0上发送SABM命令)称为initiator。响应的设备(通过在DLCI 0上发送UA响应)称为responder。网络上都对这个地方说明的模凌两可,对于上面的这段话其实也说的模棱两可,我来总结下:

    1)对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,initiator发送给responder,C/R=1,response相应initiator C/R也为1。

    2)对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,response发送给initiator C/R为0,initiator响应给responder,C/R=0.

    3)对于UIH帧,这个称为数据帧,initiator发送给responder,C/R=1,response发送给initiator C/R为0.

    总结图标如下:

    为了便于我上面的总结理解,那么加一个流程图,来加深你们的印象

    下面我们用BTsnopp来一一看下以上个3case:

    1)对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,initiator发送给responder,C/R=1,response相应initiator C/R也为1。

    分别解析如下:

    从截图看出是对方来连接我们signaling,所以对方是initiator,所以对方发送SABM种的C/R是1,而我们回复的UA帧中的C/R也为1

    以下例子都是以对方为initiator来说明

    2)对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,response发送给initiator C/R为0,initiator响应给responder,C/R=0.

    从1)中我们可以看到我们是responder,对方是initiator,所以按照我们发送给对方的SABM帧的C/R是0,对方回应我们的也是0

    3)对于UIH帧,这个称为数据帧,initiator发送给responder,C/R=1,response发送给initiator C/R为0.

    上图解析如下:

    可以看到对方给我们的UIH帧C/R为1,我们给对方的UIH帧C/R为0

    讲到这里你应该明白了C/R位了吧,我感觉我是全网在这里说明最清晰的。

    D参数:这个同样比较绕,我们来看下官方解释

    D其实就是DLCI中的direction bit

    网上也没有一个特别明确的说明,我自己总结了下,感觉也是比较清晰:

    建立连接的设备(通过在DLCI 0上发送SABM命令)称为initiator。响应的设备(通过在DLCI 0上发送UA响应)称为responder,这点在上面我们也已经说明了。initiator自己的D=1,responder自己的D=0,所以如果在DLCI已经建立连接后,后续initiator连接responder某一个profile的时候(比如HFP),那么应该是DCLI=0+ server chanel<<1,如果是responder连接initiator的某一个profile,那么应该是DCLI=1+ server channel<<1

    后续交互封包的UIH的DCLI一直不变

    举几个例子来说明下这里(remote是initiator,local是responder):

    来一个initiator连接responder的btsnoop

    可以发现server channel是9,那么按照算法应该是0+9<<1,所以DCLI应该是0x12

    来一个responder连接initiator的btsnoop

    可以发现server channel是13,那么按照算法应该是1+13<<1,所以DCLI应该是0x1B

    Server channel:说白了就是上层profile的rfcomm channel

    注册到SDP中,整个流程就是SDP问询对方的RFCOMM channel,然后再发起RFCOMM的连接(比如HFP,HSP,SPP,OPP等),连接完毕交互完参数,就相当于上层profile连接成功

    2.2 Control参数

    主要是标示RFCOMM frame type是什么,截图如下:

    帧分别作用如下:

    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/F Bit:P/F是Poll/Final位

    在Commands中,被称为P(poll)位;而在Responses中则被称为F(final)位,大概用法我自己总结如下:

    1)对于(SABM,UA,DM,DISC)帧,这些统称为命令帧,command跟response都设置为1就好。

    2)对于UIH帧,除了给对方credit设置为1外,UIH user帧以及UIH多路控制帧都设置为0就好了。

    2.3 Length Indicator参数

    L1 到 L7 位表示数据字段的长度,其默认值为 31 字节。同样,它可以根据 EA位进行扩展。当 EA=0 时,它接下来的字节如下表表示就可以表示 15 个数字。也就是RFCOMM的后续len是32~32767 byte的字节。

    2.4 Information Field参数

    UIH帧数据,只对UIH帧有效,后续再一一介绍下UIH的格式

    2.5 FCS参数

    帧校验序列(FCS)根据不同帧类型在不同域集上进行运算.下面列出需要进行帧运算的字段:

    对于 SABM、DISC、UA、DM 帧:在地址、控制和长度标志字段上进行运算;

    对于 UIH 帧:在地址和控制字段上进行运算

    展开全文
  • 蓝牙学习笔记之RFCOMM协议

    千次阅读 2019-10-25 10:26:45
    RFCOMM帧格式  Address字段 Control字段 Length字段 Data字段 FCS字段 RFCCOMM协议数据分析 RFCOMM协议概览 协议浅述 RFCOMM 协议基于 L2CAP 协议 的串行 (9 针 RS-232) 仿真 。 最新规范是 V12 ...
  • Bluetooth RFCOMM介绍

    2019-05-09 09:53:35
    帧格式 6. Multiplexor Frames 回到顶部 1. 介绍 RFCOMM提供了基于L2CAP协议的串行(9针RS-232)模拟 RFCOMM支持在两个蓝牙设备间高达60路的通信连接,最新规范是V1.2 RFCOMM支持两种设备类型,但并不对它们进行...
  • 蓝牙学习笔记之RFCOMM协议(三)

    万次阅读 2019-04-07 18:10:30
    目录 ...RFCOMM帧格式 Address字段 Control字段 Length字段 Data字段 FCS字段 RFCCOMM协议数据分析 RFCOMM协议概览 协议浅述 RFCOMM协议基于L2CAP协议的串行(9针RS-232)仿真。最新规范是V1...
  • 蓝牙RFCOMM剖析(一)

    万次阅读 2016-05-18 18:21:46
    一.概述 RFCOMM是一个简单传输协议,其中针对9针RS-232(EIATIA-232-E)串口仿真附加了部分条款。...RFCOMM不使用TS07.10基本帧格式中的开始和结束标志,而仅仅使用包含在L2CAP层和RFCOMM层间交换标志中的那些域。
  • RFCOMM/HFP协议

    2019-09-10 17:12:33
    RFCOMM Set Asynchronous Balanced Mode (SABM) command向对方请求建立异步平衡模式(ABM)的建立 Unnumbered Acknowledgement (UA) response 对SABM或者DISC的响应,表示确认收到 Disconnected Mode (DM) ...
  • RFCOMM(一)

    2021-09-13 21:55:18
    1、RFCOMM协议就是在L2CAP上进行串口(RS-232 9针)仿真,这个协议以GSM 07.10为基础,但是只使用了其中的一部分。此外,还增加了一个RFCOMM特定的延伸:基于credit的流控方案 2、RFCOMM协议最大支持在两个蓝牙设备...
  • 蓝牙—RFCOMM协议

    2018-12-28 09:48:00
    RFCOMM是一个简单的协议,其中针对9针RS-232串口仿真附加了部分条款.可支持在两个蓝牙设备之间同时保持高达60路的通信连接.RFCOMM的目的是针对如何在两个不同设备上的应用之间保证一条完整的通信路径。 1....
  • 第三章 蓝牙协议规范(HCI、L2CAP、SDP、RFCOMM) 一、主机控制接口协议 HCI 蓝牙主机-主机控模型 蓝牙软件协议栈堆的数据传输过程: 1、蓝牙控制器接口数据分组: 指令分组、事件分组、数据分组 ...
  • 一、主机控制接口协议 HCI 蓝牙主机-主机控模型 蓝牙软件协议栈堆的数据传输过程: 1、蓝牙控制器接口数据分组:指令分组、事件分组、数据分组(1)、指令分组 如:Accpet Connection Request ...
  • 主要介绍下蓝牙协议栈(bluetooth stack)传统蓝牙音频协议之 音视频分布传输协议的封包格式介绍,包括Signaling command,media packet格式介绍。 一. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划...
  • 备注:关于HCI command/event,l2cap,rfcomm,sdp封包格式我会做简短的介绍,详细的可以分别看下我之前的文章 步骤1)手机发送连接请求,开发板接受连接,然后收到连接完成事件(HCI层面的范畴) 整个步骤1分为以下...
  • 蓝牙协议栈(四、协议)

    千次阅读 2019-09-11 17:43:22
    请注意,由于BTstack的“无缓冲”策略,BTstack将立即发送传出的RFCOMM数据并隐式保留数据包边界,即它将数据作为单个RFCOMM数据包发送到单个L2CAP数据包中,该数据包将在一个片。虽然这将在两个BTstack实例之间保持...
  • 中继配置

    2008-12-11 09:20:06
    中继是一种用于连接计算机系统的面向分组的通信方法。它主要用在公共或专用网上的局域网互联以及广域网连接。大多数公共电信局都提供中继服务,把它作为建立高性能的虚拟广域连接的一种途径。中继是进入带宽...
  • BlueTooth: 蓝牙协议栈实现模式分析

    千次阅读 2016-02-27 19:34:01
    基带层(BB)提供了两种不同的物理链路(同步面向连接链路SCO Synchronous Connection Oriented和异步无连接链路ACL Asynchronous Connection Less),负责跳频和蓝牙数据及信息的传输,且对所有类型的数据包提供...
  • 在HCI的主机和HCI主机控制器之间会存在若干传输层,这些传输层是透明的,只需完成传输数据的任务,不必清楚数据的具体格式.蓝牙的SIG规定了四种与硬件连接的物理总线方式,即四种HCI传输层:USB、RS232、UART和PC卡   ...
  • linux下/proc目录简介

    千次阅读 2017-08-31 15:14:58
    /proc/kcore 代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb /proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理 /proc/loadavg 根据过去一段时间内CPU...
  • 1.10、stat — 当前进程的状态信息,包含一系统格式化后的数据列,可读性差,通常由ps命令使用; 1.11、statm — 当前进程占用内存的状态信息,通常以“页面”(page)表示; 1.12、status — 与stat所...
  • 1、高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通开发板上烧录文件系统 建立高通平台开发环境 高通平台,android和 modem 编译流程分析 高通平台 7620 启动流程分析 ...qcril 流程分析,设置sim卡...
  • ):提供了两种不同的物理链路(同步面向连接链路SCO Synchronous ConnectionOriented和异步无连接链路ACL AsynchronousConnection Less ),负责跳频和蓝牙数据及信息的传输,且对所有类型的数据包提供了不同层次...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 460
精华内容 184
关键字:

RFCOMM帧格式