關(guān)鍵詞:藍(lán)牙核心技術(shù)協(xié)議 HCI L2CAP SDP RFCOMM
作者:xubin341719(歡迎轉(zhuǎn)載,請(qǐng)注明作者,請(qǐng)尊重版權(quán),謝謝!)歡迎指正錯(cuò)誤,共同學(xué)習(xí)、共同進(jìn)步!!下載鏈接:Bluetooth PROFILE SPECIFICATIONS (基本涵蓋所有藍(lán)牙協(xié)議)、buletooth core 2.1-4.0 SPECIFICATION(三藍(lán)牙版本的核心協(xié)議v2.1/v3.0/v4.0)、藍(lán)牙核心技術(shù)與應(yīng)用 馬建倉 版(藍(lán)牙協(xié)議相關(guān)初學(xué)者必讀,開發(fā)者參考)
藍(lán)牙核心技術(shù)概述(一):藍(lán)牙概述藍(lán)牙核心技術(shù)概述(二):藍(lán)牙使用場景藍(lán)牙核心技術(shù)概述(三): 藍(lán)牙協(xié)議規(guī)范(射頻、基帶鏈路控制、鏈路管理)藍(lán)牙核心技術(shù)概述(四):藍(lán)牙協(xié)議規(guī)范(HCI、L2CAP、SDP、RFOCMM)藍(lán)牙核心技術(shù)概述(五):藍(lán)牙協(xié)議規(guī)范(irOBEX、BNEP、AVDTP、AVCTP)
一、主機(jī)控制接口協(xié)議  HCI藍(lán)牙主機(jī)-主機(jī)控模型
藍(lán)牙軟件協(xié)議棧堆的數(shù)據(jù)傳輸過程:
1、藍(lán)牙控制器接口數(shù)據(jù)分組:指令分組、事件分組、數(shù)據(jù)分組(1)、指令分組

如:Accpet Connection RequestOpcode為:0x0409參數(shù)長度為: 07 參數(shù)中藍(lán)牙地址為:00:0d:fd:5f:16:9f角色為:從設(shè)備  0x01大端數(shù)據(jù)模式指令為:09 04 07 9f 16 5f fd 0d 00 01(2)、事件分組

如上圖:Opcode :0x0409狀態(tài): 0x00總長度: 4字節(jié)命令狀態(tài):0x0f(3)、數(shù)據(jù)分組ACL 數(shù)據(jù)分組
連接句柄(12bit)  | PB(2bit)  | BC(2bit)  | 數(shù)據(jù)長度(16bit)  | 
數(shù)據(jù)…………  | |||
注:PB Packet_Boundary BC Broadcast FlagSCO 數(shù)據(jù)分組
連接句柄(12bit)  | 保留(4bit)  | 數(shù)據(jù)長度(16bit)  | 
數(shù)據(jù)…………  | ||
(4)、RS232分組指示器:
HCI 分組類型  | RS232分組指示器  | 
HCI指令分組  | 0x01  | 
HCI ACL數(shù)據(jù)分組  | 0x02  | 
HCI SCO數(shù)據(jù)分組  | 0x03  | 
HCI事件分組  | 0x04  | 
HCI錯(cuò)誤消息分組  | 0x05  | 
HCI協(xié)商分組  | 0x06  | 
2、HCI控制命令
(1)、鏈路控制指令
命令  | OCF  | 概述  | 
Inquiry  | 0x0001  | 藍(lán)牙設(shè)備進(jìn)入查詢模式,搜索臨近設(shè)備  | 
Inquiry Cancel  | 0x0002  | 退出查詢模式  | 
Periodic Inquiry Mode  | 0x0003  | 藍(lán)牙設(shè)備在指定周期內(nèi)自動(dòng)查詢  | 
Exit Periodic Inquiry Mode  | 0x0004  | 退出自動(dòng)查詢模式  | 
Create Connection  | 0x0005  | 按指定藍(lán)牙設(shè)備的BD_ADDR創(chuàng)建ACL鏈路  | 
Disconnect  | 0x0006  | 終止現(xiàn)有連接  | 
Add SCO Connection  | 0x0007  | 利用連接句柄參數(shù)指定的ACL連接創(chuàng)建SCO  | 
Cancel Create Connection  | 0x0008  | 
  | 
