经典蓝牙(Classic Bluetooth / BR/EDR)--- 核心协议层4 --- 经典蓝牙(BR/EDR)服务发现层核心机制详解 文章目录蓝牙 SDP 层详解1. 概述2. 核心作用3. 架构模型4. 核心概念4.1 服务记录Service Record4.2 数据元素Data Element4.3 UUID通用唯一标识符5. 关键属性6. 工作流程步骤 1建立 L2CAP 连接步骤 2服务搜索Service Search步骤 3属性获取Attribute Retrieval步骤 4断开连接7. PDU协议数据单元8. SDP 的局限性与演进9. 实际应用场景10. 总结蓝牙 SDP 层详解1. 概述SDPService Discovery Protocol服务发现协议是蓝牙协议栈中位于L2CAP 层之上的核心协议之一负责让蓝牙设备能够发现附近设备提供的服务及其属性而无需事先了解对方设备的具体功能。协议栈位置应用层 / Profile → SDP → L2CAP → HCI → 基带 / 射频2. 核心作用功能说明服务发现查询对端设备支持哪些蓝牙服务如 A2DP、HFP、SPP 等属性获取获取服务的详细属性如协议版本、通道号、服务名称等动态适配无需预配置设备可动态发现并使用对端服务3. 架构模型SDP 采用客户端-服务器Client-Server架构┌─────────────┐ ┌─────────────┐ │ SDP Client │ ←──── L2CAP ────→ │ SDP Server │ │ (查询方) │ (PSM 0x0001) │ (提供方) │ └─────────────┘ └─────────────┘SDP Server驻留在提供服务的设备上维护一张服务记录表Service RecordSDP Client通过发送请求查询对端的服务信息4. 核心概念4.1 服务记录Service Record每个服务对应一条记录由多个属性Attribute组成用32位属性ID标识。4.2 数据元素Data ElementSDP 使用统一的数据编码格式表示所有数据基本类型包括类型描述符含义0x00Nil空0x01~0x08无符号/有符号整数1~8字节0x09~0x10UUID16/32/128位0x25文本字符串0x35数据元素序列Sequence0x36数据元素替代Alternative4.3 UUID通用唯一标识符用于唯一标识服务类型或协议16-bit UUID蓝牙 SIG 定义的标准服务如0x1101 SPP32-bit UUID扩展标准服务128-bit UUID自定义服务5. 关键属性属性 ID属性名说明0x0000ServiceRecordHandle记录句柄唯一标识一条服务记录0x0001ServiceClassIDList服务类别 UUID 列表0x0002ServiceRecordState记录状态用于缓存判断0x0003ServiceID服务唯一标识 UUID0x0004ProtocolDescriptorList协议描述符列表含 PSM/Channel 等关键信息0x0005BrowseGroupList浏览分组列表0x0006LanguageBaseAttributeIDList语言基础属性偏移0x0009BluetoothProfileDescriptorListProfile 描述符列表0x0100ServiceName服务名称0x0101ServiceDescription服务描述重点ProtocolDescriptorList0x0004通常包含RFCOMM Channel或L2CAP PSM是建立上层连接的关键。6. 工作流程步骤 1建立 L2CAP 连接SDP 使用固定的PSM 0x0001通过 L2CAP 建立面向连接的通道。步骤 2服务搜索Service SearchClient 发送SDP_ServiceSearchRequest携带目标UUIDServer 返回匹配记录的Handle 列表。Client → Server: Search for UUID 0x1101 (SPP) Server → Client: Handles [0x00010001, 0x00010002]步骤 3属性获取Attribute RetrievalClient 发送SDP_ServiceAttributeRequest或SDP_ServiceSearchAttributeRequest获取指定记录的详细属性。Client → Server: Get attributes for Handle 0x00010001 Server → Client: ProtocolDescriptorList [L2CAP, RFCOMM, Channel3]步骤 4断开连接获取所需信息后关闭 L2CAP 通道。7. PDU协议数据单元PDU 名称用途SDP_ErrorResponse错误响应SDP_ServiceSearchRequest/Response搜索服务SDP_ServiceAttributeRequest/Response获取指定记录的属性SDP_ServiceSearchAttributeRequest/Response搜索并获取属性合并操作提示ServiceSearchAttribute是最常用的组合操作可在一个请求中完成搜索属性获取。8. SDP 的局限性与演进局限说明仅发现不连接SDP 只负责发现实际连接需上层协议如 RFCOMM完成无安全机制SDP 本身不提供认证/加密依赖蓝牙配对链路查询效率低传统蓝牙中需多次交互才能获取完整信息BLE 替代方案低功耗蓝牙BLE使用GATTGeneric Attribute Profile替代 SDP基于 UUID 的属性表更高效9. 实际应用场景场景手机连接蓝牙耳机 ├─ 手机SDP Client查询耳机SDP Server ├─ 发现耳机支持 HFP0x111E和 A2DP0x110D ├─ 获取 HFP 的 RFCOMM Channel 2 ├─ 获取 A2DP 的 L2CAP PSM 0x0019 └─ 手机分别建立 HFP 和 A2DP 连接10. 总结SDP 是蓝牙生态的**“目录系统”**解决了设备间你能做什么、怎么连接你的问题。虽然其设计在经典蓝牙BR/EDR时代足够有效但在 BLE 中已被更灵活的GATT所取代。理解 SDP 对于调试蓝牙连接问题、开发自定义 Profile 或分析协议抓包如 Ellisys/Frontline至关重要。

相关新闻

最新新闻

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现 【免费下载链接】serenity The Serenity Operating System 🐞 项目地址: https://gitcode.com/GitHub_Trending/se/serenity 导读 本文以 getopt(3) 手册 为核心&a…

2026/9/26 23:24:47
轻量服务器还是ECS?大促云服务器选购与避坑实战指南

轻量服务器还是ECS?大促云服务器选购与避坑实战指南

每年大促节点,群里永远有人在问同一个问题:“38元的轻量服务器到底怎么抢?为什么我每次点进去都是已售罄?68元直购和99元的ECS我到底选哪个?”作为一个常年帮团队和自己采购云服务器的老用户,我太清楚这种纠…

2026/9/26 18:48:15
为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南 【免费下载链接】agents Multi-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity 项目地址:…

2026/9/26 3:42:08
PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署 【免费下载链接】PaddleOCR Turn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between i…

2026/9/26 11:37:29
Spring源码解析:构造器注入的类型转换与候选匹配机制

Spring源码解析:构造器注入的类型转换与候选匹配机制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/26 4:08:27
openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由 【免费下载链接】openai-agents-python A lightweight, powerful framework for multi-agent workflows 项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-pyth…

2026/9/26 21:11:24

日新闻

周新闻