📄 hci.c
字号:
rq.rparam = &rn; rq.rlen = EVT_REMOTE_NAME_REQ_COMPLETE_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rn.status) { errno = EIO; return -1; } rn.name[247] = '\0'; strncpy(name, (char *) rn.name, len); return 0;}int hci_read_remote_name(int dd, const bdaddr_t *bdaddr, int len, char *name, int to){ return hci_read_remote_name_with_clock_offset(dd, bdaddr, 0x02, 0x0000, len, name, to);}int hci_read_remote_name_cancel(int dd, const bdaddr_t *bdaddr, int to){ remote_name_req_cancel_cp cp; struct hci_request rq; memset(&cp, 0, sizeof(cp)); bacpy(&cp.bdaddr, bdaddr); memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_LINK_CTL; rq.ocf = OCF_REMOTE_NAME_REQ_CANCEL; rq.cparam = &cp; rq.clen = REMOTE_NAME_REQ_CANCEL_CP_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; return 0;}int hci_read_remote_version(int dd, uint16_t handle, struct hci_version *ver, int to){ evt_read_remote_version_complete rp; read_remote_version_cp cp; struct hci_request rq; memset(&cp, 0, sizeof(cp)); cp.handle = handle; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_LINK_CTL; rq.ocf = OCF_READ_REMOTE_VERSION; rq.event = EVT_READ_REMOTE_VERSION_COMPLETE; rq.cparam = &cp; rq.clen = READ_REMOTE_VERSION_CP_SIZE; rq.rparam = &rp; rq.rlen = EVT_READ_REMOTE_VERSION_COMPLETE_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } ver->manufacturer = btohs(rp.manufacturer); ver->lmp_ver = rp.lmp_ver; ver->lmp_subver = btohs(rp.lmp_subver); return 0;}int hci_read_remote_features(int dd, uint16_t handle, uint8_t *features, int to){ evt_read_remote_features_complete rp; read_remote_features_cp cp; struct hci_request rq; memset(&cp, 0, sizeof(cp)); cp.handle = handle; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_LINK_CTL; rq.ocf = OCF_READ_REMOTE_FEATURES; rq.event = EVT_READ_REMOTE_FEATURES_COMPLETE; rq.cparam = &cp; rq.clen = READ_REMOTE_FEATURES_CP_SIZE; rq.rparam = &rp; rq.rlen = EVT_READ_REMOTE_FEATURES_COMPLETE_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } memcpy(features, rp.features, 8); return 0;}int hci_read_remote_ext_features(int dd, uint16_t handle, uint8_t page, uint8_t *max_page, uint8_t *features, int to){ evt_read_remote_ext_features_complete rp; read_remote_ext_features_cp cp; struct hci_request rq; memset(&cp, 0, sizeof(cp)); cp.handle = handle; cp.page_num = page; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_LINK_CTL; rq.ocf = OCF_READ_REMOTE_EXT_FEATURES; rq.event = EVT_READ_REMOTE_EXT_FEATURES_COMPLETE; rq.cparam = &cp; rq.clen = READ_REMOTE_EXT_FEATURES_CP_SIZE; rq.rparam = &rp; rq.rlen = EVT_READ_REMOTE_EXT_FEATURES_COMPLETE_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } *max_page = rp.max_page_num; memcpy(features, rp.features, 8); return 0;}int hci_read_clock_offset(int dd, uint16_t handle, uint16_t *clkoffset, int to){ evt_read_clock_offset_complete rp; read_clock_offset_cp cp; struct hci_request rq; memset(&cp, 0, sizeof(cp)); cp.handle = handle; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_LINK_CTL; rq.ocf = OCF_READ_CLOCK_OFFSET; rq.event = EVT_READ_CLOCK_OFFSET_COMPLETE; rq.cparam = &cp; rq.clen = READ_CLOCK_OFFSET_CP_SIZE; rq.rparam = &rp; rq.rlen = EVT_READ_CLOCK_OFFSET_COMPLETE_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } *clkoffset = rp.clock_offset; return 0;}int hci_read_local_version(int dd, struct hci_version *ver, int to){ read_local_version_rp rp; struct hci_request rq; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_INFO_PARAM; rq.ocf = OCF_READ_LOCAL_VERSION; rq.rparam = &rp; rq.rlen = READ_LOCAL_VERSION_RP_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } ver->manufacturer = btohs(rp.manufacturer); ver->hci_ver = rp.hci_ver; ver->hci_rev = btohs(rp.hci_rev); ver->lmp_ver = rp.lmp_ver; ver->lmp_subver = btohs(rp.lmp_subver); return 0;}int hci_read_local_commands(int dd, uint8_t *commands, int to){ read_local_commands_rp rp; struct hci_request rq; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_INFO_PARAM; rq.ocf = OCF_READ_LOCAL_COMMANDS; rq.rparam = &rp; rq.rlen = READ_LOCAL_COMMANDS_RP_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } memcpy(commands, rp.commands, 64); return 0;}int hci_read_local_features(int dd, uint8_t *features, int to){ read_local_features_rp rp; struct hci_request rq; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_INFO_PARAM; rq.ocf = OCF_READ_LOCAL_FEATURES; rq.rparam = &rp; rq.rlen = READ_LOCAL_FEATURES_RP_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } memcpy(features, rp.features, 8); return 0;}int hci_read_local_ext_features(int dd, uint8_t page, uint8_t *max_page, uint8_t *features, int to){ read_local_ext_features_cp cp; read_local_ext_features_rp rp; struct hci_request rq; cp.page_num = page; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_INFO_PARAM; rq.ocf = OCF_READ_LOCAL_EXT_FEATURES; rq.cparam = &cp; rq.clen = READ_LOCAL_EXT_FEATURES_CP_SIZE; rq.rparam = &rp; rq.rlen = READ_LOCAL_EXT_FEATURES_RP_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } *max_page = rp.max_page_num; memcpy(features, rp.features, 8); return 0;}int hci_read_bd_addr(int dd, bdaddr_t *bdaddr, int to){ read_bd_addr_rp rp; struct hci_request rq; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_INFO_PARAM; rq.ocf = OCF_READ_BD_ADDR; rq.rparam = &rp; rq.rlen = READ_BD_ADDR_RP_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } bacpy(bdaddr, &rp.bdaddr); return 0;}int hci_read_class_of_dev(int dd, uint8_t *cls, int to){ read_class_of_dev_rp rp; struct hci_request rq; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_HOST_CTL; rq.ocf = OCF_READ_CLASS_OF_DEV; rq.rparam = &rp; rq.rlen = READ_CLASS_OF_DEV_RP_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } memcpy(cls, rp.dev_class, 3); return 0;}int hci_write_class_of_dev(int dd, uint32_t cls, int to){ write_class_of_dev_cp cp; struct hci_request rq; memset(&rq, 0, sizeof(rq)); cp.dev_class[0] = cls & 0xff; cp.dev_class[1] = (cls >> 8) & 0xff; cp.dev_class[2] = (cls >> 16) & 0xff; rq.ogf = OGF_HOST_CTL; rq.ocf = OCF_WRITE_CLASS_OF_DEV; rq.cparam = &cp; rq.clen = WRITE_CLASS_OF_DEV_CP_SIZE; return hci_send_req(dd, &rq, to);}int hci_read_voice_setting(int dd, uint16_t *vs, int to){ read_voice_setting_rp rp; struct hci_request rq; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_HOST_CTL; rq.ocf = OCF_READ_VOICE_SETTING; rq.rparam = &rp; rq.rlen = READ_VOICE_SETTING_RP_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } *vs = rp.voice_setting; return 0;}int hci_write_voice_setting(int dd, uint16_t vs, int to){ write_voice_setting_cp cp; struct hci_request rq; memset(&rq, 0, sizeof(rq)); cp.voice_setting = vs; rq.ogf = OGF_HOST_CTL; rq.ocf = OCF_WRITE_VOICE_SETTING; rq.cparam = &cp; rq.clen = WRITE_VOICE_SETTING_CP_SIZE; return hci_send_req(dd, &rq, to);}int hci_read_current_iac_lap(int dd, uint8_t *num_iac, uint8_t *lap, int to){ read_current_iac_lap_rp rp; struct hci_request rq; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_HOST_CTL; rq.ocf = OCF_READ_CURRENT_IAC_LAP; rq.rparam = &rp; rq.rlen = READ_CURRENT_IAC_LAP_RP_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } *num_iac = rp.num_current_iac; memcpy(lap, rp.lap, rp.num_current_iac * 3); return 0;}int hci_write_current_iac_lap(int dd, uint8_t num_iac, uint8_t *lap, int to){ write_current_iac_lap_cp cp; struct hci_request rq; memset(&cp, 0, sizeof(cp)); cp.num_current_iac = num_iac; memcpy(&cp.lap, lap, num_iac * 3); memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_HOST_CTL; rq.ocf = OCF_WRITE_CURRENT_IAC_LAP; rq.cparam = &cp; rq.clen = num_iac * 3 + 1; return hci_send_req(dd, &rq, to);}int hci_read_stored_link_key(int dd, bdaddr_t *bdaddr, uint8_t all, int to){ read_stored_link_key_cp cp; struct hci_request rq; memset(&cp, 0, sizeof(cp)); bacpy(&cp.bdaddr, bdaddr); cp.read_all = all; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_HOST_CTL; rq.ocf = OCF_READ_STORED_LINK_KEY; rq.cparam = &cp; rq.clen = READ_STORED_LINK_KEY_CP_SIZE; return hci_send_req(dd, &rq, to);}int hci_write_stored_link_key(int dd, bdaddr_t *bdaddr, uint8_t *key, int to){ unsigned char cp[WRITE_STORED_LINK_KEY_CP_SIZE + 6 + 16]; struct hci_request rq; memset(&cp, 0, sizeof(cp)); cp[0] = 1; bacpy((bdaddr_t *) (cp + 1), bdaddr); memcpy(cp + 7, key, 16); memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_HOST_CTL; rq.ocf = OCF_WRITE_STORED_LINK_KEY; rq.cparam = &cp; rq.clen = WRITE_STORED_LINK_KEY_CP_SIZE + 6 + 16; return hci_send_req(dd, &rq, to);}int hci_delete_stored_link_key(int dd, bdaddr_t *bdaddr, uint8_t all, int to){ delete_stored_link_key_cp cp; struct hci_request rq; memset(&cp, 0, sizeof(cp)); bacpy(&cp.bdaddr, bdaddr); cp.delete_all = all; memset(&rq, 0, sizeof(rq)); rq.ogf = OGF_HOST_CTL; rq.ocf = OCF_DELETE_STORED_LINK_KEY; rq.cparam = &cp; rq.clen = DELETE_STORED_LINK_KEY_CP_SIZE; return hci_send_req(dd, &rq, to);}int hci_authenticate_link(int dd, uint16_t handle, int to){ auth_requested_cp cp; evt_auth_complete rp; struct hci_request rq; cp.handle = handle; rq.ogf = OGF_LINK_CTL; rq.ocf = OCF_AUTH_REQUESTED; rq.event = EVT_AUTH_COMPLETE; rq.cparam = &cp; rq.clen = AUTH_REQUESTED_CP_SIZE; rq.rparam = &rp; rq.rlen = EVT_AUTH_COMPLETE_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } return 0;}int hci_encrypt_link(int dd, uint16_t handle, uint8_t encrypt, int to){ set_conn_encrypt_cp cp; evt_encrypt_change rp; struct hci_request rq; cp.handle = handle; cp.encrypt = encrypt; rq.ogf = OGF_LINK_CTL; rq.ocf = OCF_SET_CONN_ENCRYPT; rq.event = EVT_ENCRYPT_CHANGE; rq.cparam = &cp; rq.clen = SET_CONN_ENCRYPT_CP_SIZE; rq.rparam = &rp; rq.rlen = EVT_ENCRYPT_CHANGE_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } return 0;}int hci_change_link_key(int dd, uint16_t handle, int to){ change_conn_link_key_cp cp; evt_change_conn_link_key_complete rp; struct hci_request rq; cp.handle = handle; rq.ogf = OGF_LINK_CTL; rq.ocf = OCF_CHANGE_CONN_LINK_KEY; rq.event = EVT_CHANGE_CONN_LINK_KEY_COMPLETE; rq.cparam = &cp; rq.clen = CHANGE_CONN_LINK_KEY_CP_SIZE; rq.rparam = &rp; rq.rlen = EVT_CHANGE_CONN_LINK_KEY_COMPLETE_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } return 0;}int hci_switch_role(int dd, bdaddr_t *bdaddr, uint8_t role, int to){ switch_role_cp cp; evt_role_change rp; struct hci_request rq; bacpy(&cp.bdaddr, bdaddr); cp.role = role; rq.ogf = OGF_LINK_POLICY; rq.ocf = OCF_SWITCH_ROLE; rq.cparam = &cp; rq.clen = SWITCH_ROLE_CP_SIZE; rq.rparam = &rp; rq.rlen = EVT_ROLE_CHANGE_SIZE; rq.event = EVT_ROLE_CHANGE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } return 0;}int hci_park_mode(int dd, uint16_t handle, uint16_t max_interval, uint16_t min_interval, int to){ park_mode_cp cp; evt_mode_change rp; struct hci_request rq; memset(&cp, 0, sizeof (cp)); cp.handle = handle; cp.max_interval = max_interval; cp.min_interval = min_interval; memset(&rq, 0, sizeof (rq)); rq.ogf = OGF_LINK_POLICY; rq.ocf = OCF_PARK_MODE; rq.event = EVT_MODE_CHANGE; rq.cparam = &cp; rq.clen = PARK_MODE_CP_SIZE; rq.rparam = &rp; rq.rlen = EVT_MODE_CHANGE_SIZE; if (hci_send_req(dd, &rq, to) < 0) return -1; if (rp.status) { errno = EIO; return -1; } return 0;}int hci_exit_park_mode(int dd, uint16_t handle, int to){ exit_park_mode_cp cp; evt_mode_change rp; struct hci_request rq; memset(&cp, 0, sizeof (cp)); cp.handle = handle; memset (&rq, 0, sizeof (rq)); rq.ogf = OGF_LINK_POLICY; rq.ocf = OCF_EXIT_PARK_MODE; rq.event = EVT_MODE_CHANGE; rq.cparam = &cp; rq.clen = EXIT_PARK_MODE_CP_SIZE; rq.rparam = &rp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -