当前位置: 首页 > news >正文

【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]
参数名大小描述
Status1 byte0x00 表示成功
Supported_Commands64 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. 命令介绍&#xff08;Description&#xff09; HCI_Read_Local_Supported_Commands 是 HCI 层中非常重要的查询命令。它允许 Host&#xff08;如 Android 系统中的 Bluetooth stack&#xff09;获取 Controller&#xff08;…...

Model 速通系列(一)nanoGPT

这个是新开的一个系列用来手把手复现一些模型工程&#xff0c;之所以开这个系列是因为有人留言说看到一个工程不知道从哪里读起&#xff0c;出于对自身能力的提升与兴趣&#xff0c;故新开了这个系列。由于主要动机是顺一遍代码并提供注释。 该系列第一篇博客是 nanoGPT &…...

星际争霸小程序:用Java实现策略模式的星际大战

在游戏开发的世界里&#xff0c;策略模式是一种非常实用的设计模式&#xff0c;它允许我们在运行时动态地选择算法或行为。今天&#xff0c;我将带你走进一场星际争霸的奇幻之旅&#xff0c;用Java实现一个简单的星际争霸小程序&#xff0c;通过策略模式来模拟不同种族单位的战…...

网络Tips20-007

网络威胁会导致非授权访问、信息泄露、数据被破坏等网络安全事件发生&#xff0c; 其常见的网络威胁包括窃听、拒绝服务、病毒、木马、( 数据完整性破坏 )等&#xff0c; 常见的网络安全防范措施包括访问控制、审计、身份认证、数字签名、( 数据加密 )、 包过滤和检测等。 AE…...

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…...

Python编程从入门到实践 PDF 高清版

各位程序员朋友们&#xff0c;还在为找不到合适的Python学习资料而烦恼吗&#xff1f;还在为晦涩难懂的编程书籍而头疼吗&#xff1f;今天&#xff0c;就给大家带来一份重磅福利——237完整版PDF&#xff0c; 我用网盘分享了「Python编程&#xff1a;从入门到实践__超清版.pdf…...

CVE-2015-3934 Fiyo CMS SQL注入

CVE-2015-3934 Fiyo CMS SQL注入 页面抓登录数据包 构造延时注入语句在user处’%2B(select(0)from(select(sleep(5)))v)%2B’ 存在延时注入&#xff0c;使用脚本即可...

【Pandas】pandas DataFrame mode

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...

(思维题、贪心)洛谷 P11232 CSPS2024 超速检测 题解

这一题在 2024 将我击败&#xff0c;但我怎么现在才补题解 …… 题意 原题 思路 对于每一辆车&#xff0c;我们可以算出&#xff0c;其在距离左端点哪段位置会超速 [ l , r ] [l,r] [l,r]&#xff0c;那么这辆车会被 l l l 右侧最近的测速仪到 r r r 左侧最近的测速仪检…...

C#:多线程

一.线程常用概念 线程&#xff08;Thread&#xff09;&#xff1a;操作系统执行程序的最小单位 进程&#xff08;Process&#xff09;&#xff1a;程序在内存中的运行实例 并发&#xff08;Concurrency&#xff09;&#xff1a;多个任务交替执行&#xff08;单核CPU&#xff0…...

虚拟币制度钱包开发:功能设计与成本全解析

虚拟币制度钱包开发&#xff1a;功能设计与成本全解析 ——从基础架构到合规风控的完整解决方案 一、开发成本&#xff1a;分层定价与关键影响因素 根据2024-2025年行业数据显示&#xff0c;虚拟币钱包App开发成本跨度较大&#xff0c;主要受功能复杂度、技术架构与合规要求三…...

TransmittableThreadLocal实现上下文传递-笔记

1.TransmittableThreadLocal简介 com.alibaba.ttl.TransmittableThreadLocal&#xff08;简称 TTL&#xff09;是阿里巴巴开源的一个工具类&#xff0c;旨在解决 ThreadLocal 在线程池中无法传递上下文变量 的问题。它是对 InheritableThreadLocal 的增强&#xff0c;尤其适用…...

应对WEEE 2025:猎板PCB的区块链追溯与高温基材创新

在全球电子产业加速向循环经济转型的背景下&#xff0c;欧盟《绿色新政》与《WEEE指令》对PCB行业提出更高要求。作为行业先行者&#xff0c;猎板PCB&#xff08;Hunter PCB&#xff09;以生物降解基材为核心&#xff0c;结合全球合规体系与产业链协同创新&#xff0c;构建从材…...

大陆资产在香港发行RWA的合规路径与核心限制

大陆资产在香港发行RWA的合规路径与核心限制 ——从“双重合规原则”到资产准入边界的全景解读 一、法律框架&#xff1a;双重合规原则的刚性约束 根据香港金管局Ensemble沙盒项目要求&#xff0c;大陆资产在香港发行RWA需遵循“双重合规原则”&#xff0c;即底层资产需同时符…...