Accept Connection Request  | 0x0009  | 接收新的呼入連接請(qǐng)求  | 
Reject Connection Request  | 0x000A  | 拒絕新的呼入連接請(qǐng)求  | 
Link Key Request Reply  | 0x000B  | 應(yīng)答從主機(jī)控制器發(fā)出的鏈路密鑰請(qǐng)求事件,并指定存儲(chǔ)在主機(jī)上的鏈路密鑰做為與BD_ADDR指定的藍(lán)牙設(shè)備進(jìn)行連接使用的鏈路密鑰請(qǐng)求事件  | 
Link Key Request Negative Reply  | 0x000C  | 如果主機(jī)上沒有存儲(chǔ)鏈路密鑰,作為與BD_ADDR指定的藍(lán)牙設(shè)備進(jìn)行連接使用的鏈路密鑰,就應(yīng)答從主機(jī)控制器發(fā)出的鏈路密鑰請(qǐng)求事件  | 
PIN Code Request Reply  | 0x000D  | 應(yīng)答從主機(jī)控制器發(fā)出的PIN請(qǐng)求事件,并指定用于連接的PIN  | 
PIN Code Request Negative Reply  | 0x000E  | 當(dāng)主機(jī)不能指定連接的PIN時(shí),應(yīng)回答從機(jī)控制器發(fā)出的PIN請(qǐng)求事件  | 
Change Connection Packet Type  | 0x000F  | 改變正在建立連接的分組類型  | 
Authentication Request  | 0x0011  | 指定連接句柄關(guān)聯(lián)的兩個(gè)藍(lán)牙設(shè)備之間建立身份鑒權(quán)  | 
Set Connection Encryption  | 0x0013  | 建立取消連接加密  | 
Change Connection Link Key  | 0x0015  | 強(qiáng)制關(guān)聯(lián)了連接句柄的兩個(gè)設(shè)備建立連接,并生成一個(gè)新的鏈路密鑰  | 
Master Link Key  | 0x0017  | 強(qiáng)制關(guān)聯(lián)了連接句柄的兩個(gè)設(shè)備利用主設(shè)備時(shí)鏈路密鑰或常規(guī)密鑰  | 
Remote Name Request  | 0x0019  | 獲取遠(yuǎn)端設(shè)備的名稱  | 
Cancel Remote Name Request  | 
  | 
  | 
Read Remote Supported Features  | 0x001B  | 請(qǐng)求遠(yuǎn)端設(shè)備所支持的特性列表  | 
Read Remote Extended Features  | 
  | 
  | 
Read Remote Version Information  | 0x001D  | 從遠(yuǎn)端設(shè)備讀取版本信息  | 
Read Clock Offset  | 0x001F  | 讀取遠(yuǎn)端的時(shí)鐘信息  | 
(2)、鏈路策略指令
命令  | OCF  | 簡介  | 
Hold Mode  | 0x0001  | 改變LM狀態(tài)和本地及遠(yuǎn)程設(shè)備為主模式的LM位置  | 
Sniff Mode  | 0x0003  | 改變LM狀態(tài)和本地及遠(yuǎn)程設(shè)備為呼吸模式的LM位置  | 
Exit Sniff Mode  | 0x0004  | 結(jié)束連接句柄在當(dāng)前呼吸模式里的呼吸模式  | 
Park State  | 0x0005  | 改變LM狀態(tài)和本地及遠(yuǎn)程設(shè)備為休眠模式的LM位置  | 
Exit Park State  | 0x0006  | 切換從休眠模式返回到激活模式的藍(lán)牙設(shè)備  | 
QoS Setup  | 0x0007  | 指出連接句柄的服務(wù)質(zhì)量參數(shù)  | 
Role Discovery  | 0x0009  | 藍(lán)牙設(shè)備連接后確定自己的主從角色  | 
Switch Role  | 0x000B  | 角色互換  | 
Read Link Policy Settings  | 0x000C  | 為指定連接句柄讀鏈路策略設(shè)置。鏈路策略設(shè)置允許主機(jī)控制器指定用于連接句柄的LM連接模式  | 
Write Link Policy Settings  | 0x000D  | 為指定連接句柄寫鏈路策略設(shè)置。鏈路策略設(shè)置允許主機(jī)控制器指定用于連接句柄的LM連接模式  | 
Read Default Link Policy Settings  | 0x000E  | 
  | 
Write Default Link Policy Settings  | 0x000F  | 
  | 
Flow Specification  | 0X0010  | 
  | 
(3)、主機(jī)控制器與基帶指令
Set Event Mark  | 0x0001  | 使能主機(jī)過濾HCI產(chǎn)生的事件  | 
Reset  | 0x0003  | 復(fù)位藍(lán)牙控制器、鏈路管理器、基帶鏈路管理器  | 
Set Event Filter  | 0x0005  | 使能主機(jī)指定不同事件過濾  | 
Flush  | 0x0008  | 針對(duì)指定的藍(lán)牙句柄,放棄所有作為當(dāng)前待傳輸數(shù)據(jù),甚至當(dāng)前是屬于多個(gè)在主機(jī)控制器里的L2CAP指令的數(shù)據(jù)塊  | 
Read PIN Type  | 0x0009  | 主機(jī)讀取指定主機(jī)的PIN類型是可變的還是固定的  | 
Write PIN Type  | 0x000A  | 主機(jī)寫入指定主機(jī)的PIN類型是可變的還是固定的  | 
Create New Unit Key  | 0x000B  | 創(chuàng)建新的單一密鑰  | 
Read Stored Link Key  | 0x000D  | 讀取存放在藍(lán)牙控制器中的單個(gè)或者多個(gè)密鑰  | 
Write Stored Link Key  | 0x0011  | 寫入存放在藍(lán)牙控制器中的單個(gè)或者多個(gè)密鑰  | 
Delete Stored Link Key  | 0x0012  | 刪除存放在藍(lán)牙控制器中的單個(gè)或者多個(gè)密鑰  | 
Write Local Name  | 0x0013  | 修改藍(lán)牙設(shè)備名稱  | 
Read Local Name  | 0x0014  | 讀取藍(lán)牙設(shè)備名稱  | 
Read Connection Accept Timeout  | 0x0015  | 讀連接識(shí)別超時(shí)參數(shù)值,定時(shí)器終止后藍(lán)牙硬件自動(dòng)拒絕連接  | 
Write Connection Accept Timeout  | 0x0016  | 寫連接識(shí)別超時(shí)參數(shù)值,定時(shí)器終止后藍(lán)牙硬件自動(dòng)拒絕連接  | 
Read Page Timeout  | 0x0017  | 讀尋呼超時(shí)參數(shù)值,本地設(shè)備返回連接失敗前,該值是允許藍(lán)牙硬件定義等待遠(yuǎn)程設(shè)備連接申請(qǐng)時(shí)間  | 
Write Page Timeout  | 0x0018  | 寫尋呼超時(shí)參數(shù)值,本地設(shè)備返回連接失敗前,該值是允許藍(lán)牙硬件定義等待遠(yuǎn)程設(shè)備連接申請(qǐng)時(shí)間  | 
Read Scan Enable  | 0x0019  | 寫出掃描允許參數(shù)值---用來控制藍(lán)牙設(shè)備周期性查詢  | 
Write Scan Enable  | 0x001A  | 讀出掃描允許參數(shù)值---用來控制藍(lán)牙設(shè)備周期性查詢  | 
Read Page Scan Activity  | 0x001B  | 讀尋呼掃描間隔、尋呼掃描區(qū)間參數(shù)  | 
Write Page Scan Activity  | 0x001C  | 寫尋呼掃描間隔、尋呼掃描區(qū)間參數(shù)  | 
Read Inquiry Scan Activity  | 0x001D  | 讀查詢掃描間隔、查詢掃描區(qū)間參數(shù)  | 
Write Inquiry Scan Activity  | 0x001E  | 寫查詢掃描間隔、查詢掃描區(qū)間參數(shù)  | 
Read Authentication Enable  | 0x001F  | 讀取鑒權(quán)允許參數(shù)---控制藍(lán)牙設(shè)備是否對(duì)每個(gè)連接進(jìn)行鑒權(quán)  | 
Write Authentication Enable  | 0x0020  | 寫取鑒權(quán)允許參數(shù)---控制藍(lán)牙設(shè)備是否對(duì)每個(gè)連接進(jìn)行鑒權(quán)  | 
Read Encryption Mode  | 0x0021  | 讀加密模式數(shù)值---控制藍(lán)牙設(shè)備是否對(duì)每個(gè)連接進(jìn)行加密  | 
Write Encryption Mode  | 0x0022  | 寫加密模式數(shù)值---控制藍(lán)牙設(shè)備是否對(duì)每個(gè)連接進(jìn)行加密  | 
Read Class Of Device  | 0x0023  | 讀取設(shè)備類型參數(shù)值,用于區(qū)別設(shè)備能力  | 
Write Class Of Device  | 0x0024  | 寫設(shè)備類型參數(shù)值,用于區(qū)別設(shè)備能力  | 
Read Voice Setting  | 0x0025  | 讀取語音設(shè)置參數(shù)值,控制語音連接的各種設(shè)置  | 
Write Voice Setting  | 0x0026  | 寫語音設(shè)置參數(shù)值,控制語音連接的各種設(shè)置  | 
Read Automatic Flush Timeout  | 0x0027  | 對(duì)指定句柄,讀取刷新超時(shí)值  | 
Write Automatic Flush Timeout  | 0x0028  | 對(duì)指定句柄,寫入刷新超時(shí)值  | 
Read Num Broadcast Retransmissions  | 0x0029  | 讀取設(shè)備的廣播重復(fù)發(fā)送次數(shù),重復(fù)發(fā)送提高廣播消息的可靠性  | 
Write Num Broadcast Retransmissions  | 0x002A  | 寫入設(shè)備的廣播重復(fù)發(fā)送次數(shù),重復(fù)發(fā)送提高廣播消息的可靠性  | 
Read Hold Mode Activity  | 0x002B  | 讀取Hold Mode Activity的參數(shù)值,用來確定Hold掛起的時(shí)間  | 
Write Hold Mode Activity  | 0x002C  | 寫入Hold Mode Activity的參數(shù)值,用來確定Hold掛起的時(shí)間  | 
Read Transmit Power Level  | 0x002D  | 對(duì)指定句柄,讀取傳輸功率的參數(shù)值  | 
Read Synchronous Flow Control Enable  | 0x002E  | 讀取SCO流量控制設(shè)置。通過使用該設(shè)置,主機(jī)控制器決定是否主機(jī)控制器發(fā)送與SCO連接句柄相關(guān)的完成分組事件的數(shù)量  | 
Write Synchronous Flow Control Enable  | 0x002F  | 讀寫入SCO流量控制設(shè)置。通過使用該設(shè)置,主機(jī)控制器決定是否主機(jī)控制器發(fā)送與SCO連接句柄相關(guān)的完成分組事件的數(shù)量  | 
Set Host Controller To Host Flow Control  | 0x0031  | 主機(jī)控制器的打開、關(guān)閉,主機(jī)控制器到主機(jī)的流量控制  | 
Host Buffer Size  | 0x0033  | 主機(jī)通知主機(jī)控制器自己的ACL、SCO數(shù)據(jù)緩沖區(qū)大小。主機(jī)控制器分段傳輸數(shù)據(jù),而數(shù)據(jù)不會(huì)超出這個(gè)范圍  | 
Host Number Of Completed Packets  | 0x0035  | 當(dāng)主機(jī)對(duì)于任何連接的句柄準(zhǔn)備接受較多的HCI指令時(shí),該指令用于通過主機(jī)指出主機(jī)控制器  | 
Read Link Supervision Timeout  | 0x0036  | 讀取連接管理超時(shí)參數(shù)。主從藍(lán)牙設(shè)備用該參數(shù)監(jiān)視鏈路丟失情況  | 
Write Link Supervision Timeout  | 0x0037  | 寫入連接管理超時(shí)參數(shù)。主從藍(lán)牙設(shè)備用該參數(shù)監(jiān)視鏈路丟失情況  | 
Read Number of Supported IAC  | 0x0038  | 讀取查詢掃描期間本地藍(lán)牙掃描的查詢識(shí)別碼(ICA)的數(shù)值  | 
Read Current IAC LAP  | 0x0039  | 讀取創(chuàng)建在查詢掃描期間本地藍(lán)牙設(shè)備正同時(shí)掃描的藍(lán)牙識(shí)別碼的LAP  | 
Write Current IAC LAP  | 0x003A  | 寫入創(chuàng)建在查詢掃描期間本地藍(lán)牙設(shè)備正同時(shí)掃描的藍(lán)牙識(shí)別碼的LAP  | 
Read Page Scan Period Mode  | 0x003B  | 讀取本地藍(lán)牙設(shè)備的強(qiáng)制尋呼掃描區(qū)間模式  | 
Write Page Scan Period Mode  | 0x003C  | 寫入本地藍(lán)牙設(shè)備的強(qiáng)制尋呼掃描區(qū)間模式  | 
Read Page Scan Mode  | 0x003D  | 讀取本地藍(lán)牙設(shè)備的默認(rèn)尋呼掃描區(qū)間模式  | 
Write Page Scan Mode  | 0x003E  | 寫入本地藍(lán)牙設(shè)備的默認(rèn)尋呼掃描區(qū)間模式  | 
(4)、信息指令參數(shù)
Read Local Version Information  | 0x0001  | 讀取本地藍(lán)牙版本信息  | 
Read Local Supported Features  | 0x0003  | 讀取本地藍(lán)牙設(shè)備特征表  | 
Read Local Extended Features  | 0x0004  | 
  | 
Read Buffer Size  | 0x0005  | 返回HCI緩沖容量。緩沖容量用于傳輸緩沖數(shù)據(jù)  | 
Read Country Code [Deprecated]  | 0x0007  | 讀取國家代碼狀態(tài)參數(shù)值  | 
Read BD ADDR  | 0x0009  | 讀取BD_ADDR的參數(shù)值  | 
(5)、狀態(tài)指令參數(shù)
Read Failed Contact Count  | 0x0001  | 讀取對(duì)于其他設(shè)備特殊連接的Failed Contact Count參數(shù)值。Failed Contact Count記錄在刷新時(shí)終止及當(dāng)前正在傳輸?shù)腖2CAP數(shù)據(jù)指令被自動(dòng)刷新后,主單元或從單元不能連續(xù)響應(yīng)事件次數(shù)  | 
Reset Failed Contact Count  | 0x0002  | 復(fù)位時(shí)對(duì)于其他設(shè)備的連接的Failed Contact Count的參數(shù)值。Failed Contact Count記錄在刷新時(shí)終止及當(dāng)前正在傳輸?shù)腖2CAP數(shù)據(jù)指令被自動(dòng)刷新后,主單元或從單元不能連續(xù)響應(yīng)事件次數(shù)  | 
Get Link Quality  | 0x0003  | 讀取指定連接句柄的Link Quality的值  | 
Read rssI  | 0x0005  | 讀取對(duì)于其他藍(lán)牙設(shè)備連接句柄的接收信號(hào)強(qiáng)度指示  | 
Read AFH Channel Map  | 0x0007  | 
  | 
