【android bluetooth 协议分析 01】【HCI 层介绍 9】【ReadLocalSupportedCommands命令介绍】
1. HCI_Read_Local_Supported_Commands 命令介绍
1. 命令介绍(Description)
HCI_Read_Local_Supported_Commands 是 HCI 层中非常重要的查询命令。它允许 Host(如 Android 系统中的 Bluetooth stack)获取 Controller(蓝牙芯片)支持的 所有 HCI 命令 列表。
这些命令的支持情况由 Supported_Commands
这个 64 字节位图 表示,每一位(bit)对应一个 HCI 命令是否支持。
🔹 本质:能力查询的位图(Command Capabilities Bitmap)
2.命令参数
13 2025-04-24 15:55:53.354453 host controller HCI_CMD 4 Sent Read Local Supported CommandsBluetooth HCI Command - Read Local Supported CommandsCommand Opcode: Read Local Supported Commands (0x1002)0001 00.. .... .... = Opcode Group Field: Informational Parameters (0x04).... ..00 0000 0010 = Opcode Command Field: Read Local Supported Commands (0x002)Parameter Total Length: 0[Response in frame: 14][Command-Response Delta: 0.775ms]
无参数
3. 返回参数
14 2025-04-24 15:55:53.355228 controller host HCI_EVT 71 Rcvd Command Complete (Read Local Supported Commands)Bluetooth HCI Event - Command CompleteEvent Code: Command Complete (0x0e)Parameter Total Length: 68Number of Allowed Command Packets: 1Command Opcode: Read Local Supported Commands (0x1002)0001 00.. .... .... = Opcode Group Field: Informational Parameters (0x04).... ..00 0000 0010 = Opcode Command Field: Read Local Supported Commands (0x002)Status: Success (0x00)Local Supported Commands: ffffff03ceffefffffffff1ff20fe8fe3ff783ff1c00040061ffffff7f3820f5fff0ffff…[Command in frame: 13][Command-Response Delta: 0.775ms]
参数名 | 大小 | 描述 |
---|---|---|
Status | 1 byte | 0x00 表示成功 |
Supported_Commands | 64 bytes | 每个 bit 对应一个 HCI 命令是否支持(参考 Vol 4, Part E, Section 6.27) |
4.事件
- 成功后会通过
HCI_Command_Complete
事件返回上述字段
5. Supported_Commands 的位图说明
这个位图是 HCI 控制器支持能力的集中体现。例如:
- Byte 0 bit 0 →
HCI_Inquiry
- Byte 0 bit 1 →
HCI_Inquiry_Cancel
- Byte 1 bit 5 →
HCI_Read_Remote_Supported_Features
- Byte 5 bit 6 →
HCI_LE_Set_Advertise_Enable
- Byte 27 bit 2 →
HCI_LE_Set_Extended_Advertising_Parameters
等等,具体定义见 Bluetooth Core Spec Vol 4, Part E, Section 6.27(共 64 字节,512 bits,分别映射所有可能的 HCI 命令)
2. aosp 中的应用
1. host 发送该命令
// system/gd/hci/controller.ccstruct Controller::impl {void Start(hci::HciLayer* hci) {
...hci_->EnqueueCommand(ReadLocalSupportedCommandsBuilder::Create(),handler->BindOnceOn(this, &Controller::impl::read_local_supported_commands_complete_handler));
...
}
当收到 controller 的回复时将调用 read_local_supported_commands_complete_handler
1. read_local_supported_commands_complete_handler
void read_local_supported_commands_complete_handler(CommandCompleteView view) {auto complete_view = ReadLocalSupportedCommandsCompleteView::Create(view);ASSERT(complete_view.IsValid());ErrorCode status = complete_view.GetStatus();ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());local_supported_commands_ = complete_view.GetSupportedCommands();}
- 将 命令支持位图 保存在 local_supported_commands_ 中
我们来看一下如何使用 local_supported_commands_
// system/gd/hci/controller.cc#define OP_CODE_MAPPING(name) \case OpCode::name: { \uint16_t index = (uint16_t)OpCodeIndex::name; \uint16_t byte_index = index / 10; \uint16_t bit_index = index % 10; \bool supported = local_supported_commands_[byte_index] & (1 << bit_index); \if (!supported) { \LOG_DEBUG("unsupported command opcode: 0x%04x", (uint16_t)OpCode::name); \} \return supported; \}
OpCodeIndex 命令索引如下:
- system/gd/hci/hci_packets.pdl
// For mapping Local Supported Commands command
// Value = Octet * 10 + bit
enum OpCodeIndex : 16 {INQUIRY = 0,INQUIRY_CANCEL = 1,PERIODIC_INQUIRY_MODE = 2,EXIT_PERIODIC_INQUIRY_MODE = 3,CREATE_CONNECTION = 4,DISCONNECT = 5,ADD_SCO_CONNECTION = 6,CREATE_CONNECTION_CANCEL = 7,ACCEPT_CONNECTION_REQUEST = 10,REJECT_CONNECTION_REQUEST = 11,LINK_KEY_REQUEST_REPLY = 12,LINK_KEY_REQUEST_NEGATIVE_REPLY = 13,PIN_CODE_REQUEST_REPLY = 14,PIN_CODE_REQUEST_NEGATIVE_REPLY = 15,CHANGE_CONNECTION_PACKET_TYPE = 16,AUTHENTICATION_REQUESTED = 17,SET_CONNECTION_ENCRYPTION = 20,CHANGE_CONNECTION_LINK_KEY = 21,CENTRAL_LINK_KEY = 22,REMOTE_NAME_REQUEST = 23,REMOTE_NAME_REQUEST_CANCEL = 24,READ_REMOTE_SUPPORTED_FEATURES = 25,READ_REMOTE_EXTENDED_FEATURES = 26,READ_REMOTE_VERSION_INFORMATION = 27,READ_CLOCK_OFFSET = 30,READ_LMP_HANDLE = 31,HOLD_MODE = 41,SNIFF_MODE = 42,EXIT_SNIFF_MODE = 43,QOS_SETUP = 46,ROLE_DISCOVERY = 47,SWITCH_ROLE = 50,READ_LINK_POLICY_SETTINGS = 51,WRITE_LINK_POLICY_SETTINGS = 52,READ_DEFAULT_LINK_POLICY_SETTINGS = 53,WRITE_DEFAULT_LINK_POLICY_SETTINGS = 54,FLOW_SPECIFICATION = 55,SET_EVENT_MASK = 56,RESET = 57,SET_EVENT_FILTER = 60,FLUSH = 61,READ_PIN_TYPE = 62,WRITE_PIN_TYPE = 63,READ_STORED_LINK_KEY = 65,WRITE_STORED_LINK_KEY = 66,DELETE_STORED_LINK_KEY = 67,WRITE_LOCAL_NAME = 70,READ_LOCAL_NAME = 71,READ_CONNECTION_ACCEPT_TIMEOUT = 72,WRITE_CONNECTION_ACCEPT_TIMEOUT = 73,READ_PAGE_TIMEOUT = 74,WRITE_PAGE_TIMEOUT = 75,READ_SCAN_ENABLE = 76,WRITE_SCAN_ENABLE = 77,READ_PAGE_SCAN_ACTIVITY = 80,WRITE_PAGE_SCAN_ACTIVITY = 81,READ_INQUIRY_SCAN_ACTIVITY = 82,WRITE_INQUIRY_SCAN_ACTIVITY = 83,READ_AUTHENTICATION_ENABLE = 84,WRITE_AUTHENTICATION_ENABLE = 85,READ_CLASS_OF_DEVICE = 90,WRITE_CLASS_OF_DEVICE = 91,READ_VOICE_SETTING = 92,WRITE_VOICE_SETTING = 93,READ_AUTOMATIC_FLUSH_TIMEOUT = 94,WRITE_AUTOMATIC_FLUSH_TIMEOUT = 95,READ_NUM_BROADCAST_RETRANSMITS = 96,WRITE_NUM_BROADCAST_RETRANSMITS = 97,READ_HOLD_MODE_ACTIVITY = 100,WRITE_HOLD_MODE_ACTIVITY = 101,READ_TRANSMIT_POWER_LEVEL = 102,READ_SYNCHRONOUS_FLOW_CONTROL_ENABLE = 103,WRITE_SYNCHRONOUS_FLOW_CONTROL_ENABLE = 104,SET_CONTROLLER_TO_HOST_FLOW_CONTROL = 105,HOST_BUFFER_SIZE = 106,HOST_NUM_COMPLETED_PACKETS = 107,READ_LINK_SUPERVISION_TIMEOUT = 110,WRITE_LINK_SUPERVISION_TIMEOUT = 111,READ_NUMBER_OF_SUPPORTED_IAC = 112,READ_CURRENT_IAC_LAP = 113,WRITE_CURRENT_IAC_LAP = 114,SET_AFH_HOST_CHANNEL_CLASSIFICATION = 121,READ_INQUIRY_SCAN_TYPE = 124,WRITE_INQUIRY_SCAN_TYPE = 125,READ_INQUIRY_MODE = 126,WRITE_INQUIRY_MODE = 127,READ_PAGE_SCAN_TYPE = 130,WRITE_PAGE_SCAN_TYPE = 131,READ_AFH_CHANNEL_ASSESSMENT_MODE = 132,WRITE_AFH_CHANNEL_ASSESSMENT_MODE = 133,READ_LOCAL_VERSION_INFORMATION = 143,READ_LOCAL_SUPPORTED_FEATURES = 145,READ_LOCAL_EXTENDED_FEATURES = 146,READ_BUFFER_SIZE = 147,READ_BD_ADDR = 151,READ_FAILED_CONTACT_COUNTER = 152,RESET_FAILED_CONTACT_COUNTER = 153,READ_LINK_QUALITY = 154,READ_RSSI = 155,READ_AFH_CHANNEL_MAP = 156,READ_CLOCK = 157,READ_LOOPBACK_MODE = 160,WRITE_LOOPBACK_MODE = 161,ENABLE_DEVICE_UNDER_TEST_MODE = 162,SETUP_SYNCHRONOUS_CONNECTION = 163,ACCEPT_SYNCHRONOUS_CONNECTION = 164,REJECT_SYNCHRONOUS_CONNECTION = 165,READ_EXTENDED_INQUIRY_RESPONSE = 170,WRITE_EXTENDED_INQUIRY_RESPONSE = 171,REFRESH_ENCRYPTION_KEY = 172,SNIFF_SUBRATING = 174,READ_SIMPLE_PAIRING_MODE = 175,WRITE_SIMPLE_PAIRING_MODE = 176,READ_LOCAL_OOB_DATA = 177,READ_INQUIRY_RESPONSE_TRANSMIT_POWER_LEVEL = 180,WRITE_INQUIRY_TRANSMIT_POWER_LEVEL = 181,IO_CAPABILITY_REQUEST_REPLY = 187,USER_CONFIRMATION_REQUEST_REPLY = 190,USER_CONFIRMATION_REQUEST_NEGATIVE_REPLY = 191,USER_PASSKEY_REQUEST_REPLY = 192,USER_PASSKEY_REQUEST_NEGATIVE_REPLY = 193,REMOTE_OOB_DATA_REQUEST_REPLY = 194,WRITE_SIMPLE_PAIRING_DEBUG_MODE = 195,ENHANCED_FLUSH = 196,REMOTE_OOB_DATA_REQUEST_NEGATIVE_REPLY = 197,SEND_KEYPRESS_NOTIFICATION = 202,IO_CAPABILITY_REQUEST_NEGATIVE_REPLY = 203,READ_ENCRYPTION_KEY_SIZE = 204,SET_EVENT_MASK_PAGE_2 = 222,READ_DATA_BLOCK_SIZE = 232,READ_LE_HOST_SUPPORT = 245,WRITE_LE_HOST_SUPPORT = 246,LE_SET_EVENT_MASK = 250,LE_READ_BUFFER_SIZE_V1 = 251,LE_READ_LOCAL_SUPPORTED_FEATURES = 252,LE_SET_RANDOM_ADDRESS = 254,LE_SET_ADVERTISING_PARAMETERS = 255,LE_READ_ADVERTISING_PHYSICAL_CHANNEL_TX_POWER = 256,LE_SET_ADVERTISING_DATA = 257,LE_SET_SCAN_RESPONSE_DATA = 260,LE_SET_ADVERTISING_ENABLE = 261,LE_SET_SCAN_PARAMETERS = 262,LE_SET_SCAN_ENABLE = 263,LE_CREATE_CONNECTION = 264,LE_CREATE_CONNECTION_CANCEL = 265,LE_READ_FILTER_ACCEPT_LIST_SIZE = 266,LE_CLEAR_FILTER_ACCEPT_LIST = 267,LE_ADD_DEVICE_TO_FILTER_ACCEPT_LIST = 270,LE_REMOVE_DEVICE_FROM_FILTER_ACCEPT_LIST = 271,LE_CONNECTION_UPDATE = 272,LE_SET_HOST_CHANNEL_CLASSIFICATION = 273,LE_READ_CHANNEL_MAP = 274,LE_READ_REMOTE_FEATURES = 275,LE_ENCRYPT = 276,LE_RAND = 277,LE_START_ENCRYPTION = 280,LE_LONG_TERM_KEY_REQUEST_REPLY = 281,LE_LONG_TERM_KEY_REQUEST_NEGATIVE_REPLY = 282,LE_READ_SUPPORTED_STATES = 283,LE_RECEIVER_TEST = 284,LE_TRANSMITTER_TEST = 285,LE_TEST_END = 286,ENHANCED_SETUP_SYNCHRONOUS_CONNECTION = 293,ENHANCED_ACCEPT_SYNCHRONOUS_CONNECTION = 294,READ_LOCAL_SUPPORTED_CODECS_V1 = 295,REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY = 321,READ_SECURE_CONNECTIONS_HOST_SUPPORT = 322,WRITE_SECURE_CONNECTIONS_HOST_SUPPORT = 323,READ_LOCAL_OOB_EXTENDED_DATA = 326,WRITE_SECURE_CONNECTIONS_TEST_MODE = 327,LE_REMOTE_CONNECTION_PARAMETER_REQUEST_REPLY = 334,LE_REMOTE_CONNECTION_PARAMETER_REQUEST_NEGATIVE_REPLY = 335,LE_SET_DATA_LENGTH = 336,LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH = 337,LE_WRITE_SUGGESTED_DEFAULT_DATA_LENGTH = 340,LE_READ_LOCAL_P_256_PUBLIC_KEY_COMMAND = 341,LE_GENERATE_DHKEY_COMMAND_V1 = 342,LE_ADD_DEVICE_TO_RESOLVING_LIST = 343,LE_REMOVE_DEVICE_FROM_RESOLVING_LIST = 344,LE_CLEAR_RESOLVING_LIST = 345,LE_READ_RESOLVING_LIST_SIZE = 346,LE_READ_PEER_RESOLVABLE_ADDRESS = 347,LE_READ_LOCAL_RESOLVABLE_ADDRESS = 350,LE_SET_ADDRESS_RESOLUTION_ENABLE = 351,LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT = 352,LE_READ_MAXIMUM_DATA_LENGTH = 353,LE_READ_PHY = 354,LE_SET_DEFAULT_PHY = 355,LE_SET_PHY = 356,LE_ENHANCED_RECEIVER_TEST = 357,LE_ENHANCED_TRANSMITTER_TEST = 360,LE_SET_ADVERTISING_SET_RANDOM_ADDRESS = 361,LE_SET_EXTENDED_ADVERTISING_PARAMETERS = 362,LE_SET_EXTENDED_ADVERTISING_DATA = 363,LE_SET_EXTENDED_SCAN_RESPONSE_DATA = 364,LE_SET_EXTENDED_ADVERTISING_ENABLE = 365,LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH = 366,LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS = 367,LE_REMOVE_ADVERTISING_SET = 370,LE_CLEAR_ADVERTISING_SETS = 371,LE_SET_PERIODIC_ADVERTISING_PARAM = 372,LE_SET_PERIODIC_ADVERTISING_DATA = 373,LE_SET_PERIODIC_ADVERTISING_ENABLE = 374,LE_SET_EXTENDED_SCAN_PARAMETERS = 375,LE_SET_EXTENDED_SCAN_ENABLE = 376,LE_EXTENDED_CREATE_CONNECTION = 377,LE_PERIODIC_ADVERTISING_CREATE_SYNC = 380,LE_PERIODIC_ADVERTISING_CREATE_SYNC_CANCEL = 381,LE_PERIODIC_ADVERTISING_TERMINATE_SYNC = 382,LE_ADD_DEVICE_TO_PERIODIC_ADVERTISING_LIST = 383,LE_REMOVE_DEVICE_FROM_PERIODIC_ADVERTISING_LIST = 384,LE_CLEAR_PERIODIC_ADVERTISING_LIST = 385,LE_READ_PERIODIC_ADVERTISING_LIST_SIZE = 386,LE_READ_TRANSMIT_POWER = 387,LE_READ_RF_PATH_COMPENSATION_POWER = 390,LE_WRITE_RF_PATH_COMPENSATION_POWER = 391,LE_SET_PRIVACY_MODE = 392,LE_SET_PERIODIC_ADVERTISING_RECEIVE_ENABLE = 405,LE_PERIODIC_ADVERTISING_SYNC_TRANSFER = 406,LE_PERIODIC_ADVERTISING_SET_INFO_TRANSFER = 407,LE_SET_PERIODIC_ADVERTISING_SYNC_TRANSFER_PARAMETERS = 410,LE_SET_DEFAULT_PERIODIC_ADVERTISING_SYNC_TRANSFER_PARAMETERS = 411,LE_GENERATE_DHKEY_COMMAND = 412,LE_MODIFY_SLEEP_CLOCK_ACCURACY = 414,LE_READ_BUFFER_SIZE_V2 = 415,LE_READ_ISO_TX_SYNC = 416,LE_SET_CIG_PARAMETERS = 417,LE_SET_CIG_PARAMETERS_TEST = 418,LE_CREATE_CIS = 421,LE_REMOVE_CIG = 422,LE_ACCEPT_CIS_REQUEST = 423,LE_REJECT_CIS_REQUEST = 424,LE_CREATE_BIG = 425,LE_TERMINATE_BIG = 427,LE_BIG_CREATE_SYNC = 430,LE_BIG_TERMINATE_SYNC = 431,LE_REQUEST_PEER_SCA = 432,LE_SETUP_ISO_DATA_PATH = 433,LE_REMOVE_ISO_DATA_PATH = 434,LE_SET_HOST_FEATURE = 441,LE_READ_ISO_LINK_QUALITY = 442,LE_ENHANCED_READ_TRANSMIT_POWER_LEVEL = 443,LE_READ_REMOTE_TRANSMIT_POWER_LEVEL = 444,LE_SET_PATH_LOSS_REPORTING_PARAMETERS = 445,LE_SET_PATH_LOSS_REPORTING_ENABLE = 446,LE_SET_TRANSMIT_POWER_REPORTING_ENABLE = 447,SET_ECOSYSTEM_BASE_INTERVAL = 451,READ_LOCAL_SUPPORTED_CODECS_V2 = 452,READ_LOCAL_SUPPORTED_CODEC_CAPABILITIES = 453,READ_LOCAL_SUPPORTED_CONTROLLER_DELAY = 454,CONFIGURE_DATA_PATH = 455,LE_SET_DATA_RELATED_ADDRESS_CHANGES = 456,SET_MIN_ENCRYPTION_KEY_SIZE = 457,LE_SET_DEFAULT_SUBRATE = 460,LE_SUBRATE_REQUEST = 461,
}
这里我拿 LE_SUBRATE_REQUEST 为例 说明 OP_CODE_MAPPING 如何使用:
#define OP_CODE_MAPPING(LE_SUBRATE_REQUEST) // 等价于下面的:case OpCode::LE_SUBRATE_REQUEST: { uint16_t index = (uint16_t)OpCodeIndex::LE_SUBRATE_REQUEST;// 461 uint16_t byte_index = index / 10; // 46 uint16_t bit_index = index % 10; // 1 bool supported = local_supported_commands_[byte_index] & (1 << bit_index); // local_supported_commands_ 位图中第 46 字节第1bitif (!supported) { LOG_DEBUG("unsupported command opcode: 0x%04x", (uint16_t)OpCode::LE_SUBRATE_REQUEST); } return supported; }
- 通过 OP_CODE_MAPPING 我们可以成功索引到 该 hcicmd 在 位图中对应的位。
// system/gd/hci/controller.ccbool is_supported(OpCode op_code) {switch (op_code) {OP_CODE_MAPPING(INQUIRY)OP_CODE_MAPPING(INQUIRY_CANCEL)OP_CODE_MAPPING(PERIODIC_INQUIRY_MODE)OP_CODE_MAPPING(EXIT_PERIODIC_INQUIRY_MODE)OP_CODE_MAPPING(CREATE_CONNECTION)OP_CODE_MAPPING(DISCONNECT)OP_CODE_MAPPING(CREATE_CONNECTION_CANCEL)OP_CODE_MAPPING(ACCEPT_CONNECTION_REQUEST)OP_CODE_MAPPING(REJECT_CONNECTION_REQUEST)OP_CODE_MAPPING(LINK_KEY_REQUEST_REPLY)OP_CODE_MAPPING(LINK_KEY_REQUEST_NEGATIVE_REPLY)OP_CODE_MAPPING(PIN_CODE_REQUEST_REPLY)OP_CODE_MAPPING(PIN_CODE_REQUEST_NEGATIVE_REPLY)OP_CODE_MAPPING(CHANGE_CONNECTION_PACKET_TYPE)OP_CODE_MAPPING(AUTHENTICATION_REQUESTED)OP_CODE_MAPPING(SET_CONNECTION_ENCRYPTION)OP_CODE_MAPPING(CHANGE_CONNECTION_LINK_KEY)OP_CODE_MAPPING(CENTRAL_LINK_KEY)OP_CODE_MAPPING(REMOTE_NAME_REQUEST)OP_CODE_MAPPING(REMOTE_NAME_REQUEST_CANCEL)OP_CODE_MAPPING(READ_REMOTE_SUPPORTED_FEATURES)OP_CODE_MAPPING(READ_REMOTE_EXTENDED_FEATURES)OP_CODE_MAPPING(READ_REMOTE_VERSION_INFORMATION)OP_CODE_MAPPING(READ_CLOCK_OFFSET)OP_CODE_MAPPING(READ_LMP_HANDLE)OP_CODE_MAPPING(HOLD_MODE)OP_CODE_MAPPING(SNIFF_MODE)OP_CODE_MAPPING(EXIT_SNIFF_MODE)OP_CODE_MAPPING(QOS_SETUP)OP_CODE_MAPPING(ROLE_DISCOVERY)OP_CODE_MAPPING(SWITCH_ROLE)OP_CODE_MAPPING(READ_LINK_POLICY_SETTINGS)OP_CODE_MAPPING(WRITE_LINK_POLICY_SETTINGS)OP_CODE_MAPPING(READ_DEFAULT_LINK_POLICY_SETTINGS)OP_CODE_MAPPING(WRITE_DEFAULT_LINK_POLICY_SETTINGS)OP_CODE_MAPPING(FLOW_SPECIFICATION)OP_CODE_MAPPING(SET_EVENT_MASK)OP_CODE_MAPPING(RESET)OP_CODE_MAPPING(SET_EVENT_FILTER)OP_CODE_MAPPING(FLUSH)OP_CODE_MAPPING(READ_PIN_TYPE)OP_CODE_MAPPING(WRITE_PIN_TYPE)OP_CODE_MAPPING(READ_STORED_LINK_KEY)OP_CODE_MAPPING(WRITE_STORED_LINK_KEY)OP_CODE_MAPPING(DELETE_STORED_LINK_KEY)OP_CODE_MAPPING(WRITE_LOCAL_NAME)OP_CODE_MAPPING(READ_LOCAL_NAME)OP_CODE_MAPPING(READ_CONNECTION_ACCEPT_TIMEOUT)OP_CODE_MAPPING(WRITE_CONNECTION_ACCEPT_TIMEOUT)OP_CODE_MAPPING(READ_PAGE_TIMEOUT)OP_CODE_MAPPING(WRITE_PAGE_TIMEOUT)OP_CODE_MAPPING(READ_SCAN_ENABLE)OP_CODE_MAPPING(WRITE_SCAN_ENABLE)OP_CODE_MAPPING(READ_PAGE_SCAN_ACTIVITY)OP_CODE_MAPPING(WRITE_PAGE_SCAN_ACTIVITY)OP_CODE_MAPPING(READ_INQUIRY_SCAN_ACTIVITY)OP_CODE_MAPPING(WRITE_INQUIRY_SCAN_ACTIVITY)OP_CODE_MAPPING(READ_AUTHENTICATION_ENABLE)OP_CODE_MAPPING(WRITE_AUTHENTICATION_ENABLE)OP_CODE_MAPPING(READ_CLASS_OF_DEVICE)OP_CODE_MAPPING(WRITE_CLASS_OF_DEVICE)OP_CODE_MAPPING(READ_VOICE_SETTING)OP_CODE_MAPPING(WRITE_VOICE_SETTING)OP_CODE_MAPPING(READ_AUTOMATIC_FLUSH_TIMEOUT)OP_CODE_MAPPING(WRITE_AUTOMATIC_FLUSH_TIMEOUT)OP_CODE_MAPPING(READ_NUM_BROADCAST_RETRANSMITS)OP_CODE_MAPPING(WRITE_NUM_BROADCAST_RETRANSMITS)OP_CODE_MAPPING(READ_HOLD_MODE_ACTIVITY)OP_CODE_MAPPING(WRITE_HOLD_MODE_ACTIVITY)OP_CODE_MAPPING(READ_TRANSMIT_POWER_LEVEL)OP_CODE_MAPPING(READ_SYNCHRONOUS_FLOW_CONTROL_ENABLE)OP_CODE_MAPPING(WRITE_SYNCHRONOUS_FLOW_CONTROL_ENABLE)OP_CODE_MAPPING(SET_CONTROLLER_TO_HOST_FLOW_CONTROL)OP_CODE_MAPPING(HOST_BUFFER_SIZE)OP_CODE_MAPPING(HOST_NUM_COMPLETED_PACKETS)OP_CODE_MAPPING(READ_LINK_SUPERVISION_TIMEOUT)OP_CODE_MAPPING(WRITE_LINK_SUPERVISION_TIMEOUT)OP_CODE_MAPPING(READ_NUMBER_OF_SUPPORTED_IAC)OP_CODE_MAPPING(READ_CURRENT_IAC_LAP)OP_CODE_MAPPING(WRITE_CURRENT_IAC_LAP)OP_CODE_MAPPING(SET_AFH_HOST_CHANNEL_CLASSIFICATION)OP_CODE_MAPPING(READ_INQUIRY_SCAN_TYPE)OP_CODE_MAPPING(WRITE_INQUIRY_SCAN_TYPE)OP_CODE_MAPPING(READ_INQUIRY_MODE)OP_CODE_MAPPING(WRITE_INQUIRY_MODE)OP_CODE_MAPPING(READ_PAGE_SCAN_TYPE)OP_CODE_MAPPING(WRITE_PAGE_SCAN_TYPE)OP_CODE_MAPPING(READ_AFH_CHANNEL_ASSESSMENT_MODE)OP_CODE_MAPPING(WRITE_AFH_CHANNEL_ASSESSMENT_MODE)OP_CODE_MAPPING(READ_LOCAL_VERSION_INFORMATION)OP_CODE_MAPPING(READ_LOCAL_SUPPORTED_FEATURES)OP_CODE_MAPPING(READ_LOCAL_EXTENDED_FEATURES)OP_CODE_MAPPING(READ_BUFFER_SIZE)OP_CODE_MAPPING(READ_BD_ADDR)OP_CODE_MAPPING(READ_FAILED_CONTACT_COUNTER)OP_CODE_MAPPING(RESET_FAILED_CONTACT_COUNTER)OP_CODE_MAPPING(READ_LINK_QUALITY)OP_CODE_MAPPING(READ_RSSI)OP_CODE_MAPPING(READ_AFH_CHANNEL_MAP)OP_CODE_MAPPING(READ_CLOCK)OP_CODE_MAPPING(READ_LOOPBACK_MODE)OP_CODE_MAPPING(WRITE_LOOPBACK_MODE)OP_CODE_MAPPING(ENABLE_DEVICE_UNDER_TEST_MODE)OP_CODE_MAPPING(SETUP_SYNCHRONOUS_CONNECTION)OP_CODE_MAPPING(ACCEPT_SYNCHRONOUS_CONNECTION)OP_CODE_MAPPING(REJECT_SYNCHRONOUS_CONNECTION)OP_CODE_MAPPING(READ_EXTENDED_INQUIRY_RESPONSE)OP_CODE_MAPPING(WRITE_EXTENDED_INQUIRY_RESPONSE)OP_CODE_MAPPING(REFRESH_ENCRYPTION_KEY)OP_CODE_MAPPING(SNIFF_SUBRATING)OP_CODE_MAPPING(READ_SIMPLE_PAIRING_MODE)OP_CODE_MAPPING(WRITE_SIMPLE_PAIRING_MODE)OP_CODE_MAPPING(READ_LOCAL_OOB_DATA)OP_CODE_MAPPING(READ_INQUIRY_RESPONSE_TRANSMIT_POWER_LEVEL)OP_CODE_MAPPING(WRITE_INQUIRY_TRANSMIT_POWER_LEVEL)OP_CODE_MAPPING(IO_CAPABILITY_REQUEST_REPLY)OP_CODE_MAPPING(USER_CONFIRMATION_REQUEST_REPLY)OP_CODE_MAPPING(USER_CONFIRMATION_REQUEST_NEGATIVE_REPLY)OP_CODE_MAPPING(USER_PASSKEY_REQUEST_REPLY)OP_CODE_MAPPING(USER_PASSKEY_REQUEST_NEGATIVE_REPLY)OP_CODE_MAPPING(REMOTE_OOB_DATA_REQUEST_REPLY)OP_CODE_MAPPING(WRITE_SIMPLE_PAIRING_DEBUG_MODE)OP_CODE_MAPPING(REMOTE_OOB_DATA_REQUEST_NEGATIVE_REPLY)OP_CODE_MAPPING(SEND_KEYPRESS_NOTIFICATION)OP_CODE_MAPPING(SET_EVENT_MASK_PAGE_2)OP_CODE_MAPPING(IO_CAPABILITY_REQUEST_NEGATIVE_REPLY)OP_CODE_MAPPING(REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY)OP_CODE_MAPPING(READ_ENCRYPTION_KEY_SIZE)OP_CODE_MAPPING(READ_DATA_BLOCK_SIZE)OP_CODE_MAPPING(READ_LE_HOST_SUPPORT)OP_CODE_MAPPING(WRITE_LE_HOST_SUPPORT)OP_CODE_MAPPING(LE_SET_EVENT_MASK)OP_CODE_MAPPING(LE_READ_BUFFER_SIZE_V1)OP_CODE_MAPPING(LE_READ_LOCAL_SUPPORTED_FEATURES)OP_CODE_MAPPING(LE_SET_RANDOM_ADDRESS)OP_CODE_MAPPING(LE_SET_ADVERTISING_PARAMETERS)OP_CODE_MAPPING(LE_READ_ADVERTISING_PHYSICAL_CHANNEL_TX_POWER)OP_CODE_MAPPING(LE_SET_ADVERTISING_DATA)OP_CODE_MAPPING(LE_SET_SCAN_RESPONSE_DATA)OP_CODE_MAPPING(LE_SET_ADVERTISING_ENABLE)OP_CODE_MAPPING(LE_SET_SCAN_PARAMETERS)OP_CODE_MAPPING(LE_SET_SCAN_ENABLE)OP_CODE_MAPPING(LE_CREATE_CONNECTION)OP_CODE_MAPPING(LE_CREATE_CONNECTION_CANCEL)OP_CODE_MAPPING(LE_READ_FILTER_ACCEPT_LIST_SIZE)OP_CODE_MAPPING(LE_CLEAR_FILTER_ACCEPT_LIST)OP_CODE_MAPPING(LE_ADD_DEVICE_TO_FILTER_ACCEPT_LIST)OP_CODE_MAPPING(LE_REMOVE_DEVICE_FROM_FILTER_ACCEPT_LIST)OP_CODE_MAPPING(LE_CONNECTION_UPDATE)OP_CODE_MAPPING(LE_SET_HOST_CHANNEL_CLASSIFICATION)OP_CODE_MAPPING(LE_READ_CHANNEL_MAP)OP_CODE_MAPPING(LE_READ_REMOTE_FEATURES)OP_CODE_MAPPING(LE_ENCRYPT)OP_CODE_MAPPING(LE_RAND)OP_CODE_MAPPING(LE_START_ENCRYPTION)OP_CODE_MAPPING(LE_LONG_TERM_KEY_REQUEST_REPLY)OP_CODE_MAPPING(LE_LONG_TERM_KEY_REQUEST_NEGATIVE_REPLY)OP_CODE_MAPPING(LE_READ_SUPPORTED_STATES)OP_CODE_MAPPING(LE_RECEIVER_TEST)OP_CODE_MAPPING(LE_TRANSMITTER_TEST)OP_CODE_MAPPING(LE_TEST_END)OP_CODE_MAPPING(ENHANCED_SETUP_SYNCHRONOUS_CONNECTION)OP_CODE_MAPPING(ENHANCED_ACCEPT_SYNCHRONOUS_CONNECTION)OP_CODE_MAPPING(READ_LOCAL_SUPPORTED_CODECS_V1)OP_CODE_MAPPING(READ_SECURE_CONNECTIONS_HOST_SUPPORT)OP_CODE_MAPPING(WRITE_SECURE_CONNECTIONS_HOST_SUPPORT)OP_CODE_MAPPING(READ_LOCAL_OOB_EXTENDED_DATA)OP_CODE_MAPPING(WRITE_SECURE_CONNECTIONS_TEST_MODE)OP_CODE_MAPPING(LE_REMOTE_CONNECTION_PARAMETER_REQUEST_REPLY)OP_CODE_MAPPING(LE_REMOTE_CONNECTION_PARAMETER_REQUEST_NEGATIVE_REPLY)OP_CODE_MAPPING(LE_SET_DATA_LENGTH)OP_CODE_MAPPING(LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH)OP_CODE_MAPPING(LE_WRITE_SUGGESTED_DEFAULT_DATA_LENGTH)OP_CODE_MAPPING(LE_READ_LOCAL_P_256_PUBLIC_KEY_COMMAND)OP_CODE_MAPPING(LE_GENERATE_DHKEY_COMMAND_V1)OP_CODE_MAPPING(LE_ADD_DEVICE_TO_RESOLVING_LIST)OP_CODE_MAPPING(LE_REMOVE_DEVICE_FROM_RESOLVING_LIST)OP_CODE_MAPPING(LE_CLEAR_RESOLVING_LIST)OP_CODE_MAPPING(LE_READ_RESOLVING_LIST_SIZE)OP_CODE_MAPPING(LE_READ_PEER_RESOLVABLE_ADDRESS)OP_CODE_MAPPING(LE_READ_LOCAL_RESOLVABLE_ADDRESS)OP_CODE_MAPPING(LE_SET_ADDRESS_RESOLUTION_ENABLE)OP_CODE_MAPPING(LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT)OP_CODE_MAPPING(LE_READ_MAXIMUM_DATA_LENGTH)OP_CODE_MAPPING(LE_READ_PHY)OP_CODE_MAPPING(LE_SET_DEFAULT_PHY)OP_CODE_MAPPING(LE_SET_PHY)OP_CODE_MAPPING(LE_ENHANCED_RECEIVER_TEST)OP_CODE_MAPPING(LE_ENHANCED_TRANSMITTER_TEST)OP_CODE_MAPPING(LE_SET_ADVERTISING_SET_RANDOM_ADDRESS)OP_CODE_MAPPING(LE_SET_EXTENDED_ADVERTISING_PARAMETERS)OP_CODE_MAPPING(LE_SET_EXTENDED_ADVERTISING_DATA)OP_CODE_MAPPING(LE_SET_EXTENDED_SCAN_RESPONSE_DATA)OP_CODE_MAPPING(LE_SET_EXTENDED_ADVERTISING_ENABLE)OP_CODE_MAPPING(LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH)OP_CODE_MAPPING(LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS)OP_CODE_MAPPING(LE_REMOVE_ADVERTISING_SET)OP_CODE_MAPPING(LE_CLEAR_ADVERTISING_SETS)OP_CODE_MAPPING(LE_SET_PERIODIC_ADVERTISING_PARAM)OP_CODE_MAPPING(LE_SET_PERIODIC_ADVERTISING_DATA)OP_CODE_MAPPING(LE_SET_PERIODIC_ADVERTISING_ENABLE)OP_CODE_MAPPING(LE_SET_EXTENDED_SCAN_PARAMETERS)OP_CODE_MAPPING(LE_SET_EXTENDED_SCAN_ENABLE)OP_CODE_MAPPING(LE_EXTENDED_CREATE_CONNECTION)OP_CODE_MAPPING(LE_PERIODIC_ADVERTISING_CREATE_SYNC)OP_CODE_MAPPING(LE_PERIODIC_ADVERTISING_CREATE_SYNC_CANCEL)OP_CODE_MAPPING(LE_PERIODIC_ADVERTISING_TERMINATE_SYNC)OP_CODE_MAPPING(LE_ADD_DEVICE_TO_PERIODIC_ADVERTISING_LIST)OP_CODE_MAPPING(LE_REMOVE_DEVICE_FROM_PERIODIC_ADVERTISING_LIST)OP_CODE_MAPPING(LE_CLEAR_PERIODIC_ADVERTISING_LIST)OP_CODE_MAPPING(LE_READ_PERIODIC_ADVERTISING_LIST_SIZE)OP_CODE_MAPPING(LE_READ_TRANSMIT_POWER)OP_CODE_MAPPING(LE_READ_RF_PATH_COMPENSATION_POWER)OP_CODE_MAPPING(LE_WRITE_RF_PATH_COMPENSATION_POWER)OP_CODE_MAPPING(LE_SET_PRIVACY_MODE)OP_CODE_MAPPING(LE_SET_PERIODIC_ADVERTISING_RECEIVE_ENABLE)OP_CODE_MAPPING(LE_PERIODIC_ADVERTISING_SYNC_TRANSFER)OP_CODE_MAPPING(LE_PERIODIC_ADVERTISING_SET_INFO_TRANSFER)OP_CODE_MAPPING(LE_SET_PERIODIC_ADVERTISING_SYNC_TRANSFER_PARAMETERS)OP_CODE_MAPPING(LE_SET_DEFAULT_PERIODIC_ADVERTISING_SYNC_TRANSFER_PARAMETERS)OP_CODE_MAPPING(LE_GENERATE_DHKEY_COMMAND)OP_CODE_MAPPING(LE_MODIFY_SLEEP_CLOCK_ACCURACY)OP_CODE_MAPPING(LE_READ_BUFFER_SIZE_V2)OP_CODE_MAPPING(LE_READ_ISO_TX_SYNC)OP_CODE_MAPPING(LE_SET_CIG_PARAMETERS)OP_CODE_MAPPING(LE_SET_CIG_PARAMETERS_TEST)OP_CODE_MAPPING(LE_CREATE_CIS)OP_CODE_MAPPING(LE_REMOVE_CIG)OP_CODE_MAPPING(LE_ACCEPT_CIS_REQUEST)OP_CODE_MAPPING(LE_REJECT_CIS_REQUEST)OP_CODE_MAPPING(LE_CREATE_BIG)OP_CODE_MAPPING(LE_TERMINATE_BIG)OP_CODE_MAPPING(LE_BIG_CREATE_SYNC)OP_CODE_MAPPING(LE_BIG_TERMINATE_SYNC)OP_CODE_MAPPING(LE_REQUEST_PEER_SCA)OP_CODE_MAPPING(LE_SETUP_ISO_DATA_PATH)OP_CODE_MAPPING(LE_REMOVE_ISO_DATA_PATH)OP_CODE_MAPPING(LE_SET_HOST_FEATURE)OP_CODE_MAPPING(LE_READ_ISO_LINK_QUALITY)OP_CODE_MAPPING(LE_ENHANCED_READ_TRANSMIT_POWER_LEVEL)OP_CODE_MAPPING(LE_READ_REMOTE_TRANSMIT_POWER_LEVEL)OP_CODE_MAPPING(LE_SET_PATH_LOSS_REPORTING_PARAMETERS)OP_CODE_MAPPING(LE_SET_PATH_LOSS_REPORTING_ENABLE)OP_CODE_MAPPING(LE_SET_TRANSMIT_POWER_REPORTING_ENABLE)OP_CODE_MAPPING(SET_ECOSYSTEM_BASE_INTERVAL)OP_CODE_MAPPING(READ_LOCAL_SUPPORTED_CODECS_V2)OP_CODE_MAPPING(READ_LOCAL_SUPPORTED_CODEC_CAPABILITIES)OP_CODE_MAPPING(READ_LOCAL_SUPPORTED_CONTROLLER_DELAY)OP_CODE_MAPPING(CONFIGURE_DATA_PATH)OP_CODE_MAPPING(ENHANCED_FLUSH)OP_CODE_MAPPING(LE_SET_DATA_RELATED_ADDRESS_CHANGES)OP_CODE_MAPPING(LE_SET_DEFAULT_SUBRATE)OP_CODE_MAPPING(LE_SUBRATE_REQUEST)OP_CODE_MAPPING(SET_MIN_ENCRYPTION_KEY_SIZE)// deprecatedcase OpCode::ADD_SCO_CONNECTION:return false;// vendor specificcase OpCode::LE_GET_VENDOR_CAPABILITIES:return vendor_capabilities_.is_supported_ == 0x01;case OpCode::LE_MULTI_ADVT:return vendor_capabilities_.max_advt_instances_ != 0x00;case OpCode::LE_BATCH_SCAN:return vendor_capabilities_.total_scan_results_storage_ != 0x00;case OpCode::LE_ADV_FILTER:return vendor_capabilities_.filtering_support_ == 0x01;case OpCode::LE_ENERGY_INFO:return vendor_capabilities_.activity_energy_info_support_ == 0x01;case OpCode::LE_EXTENDED_SCAN_PARAMS:return vendor_capabilities_.extended_scan_support_ == 0x01;case OpCode::CONTROLLER_DEBUG_INFO:return vendor_capabilities_.debug_logging_supported_ == 0x01;case OpCode::CONTROLLER_A2DP_OPCODE:return vendor_capabilities_.a2dp_source_offload_capability_mask_ != 0x00;case OpCode::CONTROLLER_BQR:return vendor_capabilities_.bluetooth_quality_report_support_ == 0x01;// undefined in local_supported_commands_case OpCode::READ_LOCAL_SUPPORTED_COMMANDS:return true;case OpCode::NONE:return false;}return false;}
- 所以如果要判断 当前 controller 是否支持 该命令,只需要调用 is_supported 函数即可。
bool Controller::IsSupported(bluetooth::hci::OpCode op_code) const {return impl_->is_supported(op_code);
}
- 外部模块只需要调用 Controller::IsSupported 即可判断是否支持该命令。
2. aosp 中的作用:为什么它很重要?
在 Android 蓝牙协议栈(如 system/bt
)中,HCI_Read_Local_Supported_Commands
返回的这 64 字节位图广泛用于以下几个方面:
1. 功能检测与控制器能力决策
-
Android 蓝牙栈会根据该命令结果动态判断 Controller 支持哪些命令。
-
典型例子:LE Extended Advertising、Coded PHY、LE Periodic Advertising 等功能是否可用,直接影响上层是否启用某些 GAP/GATT 功能。
2. 初始化过程动态调整命令发送策略
- 在 stack 初始化时,controller 不支持某些命令则跳过它们的初始化调用,避免失败。
- 举例:是否发送
LeReadBufferSizeV2
命令前会先检查对应 bit 是否为 1。
if (is_supported(OpCode::LE_READ_BUFFER_SIZE_V2)) {hci_->EnqueueCommand(LeReadBufferSizeV2Builder::Create(),handler->BindOnceOn(this, &Controller::impl::le_read_buffer_size_v2_handler));}
3. 厂商定制逻辑与能力适配
-
有些厂商芯片即便宣称是 BT5.1,但可能缺失部分命令实现。
-
Android 通过查询这个位图 动态适配,避免调用未支持的命令导致错误。
4. 蓝牙兼容性 Debug
- 蓝牙连接或功能异常时,可通过 dumpsys 或 log 分析哪些命令是被支持的。
Supported_Commands
是诊断「为什么不能执行某个 HCI 操作」的关键。
相关文章:

【android bluetooth 协议分析 01】【HCI 层介绍 9】【ReadLocalSupportedCommands命令介绍】
1. HCI_Read_Local_Supported_Commands 命令介绍 1. 命令介绍(Description) HCI_Read_Local_Supported_Commands 是 HCI 层中非常重要的查询命令。它允许 Host(如 Android 系统中的 Bluetooth stack)获取 Controller(…...
stm32实战项目:无刷驱动
目录 系统时钟配置 PWM模块初始化 ADC模块配置 霍尔接口配置 速度环定时器 换相逻辑实现 主控制循环 系统时钟配置 启用72MHz主频:RCC_Configuration()设置PLL外设时钟使能:TIM1/ADC/GPIO时钟 #include "stm32f10x.h"void RCC_Configu…...

python打卡训练营打卡记录day30
一、导入官方库 我们复盘下学习python的逻辑,所谓学习python就是学习python常见的基础语法学习你所处理任务需要用到的第三方库。 1.1标准导入:导入整个库 这是最基本也是最常见的导入方式,直接使用import语句。 # 方式1:导入整…...

2025年- H33-Lc141 --148. 排序链表(快慢指针,快指针先出发一步)--Java版
1.题目描述 2.思路 时间空间复杂度分别为 O(nlogn) 和 O(1),根据时间复杂度想到二分法,从而联想到归并排序;对数组做归并排序的空间复杂度为 O(n),分别由新开辟数组 O(n) 和递归函数调用 O(logn) 组成,而根据链表特性…...

【prometheus+Grafana篇】基于Prometheus+Grafana实现Oracle数据库的监控与可视化
💫《博主主页》: 🔎 CSDN主页 🔎 IF Club社区主页 🔥《擅长领域》:擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(MongoDB)有了…...
板凳-------Mysql cookbook学习 (四)
综合对比与选择建议 维度 PHP Java Python Ruby Perl 学习门槛 低(适合新手) 高(语法复杂) 低(语法简洁) 中(需理解 Rails 理念) 中(特殊语法…...
【D1,2】 贪心算法刷题
文章目录 不同路径 II整数拆分 不同路径 II 初始化的时候不能整列初始化为1,因为如果有障碍物,后面的都不能到达 也不能整列初始化为0,因为状态转移的时候第一行第一列都没有检查,因此不能部分初始化 整数拆分 需要考虑几种情况…...

算法题(150):拼数
审题: 本题需要我们将数组中的数据经过排序,使得他们拼接后得到的数是所有拼接方案中最大的 思路: 方法一:排序贪心 贪心策略1:直接排序 如果我们直接按照数组数据的字典序进行排序,会导致部分情况出错 eg&…...
Denoising Score Matching with Langevin Dynamics
在自然图像等复杂数据集中,真实数据往往集中分布在一个低维流形上,概率密度函数的梯度(即得分函数)难以定义与估计。为缓解该问题,SMLD 提出使用不同强度的高斯噪声对数据进行扰动,扰动后的数据不再集中于低…...

Docker构建 Dify 应用定时任务助手
概述 Dify 定时任务管理工具是一个基于 GitHub Actions 的自动化解决方案,用于实现 Dify Workflow 的定时执行和状态监控。无需再为缺乏定时任务支持而感到困扰,本工具可以帮助设置自动执行任务并获取实时通知,优化你的工作效率。 注意&…...

mongodb管理工具的使用
环境: 远程服务器的操作系统:centOS stream 9; mongoDB version:8.0; 本地电脑 navicat premium 17.2 ; 宝塔上安装了mongoDB 目的:通过本地的navicat链接mongoDB,如何打通链接,分2步: 第一步:宝塔-&…...

第2篇 水滴穿透:IGBT模块的绝对防御体系
引言:从《三体》水滴到功率模块的哲学思考 科幻映照现实:三体探测器"水滴"的绝对光滑表面 → IGBT模块的可靠性设计哲学行业现状痛点:2023年OEM质量报告显示,电控系统23%的故障源自功率模块技术演进悖论:开关频率提升与可靠性保障的永恒博弈 一、基础理论:IGBT…...
LVGL(lv_dropdown下拉列表控件)
文章目录 🔧 一、基本概念🚀 二、创建一个 Dropdown🧰 三、常用函数1. 设置选项2. 获取选项3. 设置当前选中项4. 获取当前选中项索引5. 获取当前选中项文本🎨 四、样式与模式设置方向(最多显示多少项)设置显示模式设置提示文本📞 五、事件回调🧪 六、使用示例📌…...
2.微服务-配置
引入springcloud的pom配置 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.12</version><relativePath/></parent> <dependencyManagemen…...
python实现pdf转图片(针对每一页)
from pdf2image import convert_from_path import ospdf_file rC:\Users\\Desktop\拆分\产权证.pdf poppler_path rC:\poppler-24.08.0\Library\bin # 这里改成你自己的路径output_dir rC:\Users\\Desktop\拆分\output_images os.makedirs(output_dir, exist_okTrue)image…...
C语言练手磨时间
167. 两数之和 II - 输入有序数组 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <…...
数字图像处理——图像压缩
背景 图像压缩是一种减少图像文件大小的技术,旨在在保持视觉质量的同时降低存储和传输成本。随着数字图像的广泛应用,图像压缩在多个领域如互联网、移动通信、医学影像和卫星图像处理中变得至关重要。 技术总览 当下图像压缩JPEG几乎一统天下ÿ…...

验证器回调中value值没有数据
复杂的响应式,导致回调中value值没有数据,最终还是通过手动判断获取值处理 原理没有搞清楚,为什么回调中value没有值背景:动态增加了form表单的字段,通过for循环处理的。对每个新增的字段还要添加字段验证其。就出现了…...

Python | 需求预测模型
目录 需求预测 1.方法选择 2.颗粒度选择 3.在医药行业的应用 预测模型 1.模型对比 2.Prophet 3.Holt-Winters 需求预测 1.方法选择 方法 适用范围分类移动平均法中小企业、SKU较少的卖家低成本预测方案Excel趋势线预测中小企业、SKU较少的卖家低成本预测方案季节性系数法中小企…...

双指针算法:原理与应用详解
文章目录 一、什么是双指针算法二、双指针算法的适用场景三、双指针的三种常见形式1. 同向移动指针2. 相向移动指针3. 分离指针 四、总结 一、什么是双指针算法 双指针算法(Two Pointers Technique)是一种在数组或链表等线性数据结构中常用的高效算法技…...

打造灵感投掷器:我的「IdeaDice」开发记录
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 起源:我只是想“摇”出点灵感 有时候面对写作或者做产品设计,我会卡在「不知道从哪开始…...

2025ICPC邀请赛南昌游记
滚榜时候队伍照片放的人家的闹麻了,手机举了半天 。 最后银牌700小几十罚时,rank60多点。 参赛体验还行,队长是福建人,说感觉这个热度是主场作战哈哈哈哈。空调制冷确实不太行吧。 9s过A是啥,没见过,虽然…...

python重庆旅游系统-旅游攻略
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...

MySQL企业版免费开启,强先体验
近期Oracle突然宣布,MySQL企业版面向开发者免费开放下载,这一消息瞬间引爆DBA圈。作为数据库领域的“顶配车型”,企业版长期因高昂授权费让中小团队望而却步,如今免费开放无异于“劳斯莱斯开进菜市场”。 本文将深度拆解企业版的…...
从纸质契约到智能契约:AI如何改写信任规则与商业效率?——从智能合约到监管科技,一场颠覆传统商业逻辑的技术革命
一、传统合同的“低效困境”:耗时、昂贵、风险失控 近年来,全球商业环境加速向数字化转型,但合同管理却成为企业效率的“阿喀琉斯之踵”。据国际商会(International Chamber of Commerce)数据显示,全球企业…...
常见的 HTTP 接口(请求方法)
一:GET 作用:从服务器获取资源(查询数据)。特点: 请求参数通过 URL 传递(如https://api.example.com/users?id123),参数会显示在地址栏中。不修改服务器数据,属于幂等操…...
iOS 抓包实战:从 Charles 到Sniffmaster 的日常工具对比与使用经验
iOS 抓包实战:从 Charles 到抓包大师 Sniffmaster 的日常工具对比与使用经验 抓包这件事,不是高级黑客才要做的。作为一名移动端开发,我几乎每天都要和网络请求打交道,尤其是 HTTPS 请求——加密、重定向、校验证书,各…...
Lodash isEqual 方法源码实现分析
Lodash isEqual 方法源码实现分析 Lodash 的 isEqual 方法用于执行两个值的深度比较,以确定它们是否相等。这个方法能够处理各种 JavaScript 数据类型,包括基本类型、对象、数组、正则表达式、日期对象等,并且能够正确处理循环引用。 1. is…...

Qt Widgets模块功能详细说明,基本控件:QCheckBox(三)
一、基本控件(Widgets) Qt 提供了丰富的基本控件,如按钮、标签、文本框、复选框、单选按钮、列表框、组合框、菜单、工具栏等。 1、QCheckBox 1.1、概述 (用途、状态、继承关系) QCheckBox 是 Qt 框架中的复选框控件,用于表示二…...

第四天的尝试
目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 很抱歉的说一下,我昨天看白色巨塔电视剧,看的入迷了,同时也看出一些道理,学到东西; 但是把昨天的写事情给忘记了,今天…...