蓝牙LE L2CAP CID与PSM

问题描述 投票:6回答:2

我一直在教自己如何使用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之间的差异?

谢谢 :)

c bluetooth bluetooth-lowenergy bluez l2cap
2个回答
1
投票

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

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

它还提供了l2cap连接请求包l2cap Connection Request Packet的概述

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

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


3
投票

我不是蓝牙通信专家,但我目前正致力于基于L2CAP LE的移动应用程序和基于Linux的服务器之间的通信。

在这个开发工作期间,我在蓝牙SIG规范 - 核心4.2中遇到了一些称为面向连接的通道和无连接数据通道。特此链接:https://www.bluetooth.com/specifications/bluetooth-core-specification

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

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

这些只是我的理解和观察。我是新手,也许是错的。我努力写这篇文章,因为我看不到真正的文档或论坛,人们已经在那里解释他们对这个概念的理解。越多越好。

© www.soinside.com 2019 - 2024. All rights reserved.