Read BD Clock  | 0x0009  | 
  | 
(6)、測試指令
Read Loopback Mode  | 0x0001  | 讀取主機(jī)端控制器會(huì)送模式的設(shè)置值。回送模式設(shè)置可以確定信息發(fā)送路徑  | 
Write Loopback Mode  | 0x0002  | 寫入主機(jī)控制器會(huì)送模式的設(shè)置值。回送模式設(shè)置可以確定信息發(fā)送路徑  | 
Enable Device Under Test Mode  | 0x0003  | 允許本地藍(lán)牙設(shè)備模塊通過LMP測試指令接入測試模式。當(dāng)主機(jī)要求本地設(shè)備作為待測試設(shè)備,實(shí)現(xiàn)藍(lán)牙測試模式文件中規(guī)定測試場景,則發(fā)送該指令  | 
(7)、錯(cuò)誤代碼
錯(cuò)誤代碼  | 錯(cuò)誤含義  | 錯(cuò)誤代碼  | 錯(cuò)誤含義  | 
0x01  | 位置HCI指令  | 0x14  | 由于另一端引起連接中斷:資源限制  | 
0x02  | 不能連接  | 0x15  | 由于另一端引起連接中斷:關(guān)機(jī)  | 
0x03  | 硬件故障  | 0x16  | 本機(jī)中斷連接  | 
0x04  | 尋呼超時(shí)  | 0x17  | 重復(fù)嘗試  | 
0x05  | 身份驗(yàn)證失敗  | 0x18  | 不允許匹配  | 
0x06  | 鍵丟失  | 0x19  | 未知LMP PDU  | 
0x07  | 存儲(chǔ)器已滿  | 0x1A  | 不支持遠(yuǎn)端特性  | 
0x08  | 連接超時(shí)  | 0x1B  | 拒絕SCO補(bǔ)償  | 
0x09  | 最大連接數(shù)  | 0x1C  | 拒絕SCO間歇模式  | 
0x0A  | 連接到設(shè)備A的最大SCO連接數(shù)  | 0x1D  | 拒絕SCO無線模式  | 
0x0B  | ACL連接已存在  | 0x1E  | 非法鏈路管理參數(shù)  | 
0x0C  | 指令非法  | 0x1F  | 未特別指明錯(cuò)誤  | 
0x0D  | 由于資源有限,主機(jī)被拒絕  | 0x20  | 不支持鏈路管理器協(xié)議參數(shù)  | 
0x0E  | 由于安全原因,主機(jī)被拒絕  | 0x21  | 不允許角色改變  | 
0x0F  | 由于遠(yuǎn)端設(shè)備單連接設(shè)備,主機(jī)拒絕  | 0x22  | 鏈路管理響應(yīng)超時(shí)  | 
0x10  | 主機(jī)超時(shí)  | 0x23  | 鏈路管理錯(cuò)誤處理事務(wù)沖突  | 
0x11  | 不支持特性或參數(shù)值  | 0x24  | 不允許LMP PDU  | 
0x12  | 非法主機(jī)控制接口指令  | 0x25~0xFF  | 保留  | 
0x13  | 由于另一端引起連接中斷:用戶中斷連接  | 
  | 
  | 
