藍牙核心規(guī)范(V5.2)7.7-深入詳解之GATT(2)
藍牙篇之藍牙核心規(guī)范(V5.2)深入詳解匯總
目錄
4.GATT功能要求
4.2?功能支持和過程映射
4.3 服務器配置
4.3.1 交換MTU
4.4 主要服務發(fā)現(xiàn)
4.4.1發(fā)現(xiàn)所有的主要服務
4.4.2通過服務UUID發(fā)現(xiàn)主服務
4.5 關(guān)系發(fā)現(xiàn)
4.5.1 查找包括的服務
4.6 特征性發(fā)現(xiàn)
4.6.1 發(fā)現(xiàn)一個服務的所有特征
4.6.2通過UUID發(fā)現(xiàn)特征
4.7 特征描述符的發(fā)現(xiàn)
4.7.1 將發(fā)現(xiàn)所有的特征描述符
4.9 特征價值寫
4.9.1 ?沒有響應就可以寫
4.9.2?沒有響應的簽名寫
4.9.4 寫長特征值
4.9.5 可靠的寫
4.10 特種值通知
4.10.1通知
4.10.2 多變量長度通知
4.11?特征值指示
4.12?特征描述符
4.12.1 讀特征描述符
4.12.2 可以閱讀長時間的特征描述符
4.12.3 寫特征描述符
4.12.4 編寫長時間的特征描述符
4.13 GATT過程映射到ATT協(xié)議操作碼
4.14 程序超時
5 L2CAP互操作性要求
5.1 BR/EDR L2CAP互操作性要求
5.1.1 ATT_MTU
5.1.2 BR/EDR通道要求
5.2 LE L2CAP?互操作性要求
5.2.1 ATT_MTU
5.2.2 LE通道要求
5.3 增強的ATT承載者L2CAP的互操作性要求
5.3.1 ATT_MTU
5.3.2 通道要求
5.4 L2CAP減輕碰撞
5.5 承載支持
6?GAP的互操作性要求
6.1 BR/EDR GAP互操作性要求
6.1.1 連接建立
6.2 LE GAP的互操作性要求
6.2.1 連接建立
6.2.2 配置文件角色
6.3 斷開連接的事件
6.3.1 斷開連接時的通知和指示信息
7 通用屬性配置文件服務定義
7.1 服務變更
7.2 客戶端支持的功能
7.3 數(shù)據(jù)庫哈希
7.3.1 數(shù)據(jù)庫哈希計算
7.4?服務器支持的特性
8.GATT的安全考慮
8.1 認證要求
8.2 授權(quán)要求
9.SDP的互操作性要求
4.GATT功能要求
在GATT配置文件中定義了11個特性:
1.服務器配置
2.主服務發(fā)現(xiàn)
3.關(guān)系的發(fā)現(xiàn)
4.特征發(fā)現(xiàn)
5.特征描述符發(fā)現(xiàn)
6.讀取一個特征值
7.寫一個特征值
8.關(guān)于一個特征值的通知
9.一個特征值指示
10.閱讀一個特征描述符
11.編寫一個特征描述符
每個特性都被映射到過程和子過程。這些過程和子過程描述了如何使用屬性協(xié)議來完成相應的特性。
4.2?功能支持和過程映射
表4.1將每個特性映射到用于該特性的過程,并指示該過程對于該特性是可選的還是強制性的。這些過程在參考部分中描述.
如果在任何ATT承載上都支持ATTPDU,則它在所有支持的ATT承載上都應得到支持,但例外情況除外:
ExchangeMTU子程序應僅在LE固定通道未增強的ATT承載上得到支持。
?無響應簽名寫子程序僅在LE固定通道無增強ATT承載上得到支持。
4.3 服務器配置
客戶端將使用此過程來配置屬性協(xié)議。此過程只有一個用于設置MTU大小的子程序。
4.3.1 交換MTU
客戶端使用此子過程將ATT_MTU設置為大于屬性協(xié)議的默認ATT_MTU時,將其設置為兩個設備可能支持的最大值。此子程序只能在連接期間啟動一次。
此子程序不得用于BR/EDR物理鏈路,因為MTU大小是通過L2CAP通道配置程序進行協(xié)商的。
此子過程使用了ATT_EXCHANGE_MTU_REQPDU。客戶端RxMTU參數(shù)應設置為該客戶端可以接收到的最大MTU。
可以從服務器為ATT_-EXCHANGE_MTU_REQPDU發(fā)送兩個可能的響應:ATT_EXCHANGE_MTU_RSP和ATT_ERROR_RSPPDU。
如果服務器上發(fā)生錯誤,則返回ATT_ERROR_RSPPDU。
服務器應使用ATT_EXCHANGE_MTU_-RSPPDU響應此消息,并將ServerRxMTU參數(shù)設置為該服務器可以接收到的最大MTU。
如果ATT_ERROR_RSPPDU由服務器發(fā)送,錯誤代碼設置為不支持請求,則不支持屬性操作碼,并且應使用默認的MTU。
一旦消息被交換,ATT_MTU應被設置為客戶端RxMTU和服務器RxMTU值的最小值。
4.4 主要服務發(fā)現(xiàn)
客戶端使用此過程來發(fā)現(xiàn)服務器上的主服務。一旦發(fā)現(xiàn)了主服務,就可以使用其他過程訪問有關(guān)主服務的其他信息,包括特征發(fā)現(xiàn)和關(guān)系發(fā)現(xiàn),以查找其他相關(guān)的主服務和輔助服務。
有兩個子過程可用于主服務發(fā)現(xiàn):發(fā)現(xiàn)所有主服務和通過服務UUID發(fā)現(xiàn)主服務。
4.4.1發(fā)現(xiàn)所有的主要服務
此子過程用于發(fā)現(xiàn)服務器上的所有主服務。
ATT_READ_BY_GROUP_TYPE_REQ PDU應與屬性類型參數(shù)設置為主服務的UUID一起使用。起始手柄設置為0x0001,結(jié)束手柄設置為0xFFFF。
可以從服務器為ATT_READ_BY_-GROUP_TYPE_REQ PDU發(fā)送兩個可能的響應:ATT_READ_BY_GROUP_TYPE_RSP和ATT_-ERROR_RSP PDU。
如果服務器上發(fā)生錯誤,則返回ATT_ERROR_RSP PDU。
ATT_READ_BY_GROUP_TYPE_RSPPDU返回與服務器支持的服務對應的屬性句柄、結(jié)束組句柄和屬性值元組的列表。響應中包含的每個屬性值都是服務器支持的服務的服務UUID。屬性句柄是服務聲明的句柄。最終句柄是服務定義中的最后一個屬性的句柄。設備中最后一個服務的端組句柄可以為0xFFFF。ATT_READ_BY_GROUP_TYPE_REQPDU應再次發(fā)出,啟動手柄設置為大于ATT_READ_BY_GROUP_TYPE_RSPPDU中的最后一個端組手柄。
當收到ATT_ERROR_RSPPDU且錯誤代碼設置為屬性或“按類型讀取組響應”中的結(jié)束組句柄為0xFFFF時,此子過程將完成。
如果在發(fā)現(xiàn)服務器上的所有主服務之前找到了所需的主服務,則允許提前結(jié)束子過程。
服務聲明指定了服務聲明是可讀的,不需要身份驗證或授權(quán),因此不應出現(xiàn)不足的身份驗證或讀取不允許的錯誤。
圖4.2:發(fā)現(xiàn)所有主節(jié)點服務的示例
4.4.2通過服務UUID發(fā)現(xiàn)主服務
當只知道服務UUID時,客戶端將此子過程用于發(fā)現(xiàn)服務器上的特定主服務。特定的主服務可能在服務器上存在多次。正在發(fā)現(xiàn)的主服務由服務UUID標識。
ATT_FIND_BY_TYPE_VALUE_REQPDU應與屬性類型參數(shù)設置為主服務的UUID,屬性值設置為16位藍牙UUID或128位UUID一起使用。起始手柄設置為0x0001,結(jié)束手柄設置為0xFFFF。
可以從服務器為ATT_FIND_BY_-TYPE_VALUE_REQPDU發(fā)送兩個可能的響應:ATT_FIND_BY_TYPE_VALUE_RSP和ATT_ERROR_RSP PDU。
如果服務器上發(fā)生錯誤,將返回ATT_ERROR_RSP PDU。
ATT_FIND_BY_TYPE_VALUE_RSPPDU返回一個屬性句柄范圍的列表。屬性句柄范圍是服務定義的起始句柄和結(jié)束句柄。設備中最后一個服務的端組句柄可以為0xFFFF。如果返回正在搜索的服務UUID的屬性句柄范圍,而結(jié)束發(fā)現(xiàn)句柄不是0xFFFF,則可以再次發(fā)出ATT_FIND_BY_TYPE_VALUE_REQ PDU,并將啟動句柄設置為大于ATT_FIND_BY_TYPE_VALUE_RSP PDU中的最后一個屬性句柄范圍的1。
如果在發(fā)現(xiàn)服務器上支持的指定服務UUID的所有主服務之前找到了所需的主服務,則允許提前結(jié)束子過程。
服務聲明指定了服務聲明是可讀的,不需要身份驗證或授權(quán),因此不會出現(xiàn)不足的身份驗證或讀取不允許的錯誤。
圖4.3:通過服務UUID發(fā)現(xiàn)主服務的示例
4.5 關(guān)系發(fā)現(xiàn)
此過程用于發(fā)現(xiàn)與其他服務的服務關(guān)系。
有一個子過程可以用于關(guān)系發(fā)現(xiàn):查找包含的服務。
4.5.1 查找包括的服務
客戶端將此子過程用于查找服務器上的服務定義中的包括服務聲明。指定的服務由服務句柄范圍進行標識。
ATT_READ_BY_TYPE_REQPDU應與屬性類型參數(shù)設置為UUID一起使用,包括起始手柄應設置為指定服務的起始句柄,終止手柄應設置為指定服務的終止句柄。如果在發(fā)現(xiàn)服務器上支持的指定服務的所有包含服務之前找到所需包含的服務,則允許提前結(jié)束子過程。
可以從服務器為ATT_READ_BY_-TYPE_REQPDU發(fā)送兩個可能的響應:ATT_READ_BY_TYPE_RSP和ATT_ERROR_RSP PDU。
如果服務器上發(fā)生錯誤,將返回ATT_ERROR_RSP PDU。
ATT_READ_BY_TYPE_RSPPDU返回一組與服務定義中包含的服務對應的屬性句柄和屬性值對。響應中包含的每個屬性值都由包含的服務聲明的屬性句柄和結(jié)束組句柄組成。如果服務UUID是一個16位的藍牙UUID,那么它也會在響應中返回。ATT_READ_BY_TYPE_RSP PDU應再次發(fā)出,啟動手柄設置為大于ATT_READ_BY_TYPE_RSP PDU中的最后一個屬性手柄。
當收到ATT_ERROR_RSPPDU,錯誤代碼設置為“屬性未找到”,或ATT_READ_BY_-TYPE_RSPPDU所包含服務聲明的屬性句柄與請求的結(jié)束句柄相同時,子過程將完成。
當包含的服務使用128位UUID時要獲取包含的服務UUID,需要使用ATT_READ_REQPDU。ATT_READ_REQPDU的屬性句柄是所包含的服務的屬性句柄。
4.6 特征性發(fā)現(xiàn)
客戶端使用此過程來發(fā)現(xiàn)服務器上的服務特性。一旦發(fā)現(xiàn)了這些特征,就可以使用其他過程來發(fā)現(xiàn)或訪問有關(guān)這些特征的其他信息。
有兩個子過程可以用于特征發(fā)現(xiàn):發(fā)現(xiàn)服務的所有特征和通過UUID發(fā)現(xiàn)特征。
4.6.1 發(fā)現(xiàn)一個服務的所有特征
當只知道服務處理范圍時,此子過程用于查找服務器上服務定義內(nèi)的所有特性聲明。指定的服務由服務句柄范圍進行標識。
ATT_READ_BY_TYPE_REQP DU應與屬性類型參數(shù)設置為UUID特性一起使用。開始手柄應設置為指定服務的開始手柄,結(jié)束手柄應設置為指定服務的結(jié)束句柄。
可以從服務器為ATT_READ_BY_TYPE_REQ PDU發(fā)送兩個可能的響應:ATT_READ_BY_TYPE_RSP和ATT_ERROR_RSP PDU。
如果服務器上發(fā)生錯誤,則返回ATT_ERROR_RSP PDU.
ATT_READ_BY_TYPE_RSP PDU返回與服務定義中的特征對應的屬性句柄和屬性值對的列表。屬性句柄是特性聲明的句柄。屬性值為特征屬性、特征值手柄和特征UUID。ATT_READ_BY_TYPE_REQ PDU應再次發(fā)布,啟動手柄設置為大于ATT_READ_BY_TYPE_RSP PDU中的最后一個屬性手柄。
當接收到ATT_ERROR_RSPPDU且錯誤代碼設置為“找不到屬性”或ATT_READ_BY_TYPE_-RSPPDU具有與請求的結(jié)束句柄相同的屬性句柄時,子過程將完成。
如果在發(fā)現(xiàn)服務器上支持的指定服務的所有特性之前找到了所需的特性,則允許提前結(jié)束子過程。
4.6.2通過UUID發(fā)現(xiàn)特征
當只知道服務處理范圍且已知特征UUID時,客戶端使用此子過程來發(fā)現(xiàn)服務器上的服務特征。特定的服務可能在服務器上多次存在。所發(fā)現(xiàn)的特征可以由特征UUID來識別。
ATT_READ_BY_TYPE_REQPDU用于執(zhí)行子過程的開始。屬性類型被設置為“特性的UUID”,開始手柄和結(jié)束手柄參數(shù)應被設置為服務手柄范圍。
可以從服務器為ATT_READ_BY_TYPE_REQPDU發(fā)送兩個可能的響應:ATT_READ_BY_TYPE_RSP和ATT_ERROR_RSPPDU。
如果服務器上發(fā)生錯誤,將返回ATT_ERROR_RSPPDU。
ATT_READ_BY_TYPE_RSPPDU返回與提供的句柄范圍中包含的特性對應的屬性句柄和屬性值對的列表。列表中的每個屬性值都是特征聲明的屬性值。屬性值包含特征屬性、特征值句柄和特征UUID。檢查每個屬性句柄和屬性值對的屬性值以有匹配的特性UUID。一旦找到,子過程將繼續(xù)進行,直到服務處理柄范圍結(jié)束為止。ATT_READ_BY_-TYPE_REQPDU再次發(fā)布,啟動句柄設置為大于ATT_READ_BY_TYPE_RSPPDU中的最后一個屬性句柄。
如果ATT_ERROR_RSPPDU是由服務器發(fā)送的,錯誤代碼設置為屬性未找到,則服務器在提供的句柄范圍內(nèi)不存在該特性。
如果在發(fā)現(xiàn)服務器上支持的指定服務的所有特性之前找到了所需的特性,則允許提前結(jié)束子過程。
第3.3節(jié)中描述的特性聲明指定了特征聲明是可讀的,不需要身份驗證或授權(quán),因此不會出現(xiàn)不足的身份驗證或讀取不允許的錯誤。
圖4.6:通過UUID示例發(fā)現(xiàn)特征
4.7 特征描述符的發(fā)現(xiàn)
客戶端使用此過程來發(fā)現(xiàn)特征的特征描述符。一旦發(fā)現(xiàn)了特征描述符,就可以使用其他過程訪問有關(guān)特征描述符的其他信息。
有一個子過程可以用于特征描述符的發(fā)現(xiàn):發(fā)現(xiàn)所有特征描述符。
4.7.1 將發(fā)現(xiàn)所有的特征描述符
4.9 特征價值寫
此過程用于將特征值寫入服務器。
有五個子過程可以用來寫特征值:無響應寫、無響應簽名寫、寫特征值、寫長特征值和可靠寫。
4.9.1 ?沒有響應就可以寫
此子過程用于在客戶端知道“特征值句柄”,并且客戶端不需要確認寫入已成功執(zhí)行時,將特征值寫入服務器。此子過程只寫入特征值的第一個(ATT_MTU-3)8位字節(jié)。此子程序不能用于寫入長特征,而應使用“寫入長特征值”子程序。
在此子過程中使用了ATT_WRITE_CMD PDU。屬性句柄參數(shù)應設置為特征值句柄。屬性值參數(shù)應設置為新的特征值。
如果特征值寫入請求的大小錯誤,或者具有配置文件定義的無效值,則寫入將不會成功,服務器也不會產(chǎn)生錯誤。
4.9.2?沒有響應的簽名寫
此子過程用于在客戶端知道特征值句柄且ATT承載未被加密時將特征值寫入服務器。只有當啟用了特性屬性身份驗證位,并且客戶端和服務器設備共享[第3卷]C部分通用訪問配置文件中定義的節(jié)點時,才應使用此子過程。
此子過程只寫入屬性值的第一個(ATT_MTU-15)字節(jié)。此子過程不能用于寫入長屬性。
圖4.14:無響應的已簽名寫入示例
4.9.3 寫特征值
此子過程用于在客戶機知道特征值句柄時將特征值寫入服務器。此子過程只寫入特征值的第一個(ATT_MTU-3)八位節(jié)。此子過程不能用于寫入長屬性,而應使用“寫入長特征值”子過程。
ATT_WRITE_REQPDU用于此子過程。屬性句柄參數(shù)應設置為特征值句柄。屬性值參數(shù)應設置為新的特性。
如果特征值寫入成功,服務器應發(fā)送ATT_WRITE_RSP PDU。
如果客戶端使用身份驗證不足、授權(quán)不足、加密密鑰大小不足,或者特征值禁止寫操作,服務器應發(fā)送ATT_ERROR_RSPPDU以響應ATT_WRITE_REQ PDU。錯誤代碼參數(shù)按照屬性協(xié)議中的指定進行設置。如果寫入的特征值大小錯誤,或者具有配置文件定義的無效值,則不寫入該值,服務器將發(fā)送ATT_ERROR_RSP PDU,并將錯誤代碼發(fā)送給應用程序錯誤。
4.9.4 寫長特征值
此子過程用于在客戶端知道特性值句柄,但特征值的長度超過在單個ATT_WRITE_REQPDU中可以發(fā)送的長度時,將特性值寫入服務器。
ATT_PREPARE_WRITE_REQ和ATT_EXECUTE_WRITE_REQ pdu用于執(zhí)行此子過程。屬性句柄參數(shù)應設置為要寫入的特征值的特征值句柄。零件屬性值參數(shù)應設置為正在寫入的屬性值的部分。值偏移量參數(shù)應為要寫入的特征值范圍內(nèi)的偏移量。要寫入完整的特征值,第一個ATT_PREPARE_WRITE_REQ PDU的偏移量應設置為0x0000。后續(xù)ATT_PREPARE_WRITE_REQ pdu的偏移量是下一個尚未編寫的八重奏。重復ATT_PREPARE_-WRITE_REQ PDU,直到傳輸完整的特征值,之后使用ATT_EXECUTE_WRITE_REQ PDU寫入完整的值。
注意:在此子過程中,不需要對ATT_PREPARE_WRITE_RSPPDU中的值進行驗證。
如果客戶端使用身份驗證不足、授權(quán)不足、加密密鑰大小不足,或者特征值禁止寫操作,服務器應發(fā)送ATT_ERROR_RSPPDU以響應ATT_PREPARE_WRITE_REQPDU。錯誤代碼參數(shù)按照屬性協(xié)議中的指定進行設置。如果寫入的屬性值大小錯誤,或配置文件定義的值無效,則寫入不會成功,服務器將發(fā)送ATT_ERROR_RSPPDU,并將錯誤代碼發(fā)送為應用程序錯誤。
4.9.5 可靠的寫
此子程序用于在客戶知道特征值句柄時將特征值寫入服務器,并保證在執(zhí)行寫入之前通過將兩個方向?qū)懭氲奶卣髦祦韺懭胝_的特征值。當必須在單個操作中按順序?qū)懭攵鄠€值時,也可以使用此子過程。
子過程有兩個階段;第一階段準備要編寫的特征值。為此,客戶機會將特征值傳輸?shù)椒掌鳌7掌鲿z查特征值的有效性。客戶端還會檢查每個特征值,以驗證服務器是否使用服務器響應正確接收到每個特征值。一旦完成后,第二階段從該客戶端執(zhí)行服務器上所有準備好的特征值寫入。
在第一階段,使用ATT_PREPARE_WRITE_REQ PDU。屬性句柄應設置為要準備寫入的特征值句柄。值偏移量和部分屬性值參數(shù)應設置為新的特征值。
可以從服務器為ATT_PREPARE_-WRITE_REQ PDU發(fā)送兩個可能的響應:ATT_PREPARE_WRITE_RSP和ATT_ERROR_RSP PDU。
4.10 特種值通知
此過程用于從服務器通知客戶端特征值的值。有一個子過程可以用于通知一個值:通知。可以使用客戶端特性配置描述符來配置通知。
配置文件定義了何時使用通知。
4.10.1通知
當服務器被配置為向客戶端通知特征值,而不期望任何屬性協(xié)議層確認通知已成功收到時,將使用此子過程。
ATT_HANDLE_VALUE_NTF PDU用于執(zhí)行此子過程。屬性手柄參數(shù)應設置為已通知的特征值手柄,而屬性值參數(shù)應設置為特征值。
4.10.2 多變量長度通知
當服務器被配置為通知客戶端多個特征值時,將使用此子過程。
屬性協(xié)議ATT_MULTIPLE_HANDLE_VALUE_NTFPDU用于執(zhí)行此子過程。句柄長度值元組列表參數(shù)應包括特征值句柄集和相關(guān)的屬性值。
4.11?特征值指示
此過程用于指示從服務器到客戶端的特征值。有一個子程序可以用來指示一個值:指示。指示可以使用客戶機特征配置描述符進行配置。
配置文件定義了何時使用指示符。
當服務器被配置為向客戶端指示一個特征值,并期望一個屬性協(xié)議層確認已成功接收到該指示時,將使用此子過程。
ATT_HANDLE_VALUE_IND PDU用于執(zhí)行此子過程。屬性手柄參數(shù)應設置為所指示的特征值手柄,而屬性值參數(shù)應設置為特征值。一旦客戶端接收到ATT_HANDLE_VALUE_IND PDU,客戶端應使用ATT_HANDLE_VALUE_CFM PDU進行響應。
4.12?特征描述符
此過程用于讀寫服務器上的特征描述符。有兩個子過程可以用來讀寫特征描述符:讀特征描述符和寫特征描述符。
4.12.1 讀特征描述符
此子過程用于在客戶端知道特征描述符聲明的屬性句柄時從服務器上讀取特性描述符。
在此子過程中使用了ATT_READ_REQPDU。ATT_READ_REQ PDU與屬性句柄參數(shù)設置為特征描述符句柄一起使用。ATT_READ_RSP PDU返回屬性值參數(shù)中的特征描述符值。
如果客戶端使用身份驗證不足、授權(quán)不足、加密密鑰大小不足,或者特征值禁止讀取操作,服務器應發(fā)送ATT_ERROR_RSPPDU以響應ATT_READ_REQ PDU。錯誤代碼參數(shù)。
4.12.2 可以閱讀長時間的特征描述符
當客戶端知道特征描述符聲明的屬性句柄,并且特征描述符聲明的長度超過在單個ATT_READ_RSP PDU中可以發(fā)送的長度時,此子過程用于從服務器讀取特征描述符。
ATT_READ_BLOB_REQ PDU用于執(zhí)行此子過程。屬性句柄參數(shù)應設置為特征描述符句柄。值偏移量參數(shù)應是要讀取的特征描述符內(nèi)的偏移量。要讀取完整的特征描述符,第一個ATT_READ_BLOB_REQ PDU的偏移量應該設置為0x00。后續(xù)ATT_READ_BLOB_REQ pdu的偏移量是下一個尚未讀取的八位。重復ATT_READ_BLOB_REQ PDU,直到ATT_READ_BLOB_RSP PDU的部件屬性值參數(shù)為零,或者服務器發(fā)送ATT_ERROR_RSP PDU,錯誤代碼設置為“無效偏移”。
對于每個ATT_READ_BLOB_REQPDU,都會接收到一個ATT_READ_BLOB_RSPPDU,其中包含在部件屬性值參數(shù)中的部分特征描述符值。
如果客戶端使用身份驗證不足、授權(quán)不足、加密密鑰大小不足,或者特征描述符禁止讀取操作,服務器應發(fā)送ATT_ERROR_RSP PDU以響應ATT_READ_BLOB_REQ PDU。已相應地設置了錯誤代碼參數(shù)。
注意:ATT_READ_BLOB_REQPDU可用于讀取特征描述符值的其余部分,其中第一部分是使用簡單的ATT_READ_REQPDU讀取。
4.12.3 寫特征描述符
此子過程用于在客戶端知道特征描述符句柄時,將特征描述符值寫入服務器。
在此子過程中使用了ATT_WRITE_REQ PDU。屬性句柄參數(shù)應設置為特征描述符句柄。屬性值參數(shù)應設置為新的特征描述符值。
如果特征描述符值寫入成功,服務器應發(fā)送ATT_WRITE_RSP PDU。
如果客戶端使用身份驗證不足、授權(quán)不足、加密密鑰大小不足,或者特征值禁止寫操作,服務器應發(fā)送ATT_ERROR_RSPPDU以響應ATT_WRITE_REQ PDU。錯誤代碼參數(shù)應按照屬性協(xié)議中的規(guī)定進行設置。如果寫入的特征描述符值是錯誤的大小,或者具有配置文件定義的無效值,或者此時不允許該操作,則不應寫入該值,ATT_ERROR_RSPPDU應通過服務器將錯誤代碼發(fā)送給應用程序錯誤。
4.12.4 編寫長時間的特征描述符
此子過程用于在客戶端知道特征描述符句柄,但特征描述符值的長度超過在單個ATT_WRITE_REQ PDU中可以發(fā)送的長度時,將特征描述符值寫入服務器。
ATT_PREPARE_WRITE_REQ和ATT_EXECUTE_WRITE_REQ pdu用于執(zhí)行此子過程。屬性句柄參數(shù)應設置為要寫入的特征值的特征描述符句柄。零件屬性值參數(shù)應設置為正在寫入的屬性值的部分。值偏移量參數(shù)應為要寫入的特征值范圍內(nèi)的偏移量。要寫入完整的特征值,第一個ATT_PREPARE_WRITE_REQ PDU的偏移量應設置為0x0000。后續(xù)ATT_PREPARE_WRITE_REQ pdu的偏移量是下一個尚未編寫的八位。重復ATT_PREPARE_WRITE_REQ PDU,直到傳輸完整的特征值,之后使用ATT_EXECUTE_WRITE_REQ PDU寫入完整的值。
注意:在此子過程中的值不需要在ATT_PREPARE_WRITE_RSPPDU中進行驗證。
如果客戶端使用的身份驗證不足、授權(quán)不足、加密密鑰大小不足,或者不允許對特征值進行寫操作,服務器應響應ATT_PREPARE_WRITE_REQ或ATT_EXECUTE_WRITE_REQ PDU發(fā)送ATT_ERROR_RSP PDU。錯誤代碼參數(shù)按照屬性協(xié)議中的指定進行設置。如果寫入的屬性值大小錯誤,或配置文件定義的值無效,則寫入不會成功,服務器將發(fā)送ATT_ERROR_RSP PDU,并將錯誤代碼發(fā)送為應用程序錯誤。
4.13 GATT過程映射到ATT協(xié)議操作碼
表4.2描述了將ATT協(xié)議操作碼映射到GATT程序和子程序。只需要執(zhí)行強制性或支持的可選子程序所需的那些ATT協(xié)議請求、響應、通知或指示的部分。
4.14 程序超時
GATT過程不發(fā)生故障。
如果屬性協(xié)議交易超時,則認為該程序失敗,并通知本地高層。不得對該ATT載體進行進一步的GATT程序。一個新的GATT程序只能在另一個ATT載體上執(zhí)行。
5 L2CAP互操作性要求
以下配置文件的實現(xiàn)應使用以下默認值。根據(jù)正在發(fā)送屬性協(xié)議的物理通道,所使用的默認值可能會有所不同。
5.1 BR/EDR L2CAP互操作性要求
當使用未增強的ATT承載時,不處于增強流控制模式的BR/EDR的L2CAP連接通道可用于傳輸屬性協(xié)議PDU。這些通道使用從L2CAP開始的通道建立程序,使用ATT固定PSM,包括配置程序來確定ATT_MTU。因此,在這種情況下,ATT承載(或?qū)傩詤f(xié)議中提到的邏輯鏈接)是一個已建立的面向L2CAP連接的通道。
5.1.1 ATT_MTU
在L2CAP配置階段結(jié)束時,在過渡到打開狀態(tài)時,該ATT承載的ATT_MTU應設置為協(xié)商的最大傳輸單元配置選項的最小值。
注意:BR/EDR的最小ATT_MTU為48八進制。
5.1.2 BR/EDR通道要求
GATT通過L2CAP通道發(fā)送的所有屬性協(xié)議消息都是通過使用固定的PSM連接導出的動態(tài)通道ID發(fā)送的。使用一個固定的PSM允許快速重新連接L2CAP屬性協(xié)議通道,因為不需要一個初步的SDP查詢。
在此L2CAP通道上發(fā)送的所有數(shù)據(jù)包都應為屬性pdu。
pdu應被可靠地發(fā)送。
屬性協(xié)議的流程規(guī)范應盡力努力。
如果在基本L2CAP模式下運行,則L2CAPB幀的信息有效載荷應為單個屬性PDU。
該通道應進行加密。Key_Type應為未經(jīng)身份驗證的組合密鑰或已經(jīng)認證的組合密鑰。
L2CAP連接可以由客戶端或服務器啟動。
5.2 LE L2CAP?互操作性要求
當使用未增強的ATT承載時,用于通過LE攜帶屬性協(xié)議PDU的通道是屬性L2CAP固定通道。
注意:要刪除ATT承載,必須斷開物理通道。
5.2.1 ATT_MTU
GATT客戶端和服務器實現(xiàn)都應支持不小于默認值的ATT_MTU。
5.2.2 LE通道要求
屬性協(xié)議應使用L2CAP固定CID 0x0004。在此固定通道上發(fā)送的所有數(shù)據(jù)包都應為屬性協(xié)議pdu。
pdu應可靠地發(fā)送,且不進行flush。
該通道的再傳輸和流量控制模式應為基本的L2CAP模式.
L2CAP B-幀的有效載荷的默認參數(shù)應為單個屬性PDU。
5.3 增強的ATT承載者L2CAP的互操作性要求
當在BR/EDR或LE上使用增強ATT承載時,使用增強基于信用流量控制模式的L2CAP連接通道傳輸屬性協(xié)議pdu。這些通道是使用EATT固定PSM的來自L2CAP的基于信用的連接請求信令包建立的。因此,在這種情況下,ATT承載是已建立的面向L2CAP連接的通道。
在客戶端和服務器之間可以建立多個L2CAP通道。
5.3.1 ATT_MTU
增強型ATT承載的ATT_MTU應設置為兩個設備的最低MTU字段值;這些值來自L2CAP_CREDIT_BASED_CONNECTION_REQ和L2CAP_CREDIT_BASED_CONNECTION_RSP信令數(shù)據(jù)包或最新的L2CAP_CREDIT_BASED_RECONFIGURE_REQ數(shù)據(jù)包。
注意:增強型ATT承載的最小ATT_MTU為648字節(jié)。
5.3.2 通道要求
GATT通過L2CAP增強的基于信用的流量控制模式通道發(fā)送的所有屬性協(xié)議消息都是使用一個使用固定的PSM連接導出的動態(tài)通道id之一發(fā)送的。使用固定的PSM允許快速重新連接L2CAP通道,因為不需要初步的SDP或GATT查詢。
在此L2CAP通道上發(fā)送的所有數(shù)據(jù)包都應為屬性pdu。
屬性協(xié)議的流程規(guī)范應盡力努力。
L2CAPK幀的信息有效載荷應為單個屬性PDU。
該通道應進行加密該通道應進行加密。
5.4 L2CAP減輕碰撞
如果兩個設備同時請求L2CAP連接,并且兩個設備具有有限的資源,則設備可以拒絕傳入的請求并發(fā)現(xiàn)其自己的請求也被拒絕。在這種情況下,主服務器可以立即重試,但從服務器應等待至少100ms才能重試;在LE連接上,從服務器應等待至少2×(連續(xù)延遲+1)×連續(xù)間隔更長。
5.5 承載支持
支持BR/EDR的GATT實現(xiàn)載體應至少支持支持BR/EDR的未增強和增強ATT載體,并可能支持這兩者。
支持LE上的GATT實現(xiàn)承載應支持LE上的未增強ATT承載,并可能支持LE上的增強ATT承載。
注:因此,支持BR/EDR和LE的GATT實現(xiàn)可以支持承載的任何組合,只要它支持LE的未增強ATT承載和BR/EDR的至少一種類型的ATT承載。
6?GAP的互操作性要求
6.1 BR/EDR GAP互操作性要求
6.1.1 連接建立
為了建立未增強的ATT承載,通道建立程序應與PSM設置為ATT一起使用。
任何一種設備都可以隨時建立一個ATT承載器。
任何一個設備都可以隨時終止一個鏈接。
此配置文件沒有定義任何空閑模式過程或模式。
6.2 LE GAP的互操作性要求
6.2.1 連接建立
為建立未增強的ATT載體,應使用連接建立程序。
任何一種設備都可以隨時終止ATT承載器。
此配置文件沒有定義任何空閑模式過程或模式.
6.2.2 配置文件角色
此配置文件可用于以下配置文件角色中
中心設備
外圍設備
6.3 斷開連接的事件
6.3.1 斷開連接時的通知和指示信息
如果客戶端已將服務器配置為向客戶端發(fā)送通知或指示,則應將其配置為允許在斷開連接時重新建立連接。
如果客戶端斷開,但打算成為連接的中心,它應執(zhí)行GAP連接建立過程。如果客戶端已斷開連接,但打算成為連接中的外圍設備,則應進入GAP可連接模式。
當事件或觸發(fā)操作向客戶端發(fā)出通知或指示時,服務器應與客戶端重新建立連接。
如果服務器已斷開連接,但打算成為連接中的外圍設備,則應進入GAP可連接模式。如果服務器斷開,但打算成為連接的中心,它應執(zhí)行GAP連接建立過程。
如果服務器無法重新建立連接,則應丟棄此事件的通知或指示,并且不再發(fā)生進一步的連接重建,直到發(fā)生其他事件。
7 通用屬性配置文件服務定義
7.1 服務變更
服務更改特性是一個控制點屬性,應用于向連接的設備指示服務已更改(即添加、刪除或修改)。該特性應用于在基于GATT的服務重新連接到服務器時基于GATT發(fā)生更改時指示與服務器有信任關(guān)系(即綁定)的客戶端。
此特征值應配置為使用客戶端特征配置描述符進行指示。如果客戶錯誤地未啟用客戶特征配置描述符中的指示,則由“服務變更特征值”更改引起的指示應被視為丟失。
服務更改特征值是兩個16位屬性處理連接在一起,指示受服務器上基于gatt的服務的添加、刪除或修改影響的開始和結(jié)束屬性處理。更改特征值并不被認為是對服務的修改。如果對“服務更改特征值”和“客戶端支持的功能”特征值以外的任何GATT服務定義特征值進行了更改,則該范圍還應包括GATT服務定義的開始和結(jié)束屬性句柄。
在GATT服務定義中,應該只有一個服務改變特征的實例。每個具有信任關(guān)系的客戶應存在服務更改的特征值。
如果基于GATT協(xié)定的服務列表和服務定義不能在設備的使用壽命內(nèi)發(fā)生變化,則該特性應不存在,否則該特性應存在。
如果服務器上存在“服務更改”特性,則服務器上必須提供“特征值指示”支持。
客戶應支持服務改變特征的特征值指示。
如果服務器與任何客戶端有受信任的關(guān)系,則服務器上的服務更改特征屬性句柄不得更改。
7.2 客戶端支持的功能
客戶端使用客戶機支持的特性特性來通知服務器客戶端支持哪些特性。如果該特征存在于在服務器上,客戶端可以更新客戶端支持的特性位字段。如果一個客戶端特性位是由客戶端設置的,并且服務器支持該特性,則服務器在與該客戶端通信時應滿足與此特性相關(guān)聯(lián)的所有要求。
客戶端支持的特性特性值的默認值應將所有位設置為零。
GATT服務定義中只有一個客戶端支持的特性實例。
每個連接的客戶端都應存在一個客戶端支持的特性特征值。對于具有受信任關(guān)系的客戶端,特征值應跨連接持久化。對于沒有可信關(guān)系的客戶端,特征值應設置為每個連接處的默認值。
在連接期間,服務器上客戶端支持的特性的屬性句柄,或者如果服務器與任何客戶端有信任關(guān)系,則不得更改。
客戶不得清除其設置的任何位。服務器應響應任何此類請求,錯誤代碼設置為不允許。
7.3 數(shù)據(jù)庫哈希
數(shù)據(jù)庫哈希特性包含應用于GATT數(shù)據(jù)庫中的服務定義的哈希函數(shù)的結(jié)果。客戶端可以隨時讀取該特征,以確定服務是否已被添加、刪除或修改。如果哈列函數(shù)的任何輸入字段發(fā)生更改,服務器應計算新的數(shù)據(jù)庫哈列并更新特征值。
數(shù)據(jù)庫哈希特性是一個只讀屬性。
該特征值為一個128位的無符號整數(shù)。
在GATT服務定義中,只有數(shù)據(jù)庫哈希特性的一個實例。無論是否存在受信任的關(guān)系,所有客戶端都使用相同的數(shù)據(jù)庫哈希值。
為了讀取該特性的值,客戶應始終使用使用特征UUID讀取GATT子程序。
如果客戶端在更改數(shù)據(jù)庫后服務器重新計算散列時讀取此特性的值,服務器將返回新的散列,從而延遲其響應,直到它可用。
7.3.1 數(shù)據(jù)庫哈希計算
數(shù)據(jù)庫散列應根據(jù)RFC-4493進行計算。此RFC使用AES-128作為塊密碼函數(shù),定義了基于密碼的消息身份驗證代碼(CMAC),也被稱為AES-CMAC。
到AES-CMAC的輸入是:m是要散希的可變長度數(shù)據(jù),k是128位密鑰,它應全部為零
(0x00000000_00000000_00000000_00000000)
128位數(shù)據(jù)庫哈希值生成如下:
數(shù)據(jù)庫Hash=AES-CMACk(m),其中m計算如下:
按照屬性句柄的升序,從第一個句柄開始,如果屬性具有以下類型之一連接屬性句柄,連接屬性類型和屬性值:主服務、輔助服務、包括服務、特性或特性擴展屬性,如果屬性具有以下類型之一連接字段屬性句柄和屬性類型:特征用戶描述、客戶端特征配置、服務器特征配置、特征格式或特征聚合格式、如果該屬性具有任何其他類型(這些屬性不是連接的一部分),則忽略該屬性。對于每個屬性句柄,這些字段應按照上述順序進行連接。每個字段或子字段值所使用的字節(jié)順序應為小中位數(shù)。如果一個字段包含子字段,則這些子字段應按照第3節(jié)(服務互操作性要求)中出現(xiàn)的順序進行連接。例如,連接后的{0x02、0x0005、0x2A00}的特征聲明值表示為02 05 00 002A。
上面列出的屬性類型的屬性句柄、屬性類型和屬性值等字段的格式在第3節(jié)(服務互操作性要求)中定義。
如果m的長度不是AES-CMAC塊長度128位的倍數(shù),則應按照RFC-4493第2.4節(jié)的規(guī)定進行填充。
7.4?服務器支持的特性
服務器支持的特性特性是一個只讀特性,應用于表示對服務器特性的支持。只有在支持相應的功能時,服務器才應該設置一點。
服務器支持的特性是八進制數(shù)組,每個字節(jié)都是一個位字段。所有未列出的位都被保留以供將來使用。數(shù)組不應該有任何尾零8進制。
在GATT服務定義中,應該只有一個服務器支持特性特性的實例。
8.GATT的安全考慮
8.1 認證要求
GATT配置文件中的身份驗證將獨立地應用于每個特性。身份驗證要求在本配置文件中指定,相關(guān)的高層規(guī)范,如果沒有另行指定,則特定于實現(xiàn)。
GATT配置文件程序用于訪問可能需要在讀寫特性之前對客戶端進行身份驗證并具有加密連接的信息。
如果在物理鏈路未經(jīng)身份驗證或未加密時發(fā)出此類請求,服務器應發(fā)送ATT_ERROR_RSPPDU。想要讀取或?qū)戇@個特性的客戶端可以請求使用GAP身份驗證過程對物理鏈接進行身份驗證,一旦完成,就再次發(fā)送請求。
設備支持的服務和特性列表不被視為私人或機密信息,因此服務應始終允許發(fā)現(xiàn)程序和特性。這意味著不應在查找信息請求的ATT_ERROR_RSPPDU中使用身份驗證不足的錯誤代碼。
注意:任何設備都可以讀取一個特征,但只能由經(jīng)過身份驗證的設備寫入。一個實現(xiàn)應該考慮到這一點,而不是假設如果它可以讀取一個特征值,它也將能夠?qū)懭胩卣髦怠n愃频兀绻梢詫懸粋€特征,它并不意味著特征也可以讀取。每個單獨特性都可能具有不同的安全屬性。
一旦建立了足夠的客戶端身份驗證以允許訪問服務定義中的一個特征,服務器還可以允許根據(jù)更高級別或?qū)崿F(xiàn)的特定需求訪問服務定義中的其他特征。
一旦執(zhí)行了足夠的身份驗證,服務器可以允許訪問服務定義中的大多數(shù)特征,但限制對同一服務定義中的其他特征的訪問。這可能是由于某些特性需要比當前啟用的更強的身份驗證要求。
一旦服務器對客戶端進行了身份驗證以訪問一個服務定義中的特征,它就可以自動允許訪問其他服務定義中的特征。
8.2 授權(quán)要求
GATT配置文件中的授權(quán)獨立應用于每個特性。授權(quán)要求可以在本配置文件中、相關(guān)的高層規(guī)范中指定,或者如果沒有另有說明,則是特定于實現(xiàn)的。
如果這樣的請求被發(fā)布給未經(jīng)授權(quán)的服務定義中包含的特性,響應者應發(fā)送一個錯誤代碼設置為授權(quán)不足的ATT_ERROR_RSP PDU。
一旦服務器授權(quán)客戶端訪問一個組或服務定義中的特征,它就可以自動允許訪問其他服務定義中的特征。
9.SDP的互操作性要求
在BR/EDR上支持GATT的設備應發(fā)布以下SDP記錄。GATT開始句柄應設置為“通用屬性概要文件”服務聲明的屬性句柄。GATT端句柄應設置為“通用屬性配置文件”服務定義組中的最后一個屬性的屬性句柄。
TCP/IP
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。