主要介紹下藍牙協(xié)議棧(bluetooth stack)DID(Device ID)協(xié)議講解
btsnoop以及流程在資料中的......\STM32_UBUNTU_BLUETOOTH\2-藍牙資料\藍牙協(xié)議分析\DID分析.log
本專欄文章我們會以連載的方式持續(xù)更新,本專欄計劃更新內(nèi)容如下:

第一篇:藍牙綜合介紹 ,主要介紹藍牙的一些概念,產(chǎn)生背景,發(fā)展軌跡,市面藍牙介紹,以及藍牙開發(fā)板介紹。
第二篇:Transport層介紹,主要介紹藍牙協(xié)議棧跟藍牙芯片之前的硬件傳輸協(xié)議,比如基于UART的H4,H5,BCSP,基于USB的H2等
第三篇:傳統(tǒng)藍牙controller介紹,主要介紹傳統(tǒng)藍牙芯片的介紹,包括射頻層(RF),基帶層(baseband),鏈路管理層(LMP)等
第四篇:傳統(tǒng)藍牙host介紹,主要介紹傳統(tǒng)藍牙的協(xié)議棧,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的協(xié)議吧。
第五篇:低功耗藍牙controller介紹,主要介紹低功耗藍牙芯片,包括物理層(PHY),鏈路層(LL)
第六篇:低功耗藍牙host介紹,低功耗藍牙協(xié)議棧的介紹,包括HCI,L2CAP,ATT,GATT,SM等
第七篇:藍牙芯片介紹,主要介紹一些藍牙芯片的初始化流程,基于HCI vendor command的擴展
第八篇:附錄,主要介紹以上常用名詞的介紹以及一些特殊流程的介紹等。
另外,開發(fā)板如下所示,對于想學(xué)習(xí)藍牙協(xié)議棧的最好人手一套。以便更好的學(xué)習(xí)藍牙協(xié)議棧,相信我,學(xué)完這一套視頻你將擁有修改任何協(xié)議棧的能力(比如Linux下的bluez,Android下的bluedroid)。

-------------------------------------------------------------------------------------------------------------------------
CSDN學(xué)院鏈接(進入選擇你想要學(xué)習(xí)的課程):
藍牙交流扣扣群:970324688
Github代碼:
入手開發(fā)板:
藍牙學(xué)習(xí)目錄:
--------------------------------------------------------------------------------------------------------------------------
DID(device id)是一個用于標(biāo)示藍牙設(shè)備的協(xié)議,用于提供藍牙設(shè)備類之外的附加信息(比如廠商ID,產(chǎn)品ID等等信息),并將這些信息合并到SDP記錄和EIR響應(yīng)中,以便remote?設(shè)備獲取到這些信息。
目前在藍牙SIG官網(wǎng),只有兩個版本(V1.2/V1.3)
主要差別在于V1.2只把DID一些屬性注冊到SDP中以方便remote 設(shè)備問詢SDP的時候獲取到,而V1.3在V1.2的基礎(chǔ)上,增加了把DID的一些屬性添加到EIR(Extended?Inquery Response)中,方便remote設(shè)備在搜尋的時候就能獲取到這些信息
DID一共有以下幾個屬性:



藍牙Vendor Id的廠商在以下這個連接可查找到,發(fā)現(xiàn)很多大公司都赫然在列
https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers





Device ID information for the device is exported in terms of an explicit SDP record on that device. This will be called the Device ID Service Record, and is identified by a unique UUID – this UUID is called the PNPInformation.
PNPInformation的UUID為0x1200

在說明注冊什么樣形式的EIR之前,我們先來普及下EIR的概念
首先EIR是HCI的范疇,屬于protocol,但是我們也簡單介紹下
至于HCI command的格式,我們在HCI中再做說明,只說下EIR的數(shù)據(jù)

EIR一共240byte,非為有用數(shù)據(jù)和無用數(shù)據(jù),但是不管EIR有用數(shù)據(jù)多少,都要240byte,
格式為 1B len 1B type raw data,其中l(wèi)en不包括自身,type是0x10
![]()
我們要注冊的關(guān)于DID相關(guān)的EIR為

所以代碼可以寫成這樣:
/* Device ID */
#if PROFILE_DID_ENABLE
eir_data[data_pos ] = 9;
eir_data[data_pos ] = BT_DT_DEVICE_ID;
eir_data[data_pos ] = DID_VENDOR_ID_SOURCE_VALUE & 0xff;
eir_data[data_pos ] = (DID_VENDOR_ID_SOURCE_VALUE>>8) & 0xff;
eir_data[data_pos ] = DID_VENDOR_ID_VALUE & 0xff;
eir_data[data_pos ] = (DID_VENDOR_ID_VALUE>>8) & 0xff;
eir_data[data_pos ] = DID_PRODUCT_ID_VALUE & 0xff;
eir_data[data_pos ] = (DID_PRODUCT_ID_VALUE>>8) & 0xff;
eir_data[data_pos ] = DID_VERSION_ID_VALUE & 0xff;
eir_data[data_pos ] = (DID_VERSION_ID_VALUE>>8) & 0xff;
#endif
錄制出來的模樣就是這樣:
