蓝牙通信UUID

本文聚焦蓝牙低功耗BLE开发,介绍了开发中涉及的UUID,其对应BLE协议栈GATT的Service、Characteristic、Descriptor。开发者可自定义或采用标准。还阐述了SDP协议、ServiceRecord、Data Element、Service Class等概念,最后列举了蓝牙中常用的UUID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蓝牙低功耗BLE开发,无论是MCU端还是Android等APP端,都会涉及到一堆的UUID,对应着BLE协议栈GATT的Service、Characteristic、Descriptor。

开发者可以自定义这些128位的UUID,也可以采用Bluetooth SIG已定义的标准。

1.概念

    SDP协议让客户机的应用程序发现存在的服务器应用程序提供的服务以及这些服务的属性。SDP只提供发现服务的机制,不提供使用这些服务的方法。每个蓝牙设备都需要一个SDP Service,只做Client的蓝牙设备除外。

2.ServiceRecord

每一个Service利用ServiceRecord来表示(具有唯一的32bit的Handle),每一个ServiceRecord由若干ServiceAttribute组成,由下图表示:


 

每一个ServiceAttribute的结构由下图所示:


 

Attribute ID是由Assigned Value定义好的,例如Record Handle Attribute的ID为0x0000。

正因为SDP Record由许多Attribute组成,所以,可以把Record看成AtributeList,这在后面的SDP resposne中会常用到。

设备通过SDP request来访问这些record的相关信息。这里有个很好的SDP实例,如下:


 

Service Class ID List描述了Service的类型,如0x00000000代表SDP service

Protocol Descriptior List 列出了可能使用这种Service的protocol

 

3.Data Element

Data Element是在SDP中定义的一种数据结构,用来表示ServiceAttribute的Value域。每一个data element由Type+Size两部分组成。

Type的定义如下图:

    

 

Size的定义如下图:




 

4.Service Class

每一个Service都是ServiceClass的一个实例,一个Service Record就是一个Service Class的实例,Service Class可以表示一个Record里的所有Attribute。每一个Service Class有一个ID,包含在ServiceClassIDList这个Attribute的value里,称之为UUID。

 

5.UUID

一个全局惟一的标识符,128bit。为了节省存储和传输开销,UUID的一些位已经固定,出现了16bit和32bit的两种UUID。这些不同bit的UUID可以相互转化,如下式:


主从通信需要配置统一的128bit基础UUID和对应的接收发送属性UUID。

6. 蓝牙里面使用的常用的UUID:

 

#蓝牙串口服务

SerialPortServiceClass_UUID = '{00001101-0000-1000-8000-00805F9B34FB}'

 

LANAccessUsingPPPServiceClass_UUID = '{00001102-0000-1000-8000-00805F9B34FB}'

 

#拨号网络服务

DialupNetworkingServiceClass_UUID = '{00001103-0000-1000-8000-00805F9B34FB}'

 

#信息同步服务

IrMCSyncServiceClass_UUID = '{00001104-0000-1000-8000-00805F9B34FB}'

 

SDP_OBEXObjectPushServiceClass_UUID = '{00001105-0000-1000-8000-00805F9B34FB}'

 

#文件传输服务

OBEXFileTransferServiceClass_UUID = '{00001106-0000-1000-8000-00805F9B34FB}'

 

IrMCSyncCommandServiceClass_UUID = '{00001107-0000-1000-8000-00805F9B34FB}'

SDP_HeadsetServiceClass_UUID = '{00001108-0000-1000-8000-00805F9B34FB}'

CordlessTelephonyServiceClass_UUID = '{00001109-0000-1000-8000-00805F9B34FB}'

SDP_AudioSourceServiceClass_UUID = '{0000110A-0000-1000-8000-00805F9B34FB}'

SDP_AudioSinkServiceClass_UUID = '{0000110B-0000-1000-8000-00805F9B34FB}'

SDP_AVRemoteControlTargetServiceClass_UUID = '{0000110C-0000-1000-8000-00805F9B34FB}'

SDP_AdvancedAudioDistributionServiceClass_UUID = '{0000110D-0000-1000-8000-00805F9B34FB}'

SDP_AVRemoteControlServiceClass_UUID = '{0000110E-0000-1000-8000-00805F9B34FB}'

VideoConferencingServiceClass_UUID = '{0000110F-0000-1000-8000-00805F9B34FB}'

IntercomServiceClass_UUID = '{00001110-0000-1000-8000-00805F9B34FB}'

 

#蓝牙传真服务

FaxServiceClass_UUID = '{00001111-0000-1000-8000-00805F9B34FB}'

 

HeadsetAudioGatewayServiceClass_UUID = '{00001112-0000-1000-8000-00805F9B34FB}'

WAPServiceClass_UUID = '{00001113-0000-1000-8000-00805F9B34FB}'

WAPClientServiceClass_UUID = '{00001114-0000-1000-8000-00805F9B34FB}'

 

#个人局域网服务

PANUServiceClass_UUID = '{00001115-0000-1000-8000-00805F9B34FB}'

 

#个人局域网服务

NAPServiceClass_UUID = '{00001116-0000-1000-8000-00805F9B34FB}'

 

#个人局域网服务

GNServiceClass_UUID = '{00001117-0000-1000-8000-00805F9B34FB}'

 

DirectPrintingServiceClass_UUID = '{00001118-0000-1000-8000-00805F9B34FB}'

ReferencePrintingServiceClass_UUID = '{00001119-0000-1000-8000-00805F9B34FB}'

