蓝牙 LE L2CAP CID 与 PSM

Bluetooth LE L2CAP CID vs. PSM

我一直在自学如何使用 BlueZ API 为 BLE 设备编写 C 程序。但是,我似乎对 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代表"Protocol Service Multiplexers",是L2CAP连接的"port"。资料来源:面向程序员的蓝牙,作者:Albert Huang

CID 代表 "Channel Identifier",是表示设备上逻辑通道端点的本地名称。资料来源:http://ecee.colorado.edu/~ecen4242/marko/Bluetooth/Bluetooth/SPECIFICATION/L2CAP.html

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

谢谢:)

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

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

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

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

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

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

  • Protocol/Service Multiplexer - PSM (2 octets (minimum)) The PSM field is at least two octets in length. The structure of the PSM field is based on the ISO 3309 extension mechanism for address fields. All PSM values shall be ODD, that is, the least significant bit of the least significant octet must be 1. Also, all PSM values shall have the least significant bit of the most significant octet equal to 0. This allows the PSM field to be extended beyond 16 bits. PSM values are separated into two ranges. Valid values in the first range are assigned by the Bluetooth SIG and indicate protocols. The second range of values are dynamically allocated and used in conjunction with the Service Discovery Protocol (SDP). The dynamically assigned values may be used to support multiple implementations of a particular protocol.

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

基本上可以将 CID 视为端口或一般通信端点。在特定 CID 上接收连接,您可以在特定 CID 上请求连接。甚至还有蓝牙 SIG 保留的 CID,您可以在 [第 3 卷,A 部分,第 2.1 节]

中看到

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

在 Syngress 的 Bluetooth Application Developer Guide 2002

中找到以下内容

Q: What is the difference between an L2CAP PSM value and an L2CAP CID?

A: Protocol Service Multiplexor (PSM) values identify the protocol used to communicate over an L2CAP channel. In effect, this defines the higher layer that uses the channel. Multiple instances of the same higher layer may use different L2CAP channels, but they will all be identified by the same PSM value. Each separate channel is uniquely identified by its Channel ID (CID). A higher layer may request an L2CAP connection to a remote RFCOMM entity by specifying a PSM value of 0x0003. The local and remote L2CAP layers then assign CIDs to this link. The CIDs are used to actually identify traffic sent between RFCOMM layers.