什么是蓝牙
蓝牙,是一种支持设备短距离通信(一般10m内)的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与因特网Internet之间的通信,从而使数据传输变得更加迅速高效,为无线通信拓宽道路。
简单说,蓝牙就是一种使用无线电通信的技术去完成设备与设备间通讯与数据交换。 而我们通常使用的那些蓝牙耳机、蓝牙打印机、蓝牙手环、蓝牙鼠标等等设备,都是基于蓝牙通信技术对外提供某种(或多种)特定功能的设备。所以,蓝牙本身并不提供服务(应用功能),他只是一种数据(信息)的传输方式(或者说是通道),而设备所提供的功能,则是由设备里的各种不同的程序所提供,这种程序功能,我们叫他为服务。
想一想,蓝牙耳机与无线耳机,他们提供的都是音频播放的功能,区别在于通讯的方式不同。
蓝牙服务的组成
使用蓝牙对外提供服务的设备,需要有对应的服务功能,如蓝牙耳机,他需要提供音频播放的功能,这种具体的功能,就是蓝牙服务。这个服务分为服务、特性、属性三个部分:
服务(Service)
服务(Service) 可以理解一个房间,当这个房间为空的时候他什么也不是,不能提供任何的服务功能,所以,房间里面至少需要有一个或多个家俱,不同的家俱有不同的功能,这就是特性(Characteristic)。不同的服务(Service)应该有不同的编号(UUID),用以区分不同的服务(Service)。就像我们有卧室、厨房、书房等不同的房间,为了统一,我们给这些不同功能的房间定义了各自的编号,我们假定卧室编号为0001,不管是哪家公司修建的卧室,都必须使用0001来表示这是卧室,当客人需要休息时,他只需要找到编号为0001的房间就行了。这样,不管是用英文、法文还是德语来给房间命名,我们都知道他是卧室。
特性(Characteristic)
特性(Characteristic) 是依附于某个服务(Service)的,就像前面说到卧室里的床,卧室并不能让我们睡觉休息,真正让我们睡觉休息的是床。在卧室里,我们除了放床,通常还可以放梳妆台、衣柜等相关的家俱,每样家俱可以提供与之相关的不同功能。同样,我们需要给每样家俱分配一个编号,这就是特性(Characteristic)的UUID。我们知道,每种家俱会有一个或多个不同的子功能,这个子功能就是特性(Characteristic)所包含的属性(Property) 。例如床单可以更换、床的高低可以调整。
属性(Property)
属性的概念就更好理解,这里就不再比喻。
通常的属性有如下几个:
Read: 读属性,具有这个属性的特性是可读的,也就是说这个属性允许手机来读取一些信息。手机可以发送指令来读取某个具有读属性UUID的信息。
Notify: 通知属性, 具有这个属性的特性是可以发送通知的,也就是说具有这个属性的特性(Characteristic)可以主动发送信息给手机。
Write: 写属性, 具有这个属性的特性是可以接收写入数据的。通常手机发送数据给蓝模块就是通过这个属性完成的。这个属性在Write 完成后,会发送写入完成结果的反馈给手机,然后手机再可以写入下一包或处理后续业务,这个属性在写入一包数据后,需要等待应用层返回写入结果,速度比较慢。
WriteWithout Response:写属性,从字面意思上看,只是写,不需要返回写的结果,这个属性的特点是不需要应用层返回,完全依靠协议层完成,速度快,但是写入速度超过协议处理速度的时候,会丢包。
什么是 UUID
前面说蓝牙服务的时候,我们多次提到了UUID,这UUID (Universally Unique Identifier)用于标识蓝牙服务以及通讯特征访问属性,不同的蓝牙服务和属性使用不同的访问方法,就像人们语言交流一样,语言相同才能正常交流(找到正确的UUID,才能使用正确的功能)。
简单理解UUID就是编号,对应不同服务的一个唯一的编号,用于区分不同的服务及服务特性的个体。服务和特性都有各自的UUID。他很像网络应用中的端口号,例如80是HTTP协议的端口,他提供的是HTTP服务。为了明确标准的蓝牙服务,蓝牙技术联盟SIG定义UUID共用了一个基本的UUID:0x0000xxxx-0000-1000-8000-00805F9B34FB。总共128位,为了进一步简化基本UUID,每一个蓝牙技术联盟定义的属性有一个唯一的16位UUID,以代替上面的基本UUID的‘x’部分。使用16位的UUID便于记忆和操作,如SIG定义了“Device Information”的16位UUID为0x180A。也就是说,不管是什么样的蓝牙设备,只要你提供设备信息(Device Information) 的服务功能,就必须使用”0x180A“的UUID号。这样,当应用程序需要读取这蓝牙设备的设备信息时,只需要找到对应UUID号为0x180A的服务,就可以获取到。
蓝牙不同服务各自定义了“特征字段”用于实现数据访问,允许定义read、write、notification不同的特征属性,实现对应通道的读写操作,而“特征字段”也采用了UUID来唯一标识,如SIG在“DeviceInformation”服务下定义了“Manufacture Name String”实现“Read”属性,其16位UUID为0x2A29。
可见,蓝牙服务UUID以及服务特征字段,在蓝牙服务交互过程中起着非常重要的作用,而SIG标准中允许用户自定义服务,采用128位完成蓝牙服务,以及128位特征字段定义。
总结
蓝牙,是一种无线通讯技术;
蓝牙设备是使用蓝牙通讯技术来实现特定的功能。蓝牙设备里需要有蓝牙服务,其包括服务、特性、属性。服务与特性都有一个唯一对应的UUID,每个特性有read、write、notification等属性。我们真正使用蓝牙服务的时候,实际是针对不同属性的特性进行操作。使用过程是:通过蓝牙通信完成与设备的连接,查找到对应的服务,定位到该服务下的某个特性,并根据特性的属性完成具体操作。
技术联盟已定义好较多的标准服务UUID,例如串口服务应该使用00001101-0000-1000-8000-00805F9B34FB为标准的UUID。同时,也允许厂商定义自己的UUID,以满足已定义服务外的功能实现。
题外话:很多厂家的蓝牙串口模块(及某些打印服务)并没真正使用规定的标准UUID编号,而使用自己定义的UUID
常用的技术联盟规定标准蓝牙服务UUID
ServiceDiscoveryServerServiceClassID_UUID = ‘{00001000-0000-1000-8000-00805F9B34FB}’
BrowseGroupDescriptorServiceClassID_UUID = ‘{00001001-0000-1000-8000-00805F9B34FB}’
PublicBrowseGroupServiceClass_UUID = ‘{00001002-0000-1000-8000-00805F9B34FB}’
#蓝牙串口服务
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}’