爬虫攻防战:从入门到放弃的完整对抗史与实战解决方案

爬虫攻防战:从入门到放弃的完整对抗史与实战解决方案 这张有趣的图片生动描绘了爬虫开发者与反爬工程师之间的"军备竞赛"。作为技术博主,我将基于这张图的各个阶段,深入分析爬虫技术的演进与对应的反制措施,提供一套完整的反爬解决方案,包括技术原理、实施方法…...

Fabric初体验(踩坑笔记)

搭建fabric部署合约学习笔记 环境准备CURl安装docker 参照官网文档实现&#xff08;2025.05.19&#xff09;根据前言交代的文章去尝试&#xff08;失败版&#xff09;安装fabric-samples安装指定2.2.0版本Fabric二进制文件和配置文件直接手动下载&#xff08;不建议&#xff09…...

区块链blog2_中心化与效率

&#x1f33f;中心化出现原因 信息/服务分散在各处会浪费时间且不方便使用&#xff0c;由此&#xff0c;把信息/服务集中在一起&#xff0c;便于管理&#xff0c;避免了不必要的效率损失。 即集中资源&#xff0c;使得对信息处理的全过程效率升高。中心化不是网络中产生的&…...

2024年ASOC SCI2区TOP,多机制群优化算法+多风场输电线路巡检中多无人机任务分配与路径规划,深度解析+性能实测

目录 1.摘要2.考虑风场影响的多无人机任务分配3.基于双向蚁群和离散蜜獾算法求解多无人机任务分配问题(BACOHBA)4.考虑风场的多无人机路径规划5.结果展示6.参考文献7.代码获取8.读者交流 1.摘要 随着电力系统规模的不断扩大&#xff0c;复杂环境下的电力线路及设施的巡检与维护…...

智慧赋能光伏运维——无人机巡检+地面监控双链路覆盖,打造光伏电站管理新标杆

一、引言&#xff1a;光伏电站运维的挑战与机遇 在全球能源转型浪潮下&#xff0c;光伏电站作为清洁能源的重要载体&#xff0c;其高效运维管理成为行业核心命题。然而&#xff0c;传统光伏电站运维存在覆盖范围广、设备分散、人工巡检效率低、故障响应慢等痛点。为破解这一难…...

c/c++的opencv开闭操作

OpenCV 中的形态学开运算与闭运算 (C) 在计算机视觉和图像处理领域&#xff0c;形态学操作是用于分析和处理图像形状的一系列非线性操作。OpenCV 作为一个强大的开源计算机视觉库&#xff0c;提供了丰富的形态学转换函数。其中&#xff0c;“开运算”&#xff08;Opening&…...

Linux利用多线程和线程同步实现一个简单的聊天服务器

1. 概述 本文实现一个基于TCP/IP的简单多人聊天室程序。它包含一个服务器端和一个客户端&#xff1a;服务器能够接收多个客户端的连接&#xff0c;并将任何一个客户端发来的消息广播给所有其他连接的客户端&#xff1b;客户端则可以连接到服务器&#xff0c;发送消息并接收来自…...

无人机遥控器光纤通信模块技术要点!

一、技术要点 1. 长距离低损耗传输 采用单模光纤&#xff08;如G.654.E光纤&#xff09;&#xff0c;利用光纤的低衰减特性&#xff08;0.17 dB/km以下&#xff09;&#xff0c;支持10公里以上的远距离通信&#xff0c;突破了传统无线信号因衰减导致的覆盖限制。例如&…...

深入解析OkHttp与Retrofit:Android网络请求的黄金组合

前言 在移动应用开发中&#xff0c;网络请求是连接客户端与服务器的关键桥梁。对于Android开发者而言&#xff0c;OkHttp和Retrofit这对组合已经成为处理网络请求的事实标准。本文将全面剖析这两个框架的设计理念、核心功能、协同关系以及最佳实践&#xff0c;帮助开发者构建高…...

Python操作PDF书签详解 - 添加、修改、提取和删除

目录 简介 使用工具 Python 向 PDF 添加书签 添加书签 添加嵌套书签 Python 修改 PDF 书签 Python 展开或折叠 PDF 书签 Python 提取 PDF 书签 Python 删除 PDF 书签 简介 PDF 书签是 PDF 文件中的导航工具&#xff0c;通常包含一个标题和一个跳转位置&#xff08;如…...

Spring Boot与Kafka集成实践:从入门到实战

Spring Boot与Kafka集成实践 引言 在现代分布式系统中&#xff0c;消息队列是不可或缺的组件之一。Apache Kafka作为一种高吞吐量的分布式消息系统&#xff0c;广泛应用于日志收集、流处理、事件驱动架构等场景。Spring Boot作为Java生态中最流行的微服务框架&#xff0c;提供…...

