![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
HCI
文章平均质量分 73
蓝牙协议栈学习笔记,错误地方欢迎指正,谢谢,后面会在工作实践中不断的修改更正错误的地方
好好学习,天天向上。。
这个作者很懒,什么都没留下…
展开
-
连接的初步建立和Page Scan interval、Page Scan window、Page Scan Type的选择(为什么有的设备跟手机配对100次失败0-1次,有的确失败3-5次)
(一)、两个设备之间连接建立的初步流程如下图所示(两张图的区别在于slave接收到是f(k)还是f(k+1)频段的page message):原创 2021-06-20 16:58:22 · 2285 阅读 · 0 评论 -
HCI初始化流程(重点)
十七、初始化流程1、HCI_Reset 初始化的第一步2、确定bt chip支持的command、feature、地址等HCI_Read_Local_Version_InformationHCI_Read_Local_Supported_CommandsHCI_Read_Local_Supported_FeaturesHCI_Read_Local_Extended_FeaturesHCI_Read_BD_ADDR3、设置接收哪些eventHCI_Set_Event_...原创 2021-06-20 16:53:25 · 1401 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(16、AUTHENTICATION AND ENCRYPTION 八)
第四阶段:Authentication stage 2: DHKey Check(1)Simple Pairing Complete Event(常用)这个event用来通知host配对完成。参数说明:Status(1 Octets):0x00表示配对成功,其他表示配对失败BR_ADDR(6 Octets):远端设备地址举例说明:0x04:表示HCI Event Packet0x36:表示这个event是Simple Pairing Complete event原创 2020-12-14 22:51:41 · 1047 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(16、AUTHENTICATION AND ENCRYPTION 七)
(1)IO Capability Request Event(常用)这个event表示在简单配对过程中host需要提供自己的IO capabilities,host应该使用HCI_IO_Capability_Request_Reply或者HCI_IO_Capability_Request_Negative_Reply进行回复。参数说明:BR_ADDR(6 Octets):远端设备地址举例说明:0x04:表示HCI Event Packet0x31:表示这个ev...原创 2020-12-14 22:47:45 · 1278 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(16、AUTHENTICATION AND ENCRYPTION 六)
3、普通配对时使用的command(认证失败后开始配对)(1)PIN Code Request Event(常用)Host回复Link Key Request Negative Reply Command后或者对方发起普通配对时会收到这个ecommand。PIN Code Request event表示需要一个PIN code来产生一个新的link key,host收到这个event后,需要回复PIN_Code_Request_Reply(有PIN Code)或者 PIN_C原创 2020-12-14 22:39:56 · 497 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(16、AUTHENTICATION AND ENCRYPTION 五)
2、认证时使用的command(先看认证,认证失败才会重新配对)(1)Authentication Requested Command(常用)这个命令用来请求对远端设备进行认证,Connection_Handle表示本地设备和远端设备之间的ACL连接注意:如果认证失败,不会自动断开连接,需要host发起断开动作这个命令的后续动作:第一步:host发送Authentication_Requested以后,会立即收到一个Command Status event表示Au原创 2020-12-14 22:37:31 · 992 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(16、AUTHENTICATION AND ENCRYPTION 四)
(四)HCI指令说明:1、一般初始化时使用的command (1)Read Authentication Enable Command(一般不用)这个命令用来获取controller中Authentication_Enable的值。Authentication_Enable指的是在ACL建立过程中是否需要认证,就是在Create_Connection命令(或者接收一个ACL连接请求)和Connection Complete event之间是否需要认证。返回参数原创 2020-12-14 22:34:14 · 1189 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(16、AUTHENTICATION AND ENCRYPTION 三)
(1)Master Link Key Command(没见用过)使用这个命令可以强制使网络中的master设备使用自己的临时link key或者非永久性的link key,临时link key是用来加密广播消息的,非永久性link key是两个设备点对点进行数据交互时用来加密的。如果网络中的所有slave都支持AES-CCM加密,但是Key_Flag设置的是使用临时key,此时会返回error:Command Disallowed (0x0C);注意:如果网络中有至少一个设备...原创 2020-08-24 22:01:40 · 601 阅读 · 1 评论 -
第一部分:HCI协议(八)具体的HCI command和event(16、AUTHENTICATION AND ENCRYPTION 二)
(1)Link Key Notification Event当controller发送Link Key Notification event给host时,表示本地设备与地址为BD_ADDR的远端设备之间的连接已经产生了一个新的Link key,此时host可以将这个Link key存起来,也可以使用Write_Stored_Link_Key将link key存到controller内。参数说明:BD_ADDR(6 Octet):远端设备地址Link_Key(16 Octet):与...原创 2020-08-24 21:58:37 · 1116 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(16、AUTHENTICATION AND ENCRYPTION 一)
上面两个命令没明白(1)Link Key Request Event收到这个event表示与BD_ADDR的连接需要一个Link Key,如果host有对应的 Link Key,host需要使用Link_Key_Request_Reply将这个Link Key发送给Controller,如果host没有对应的Link Key,host需要使用Link_Key_Request_Negative_Reply进行回复注意:需要在LMP response timeout之前回复If th..原创 2020-08-24 21:54:34 · 813 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(15、LINK INFORMATION一般不用)
(1)Read LMP Handle Command这个命令用来读取与Connection_Handle(SCO或者eSCO)相关联的LMP Handle参数说明:Connection_Handle(2 Octet):必须是SCO或者eSCO连接返回参数说明:Status(1 Octet):0x00表示成功,其他表示失败Connection_Handle(2 Octet):与参数中的Connection_Handle应该是一样的LMP_Handle(1 Octet):...原创 2020-07-26 23:48:05 · 741 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(14、HOST FLOW CONTROL)
(1)Set Controller To Host Flow Control Command这个命令是Host用来开启/关闭从Controller到Host的流控(ACL数据和(e)SCO数据),如果不使用这个命令,ACL数据和(e)SCO数据的流控一般来说默认都是开启的(不确定,一般都不下这个命令)。参数说明:Flow_Control_Enable(1 Octet):取值范围如下返回参数说明:Status(1 Octet):0x00表示成功,其他值表示失败举例说...原创 2020-07-26 23:44:18 · 1650 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(13、PHYSICAL LINKS)
(1)Read Link Supervision Timeout Command这个命令用来获取Handle对应连接的Link_Supervision_Timeout的值,这个命令中的Handle指的是ACL连接Link_Supervision_Timeout是Controller用来监控link lost的,即如果Handle对应的连接上超过Link_Supervision_Timeout时间没有接收到任何数据包则表示连接断开了,取值范围:参数说明:Handle(2 Oct...原创 2020-07-23 22:22:14 · 1083 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(11、PICONET STRUCTURE)
(1)Role Discovery Command当Host想要确定在Connection_Handle(ACL连接)表示的连接上是什么role时,可以使用这个命令参数说明:Connection_Handle(2 Octet):用来表示一个ACL连接返回参数说明:Status(1 Octet):0x00表示成功,其他值表示失败Connection_Handle(2 Octet):用来表示一个ACL连接Current_Role(1 Octet):0x00表示master,0..原创 2020-07-23 22:13:09 · 1219 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(10、CONNECTION STATE)
只介绍常用的几个(1)Mode Change Event这个event用来表明Connection_Handle表示的ACL连接在Active、Hold、Sniff以及Park模式进行了切换参数说明:Status(1 Octet):0x00表示mode change已经发生;0x01-0xFF表示Hold_Mode、Sniff_Mode、Exit_Sniff_Mode、Park_State或者Exit_Park_State command失败Connection_Hand原创 2020-07-21 11:58:33 · 2993 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 二)
(6)Read Voice Setting Command这个命令用来获取Voice_Setting的值返回参数说明:Status(1 Octet):0x00表示success;0x01-0xFF表示失败Voice_Setting(2 Octet):语音连接的相关配置,用来配置Input Coding, Air coding format, input data format, Input sample size, and linear PCM parameter举例说明:(暂时没有原创 2020-07-20 12:28:36 · 1293 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(9、SYNCHRONOUS CONNECTIONS 一)
下面只介绍常用的几个command和event(1)Setup Synchronous Connection Command这个命令根据Connection_Handle建立一个新的SCO or eSCO或者修改一个已存在的eSCO注意:a)如果要建立一个新的SCO or eSCO,要使用ACL连接的Connection_Handle(新建立的SCO or eSCO将会和这个ACL关联在一起),但是如果ACL连接使用AES-CCM加密的,那么不能建立eSCO,只能建立SCO,原创 2020-07-20 12:27:14 · 1305 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(8、REMOTE INFORMATION)
这里只介绍常用的几个command和event(1)Remote Name Request Command这个命令用来获取远端BR/EDR Controller的设备名注意:当Remote Supported Host Features Notification event没有被屏蔽并且Remote_Name_Request command建立一个连接时(如果两个设备之间没有连接存在则会建立一个临时连接),Link Manager在获取远端设备名字的同时会获取远端设备LMP feat原创 2020-07-20 12:25:02 · 1493 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(7、CONNECTION SETUP 二)
(5)Create Connection Cancel Command这个命令用来取消一个正在进行的连接(注意:这个连接是本地BR/EDR Controller使用Create_Connection命令发起的)如果基带层的连接已经建立,但是本地BR/EDR Controller还没有发送Connection Complete event给host,这时候本地设备会断开连接同时发送Command Complete event(status是“Success”)给host如果连接已经建立,本地B原创 2020-07-20 12:22:17 · 2392 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(7、CONNECTION SETUP 一)
下面只介绍常用的几个command和event(1)Create Connection Command这个命令是使Link Manager根据BD_ADDR与远端设备建立ACL连接参数说明:BD_ADDR(6 Octet):远端设备地址Packet_Type(2 Octet):指定Link Manager在ACL连接中使用什么packet type(DM1 packet是永远被支持的),可以使用位与的方式指定多个packet type,取值范围如下图所示:原创 2020-07-20 12:20:53 · 1563 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(6、DEVICE DISCOVERY 二)
(6)Inquiry Cancel Command这个命令用来停止搜索返回参数说明:Status(1 Octet):0x00表示success;0x01-0xFF error code举例说明:Command如下:0x01:表示HCI Command Packet0x0402:表示是HCI_Inquiry_Cancel command指令的OGF是0x01即0000 01OCF是0x0002即00 0000 0010所以整个opcode是0000 0100 0原创 2020-07-20 12:18:55 · 1189 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(6、DEVICE DISCOVERY 一)
这里只记录常用的几个command和event(1)Inquiry Command这个命令是用来搜索周围的BR/EDR Controllers的. 当本地Controller接收到Inquiry Command以后,首先会回复一个Command Status event,当搜索到其他BR/EDR Controllers时,会有Inquiry Result events或者Inquiry Result with RSSI Event或者extended Inquiry Resu原创 2020-07-20 12:18:19 · 791 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(5、CONTROLLER CONFIGURATION 三)
原创 2020-07-20 12:16:25 · 1792 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(5、CONTROLLER CONFIGURATION 二)
(3)Read Class of Device Command这个command用来获取设备的Class_of_Device返回参数说明:Status(1 Octet):0x00表示success;0x01-0xFF error codeClass_of_Device(3 Octet):本地设备的设备类Class of Device说明:...原创 2020-07-20 12:11:00 · 371 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(5、CONTROLLER CONFIGURATION 一)
5、CONTROLLER CONFIGURATION这里只记录常用的几个command和event(LE的先不记录)(1)Read Local Name Command这个command用来获取BR/EDR Controller中存储的设备的名字Local Name是一个248 octets长度的UTF-8编码的字符串,如果Local Name长度不足248 octets,则最后用空字符0x00结束,名字的顺序就是按照获取数据的顺序(例如收到的数据是0x31 0x32...原创 2020-07-20 12:07:09 · 656 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(4、CONTROLLER INFORMATION)
4、CONTROLLER INFORMATION这里只记录常用的几个command和event(LE的先不记录)(1)Read Local Version Information Command这个command用来获取本地Controller的版本信息返回参数说明(Command Complete event):Status(1 Octet):0x00表示success;0x01-0xFF error codeHCI Version(1 Octet):定义HCI层的版本信息原创 2020-07-19 22:30:24 · 2287 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(3、CONTROLLER FLOW CONTROL(Host to Contorller))
3、CONTROLLER FLOW CONTROL(Host to Contorller)这里只记录常用的1个command和1个event:Read Buffer Size Command和Number Of Completed Packets Event(1)Read Buffer Size Command注意:BR/EDR and LE controller, 如果LE_Read_Buffer_Size command 返回的buffers数是0, 那么Read_Buffer_Si原创 2020-07-19 22:28:10 · 683 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(2、DEVICE SETUP)
2、DEVICE SETUPReset CommandCommand Complete event返回参数说明:Status(1 Octet):0x00表示success;0x01-0xFF error code举例说明:Command如下:0x01:表示HCI Command Packet0x0C03:表示是HCI Reset command指令的OGF是0x03即0000 11OCF是0x0003即00 0000 0011所以整个opcode是0000原创 2020-07-19 22:27:17 · 994 阅读 · 0 评论 -
第一部分:HCI协议(八)具体的HCI command和event(1、Generic Events)
个人感觉按照core 4.2分类容易理解,这部分只记录常用的(LE的暂时不写):1、Generic Events(1)Command Complete Event参数说明:Num_HCI_Command_Packets(1 Octet):取值范围0-255;表示 Host可以向Controller发送的HCI command packets数量(这个参数是0表示停止向controller发送command,Command_Opcode是0x0000, Num_HCI_Command_原创 2020-07-19 22:26:15 · 1080 阅读 · 0 评论 -
第一部分:HCI协议(七)HCI data format
七、HCI data format1、HCI Command PacketOpcode:操作码分为两部分:OCF(Opcode Command filed)和OGF(Opcode Group filed);其中OCF是10bit(0x0000-0x03FF),OCF是6bit(0x00-0x3F其中0x3F是vendor-vendor-specific debug commands)Parameter_Total_Length:所有参数的总长度(单位是byte)Parameter0-N:原创 2020-07-19 22:23:23 · 1519 阅读 · 7 评论 -
第一部分:HCI协议(六)HCI command错误处理
六、command错误处理一般来说,command对应event中任何参数提示error,那么就表示这个command没有被执行。当一个command发生错误时:(1)如果正常情况下这个command只返回HCI_Command_Complete event,则event的status参数会设置对应的错误码;这种情况下command没有被执行;(2)如果正常情况下这个command返回HCI_Command_Status event和一个由command指定的completion event原创 2020-07-19 22:22:22 · 1460 阅读 · 0 评论 -
第一部分:HCI协议(五)HCI Command flow control的具体实现
五、Command flow control的具体实现:1、上电,host端发送HCI reset command之后,只能发送1个HCI comamnd包,等待接收到command complete或者command status event以后再继续下面的操作2、接收到的command complete或者command status event里面包含一个参数是Num HCI Command Packets(用来表示当前Controller允许Host发送的最大command包数),Contr原创 2020-07-19 22:21:24 · 748 阅读 · 0 评论 -
第一部分:HCI协议(四)HCI flow control的具体实现
四、HCI flow control的具体实现:1、从host到Controller的数据流控分为两种:Packet-based Data Flow Control和Data-Block-Based Data Flow Control对于BR/EDR、LE 或者BR/EDR/LE controller来说packet based flow control是默认的,对于AMP control来说data block based flow control是默认的;数据流控机制使用Write Flow C原创 2020-07-19 22:19:54 · 1266 阅读 · 0 评论 -
第一部分:HCI协议(二、三)HCI的结构图、两个设备之间点对点传输数据
二、HCI的结构图三、两个设备之间点对点传输数据原创 2020-07-19 22:18:01 · 823 阅读 · 0 评论 -
第一部分:HCI协议(一)HCI传输层
一、HCI传输层:1、UART传输层配置(1)HCI UART使用的是RS232,具体配置如下图所示:主要需要注意的就是流控(Flow control),流控是为了防止uart buffer溢出,这个流控不是HCI流控,HCI有自己的流控机制(注意:有的bt chip直接可以设置uart流控,不用设置hci 流控)接线方式:BT CHIP的TX和MCU的RX接;BT CHIP的RX和MCU的TX接;BT CHIP的CTS和MCU的RTS接;BT CHIP的RTS和MCU的CTS接。(原创 2020-07-19 22:16:06 · 3289 阅读 · 0 评论