藍牙協議
針對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上的簡單的藍牙服務,直接建立在串口模擬之上。