蓝牙 LE L2CAP CID 与 PSM

Posted

技术标签:

【中文标题】蓝牙 LE L2CAP CID 与 PSM【英文标题】:Bluetooth LE L2CAP CID vs. PSM 【发布时间】:2017-04-27 16:02:15 【问题描述】:

我一直在自学如何使用 BlueZ API 用 C 语言为 BLE 设备编写程序。但是,我似乎对 sockaddr_l2 结构的一个特定方面感到困惑。我使用的定义如下:

struct sockaddr_l2 
    sa_family_t l2_family;
    unsigned short  l2_psm;
    bdaddr_t    l2_bdaddr;
    unsigned short  l2_cid;
    uint8_t     l2_bdaddr_type;
;

现在对于我不明白的部分:l2_psm 和 l2_cid 有什么区别?这是我目前收集到的:

PSM 代表“协议服务多路复用器”,是 L2CAP 连接的“端口”。资料来源:Bluetooth for Programmers,作者 Albert Huang

CID 代表“通道标识符”,是表示设备上逻辑通道端点的本地名称。来源:http://ecee.colorado.edu/~ecen4242/marko/Bluetooth/Bluetooth/SPECIFICATION/L2CAP.html

现在我确定答案就在这些定义中,但我似乎无法理解 CID 的定义。谁能更全面地向我解释 PSM 和 CID 之间的区别?

谢谢:)

【问题讨论】:

【参考方案1】:

从 2002 年开始,在 Syngress 的 Bluetooth Application Developer Guide 中发现以下内容

问:L2CAP PSM 值和 L2CAP CID 有什么区别?

A:协议服务多路复用器 (PSM) 值标识协议 用于通过 L2CAP 通道进行通信。实际上,这定义了 使用通道的更高层。相同的多个实例 更高层可能使用不同的 L2CAP 通道,但它们都将是 由相同的 PSM 值标识。每个单独的频道都是独一无二的 由其频道 ID (CID) 标识。更高层可能会要求 通过指定 PSM 值连接到远程 RFCOMM 实体的 L2CAP 0x0003。本地和远程 L2CAP 层然后将 CID 分配给此 关联。 CID 用于实际识别之间发送的流量 RFCOMM 层。

【讨论】:

【参考方案2】:

我不是蓝牙通信方面的专家,但我目前正在研究移动应用程序和基于 linux 的服务器之间的基于 L2CAP LE 的通信。

在这项开发工作中,我遇到了蓝牙 SIG 规范 - Core 4.2 中称为面向连接的通道和无连接数据通道的东西。特别是这个链接:https://www.bluetooth.com/specifications/bluetooth-core-specification

据我部分理解,面向连接的渠道,顾名思义,是面向连接的。也就是说,每个服务都与一个频道相关联。

在无连接通道的情况下,psm 充当多路复用器并促进多个服务使用无连接通道:0x0002。因此,psm(protocol/Service multiplexer)基本上类似于这个通道中的一个端口号。

这些只是我的理解和观察。我对此很陌生,也许是错的。我努力写这篇文章,因为我没有看到人们愿意解释他们对这个概念的理解的真实文档或论坛。越多越好。

【讨论】:

【参考方案3】:

查看蓝牙核心规范 v4.2 [第 3 卷,A 部分,第 4.2 节],它指出:

协议/服务多路复用器 - PSM(2 个八位字节(最少)) PSM 字段的长度至少为两个八位字节。 PSM字段的结构 基于地址字段的 ISO 3309 扩展机制。所有 PSM 值应为奇数,即最低有效位的最低有效位 八位字节必须为 1。此外,所有 PSM 值都应具有 最高有效八位字节等于 0。这允许 PSM 字段是 扩展超过 16 位。 PSM 值分为两个范围。有效的 第一个范围内的值由蓝牙 SIG 分配并指示 协议。第二个值域是动态分配和使用的 与服务发现协议 (SDP) 结合使用。动态的 分配的值可用于支持多个实现 特定协议。

它还提供了一个 l2cap 连接请求数据包的概要

基本上将 CID 视为端口或通用通信端点。在特定 CID 上接收连接,您可以在特定 CID 上请求连接。甚至还有蓝牙 SIG 保留的 CID,您可以在 [Vol 3, Part A, Section 2.1] 中看到它们

另一方面,可以将 PSM 视为尝试连接到您的特定服务或设备的标识符(如果您正在连接,则可以将其视为您自己的设备)。例如,请求连接到您的设备可以在文档中指定查找 0x80 的 PSM。

【讨论】:

以上是关于蓝牙 LE L2CAP CID 与 PSM的主要内容,如果未能解决你的问题,请参考以下文章

蓝牙 LE - 安卓上的 L2CAP CO 通道

蓝牙编程扫盲 L2CAP sockets

iPhone sdk 是不是支持 l2cap 蓝牙插座?

蓝牙协议(RFCOMM、L2CAP 和 ACL)

手机通过蓝牙传文件用的啥协议?

蓝牙的L2CAP协议