二、邏輯鏈路控制與適配協(xié)議  L2CAPL2CAP位于基帶之上,將基帶的數(shù)據(jù)分組轉(zhuǎn)換為便于高層應(yīng)用的數(shù)據(jù)分組格式,并提供協(xié)議復(fù)用和服務(wù)質(zhì)量交換等功能。L2CAP只支持ACL數(shù)據(jù)傳輸,不支持SCO數(shù)據(jù)。L2CAP本身不提供加強(qiáng)信道可靠性和保證數(shù)據(jù)完整性的機(jī)制,其信道的可靠性依靠基帶提供。
1、協(xié)議復(fù)用:底層傳輸協(xié)議沒有提供對(duì)高層協(xié)議的復(fù)用機(jī)制,因而L2CAP支持高層協(xié)議復(fù)用,L2CAP層可以區(qū)分其上的SDP、RFCOMM、TCS等。
2、分段重組:L2CAP層幫助實(shí)現(xiàn)基帶的短PDU和高層的長PDU相互傳輸,L2CAP本身不完成任何PDU的分段重組,具體的分段重組有低層和高層來完成。
3、服務(wù)質(zhì)量 Qualityof Serivce 信息的交換:藍(lán)牙建立連接的過程中,L2CAP允許交互藍(lán)牙所期望的服務(wù)質(zhì)量,建立完成后,通過監(jiān)視資源的使用情況,來保證服務(wù)質(zhì)量。
4、組抽象:L2CAP忽略地址組概念,他只關(guān)心數(shù)據(jù)。
L2CAP信道有三種類型:
A、面向連接信道:Connection-OrientedCO,用于兩個(gè)設(shè)備之間的數(shù)據(jù)通信。
B、無連接信道:Connection-LessCL,用來向一組設(shè)備廣播方式傳輸數(shù)據(jù)。CID為固定值:0x0002。
C、信令信道:Signaling,用于創(chuàng)建CO通道,可以通過協(xié)商改變CO信道的特性。
CL信道的L2CAP_PDU
長度(2bytes)  | 信道ID(0x0002)  | PSM(最小為2bytes)  | 有效載荷  | 
PSM為 協(xié)議/服務(wù)復(fù)用器Protocol/Service Multiplexer,一般為SDP、RFCOMM、TCS等中介協(xié)議復(fù)用。小于0x1000的值,0x0001對(duì)應(yīng)SDP,0x0003對(duì)應(yīng)RFCOMM、0x0005對(duì)應(yīng)TCS。(1)、藍(lán)牙邏輯鏈路控制與適配協(xié)議信令:L2CAP的信令通道的CID為0x0001
信令指令分組:
長度(2byte)  | CID(0x0001)  | 指令1  | 指令2  | ……………  | 指令n  | 
L2CAP 分組頭部分  | 
  | ||||