ImagingServiceClass_UUID = '{0000111A-0000-1000-8000-00805F9B34FB}'

ImagingResponderServiceClass_UUID = '{0000111B-0000-1000-8000-00805F9B34FB}'

ImagingAutomaticArchiveServiceClass_UUID = '{0000111C-0000-1000-8000-00805F9B34FB}'

ImagingReferenceObjectsServiceClass_UUID = '{0000111D-0000-1000-8000-00805F9B34FB}'

SDP_HandsfreeServiceClass_UUID = '{0000111E-0000-1000-8000-00805F9B34FB}'

HandsfreeAudioGatewayServiceClass_UUID = '{0000111F-0000-1000-8000-00805F9B34FB}'

DirectPrintingReferenceObjectsServiceClass_UUID = '{00001120-0000-1000-8000-00805F9B34FB}'

ReflectedUIServiceClass_UUID = '{00001121-0000-1000-8000-00805F9B34FB}'

BasicPringingServiceClass_UUID = '{00001122-0000-1000-8000-00805F9B34FB}'

PrintingStatusServiceClass_UUID = '{00001123-0000-1000-8000-00805F9B34FB}'

 

#人机输入服务

HumanInterfaceDeviceServiceClass_UUID = '{00001124-0000-1000-8000-00805F9B34FB}'

 

HardcopyCableReplacementServiceClass_UUID = '{00001125-0000-1000-8000-00805F9B34FB}'

 

#蓝牙打印服务

HCRPrintServiceClass_UUID = '{00001126-0000-1000-8000-00805F9B34FB}'

 

HCRScanServiceClass_UUID = '{00001127-0000-1000-8000-00805F9B34FB}'

CommonISDNAccessServiceClass_UUID = '{00001128-0000-1000-8000-00805F9B34FB}'

VideoConferencingGWServiceClass_UUID = '{00001129-0000-1000-8000-00805F9B34FB}'

UDIMTServiceClass_UUID = '{0000112A-0000-1000-8000-00805F9B34FB}'

UDITAServiceClass_UUID = '{0000112B-0000-1000-8000-00805F9B34FB}'

AudioVideoServiceClass_UUID = '{0000112C-0000-1000-8000-00805F9B34FB}'

SIMAccessServiceClass_UUID = '{0000112D-0000-1000-8000-00805F9B34FB}'

PnPInformationServiceClass_UUID = '{00001200-0000-1000-8000-00805F9B34FB}'

GenericNetworkingServiceClass_UUID = '{00001201-0000-1000-8000-00805F9B34FB}'

GenericFileTransferServiceClass_UUID = '{00001202-0000-1000-8000-00805F9B34FB}'

GenericAudioServiceClass_UUID = '{00001203-0000-1000-8000-00805F9B34FB}'

GenericTelephonyServiceClass_UUID = '{00001204-0000-1000-8000-00805F9B34FB}'

### Android 平台下的蓝牙通信 UUID 使用方法 在 Android 平台上,UUID (Universally Unique Identifier) 是用于唯一标识蓝牙服务和特性的重要参数[^2]。当两个设备试图通过蓝牙进行通信时,它们需要共享相同的 UUID 才能成功建立连接并交换数据。 #### 基本概念 UUID 是一种 128 位的全局唯一标识符,在 Bluetooth Low Energy (BLE) 中用来区分不同的服务和服务中的具体特征。每个 BLE 设备可以提供多个基于不同 UUID 的服务,而这些服务又可能包含若干个具有各自特定用途的特征值。为了确保兼容性和互操作性,某些常用的服务和特征被分配了固定的、广为人知的标准 UUIDs[^1]。 #### 标准 UUID 列表 对于大多数经典蓝牙(非低功耗)应用场景来说,通常会采用预定义的一组通用 UUID 来表示常见的串口端口配置文件(SPP),其十六进制形式如下: ```plaintext 00001101-0000-1000-8000-00805F9B34FB ``` 这个特殊的 UUID 主要应用于 RFCOMM 协议栈之上,支持 SPP 类型的数据传输模式,适用于诸如无线耳机配对等场景。然而值得注意的是,并不是所有的安卓手机都会开放此接口给第三方应用调用;因此即使使用上述标准 UUID 尝试与其他未知的应用程序交互也可能失败[^4]。 #### 自定义 UUID 创建方式 除了利用已有的标准化 UUID 外,开发者还可以创建自定义的 UUID 应用于私有协议或专有硬件之间。这类个性化 ID 可以借助在线工具生成随机数来获得独一无二的结果,也可以按照一定的规则自行设定前缀部分以便于识别所属公司或项目名称。不过需要注意的是,为了避免冲突,建议遵循官方推荐的方式来进行编码。 #### 实际编程实践 下面给出一段 Python 伪代码片段展示如何获取远程蓝牙设备的支持服务列表及其对应的 UUID: ```python import bluetooth def discover_services(address): services = bluetooth.find_service(address=address) for svc in services: name = svc["name"] uuid = svc["protocol"] + ": " + str(svc["profiles"]) print(f"Service Name: {name}") print(f"Service UUID: {uuid}\n") # 替换为实际的目标地址 target_address = "XX:XX:XX:XX:XX:XX" discover_services(target_address) ``` 这段脚本可以帮助理解目标设备提供了哪些可用的服务选项,从而指导后续开发过程中正确设置本地客户端所期望匹配的具体 UUID 参数。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值