luckysheet的使用——17.将表格作为pdf下载到本地

luckysheet源码里面自带有打印按钮&#xff0c;但是功能是无法使用的&#xff0c;所以我把该功能重写了一遍 1.在menuButton.js文件中找到源码打印按钮的触发事件&#xff1a; $("#luckysheet-icon-print").click(function () {}2.使用自己写的挂载方法 window.pr…...

矿井支架LCYVB-6钢丝编织护套连接器介绍

LCYVB-6钢丝编织护套连接器是一种专为矿井支架设计的连接装置&#xff0c;主要用于增强支架的稳定性和安全性。该连接器采用高强度钢丝编织护套&#xff0c;具有优异的抗拉强度和耐磨性&#xff0c;适用于恶劣的矿井环境。 主要特点 高强度钢丝编织护套&#xff1a;采用优质钢…...

git仓库中.git 文件很大,怎么清理掉一部分

查询 .git 文件大小&#xff0c;在 git-bash 里执行&#xff08;后面有些命令不能执行&#xff0c;也请在 git-bash 里执行&#xff09; windows11 安装好后右键没有 git bash 命令-CSDN博客 du -sh .git // 592m .git 操作前最好先备份一份&#xff0c;避免推送到远程时出错…...

Qt框架核心组件完全指南:从按钮交互到定时器实现

文章目录 前言一、QAbstractButton 按钮类概述1.1 常用属性1.2 常用信号1.3QButtonGroup 按钮组 二、QComboBox 组合框三、若干与数字相关的组件四、QString 字符串类五、Qt容器类5.1 顺序容器 QList5.2 关联容器 QMap 六、QVariant七、跨平台数据类型7.1 基础数据类型7.2 特殊…...

Axure设计数字乡村可视化大屏:从布局到交互的实战经验分享

乡村治理正从传统模式向“数据驱动”转型。数字乡村可视化大屏作为数据展示的核心载体&#xff0c;不仅能直观呈现乡村发展全貌&#xff0c;还能为决策提供科学依据。本文以Axure为工具&#xff0c;结合实际案例&#xff0c;分享如何从零设计一个功能完备、交互流畅的数字乡村大…...

60天python训练计划----day30

DAY 30 模块和库的导入 知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 一.导入官方库 我们复盘下学习python的逻辑&#xff0c;所谓学习pyth…...

HJ3 明明的随机数【牛客网】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路3.1 快排去重3.2 散列 四、参考代码4.1 快排去重4.2 散列 零、原题链接 HJ3 明明的随机数 一、题目描述 二、测试用例 三、解题思路 3.1 快排去重 基本思路&#xff1a;   先将序列进行快速排序&#xff0c;然后…...

BGP选路

一、拓扑图 二、要求及分析 1.要求 1.使用Preva1策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2、用As Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3.配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 4.使用Local Preference策略&#xff0c;确保…...

践行“科学智能”!和鲸打造 AI for Science 专属应用

AI for good, AI for Science. 在传统科研领域&#xff0c;人力与经验的局限始终如影随形。而“AI for Science”正逐渐改变科学研究的模式&#xff0c;以科学数据为基石、以强大算力为支撑&#xff0c;借助人工智能技术&#xff0c;开展计算密集度高且能够实现高效迭代的科学…...

【vs2022的C#窗体项目】打开运行+sql Server改为mysql数据库+发布

1. vs2022打开运行原sql Server的C#窗体项目更改为mysql数据库 1.1. vs2022安装基础模块即可 安装1️⃣vs核心编辑器2️⃣.net桌面开发必选&#xff0c;可选均不安装&#xff01;&#xff01;&#xff01; 为了成功连接mysql数据库&#xff0c;需要安装组件NuGet包管理器 安…...

wpf DataGrid 行选择事件

在WPF中处理DataGrid行选择事件主要有以下几种实现方式: 1.SelectionChanged事件处理 ‌ 通过直接订阅DataGrid的SelectionChanged事件实现行选择响应: <DataGrid SelectionChanged="DataGridAccurateLocationList_SelectionChanged" .../>后台代码中处理…...

Spring Cloud Seata 深度解析:原理与架构设计

文章目录 前言&#xff1a;为什么我们需要理解分布式事务&#xff1f;一、Seata 核心架构深度拆解1.1 分布式事务核心模型1.2 Seata undo_log 存储结构与版本控制存储结构版本控制核心算法 1.3 Seata 事务模型深度对比与实现原理AT 模式&#xff08;Auto Transaction&#xff0…...

从产品展示到工程设计:3DXML 转 STP 的跨流程数据转换技术解析

在数字化设计与制造领域&#xff0c;不同格式的三维模型文件常常需要进行转换&#xff0c;以满足不同软件和工作流程的需求。3DXML 和 STP&#xff08;STEP AP214/AP242&#xff09;是工业领域常用的两种三维模型文件格式&#xff0c;3DXML 格式以其轻量化和便于网络传输、可视…...

基于RT-Thread的STM32F4开发第五讲——软件模拟I2C

文章目录 前言一、RT-Thread工程创建二、AT24C02三、函数编写1.I2C_soft.c2.I2C_soft.h3.main.h 四、效果展示五、资源分享总结 前言 本章是基于RT-Thread studio实现软件模拟I2C&#xff0c;开发板是正点原子的STM32F4探索者&#xff0c;使用的RT-Thread驱动是5.1.0&#xff0…...

pkucpc2025 L:Game on Tree

题意 两个人在一棵无根树上玩游戏&#xff0c;每次可以删掉若干个叶子节点&#xff0c;不能操作的人输。 思路 比赛的时候我去写H Quintuple了&#xff0c;队友貌似在我写的时候把这道题讨论出来了。 后来补题的时候花了大概花了70分钟左右ac这道题。 首先考虑一条链的情况…...

大数据实时分析:ClickHouse、Doris、TiDB 对比分析

随着企业对数据分析实时性、复杂性和多样性的要求越来越高,传统的批处理数仓已经无法满足实时指标看板、流量监控、用户行为分析等场景需求。因此,越来越多的公司开始引入实时分析型数据库系统。 目前,国内外常见的实时分析数据库有: ClickHouse:列式数据库,极致的分析性…...

网络流量分析系统的十大应用场景

在现代企业和组织的IT运维体系中&#xff0c;网络流量分析系统&#xff08;Network Traffic Analysis, NTA&#xff09;早已不仅仅是用来查看带宽使用率的“流量计数器”。随着网络环境的复杂化、攻击技术的不断演进&#xff0c;以及对业务连续性要求的提升&#xff0c;网络流量…...

问题 | 代码审查:函数是否包含返回语句

“函数是否包含返回语句”这一问题的核心是&#xff1a;在编程中&#xff0c;函数是否按照设计要求正确使用了 返回语句&#xff08;如 return、return value&#xff09;&#xff0c;以便向调用者传递结果或控制权。以下是详细解释&#xff1a; 1. 什么是函数的返回语句&#…...

Spring Bean 生命周期中设计模式的应用与解析

Spring Bean 生命周期中使用的设计模式 Spring Bean 的生命周期涉及多个阶段和扩展点&#xff0c;Spring 框架在这一过程中巧妙运用了多种设计模式&#xff0c;以实现强大的功能和灵活性。以下是主要设计模式及其应用场景&#xff1a; 1. 工厂模式&#xff08;Factory Patter…...

设计模式的原理及深入解析

创建型模式 创建型模式主要关注对象的创建过程&#xff0c;旨在通过不同的方式创建对象&#xff0c;以满足不同的需求。 工厂方法模式 定义&#xff1a;定义一个创建对象的接口&#xff0c;让子类决定实例化哪一个类。 解释&#xff1a;工厂方法模式通过定义一个创建对象的…...

kotlin flow的两种SharingStarted策略的区别

一 两种 SharingStarted 策略的区别&#xff1a; SharingStarted.Eagerly: 立即开始收集上游流&#xff0c;即使没有下游订阅者持续保持活跃状态&#xff0c;直到 ViewModel 被清除优点&#xff1a;响应更快&#xff0c;数据始终保持最新缺点&#xff1a;消耗更多资源&#x…...

BGP综合实验(2)

一、实验需求 1、实验拓扑图 2、实验需求 使用 PreVal 策略&#xff0c;让 R4 经 R2 到达 192.168.10.0/24 。 使用 AS_Path 策略&#xff0c;让 R4 经 R3 到达 192.168.11.0/24 。 配置 MED 策略&#xff0c;让 R4 经 R3 到达 192.168.12.0/24 。 使用 Local Preference 策…...

python使用jsonpath-ng库操作json数据

jsonpath-ng 库的详细使用如下&#xff1a; 一、安装与导入 安装 通过 pip 安装库&#xff1a; pip install jsonpath-ng支持 Python 3.6 及以上版本。 导入核心模块 主要使用 parse 函数和 JSONPath 对象&#xff1a; from jsonpath_ng import parse二、基础查询操作 1. 简单…...

通用简洁工作汇报项目评估营销策划工作总结年终汇报PPT模版8套一组分享

工作总结汇报PPT模版8套一组分享&#xff1a;工作总结汇报PPT模版分享https://pan.quark.cn/s/04b7ab7a47c4 第一套PPT模版&#xff0c;主要是黄色和灰色调&#xff0c;上方有大面积黄色不规则形状背景&#xff0c;有“POWERPOINT”和“XXXXPPT模版”字样&#xff0c;左侧是黑…...