蓝牙协议(RFCOMM、L2CAP 和 ACL)

Posted

技术标签:

【中文标题】蓝牙协议(RFCOMM、L2CAP 和 ACL)【英文标题】:Bluetooth protocol (RFCOMM, L2CAP and ACL) 【发布时间】:2014-01-19 00:30:02 【问题描述】:

根据我从 Bluetooth Essentials for Programmers 中读到的内容,这本书提到了一些我不太明白的点。

RFCOMM 是一种可靠的基于流的协议。 L2CAP 是一种基于数据包的协议,可以配置不同级别的可靠性。

L2CAP 实际上是作为 RFCOMM 的传输协议,所以每个 RFCOMM 连接实际上都封装在一个 L2CAP 连接中。

这真的让我很困惑,因为这两种协议是不同类型的协议(一种是基于流的,另一种是基于数据包的)。所以根据它的解释,我在下面有一些问题。

    既然封装了RFCOMM连接,那么串口配置文件(SPP)如何使用RFCOMM连接呢?它也应该使用 L2CAP。

    A2DP 使用 L2CAP 连接。这对我来说意味着相同,因为 L2CAP 和 RFCOMM 被封装在 ACL 连接中,这是否意味着 A2DP 使用 ACL 连接?我知道这是不正确的,但如何在这里解释。

感谢您在这里的任何解释。

【问题讨论】:

这个网站是为程序员准备的,而不是你在这里问的问题类型,它们不是坏问题,只是不适合 SO。 谢谢。我认为这些问题也与蓝牙程序员有关。如果您能解释上述问题,那就太好了。 封装可能在“设备”驱动程序级别,所以它对您来说是不可见的,就像您从未“创建”以太网数据包一样,但您仍然可以本地使用 TCP/IP,如何来?同样的,RFCOMM 使用 L2CAP,但并不意味着你需要知道 L2CAP 才能使用 好吧,你的意思是程序员只需要创建rfcomm,我们不必知道RFCOMM是封装在L2CAP中的。谢谢你的解释。根据您提到的内容和我从书中读到的内容,我不明白为什么 RFCOMM 需要封装在 L2CAP 中。说 SPP,这可以纯粹使用 RFCOMM 连接。这种封装有什么优势? 嘿,@nrathaus 有时会适得其反,这取决于对您上面评论的点赞数。如果不是因为堆栈溢出,我对 L2CAP 的查询不会有如此突出的影响,我很感兴趣,因为我想开始为蓝牙堆栈编码。因此,感谢 SO 并感谢发布问题的 Sam。 【参考方案1】:

封装可能在“设备”驱动程序级别,所以它对您来说是不可见的,就像您从未“创建”以太网数据包一样,但您仍然可以本地使用 TCP/IP,为什么?同样,RFCOMM 使用 L2CAP,但并不意味着您需要知道 L2CAP 才能使用。

通常在您不想麻烦其他事情时使用封装,在这种情况下他们不想麻烦信令问题,RFCOMM 用于串行接口,因此他们不想处理串行接口的信令问题

【讨论】:

您好,您能否再提供一个示例说明为什么需要封装?你能更详细地解释一下吗?谢谢。 不错的答案@nrathaus。 OOP 封装了各种各样的东西,类使机制不透明。您甚至可以让同一个类的两个对象通信协议,而无需看到正在运行的底层协议,但能够利用派生服务。

以上是关于蓝牙协议(RFCOMM、L2CAP 和 ACL)的主要内容,如果未能解决你的问题,请参考以下文章

八RFCOMM

13.3.1 QBluetoothSocket类介绍

L2CAP数据发送和接收

蓝牙的OBEX协议

L2CAP数据发送和接收

蓝牙编程扫盲 L2CAP sockets