信令指令格式:
代碼(1byte)  | 標(biāo)識(shí)符(1byte)  | 長度(2byte)  | 數(shù)據(jù)  | 
信令指令頭  | |||

如上圖所示,一條L2CAP信令,1為L2CAP分組頭,2為信令指令頭,3為數(shù)據(jù)部分。
L2CAP:
Role:Master
Address:11
PDULength: 6 //指令的長度,值為06 00
ChannelID: 0x0001 (Signaling)//L2CAP的信令通道,值為01 00
Code:Information request//信息請(qǐng)求,值為0a
Identifier:1//標(biāo)識(shí)符,值為01
CommandLength: 2//命令長度,值為02 00
InfoType:Extended features supported//02 00
所以這條指令完整的為:
06 00 01 00 0a 01 02 00 02 00
信令的其他操作如下:

L2CAP信令指令碼:
Code  | Description  | 
  | 
0x00  | RESERVED  | 保留  | 
0x01  | Command reject  | 拒絕命令  | 
0x02  | Connection request  | 連接請(qǐng)求  | 
0x03  | Connection response  | 連接響應(yīng)  | 
0x04  | Configure request  | 配置請(qǐng)求  | 
0x05  | Configure response  | 配置響應(yīng)  | 
0x06  | Disconnection request  | 斷開請(qǐng)求  | 
0x07  | Disconnection response  | 斷開響應(yīng)  | 
0x08  | Echo request  | 
  | 
0x09  | Echo response  | 
  | 
0x0A  | Information request  | 信息請(qǐng)求  | 
0x0B  | Information response  | 信息響應(yīng)  | 
1)、連接請(qǐng)求Connection_Request Code=0x02
代碼(0x02)  | 標(biāo)識(shí)符(1字節(jié))  | 長度(2字節(jié))  | PSM(2字節(jié))  | 源CID(2字節(jié))  | 
例如:SDP 連接請(qǐng)求
如上紅框所示:
代碼(0x02)  | 標(biāo)識(shí)符(1字節(jié))  | 長度(2字節(jié))  | PSM(2字節(jié))  | 源CID(2字節(jié))  | 
0x02  | 3  | 4  | SDP  | 0x0040  | 
2)、連接相應(yīng)Connection_Response Code=0x03
代碼(0x03)  | 標(biāo)識(shí)符  | 長度  | 目標(biāo)CID  | 源CID  | 結(jié)果  | 狀態(tài)  | 
例如:SDP請(qǐng)求響應(yīng)
如上面紅框所示:
代碼(0x03)  | 標(biāo)識(shí)符  | 長度  | 目標(biāo)CID  | 源CID  | 結(jié)果  | 狀態(tài)  | 
0x03  | 3  | 8  | 0x0040  | 0x0040  | 0x0000  | 
  | 
(2)、MTU MAXIMUMTRANSMISSION UNIT最大傳輸單元
MTU最大傳輸單元,L2CAP應(yīng)用必須支持最小為48字節(jié)的MTU,默認(rèn)值為672
(3)、QoS 服務(wù)質(zhì)量
三、服務(wù)發(fā)現(xiàn)協(xié)議 SDP
SDP兩種服務(wù)發(fā)現(xiàn)模式:1)、服務(wù)搜索:查詢具有特定服務(wù)屬性的服務(wù);2)、服務(wù)瀏覽:簡單的瀏覽全部可用服務(wù)。(1)、PDU 格式:(協(xié)議數(shù)據(jù)單元)
PDU ID(1byte)  | Transaction ID(2byte)  | 參數(shù)長度(2byte)  | 參數(shù)1  | ……  | 參數(shù)N  | 
Header  | 
  | ||||
不同PDU ID實(shí)現(xiàn)SDP的不同功能,概述如下表格:
Value  | Parameter Descirption  | 
  | 
0x00  | Reserved  | 保留  | 
0x01  | SDP_ErrorResponse  | 錯(cuò)誤響應(yīng)  | 
0x02  | SDP_ServiceSearchRequest  | 服務(wù)搜索請(qǐng)求  | 
0x03  | SDP_ServiceSearchResponse  | 服務(wù)搜索響應(yīng)  | 
0x04  | SDP_ServiceAttributeRequest  | 服務(wù)屬性請(qǐng)求  | 
0x05  | SDP_ServiceAttributeResponse  | 服務(wù)屬性響應(yīng)  | 
0x06  | SDP_ServiceSearchAttributeRequest  | 服務(wù)搜索屬性請(qǐng)求  | 
0x07  | SDP_ServiceSearchAttributeResponse  | 服務(wù)搜索屬性響應(yīng)  | 
0x08-0xff  | Reserved  | 保留  | 
(2)、服務(wù)記錄表SDP的服務(wù)記錄表對(duì)每一個(gè)服務(wù)進(jìn)行描述,每條記錄包含服務(wù)句柄、一組服務(wù)屬性:

Service Record Attributes:服務(wù)記錄;Service Record Handle 服務(wù)句柄;Attribute 服務(wù)屬性;

四、串口仿真協(xié)議 RFCOMM
為建立在串口之上的傳統(tǒng)應(yīng)用提供環(huán)境接口,使他們可以做比較少協(xié)議改動(dòng)就可以在藍(lán)牙無線通信無線鏈路上工作。多路串口仿真是RFCOMM的重要功能,通過多路復(fù)用器(multiplexer),一條L2CAP鏈路可以同時(shí) 多個(gè)串行應(yīng)用。兩臺(tái)設(shè)備間的串口仿真:
RFCOMM 兩個(gè)藍(lán)牙設(shè)備之間可以支持多達(dá)60多路仿真串口。
RFCOMM幀類型如下:
SABM  | 異步平衡模式設(shè)置指令  | 
UA  | 未加編號(hào)的確認(rèn)響應(yīng)  | 
DM  | 斷開連接模式響應(yīng)  | 
DISC  | 斷開連接指令  | 
UIH  | 帶頭校驗(yàn)的未編號(hào)信息命令和響應(yīng)  | 

新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注