8

我一直在自学如何使用 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 连接的“端口”。资料来源:程序员蓝牙,作者 Albert Huang

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

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

谢谢 :)

4

3 回答 3

4

从 2002 年开始,在 Syngress 的蓝牙应用程序开发人员指南中找到以下内容

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

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

于 2020-04-30T14:15:46.893 回答
2

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

在这项开发工作中,我在蓝牙 SIG 规范 - Core 4.2 中遇到了名为 Connection-oriented Channels 和 Connectionless Data Channel 的东西。特别是在这个链接中:https ://www.bluetooth.com/specifications/bluetooth-core-specification

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

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

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

于 2017-07-24T14:51:58.837 回答
2

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

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

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

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

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

于 2019-03-27T20:37:36.247 回答