在 lib/Hci.h 头文件中定义了很的我 HCI Commands,这些命令是分组的,每个组下面又提供了具体的命令,如:
其中
OGF 为 OpCode Group Flag,表明命令级别
OCF 为 OpCode Command Flag,表明要执行的命令
Hci.h 头文件里提供的命令级别一共有 8 个,分别为:
1,OGF_LINK_CTL /* Link Control */
2,OGF_LINK_POLICY /* Link Policy */
3,OGF_HOST_CTL /* Host Controller and Baseband */
4,OGF_INFO_PARAM /* Informational Parameters */
5,OGF_STATUS_PARAM /* Status params */
6,OGF_TESTING_CMD /* Testing commands */
7, OGF_LE_CTL /* LE commands */
8, OGF_VENDOR_CMD /* Vendor specific commands */
每组命令下提供了很多的具体的命令,可以详看Hci.h头文件。 可以从提供的命令看出 :
1,OGF_LINK_CTL 主要用于控制蓝牙设备的,如 查询、链接创建、链接断开等操作。
2,OGF_LINK_POLICY 主要用于控制蓝牙设备的模式或是角色,如读写模式、发现模式,主/从模式等。其他的可以自己看看了,当要向一个蓝牙设备发送指令时,则根据需要指定OGF和OCF,如链接函数:
int hci_create_connection(int dd, const bdaddr_t *bdaddr, uint16_t ptype,
uint16_t clkoffset, uint8_t rswitch,
uint16_t *handle, int to)
{
evt_conn_complete rp;
create_conn_cp cp;
struct hci_request rq;
memset(&cp, 0, sizeof(cp));
bacpy(&cp.bdaddr, bdaddr);
cp.pkt_type = ptype;
cp.pscan_rep_mode = 0x02;
cp.clock_offset = clkoffset;
cp.role_switch = rswitch;
memset(&rq, 0, sizeof(rq));
rq.ogf = OGF_LINK_CTL;
rq.ocf = OCF_CREATE_CONN;
rq.event = EVT_CONN_COMPLETE;
rq.cparam = &cp;
rq.clen = CREATE_CONN_CP_SIZE;
rq.rparam = &rp;
rq.rlen = EVT_CONN_COMPLETE_SIZE;
if (hci_send_req(dd, &rq, to) < 0)
return -1;
if (rp.status) {
errno = EIO;
return -1;
}
*handle = rp.handle;
return 0;
}