蓝牙LE L2CAP CID与PSM

时间:2016-12-12 18:01:54

标签: c bluetooth bluetooth-lowenergy bluez l2cap

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

谢谢:)

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

查看蓝牙核心规范v4.2 [Vol 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上请求连接。甚至还有蓝牙SIG保留的CID,您可以在[第3卷,A部分,第2.1节]中看到

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