主要介绍下蓝牙协议栈(bluetooth stack)DID(Device ID)协议讲解
btsnoop以及流程在资料中的......\STM32_UBUNTU_BLUETOOTH\2-蓝牙资料\蓝牙协议分析\DID分析.log
本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:
第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。
第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等
第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(LMP)等
第四篇:传统蓝牙host介绍,主要介绍传统蓝牙的协议栈,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的协议吧。
第五篇:低功耗蓝牙controller介绍,主要介绍低功耗蓝牙芯片,包括物理层(PHY),链路层(LL)
第六篇:低功耗蓝牙host介绍,低功耗蓝牙协议栈的介绍,包括HCI,L2CAP,ATT,GATT,SM等
第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展
第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。
另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。
-------------------------------------------------------------------------------------------------------------------------
CSDN学院链接(进入选择你想要学习的课程):
蓝牙交流扣扣群:970324688
Github代码:
入手开发板:
蓝牙学习目录:
--------------------------------------------------------------------------------------------------------------------------
DID(device id)是一个用于标示蓝牙设备的协议,用于提供蓝牙设备类之外的附加信息(比如厂商ID,产品ID等等信息),并将这些信息合并到SDP记录和EIR响应中,以便remote 设备获取到这些信息。
目前在蓝牙SIG官网,只有两个版本(V1.2/V1.3)
主要差别在于V1.2只把DID一些属性注册到SDP中以方便remote 设备问询SDP的时候获取到,而V1.3在V1.2的基础上,增加了把DID的一些属性添加到EIR(Extended Inquery Response)中,方便remote设备在搜寻的时候就能获取到这些信息
DID一共有以下几个属性:
蓝牙Vendor Id的厂商在以下这个连接可查找到,发现很多大公司都赫然在列
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的数据
EIR一共240byte,非为有用数据和无用数据,但是不管EIR有用数据多少,都要240byte,
格式为 1B len 1B type raw data,其中len不包括自身,type是0x10
我们要注册的关于DID相关的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
录制出来的模样就是这样: