【0x000A】HCI_Reject_Connection_Request命令详解

目录

一、命令概述

二、命令格式及参数说明

2.1. HCI_Reject_Connection_Request命令格式

2.2. 参数说明

2.2.1. BD_ADDR(蓝牙设备地址)

2.2.2.  Reason(拒绝原因)

三、返回事件及参数说明

3.1. 返回参数

3.2. 生成的事件

3.2.1. HCI_Command_Status事件

3.2.2. HCI_Connection_Complete事件

3.2.3. 远程设备的事件

四、命令执行流程

4.1. 连接请求接收阶段

4.2. 命令调用决策阶段

4.3. 命令组装阶段

4.4. 命令发送阶段

4.5. 本地控制器响应阶段

4.6. 远程设备响应阶段

4.7. 后续处理阶段

4.8. 示例代码

四、使用场景

4.1. 设备资源管理场景

4.2. 安全和隐私保护场景

4.3. 设备兼容性和功能匹配场景

五、注意事项

5.1. 命令调用时机

5.2. 参数准确性

5.3. 事件处理和反馈

5.4. 兼容性和协议版本

5.5. 错误处理和恢复

5.6. 其他注意事项


HCI_Reject_Connection_Request命令是蓝牙通信中用于拒绝传入连接请求的重要命令。通过合理使用该命令,蓝牙设备可以有效地管理其连接请求,并确保只与期望的设备建立连接。

一、命令概述

当蓝牙主机控制器(Host Controller)接收到一个新的连接请求时,会触发一个HCI_Connection_Request事件。该事件会返回请求连接的设备的BD_ADDR(蓝牙设备地址)。如果主机决定拒绝这个连接请求,就可以使用HCI_Reject_Connection_Request命令。

在执行HCI_Reject_Connection_Request命令时,需要指定两个参数:BD_ADDR和Reason。BD_ADDR用于标识请求连接的设备,而Reason则用于说明拒绝连接的原因。这个Reason参数包含在返回给连接设备的HCI_Connection_Complete事件的Status参数中,告知连接设备为什么连接被拒绝了。

二、命令格式及参数说明

2.1. HCI_Reject_Connection_Request命令格式

HCI_Reject_Connection_Request 命令遵循一定的字节序列格式来进行传输和解析,一般以命令分组(Command Packet)的形式呈现,其大致格式如下:

字节偏移字段内容长度(字节)描述
0操作码(Opcode)2用于标识命令类型,对于 HCI_Reject_Connection_Request 命令,其操作码固定为 0x000A,前一个字节为操作码组(OGF,一般为蓝牙规范定义的固定值),后一个字节为操作码命令(OCF,即具体命令的编号,这里对应此命令)。
2参数总长度(Parameter Total Length)1表示后续跟着的所有参数部分的总字节长度,这有助于接收方准确解析出完整的参数内容。
3BD_ADDR(蓝牙设备地址)6用于唯一标识发起连接请求的蓝牙设备,按照蓝牙地址的标准格式进行存储,通常是由 6 个字节组成的标识符,比如 00:11:22:33:44:55 这样的形式(实际在字节流中是连续的 6 个字节)。
9Reason(拒绝原因)1一个字节长度的参数,用于向连接设备说明拒绝连接的原因,不同的数值对应不同的预定义原因(具体数值和对应原因由蓝牙规范定义)。

整个命令分组的长度由操作码、参数总长度以及具体参数所占字节数共同决定,接收方按照这样的格式规范进行解析,从而准确执行相应的命令操作。

2.2. 参数说明

HCI_Reject_Connection_Request命令包含两个参数:BD_ADDR和Reason。

2.2.1. BD_ADDR(蓝牙设备地址)

当 HCI_Connection_Request 事件发生后,主机获取到发起连接请求的设备的 BD_ADDR,然后在调用 HCI_Reject_Connection_Request 命令时,将这个地址填入相应参数位置,使得命令能够准确地针对该特定设备的连接请求进行拒绝操作。

  • 长度:6字节(48位)。
  • 格式:通常以小端字节序(低字节序放低位,高字节序放高位)存储。

2.2.2.  Reason(拒绝原因)

Reason 参数旨在向发起连接请求的设备反馈拒绝连接的具体缘由,虽然它不是直接立刻返回给请求设备,而是通过后续 HCI_Connection_Complete 事件的 Status 参数来传达给对方。这个参数可以帮助请求设备了解连接被拒是出于何种情况。

  • 0x0D至0x0F:这些值代表由主机发出的拒绝错误代码。具体含义可能因蓝牙协议的不同版本或实现而有所差异,但通常用于指示在与远程设备建立连接或进行其他操作时遇到的问题。例如是因为自身不符合对方的连接策略、对方设备当前处于忙碌状态还是其他原因等,便于请求设备做出相应的后续处理(比如提示用户或者调整自身的连接尝试策略等)。

三、返回事件及参数说明

3.1. 返回参数

  • 无返回参数(Return parameters: None):表明当执行 HCI_Reject_Connection_Request 命令后,不会直接返回任何参数给调用者。这一点与一些其他命令可能有所不同,有些命令执行后会返回如操作结果状态码、读取的数据等信息,但此命令不会有这样的直接返回值。

3.2. 生成的事件

3.2.1. HCI_Command_Status事件

  • 当控制器接收到HCI_Reject_Connection_Request命令后,首先会向主机发送一个HCI_Command_Status事件。
  • 这个事件用于通知主机命令是否已成功接收并处理。它包含命令的操作码(Opcode)、状态(Status,表示命令是否成功执行)以及任何相关的硬件错误代码(如果有的话)。

3.2.2. HCI_Connection_Complete事件

  • 接下来,本地的BR/EDR(Basic Rate/Enhanced Data Rate)控制器会向其主机发送一个HCI_Connection_Complete事件。
  • 这个事件用于通知主机连接尝试的结果。对于被拒绝的连接请求,该事件的Status参数将包含来自HCI_Reject_Connection_Request命令的Reason参数。
  • 意味着尝试建立连接的设备的主机将接收到一个包含拒绝原因的HCI_Connection_Complete事件。

3.2.3. 远程设备的事件

  • 远程设备(即发起连接请求的设备)也会收到一个事件,但具体是HCI_Connection_Complete事件还是HCI_Synchronous_Connection_Complete事件取决于连接的类型。
  • 对于普通的ACL(Asynchronous Connectionless)连接,远程设备将收到HCI_Connection_Complete事件。
  • 如果尝试建立的是SCO(Synchronous Connection-Oriented)连接,则远程设备将收到HCI_Synchronous_Connection_Complete事件。
  • 在这些事件中,Status参数同样会包含拒绝连接的原因。

这些事件的生成和传递构成了蓝牙设备之间在处理连接请求拒绝操作时完整的通信流程,确保双方设备的主机都能及时、准确地了解连接请求的处理情况以及拒绝的原因,对于维护蓝牙通信系统的稳定性和可靠性非常重要。

四、命令执行流程

4.1. 连接请求接收阶段

  • 蓝牙控制器监听:蓝牙设备的控制器持续监听来自其他设备的连接请求。
  • 接收连接请求:当有其他设备尝试与当前设备建立连接时,本地设备的主机(Host)会接收到一个HCI_Connection_Request事件。该事件包含发起连接请求的设备的蓝牙设备地址(BD_ADDR),表明有外部设备尝试与本地设备建立连接。

4.2. 命令调用决策阶段

  • 判断连接请求:本地设备的主机根据自身的连接策略、资源状况等因素来判断是否拒绝这个连接请求。如果决定拒绝,则进入下一步。

4.3. 命令组装阶段

  • 操作码设置:将操作码(Opcode)设置为0x000A,用于标识该命令为HCI_Reject_Connection_Request
  • 参数总长度计算:由于命令包含BD_ADDR(6字节)和Reason(1字节)两个参数,所以参数总长度为7字节,并将其填充到命令分组中对应的位置。
  • BD_ADDR填充:将从HCI_Connection_Request事件中获取的发起连接请求设备的BD_ADDR填充到命令分组的相应位置。
  • Reason值选择:根据拒绝连接的具体原因,选择一个合适的Reason值(1字节)填充到命令分组中。Reason值的选择基于蓝牙规范中定义的拒绝原因代码。

4.4. 命令发送阶段

  • 发送命令:本地设备的主机将组装好的HCI_Reject_Connection_Request命令通过HCI接口发送给本地设备的控制器(Controller)。

4.5. 本地控制器响应阶段

  • HCI_Command_Status事件:控制器接收到命令后,向主机发送一个HCI_Command_Status事件,通知主机命令已经被控制器接收,并包含命令是否被正确接收和开始处理等初步状态信息。
  • HCI_Connection_Complete事件:本地的BR/EDR控制器接着会向其主机发送一个HCI_Connection_Complete事件,告知本地主机关于连接请求最终处理的结果(拒绝连接请求)。

4.6. 远程设备响应阶段

  • 拒绝信息传递:本地控制器通过蓝牙通信机制将拒绝信息传递给远程设备。
  • HCI_Connection_Complete或HCI_Synchronous_Connection_Complete事件:远程设备会向其主机发送一个HCI_Connection_Complete事件或HCI_Synchronous_Connection_Complete事件,告知远程设备的主机连接请求的最终处理情况。在这些事件中,Status参数会包含此HCI_Reject_Connection_Request命令中的Reason参数,以便远程设备的主机了解拒绝连接的具体原因。

4.7. 后续处理阶段

  • 主机处理:主机接收到HCI_Command_StatusHCI_Connection_Complete事件后,根据事件中的信息采取相应的行动。对于成功的命令执行,主机可能会更新其连接状态表或通知用户连接已被拒绝。对于失败的命令执行,主机可能需要记录错误信息或采取其他恢复措施。
  • 用户通知:在某些情况下,主机可能会通知用户连接请求已被拒绝,并提供拒绝的具体原因。

4.8. 示例代码

以下代码是一个高度简化的示例,旨在展示上述流程的基本结构。在实际应用中,需要使用具体的蓝牙协议栈API来实现这些功能。

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>

// 假设的HCI事件和命令结构体
typedef struct {
    uint16_t opcode;
    uint8_t  param_len;
    uint8_t  bd_addr[6];
    // 其他可能的参数...
} hci_connection_request_event_t;

typedef struct {
    uint16_t opcode;
    uint8_t  param_len;
    uint8_t  bd_addr[6];
    uint8_t  reason;
    // 其他可能的参数...
} hci_reject_connection_request_command_t;

typedef struct {
    uint8_t  status;
    uint16_t opcode;
    // 其他可能的参数...
} hci_command_status_event_t;

typedef struct {
    uint8_t  status;
    uint16_t handle;
    uint8_t  bd_addr[6];
    uint8_t  reason;
    // 其他可能的参数...
} hci_connection_complete_event_t;

// 假设的蓝牙控制器接口函数(在实际应用中,这些函数将由蓝牙栈提供)
void send_hci_command(const void* command, size_t len);
void register_hci_event_callback(void (*callback)(void*));

// 假设的决策函数(在实际应用中,这将基于具体的连接策略和资源状况)
bool should_reject_connection(const uint8_t* bd_addr);

// 假设的事件回调函数
void handle_hci_event(void* event) {
    if (((hci_event_header_t*)event)->event_code == 0x01) { // 假设0x01是HCI_Connection_Request事件的代码
        const hci_connection_request_event_t* conn_req = (const hci_connection_request_event_t*)event;
        
        if (should_reject_connection(conn_req->bd_addr)) {
            hci_reject_connection_request_command_t reject_cmd = {
                .opcode = 0x000A,
                .param_len = 7,
                .bd_addr = {0}, // 这里应该填充为conn_req->bd_addr
                .reason = 0x13   // 假设0x13是“设备忙碌”的拒绝原因代码
            };
            memcpy(reject_cmd.bd_addr, conn_req->bd_addr, 6);
            send_hci_command(&reject_cmd, sizeof(reject_cmd));
        }
    } else if (((hci_event_header_t*)event)->event_code == 0x0F) { // 假设0x0F是HCI_Command_Status事件的代码
        const hci_command_status_event_t* cmd_status = (const hci_command_status_event_t*)event;
        // 处理命令状态事件...
    } else if (((hci_event_header_t*)event)->event_code == 0x03) { // 假设0x03是HCI_Connection_Complete事件的代码
        const hci_connection_complete_event_t* conn_complete = (const hci_connection_complete_event_t*)event;
        // 处理连接完成事件...
    }
    // 处理其他事件...
}

int main() {
    // 注册HCI事件回调函数
    register_hci_event_callback(handle_hci_event);
    
    // 主循环(在实际应用中,这通常是一个事件驱动或异步I/O循环)
    while (true) {
        // 等待并处理HCI事件...
    }
    
    return 0;
}

// 假设的决策函数实现(仅作为示例)
bool should_reject_connection(const uint8_t* bd_addr) {
    // 在这里实现具体的连接策略和资源状况检查...
    // 返回true表示拒绝连接,返回false表示接受连接(但在这个示例中我们只关注拒绝的情况)
    return true; // 假设总是拒绝连接以进行演示
}

// 假设的发送HCI命令函数(在实际应用中,这将由蓝牙栈提供)
void send_hci_command(const void* command, size_t len) {
    // 在这里实现发送HCI命令到蓝牙控制器的逻辑...
    printf("Sending HCI command...\n");
}

// 假设的注册HCI事件回调函数(在实际应用中,这将由蓝牙栈提供)
void register_hci_event_callback(void (*callback)(void*)) {
    // 在这里实现注册HCI事件回调函数的逻辑...
    printf("Registered HCI event callback.\n");
}

在实际应用中,还需要处理错误情况、超时情况、重试逻辑等。

四、使用场景

HCI_Reject_Connection_Request命令使用场景主要涉及到蓝牙设备间连接请求的拒绝处理。以下是该命令的具体使用场景及相关说明。

4.1. 设备资源管理场景

  • 连接数限制情况
    • 当蓝牙设备达到其最大连接数限制时,对于新的连接请求,可以使用此命令拒绝。
    • Reason 参数可以设置为“已达最大连接数”
  • 资源占用情况
    • 如果蓝牙设备当前资源繁忙,如正在进行高带宽的数据传输或处理多个蓝牙传感器的数据,可以使用此命令拒绝新的连接请求。
    • Reason 参数可以设置为“设备资源繁忙”

4.2. 安全和隐私保护场景

  • 设备认证情况
    • 在安全要求较高的蓝牙设备中,未认证的设备发起连接请求时,可以使用此命令拒绝。
    • Reason 参数可以设置为“设备未认证”
  • 隐私策略情况
    • 蓝牙设备可能有隐私保护策略,不允许陌生设备未经用户同意连接。
    • 当陌生设备发起连接请求时,可以使用此命令拒绝,Reason 参数可以设置为“隐私策略限制”

4.3. 设备兼容性和功能匹配场景

  • 协议版本不兼容情况
    • 如果发起连接请求的设备所使用的蓝牙协议版本与本地设备不兼容,可以使用此命令拒绝连接。
    • Reason 参数可以设置为“协议版本不兼容”
  • 功能不匹配情况
    • 当连接请求涉及的功能本地设备不支持时,可以使用此命令拒绝。
    • Reason 参数可以设置为“功能不匹配”

了解这个命令的使用场景和相关说明有助于更好地理解和应用蓝牙技术。在实际应用中,需要根据具体场景和蓝牙设备的特性来合理使用此命令,以确保蓝牙通信的顺畅和安全。

五、注意事项

5.1. 命令调用时机

  • 必须条件:只能在接收到HCI_Connection_Request事件后调用此命令。
  • 原因:确保有明确的连接请求需要拒绝,避免蓝牙控制器异常或错误反馈。

5.2. 参数准确性

  • BD_ADDR参数
    • 获取方式:从HCI_Connection_Request事件中获取。
    • 准确性要求:必须准确无误,避免错误拒绝或无法拒绝目标设备。
  • Reason参数
    • 取值要求:符合蓝牙规范中定义的代码含义。
    • 重要性:确保发起连接请求的设备能正确理解拒绝原因,影响后续连接策略或用户体验。

5.3. 事件处理和反馈

  • 事件类型
    • HCI_Command_Status事件:确认命令是否成功执行。
    • HCI_Connection_Complete事件:包含连接结果及Reason参数。
  • 处理要求
    • 正确接收和解析事件。
    • HCI_Connection_Complete事件的Status参数中获取Reason参数,确保跟踪连接请求处理情况并正确反馈。

5.4. 兼容性和协议版本

  • 协议版本差异:不同蓝牙协议版本对命令实现、参数含义或事件处理方式可能有细微差异。
  • 注意事项
    • 确保设备支持该命令。
    • 按照相应协议版本规范执行命令操作。
    • 注意蓝牙4.0与蓝牙5.0等版本间的兼容性问题。

5.5. 错误处理和恢复

  • 错误类型:命令发送失败、事件接收丢失、参数解析错误等。
  • 处理机制
    • 尝试重新发送命令。
    • 通过超时机制判断命令执行状态。
    • 识别并纠正参数解析错误或向用户提示错误。

5.6. 其他注意事项

  • 连接请求类型:通常用于拒绝ACL连接请求,也可能适用于SCO或eSCO连接请求。
  • 命令格式与参数:确保命令头及参数格式和长度符合蓝牙核心规范。
  • 设备状态:确保本地蓝牙设备处于可接受连接请求的状态。
  • 安全性考虑:拒绝未知或不受信任设备的连接请求,启用加密和身份验证功能确保数据传输安全。
  • 日志记录与调试:记录HCI命令和事件日志信息,有助于诊断问题、优化性能和调试代码。

使用HCI_Reject_Connection_Request命令时,需要特别注意命令调用时机、参数准确性、事件处理和反馈、兼容性和协议版本、错误处理和恢复以及其他相关注意事项。遵循这些注意事项可以确保蓝牙设备在处理连接请求时的高效性和安全性。

综上所述,HCI_Reject_Connection_Request命令在蓝牙通信中扮演着至关重要的角色,它允许蓝牙设备对传入的连接请求进行筛选和控制,只与期望的设备建立连接,从而有效地管理其连接请求。对于维护蓝牙网络的安全性、稳定性和效率至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/936546.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ant Design of Vue之带select控件,单元格编辑功能的表格EditableCell组件

效果图 功能 表格里面某一行或者某一个单元格支持select复选框可以编辑&#xff0c;新增一行数据&#xff0c;删除一行数据&#xff0c;并且有校验规则 源码 editablecell组件源码 参考自 源码

git企业的使用详细命令行操作

git是Linux创始人通过内核开发而创作的分布式版本的控制系统&#xff0c;而我们作为开发者需要开发与维护&#xff0c;避免不了版本的迭代和更新&#xff0c;git就是用来保存修改删除等操作的工具&#xff0c;可以记录代码改动情况&#xff0c;它能够保存代码的每个版本&#x…

景联文科技提供高质量文本标注服务,驱动AI技术发展

文本标注是指在原始文本数据上添加标签的过程&#xff0c;这些标签可以用来指示特定的实体、关系、事件等信息&#xff0c;以帮助计算机理解和处理这些数据。 文本标注是自然语言处理&#xff08;NLP&#xff09;领域的一个重要环节&#xff0c;它通过为文本的不同部分提供具体…

基于nginx和ffmpeg搭建HTTP FLV流媒体服务器

一、简介 整体是使用nginx搭建HTTP FLV流媒体服务器&#xff1a; 流程&#xff1a;音视频->rtmp->http-flv 音视频转为rtmp需要借助ffmpeg转化。 rtmp转为http-flv需要借助nginx转化。 nginx-http-flv-module是基于nginx-rtmp-module开发的&#xff0c;包含nginx-rt…

01-51单片机硬件基础

开发板介绍 学校授课用的是普中科技的EM3.V2.2开发板&#xff0c;没什么好说的&#xff0c;记着去淘宝上找原理图&#xff0c;别迷信课本。 网上有卖51最小系统板的&#xff0c;比开发板便宜&#xff0c;也有下载模块&#xff0c;可以自己搭建外围电路。 还可以自己在protue…

使用 Database Tools 实现高效数据查询的十大 IntelliJ IDEA 快捷键

得益于 IntelliJ IDEA Ultimate 的 Database Tools&#xff08;数据库工具&#xff09;中的专用 SQL 查询控制台&#xff0c;您无需离开 IDE 即可轻松修改连接到您的 Java 应用程序的任何数据库中的数据&#xff0c;以及从这些数据库中提取数据。 查询控制台具有 SQL 语句特定的…

【新人系列】Python 入门(十六):正则表达式

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12801353.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Python 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…

资料分析题

1、截位除 差距10% 以内 差距小 否则 差距大 2、基期与现期 3、同比与环比

SpringBoot进阶 - 自定义starter

文章目录 思路封装Starter使用starter 思路 创建模块&#xff0c;封装starter&#xff0c;最后使用starter. 1 - 创建一个Demo Project&#xff0c;模拟一个需要被封装的DemoModule模块&#xff0c;其中核心方法为exeModuleMethod 2 - 通过starter封装可以直接初始化DemoModule…

socket编程UDP-实现停等机制(接收确认、超时重传)

在下面博客中&#xff0c;我介绍了利用UDP模拟TCP连接、按数据包发送文件的过程&#xff0c;并附上完整源码。 socket编程UDP-文件传输&模拟TCP建立连接脱离连接&#xff08;进阶篇&#xff09;_udp socket发送-CSDN博客 下面博客实现的是滑动窗口机制&#xff1a; sock…

Elasticsearch高性能实践

前言 本方案主要从运维层面分析es是实际生产使用过程中的参数优化&#xff0c;深入理解es各个名词及含义&#xff0c;深入分析es的使用过程中应注意的点&#xff0c;详细解释参数设置的原因以及目的&#xff0c;主要包括系统层面&#xff0c;参数层面。除此之外&#xff0c;优…

Nacos系列:Nacos 控制台手册

引言 Nacos是阿里巴巴中间件部门开源的一款用于服务发现和配置管理的产品&#xff0c;Nacos 控制台主要旨在于增强对于服务列表、健康状态管理、服务治理、分布式配置管理等方面的管控能力&#xff0c;以便进一步帮助用户降低管理微服务应用架构的成本。 一、访问 Nacos 控制台…

FPGA 第十四讲 分频器--偶分频

时间:2024.12.14 时钟对于 FPGA 是非常重要的,但板载晶振提供的时钟信号频率是固定的,不一定满足工程需求,所以使用分频或倍频产生需要的时钟是很有必要的。 一、学习内容 1.分频器 分频器是数字系统设计中最常见的基本电路之一。所谓“分频”,就是把输入信号的频率变成…

Linux:Git

Git常见指令&#xff1a; git help xx_command git xx_command --help git --version 查看git版本git config --global user.name "xxx_name" 全局级别的签名设置&#xff0c;全局的放在本用 git config --global user.ema…

如何使用aws的bedrock训练适合自己的模型

使用 Amazon Bedrock 训练适合自己的模型是一个涉及多个步骤的过程&#xff0c;包括数据准备、模型选择、训练和部署。以下是九河云总结的详细的步骤指南&#xff0c;帮助您在 AWS Bedrock 上训练和部署自定义模型。 ### 1. **准备工作** 在开始训练模型之前&#xff0c;您需…

30.攻防世界unserialize3

进入场景 解读一下 这个类 xctf 中有一个公共属性 $flag &#xff0c;其值为 111 &#xff0c;并且定义了一个 __wakeup 魔术方法&#xff0c;当对象被反序列化时会自动调用该方法&#xff0c;该方法会输出 bad requests 并终止程序的执行。 ?code提示了参数 <?php clas…

PWM调节DCDC参数计算原理

1、动态电压频率调整DVFS SOC芯片的核电压、GPU电压、NPU电压、GPU电压等&#xff0c;都会根据性能和实际应用场景来进行电压和频率的调整。 即动态电压频率调整DVFS&#xff08;Dynamic Voltage and Frequency scaling&#xff09;&#xff0c;优化性能和功耗。 比如某SOC在…

Python爬虫之Selenium的应用

【1】Selenium基础介绍 1.什么是selenium&#xff1f; &#xff08;1&#xff09;Selenium是一个用于Web应用程序测试的工具。 &#xff08;2&#xff09;Selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 &#xff08;3&#xff09;支持通过各种driv…

DocFlow票据AI自动化处理工具:出色的文档解析+抽取能力,提升企业文档数字化管理效能

目录 财务应付 金融信贷业务 近期&#xff0c;DocFlow票据自动化产品正式上线。DocFlow是一款票据AI自动化处理工具&#xff0c;支持不同版式单据智能分类扩展&#xff0c;可选功能插件配置流程&#xff0c;满足多样业务场景。 随着全球化与信息化进程&#xff0c;企业的文件…

Python高性能web框架-FastApi教程:(3)路径操作装饰器方法的参数

路径操作装饰器方法的参数 1. 定义带有参数的POST请求路由 app.post(/items,tags[这是items测试接口],summary这是items测试的summary,description这是items测试的description,response_description这是items测试的response_description) def test():return {items: items数据…