HCI控制命令由两个字节的OpCode定义,每个OpCode由一个字节的OGF(OpCode Group Field)和一个字节的OCF(OpCode Command Field)组成。参考:
HCI Command Packet
Command的数据包格式如下图:
其中opcode(操作码)由ogf(opcode group field,6个bits)和ocf(opcode command field,10个bits)组成。
十六进组高低位组合后的opcode为:OGF 6个bit后添加两个0,并移到高8位 + OCF:
以reset命令为例,OGF=0X03,0GF=0X03:
opcode = 0X03为高8位,末尾添加两个0,+OCF = 0x0c03
OGF包括如下定义:
#def ine OGF LINK CONTROL 0 x01
#def ine OGF LINK POLICY 0 x02
#def ine OGF CONTROLLER BASEBAND 0 x03
#def ine OGF INFORMATIONAL PARAMETERS 0 x04
#def ine OGF LE CONTROLLER 0 x08
#def ine OGF BTSTACK 0x3d
#def ine OGF VENDOR 0 x 3f
OCF包括如下定义:
Bluetooth Specififica�tion - Core Version 4.0, Volume 2, Part E, Chapter 7.
// calculate hci opcode for ogf/ocf value
#define HCI_OPCODE(ogf, ocf) ((ocf) | ((ogf) << 10))// Link Control HCI_OPCODE_HCI_INQUIRY = HCI_OPCODE (OGF_LINK_CONTROL, 0x01), HCI_OPCODE_HCI_INQUIRY_CANCEL = HCI_OPCODE (OGF_LINK_CONTROL, 0x02), HCI_OPCODE_HCI_PERIODIC_INQUIRY_MODE = HCI_OPCODE(OGF_LINK_CONTROL, 0x03), HCI_OPCODE_HCI_EXIT_PERIODIC_INQUIRY_MODE = HCI_OPCODE(OGF_LINK_CONTROL, 0x04), HCI_OPCODE_HCI_CREATE_CONNECTION = HCI_OPCODE (OGF_LINK_CONTROL, 0x05),
HCI_OPCODE_HCI_DISCONNECT = HCI_OPCODE (OGF_LINK_CONTROL, 0x06), HCI_OPCODE_HCI_CREATE_CONNECTION_CANCEL = HCI_OPCODE (OGF_LINK_CONTROL, 0x08), HCI_OPCODE_HCI_ACCEPT_CONNECTION_REQUEST = HCI_OPCODE (OGF_LINK_CONTROL, 0x09), HCI_OPCODE_HCI_REJECT_CONNECTION_REQUEST = HCI_OPCODE (OGF_LINK_CONTROL, 0x0a), HCI_OPCODE_HCI_LINK_KEY_REQUEST_REPLY = HCI_OPCODE (OGF_LINK_CONTROL, 0x0b), HCI_OPCODE_HCI_LINK_KEY_REQUEST_NEGATIVE_REPLY = HCI_OPCODE (OGF_LINK_CONTROL, 0x0c), HCI_OPCODE_HCI_PIN_CODE_REQUEST_REPLY = HCI_OPCODE (OGF_LINK_CONTROL, 0x0d), HCI_OPCODE_HCI_PIN_CODE_REQUEST_NEGATIVE_REPLY = HCI_OPCODE (OGF_LINK_CONTROL, 0x0e), HCI_OPCODE_HCI_CHANGE_CONNECTION_PACKET_TYPE = HCI_OPCODE (OGF_LINK_CONTROL, 0x0f), HCI_OPCODE_HCI_AUTHENTICATION_REQUESTED = HCI_OPCODE (OGF_LINK_CONTROL, 0x11), HCI_OPCODE_HCI_SET_CONNECTION_ENCRYPTION = HCI_OPCODE (OGF_LINK_CONTROL, 0x13), HCI_OPCODE_HCI_CHANGE_CONNECTION_LINK_KEY = HCI_OPCODE (OGF_LINK_CONTROL, 0x15), HCI_OPCODE_HCI_REMOTE_NAME_REQUEST = HCI_OPCODE (OGF_LINK_CONTROL, 0x19), HCI_OPCODE_HCI_REMOTE_NAME_REQUEST_CANCEL = HCI_OPCODE (OGF_LINK_CONTROL, 0x1A), HCI_OPCODE_HCI_READ_REMOTE_SUPPORTED_FEATURES_COMMAND = HCI_OPCODE (OGF_LINK_CONTROL, 0x1B), HCI_OPCODE_HCI_READ_REMOTE_EXTENDED_FEATURES_COMMAND = HCI_OPCODE (OGF_LINK_CONTROL, 0x1C), HCI_OPCODE_HCI_READ_REMOTE_VERSION_INFORMATION = HCI_OPCODE (OGF_LINK_CONTROL, 0x1D), HCI_OPCODE_HCI_SETUP_SYNCHRONOUS_CONNECTION = HCI_OPCODE (OGF_LINK_CONTROL, 0x0028), HCI_OPCODE_HCI_ACCEPT_SYNCHRONOUS_CONNECTION = HCI_OPCODE (OGF_LINK_CONTROL, 0x0029), HCI_OPCODE_HCI_IO_CAPABILITY_REQUEST_REPLY = HCI_OPCODE (OGF_LINK_CONTROL, 0x2b), HCI_OPCODE_HCI_USER_CONFIRMATION_REQUEST_REPLY = HCI_OPCODE (OGF_LINK_CONTROL, 0x2c), HCI_OPCODE_HCI_USER_CONFIRMATION_REQUEST_NEGATIVE_REPLY = HCI_OPCODE (OGF_LINK_CONTROL, 0x2d), HCI_OPCODE_HCI_USER_PASSKEY_REQUEST_REPLY = HCI_OPCODE (OGF_LINK_CONTROL, 0x2e), HCI_OPCODE_HCI_USER_PASSKEY_REQUEST_NEGATIVE_REPLY = HCI_OPCODE (OGF_LINK_CONTROL, 0x2f), HCI_OPCODE_HCI_REMOTE_OOB_DATA_REQUEST_REPLY = HCI_OPCODE (OGF_LINK_CONTROL, 0x30), HCI_OPCODE_HCI_REMOTE_OOB_DATA_REQUEST_NEGATIVE_REPLY = HCI_OPCODE (OGF_LINK_CONTROL, 0x33), HCI_OPCODE_HCI_IO_CAPABILITY_REQUEST_NEGATIVE_REPLY = HCI_OPCODE (OGF_LINK_CONTROL, 0x34), HCI_OPCODE_HCI_ENHANCED_SETUP_SYNCHRONOUS_CONNECTION = HCI_OPCODE (OGF_LINK_CONTROL, 0x3d), HCI_OPCODE_HCI_ENHANCED_ACCEPT_SYNCHRONOUS_CONNECTION = HCI_OPCODE (OGF_LINK_CONTROL, 0x3e), HCI_OPCODE_HCI_REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY = HCI_OPCODE (OGF_LINK_CONTROL, 0x45), // Link Policy
HCI_OPCODE_HCI_HOLD_MODE = HCI_OPCODE (OGF_LINK_POLICY, 0x01),
HCI_OPCODE_HCI_SNIFF_MODE = HCI_OPCODE (OGF_LINK_POLICY, 0x03),
HCI_OPCODE_HCI_EXIT_SNIFF_MODE = HCI_OPCODE (OGF_LINK_POLICY, 0x04),
HCI_O