网站做的很差的案例仿制网站建设
网站做的很差的案例,仿制网站建设,asp 做购物网站,平面设计常用网站蓝牙HCI层#xff08;末#xff09;本笔记为作者再学习蓝牙Host协议栈的一些心得体会#xff0c;如有不对的地方#xff0c;请包含与谅解#xff01;
————by wsoz主机控制器接口层#xff08;HCI#xff09;
上一章末尾&…蓝牙HCI层末本笔记为作者再学习蓝牙Host协议栈的一些心得体会如有不对的地方请包含与谅解 ————by wsoz主机控制器接口层HCI上一章末尾我们学习了经典蓝牙HCI层的初始化下面我们学习一下HCI层其他的知识。蓝牙配对方式 经典蓝牙Classic Bluetooth的配对方式主要包括Pin Code配对和安全简易配对Secure Simple Pairing, SSP。SSP是蓝牙2.1版本及更高版本引入的旨在改善旧版Pin Code配对的易用性和安全性。Pin Code配对这是最简单的配对方式在目前一些简单的蓝牙模块如HC-05上就是使用的这种配对方式。下图为蓝牙接收配对的btsnoop数据交互流程下面来学习一下这个交互流程首先当控制器接收到另一控制器发送来的配对请求时我们的控制器会向主机发送HCI_PIN_Code_Request事件然后当主机接收当上报的配对请求事件请求主机提供配对码响应HCI_PIN_Code_Request_Negative_Reply或者HCI_PIN_Code_Request_Reply命令控制器接收到主机的响应后完成处理后上报HCI_Command_Complete事件进行响应下面具体介绍一下这些交互的事件和命令HCI_PIN_Code_Request请求配对码EventEvent CodeEvent ParametersHCI_PIN_Code_Request0x16BD_ADDR该事件的事件码是0x16,包含一个参数请求连接的物理地址BD_ADDR这个物理地址参数我们前面讲过所以此处就贴出btsnoop的数据:HCI_PIN_Code_Request_Reply响应配对码CommandOCFCommand ParametersReturn ParametersHCI_PIN_Code_Request_Reply0x000DBD_ADDR,PIN_Code_Length,PIN_CodeStatus, BD_ADDR该命令的OGF是0x01所以该命令的操作码是0x04 0x0d下面讲解一下参数BD_ADDR该设备地址6字节PIN_Code_Length配对码长度1字节ValueParameter Description0xXXThe PIN code length specifies the length, in octets, of the PIN code to be used.Range: 0x01 to 0x10**最长16位**PIN_Code配对码16字节ValueParameter Description0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXPIN code for the device that is to be connected. The Host should ensure that strong PIN Codes are used. PIN Codes can be up to a maximum of 128 bits. The first octet of the PIN code should be transmitted first.**首位先行**Note: The PIN_Code parameter is a string parameter. Endianness does therefore not apply to the PIN_Code parameter.当我们提供的配对码长度不足16位时配对码后续直接补0即可完成核心文档命令要求下面为btsnoop数据当控制器接收到命令后完成处理后响应HCI_Command_Complete事件下面直接贴btsnoop数据HCI_PIN_Code_Request_Negative_Reply取消请求配对码这个命令主要在用户主动拒绝配对、设备策略不允许配对或设备无法提供PIN码时使用用于优雅地终止配对过程。CommandOCFCommand ParametersReturn ParametersHCI_PIN_Code_Request_-_Negative_Reply0x000EBD_ADDRStatus,BD_ADDRSSP配对ssp配对方式是为了解决pin code配对的易用性和安全性问题。它通过使用**椭圆曲线Diffie-Hellman (ECDH)**密钥交换算法来大大增强安全性并根据设备能力提供了多种交互模型。对于SSP配对我们需要在上一章讲的初始化中使能SSP配对方式同时开启相应事件的通知下图为SSP配对的交互流程下面来学习一下这个交互流程IO能力交换阶段首先当我们的控制器接收到对方发来的IO能力时接回向主机上报HCI_IO_Capability_Response事件同时我们的控制器接收到配对信息时我们的控制器会向主机发送HCI_IO_Capability_Request事件注意我们一般不需要去手动触发配对大多数情况下会自动触发比如再进行HID服务时会自动去触发主机根据自身能力比如键盘屏幕等对接收到的请求事件进行响应HCI_IO_Capability_Request_Reply命令控制器接收到主机发来的IO响应时处理之后上报HCI_Command_Complete事件进行响应认证阶段此处我们只介绍数字比较型输入密码型略交换完IO能力之后会根据算法构建出一个数字然后我们的控制器就会通过HCI_User_Confirmation_Request事件上报给主机数字和地址主机在接收到配对确认请求时接收可以响应HCI_User_Confirmation_Request_Reply命令或者不接受响应HCI_User_Confirmation_Request_Negative_Reply命令控制器接收到主机的响应后进行处理后上报HCI_Command_Complete事件进行响应最后认证成功还会上报HCI_Simple_Pairing_Complete事件下面具体介绍涉及到的命令和事件HCI_IO_Capability_Response设备能力结果EventEvent CodeEvent ParametersHCI_IO_Capability_Response0x32BD_ADDR,IO_Capability,OOB_Data_Present,Authentication_Requirements该事件的事件码是0x32下面依次介绍一下该事件的参数BD_ADDR请求连接的设备地址6字节IO_Capability设备交互能力1字节ValueParameter Description0x00DisplayOnly**仅显示**0x01DisplayYesNo**显示加简单确认**0x02KeyboardOnly**只有键盘输入**0x03NoInputNoOutput**什么都没有**All other valuesReserved for future useOOB_Data_Present是否支持带外数据1字节该参数就算指有没有除了通过蓝牙来进行交换配对所需信息。egNFC/二维码ValueParameter Description0x00OOB authentication data not present 通常0x01OOB authentication data from remote device presentAll other valuesReserved for future useAuthentication_Requirements安全级别和用户交互要求1字节这个参数允许设备在配对过程中协商并决定使用哪种身份验证方法以及是否需要用户进行确认。ValueParameter Description0x00MITM Protection Not Required – No Bonding. Numeric comparison with automatic accept allowed.0x01MITM Protection Required – No Bonding. Use IO Capabilities to determine authentication procedure0x02MITM Protection Not Required – Dedicated Bonding. Numeric comparison with automatic accept allowed.0x03MITM Protection Required – Dedicated Bonding. Use IO Capabilities to determine authentication procedure0x04MITM Protection Not Required – General Bonding. Numeric Comparison with automatic accept allowed.0x05MITM Protection Required – General Bonding. Use IO capabilities to determine authentication procedure.All other valuesReserved for future useMITM保护是否需要用户确认防止中间人攻击一般自己使用可以不需要MIMT但是如键盘按照规范需要MIMT防止密码泄露。Bonding绑定记不记住该设备然后后续可以自动连接通常使用的是通用绑定下图为btsnoop数据HCI_IO_Capability_Request请求获取设备能力EventEvent CodeEvent ParametersHCI_IO_Capability_Request0x31BD_ADDR该事件的事件码是0x31参数就是请求获取设备能力的物理地址下图为btsnoop数据HCI_IO_Capability_Request_Reply响应设备能力CommandOCFCommand ParametersReturn ParametersHCI_IO_Capability_Request_Reply0x002BBD_ADDR,IO_Capability,OOB_Data_Present,Authentication_RequirementsStatus,BD_ADDR该命令的OGF是0x01所以该命令的操作码为0x04 0x2b然后参数大致和上面上报的参数一样除了OOB_Data_Present参数OOB_Data_Present是否接收到带外数据ValueParameter Description0x00OOB authentication data not present0x01P-192 OOB authentication data from remote device present0x02P-256 OOB authentication data from remote device present0x03P-192 and P-256 OOB authentication data from remote device presentAll other valuesReserved for future use为啥和上面HCI_IO_Capability_Response事件的取值不一样首先在Response事件中是告知我们主机有外带数据要给我们但是在Reply命令中是告诉控制器我们收没收到带外数据。如果不一样就可能会回退到pin code配对。下图为btsnoop数据当控制器接收到命令后完成处理后响应HCI_Command_Complete事件下面直接贴btsnoop数据HCI_User_Confirmation_Request用户连接确认请求EventEvent CodeEvent ParametersHCI_User_Confirmation_Request0x33BD_ADDR,Numeric_Value该事件的事件码是0x33下面介绍参数BD_ADDR请求连接设备的物理地址6字节Numeric_Value显示的配对随机数4字节下面为该事件的btsnoop数据包HCI_User_Confirmation_Request_Reply响应连接请求CommandOCFCommand ParametersReturn ParametersHCI_User_Confirmation_Request_Reply0x002CBD_ADDRStatus,BD_ADDR该命令的OGF为0x01所以该命令的操作码为0x04 0x2c下面为btsnoop数据当控制器接收到命令后完成处理后响应HCI_Command_Complete事件下面直接贴btsnoop数据HCI_User_Confirmation_Request_Negative_Reply拒绝响应连接确认请求EventEvent CodeEvent ParametersHCI_User_Confirmation_Request0x33BD_ADDR,Numeric_ValueHCI_Simple_Pairing_CompleteSPP认证完成EventEvent CodeEvent ParametersHCI_Simple_Pairing_Complete0x36Status,BD_ADDR下图为btsnoop数据EIR蓝牙搜索有三种经典搜索/RSSI搜索/EIR搜索下面先简单介绍一下这几种搜索的区别经典查询的 Inquiry Result 事件仅含BD_ADDR、Page Scan Repetition Mode、Class of Device、Clock Offset等基础字段。RSSI 搜索响应在 Inquiry Result 的末尾增加一个 1 字节RSSI可用于估算距离或信号质量。EIRExtended Inquiry Response用于在经典蓝牙搜索阶段返回更丰富的设备信息最长可携带240字节负载。比如:remote name、支持的服务 UUID、制造商自定义字段等。EIR数据格式控制器里的一块240 字节缓冲区前面是“有效部分”后面用0x00填充到 240B。必须填充到240字节。有效部分 若干个 EIR-DATAAD 结构TLV串起来Length(1B) | Type(1B) | Value(Length-1 B)其中Length 含 TypeValue 的总和。常用 AD_Type摘取核心0x01 Flags同 BLE可指示 BR/EDR Only、LE Only、双模等0x02/0x03/0x04/0x05/0x06/0x0716/32/128 bit 服务 UUID 的部分/完整列表0x08/0x09短名称 / 完整设备名称0x0ATx Power Level0x0E/0x0FSimple Pairing Hash C, Simple Pairing Randomizer RSSP 必需配合 MITM 验证0x10Device ID0x11/0x12/0x14/0x15以 16/32/128 bit UUID 表示的服务数据0x16/0x17/0x18 等通用/特定服务数据0x1BBR/EDR 安全管理数据0x1DClass of Device可重复发送以冗余0xFF厂商自定义数据。下面为一个简单例子目标设备名MyDevice16-bit 服务 UUID 完整列表0x111F、0x111E示例值厂商自定义数据Company ID0x1234 负载01 02 03组包仅“有效部分”其后全00填充到 240B# 1) Complete Local Name MyDevice09094D79446576696365# ^L9 (Type7字节ASCII)# 2) Complete list of 16-bit Service UUIDs 0x111F, 0x111E05031F111E11# ^L5 ^Type0x03 UUID小端序# 3) Manufacturer Specific Data CompanyID 0x1234 01 02 0307FF3412010203# ^L7 ^Type0xFF ^CompanyID LSB-first# 之后直到满240字节全部 00EIR注册流程使用EIR的话一般是在HCI初始化流程中进行的下面为普遍的流程初始化时在 Write Simple Pairing Mode 之后调用HCI_Write_Inquiry_Mode命令开启EIR初始化收尾或状态准备完毕后调用HCI_Write_Extended_Inquiry_Response写入 240 字节缓冲Inquiry 过程中根据事件码区分HCI_Extended_Inquiry_Result与普通结果。注意EIR 的“启用命令”确实放在初始化流程里但“写入数据”需要在初始化完成后补做一次否则控制器会回退到普通/RSSI 搜索。下面进行依次介绍涉及到的命令和事件HCI_Write_Inquiry_Mode设置查询模式CommandOCFCommand ParametersReturn ParametersHCI_Write_Inquiry_Mode0x0045Inquiry_ModeStatus该命令的OGF是0x03所以该命令的操作码是0x0C 0x45下面介绍一下参数Inquiry_Mode查询模式1字节ValueParameter Description0x00标准查询结果事件格式默认 (Standard Inquiry Result event format (default))0x01带RSSI的查询结果格式 (Inquiry Result format with RSSI)0x02带RSSI格式或扩展查询结果格式 (Inquiry Result with RSSI format or Extended Inquiry Result format)All other values保留供将来使用 (Reserved for future use)当控制器接收到主机的该命令后执行后会上报HCI_Command_Complete事件HCI_Write_Extended_Inquiry_Response写EIR数据CommandOCFCommand ParametersReturn ParametersHCI_Write_Extended_Inquiry_Response0x0052FEC_Required,Extended_Inquiry_ResponseStatus该命令的OGF是0x03所以该命令的操作码是0x0C 0X52下面介绍一下参数FEC_Required纠错编码标志1字节ValueParameter Description0x00FEC不需要 (FEC is not required)0x01FEC需要 (FEC is required)All other values保留供将来使用 (Reserved for future use)不需要前向纠错控制器会按带 FEC 的方式发送耗费一点点带宽但更抗干扰需要前向纠错则完全按原始数据发出更省资源但可靠性稍差。FEC前向纠错是一种通信中的抗干扰手段在发送数据时发送端会额外附加一些冗余校验信息这样接收端即使收到的部分比特被噪声破坏也能利用冗余信息自动检测并修复一定数量的错误无需回请求重发。Extended_Inquiry_ResponseEIR数据240字节该参数就算我们的EIR数据必须要填满240字节。当控制器接收到主机的该命令后执行后会上报HCI_Command_Complete事件HCI_Extended_Inquiry_Result EIR数据结果上报EventEvent CodeEvent ParametersHCI_Extended_Inquiry_Result0x2FNum_Responses,BD_ADDR,Page_Scan_Repetition_Mode,Reserved,Class_Of_Device,Clock_Offset,RSSI,Extended_Inquiry_Response注意查询阶段区分事件时关注 HCI_Extended_Inquiry_ResultEvent Code0x2F若只收到 0x02Inquiry Result或 0x22Inquiry Result with RSSI则表示对端未返回 EIR需回退到普通处理流程。该事件的操作码是0x2F同时由于大部分参数在经典搜索中讲过此处就不过多介绍Reserved保留字段1字节需要注意的是在普通搜索上报事件中该字段的字节数为2字节但是在EIR数据上报时该字段的字节数为1字节。所以导致后续我们的数据COD参数会产生一个字节的偏移。RSSI信号强度1字节ValueParameter Description0xXXRange: -127 to 20 Units: dBm单位是dBm(分贝毫瓦)通常用来表示接收信号强度。Extended_Inquiry_ResponseEIR数据240字节该参数就是接收到的EIR数据有填满240字节。疑惑控制器是否上报HCI_Extended_Inquiry_Result还是HCI_Inquiry_Result主要取决于两个条件本地主机需先通过 HCI_Write_Inquiry_Mode0x02允许扩展查询结果否则控制器只会发普通 Inquiry 事件。远端设备必须实际返回 EIR 负载控制器才会上报事件码 0x2F 的 HCI_Extended_Inquiry_Result若对端无 EIR则仍然是 0x02 或 0x22 的普通查询结果。