蓝牙LE L2CAP CID与PSM
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝牙LE L2CAP CID与PSM相关的知识,希望对你有一定的参考价值。
我一直在教自己如何使用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之间的差异?
谢谢 :)
查看蓝牙核心规范v4.2 [第3卷,第A部分,第4.2节],它指出:
- 协议/服务多路复用器 - PSM(2个八位字节(最小值))PSM字段的长度至少为两个八位字节。 PSM字段的结构基于地址字段的ISO 3309扩展机制。所有PSM值都应为ODD,即最低有效八位字节的最低有效位必须为1.此外,所有PSM值应使最高有效八位字节的最低有效位等于0.这允许PSM字段为扩展到超过16位。 PSM值分为两个范围。第一个范围内的有效值由Bluetooth SIG分配并指示协议。第二个值范围是动态分配的,并与服务发现协议(SDP)结合使用。动态分配的值可用于支持特定协议的多个实现。
基本上将CID视为端口或一般通信端点。在特定CID上接收连接,您可以请求特定CID上的连接。甚至还有Bluetooth SIG保留的CID,你可以在[Vol 3,Part A,Section 2.1]中看到
另一方面,PSM可以被认为是尝试连接到您的特定服务或设备的标识符(如果您正在进行连接,则可以将其视为您自己的设备)。例如,请求与您建立连接的设备可以在文档中指定寻找0x80的PSM。
我不是蓝牙通信专家,但我目前正致力于基于L2CAP LE的移动应用程序和基于Linux的服务器之间的通信。
在这个开发工作期间,我在蓝牙SIG规范 - 核心4.2中遇到了一些称为面向连接的通道和无连接数据通道。特此链接:https://www.bluetooth.com/specifications/bluetooth-core-specification
就我从阅读中所理解的部分而言,面向连接的渠道,顾名思义,是面向连接的。也就是说,每个服务都与一个频道相关联。
在无连接通道的情况下,psm充当多路复用器并促进多个服务使用无连接通道:0x0002。因此,psm(协议/服务多路复用器)基本上类似于该信道中的端口号。
这些只是我的理解和观察。我是新手,也许是错的。我努力写这篇文章,因为我看不到真正的文档或论坛,人们已经在那里解释他们对这个概念的理解。越多越好。
以上是关于蓝牙LE L2CAP CID与PSM的主要内容,如果未能解决你的问题,请参考以下文章