蓝牙协议
针对Bluetooth, Java Community Process(JCP)定义了JSR 82Java APIs for Bluetooth Wireless Technology(JABWT)规范bluetooth API。
下面是Bluetooth栈结构,作为开发,主要关注的是红框中的几个协议及JSR-082定义的相关API。
L2CAP协议
该协议用于数据传输前后的处理,比如数据分段和组装。这是个底层的协议,作用类似于TCP或者UDP,但它用UUID,而不是Port用于server和client的结对
RFCOMM
该协议是串口模拟,把蓝牙接口模拟成串口
OBEX协议
这是一个应用层的协议,建立在RFCOMM之上,但它也可以建立在红外协议IrDA和TCP/IP等其他传输协议之上
SDP协议
SDP协议用于客户端在远端设备中寻找所需的服务。它与SDDB(Service Discovery Database)有密切联系。SDDB保存该蓝牙设备提供的所有服务(Service Record),SDP会在SDDB中寻找客户所需的服务并连接之
UUID
UUID在蓝牙接口中的作用类似于TCP/IP的端口号。UUID列表 列出了一些常用的UUID值
蓝牙服务例子
使用安卓开发工具adp shell可以查找远端设备可用的蓝牙service.
步骤如下:连接安卓手机和PC,进入安卓SDK的platform-tools 目录,运行 adb -s TA01404HLN shell
然后在shell中运行
sdptool browse 60:D8:19:F1:FD:42:
60:D8:19:F1:FD:42:是我的PC的MAC地址
下面是在我的安卓手机上search到的我的Win7 laptop上的部分蓝牙服务例子:
SDP服务
Service Provider: Microsoft
Service RecHandle: 0x0
Service Class ID List:
"SDP Server" (0x1000)
Protocol Descriptor List:
"L2CAP" (0x0100)
PSM: 1
"SDP" (0x0001)
Language Base Attr List:
code_ISO639: 0x656e
encoding: 0x6a
base_offset: 0x100
这是由微软提供的SDP服务,这个服务是最基本的服务,通常客户端首先需要使用该服务才能寻找该设备提供的其他服务。可以看到SDP协议建立在L2CAP协议之上,UUID是0x0001
文件传输服务
Service Name: File Transfer
Service RecHandle: 0x100a2
Service Class ID List:
"OBEX File Transfer" (0x1106)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 2
"OBEX" (0x0008)
Language Base Attr List:
code_ISO639: 0x656e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
"OBEX File Transfer" (0x1106)
Version: 0x0102
这是Win7提供的文件传输服务,它使用OBEX协议,UUID是0x1106
蓝牙立体声服务
Service Name: Stereo Audio
Service RecHandle: 0x100a4
Service Class ID List:
"Audio Sink" (0x110b)
Protocol Descriptor List:
"L2CAP" (0x0100)
PSM: 25
"AVDTP" (0x0019)
uint16: 0x100
Language Base Attr List:
code_ISO639: 0x656e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
"Advanced Audio" (0x110d)
Version: 0x0102
这是个提供蓝牙立体声输出的服务,它直接建立在数据协议L2CAP之上,采用的是AVDTP协议,UUID 0x110b
我的串口服务
Service Name: MyCommServer
Service RecHandle: 0x100af
Service Class ID List:
"Serial Port" (0x1101)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 10
这是我自己写的一个运行在PC上的简单的蓝牙服务,直接建立在串口模拟之上。