⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hci.c

📁 bluez-libs-2.17.tar.gz网上很少找到这个版本的了
💻 C
📖 第 1 页 / 共 3 页
字号:
	return err;}/* Open HCI device.  * Returns device descriptor (dd). */int hci_open_dev(int dev_id){	struct sockaddr_hci a;	int dd, err;	/* Create HCI socket */	dd = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);	if (dd < 0)		return dd;	/* Bind socket to the HCI device */	a.hci_family = AF_BLUETOOTH;	a.hci_dev = dev_id;	if (bind(dd, (struct sockaddr *) &a, sizeof(a)) < 0)		goto failed;	return dd;failed:	err = errno;	close(dd);	errno = err;	return -1;}int hci_close_dev(int dd){	return close(dd);}/* HCI functions that require open device * dd - Device descriptor returned by hci_open_dev. */int hci_send_cmd(int dd, uint16_t ogf, uint16_t ocf, uint8_t plen, void *param){	uint8_t type = HCI_COMMAND_PKT;	hci_command_hdr hc;	struct iovec iv[3];	int ivn;	hc.opcode = htobs(cmd_opcode_pack(ogf, ocf));	hc.plen= plen;	iv[0].iov_base = &type;	iv[0].iov_len  = 1;	iv[1].iov_base = &hc;	iv[1].iov_len  = HCI_COMMAND_HDR_SIZE;	ivn = 2;	if (plen) {		iv[2].iov_base = param;		iv[2].iov_len  = plen;		ivn = 3;	}	while (writev(dd, iv, ivn) < 0) {		if (errno == EAGAIN || errno == EINTR)			continue;		return -1;	}	return 0;}int hci_send_req(int dd, struct hci_request *r, int to){	unsigned char buf[HCI_MAX_EVENT_SIZE], *ptr;	uint16_t opcode = htobs(cmd_opcode_pack(r->ogf, r->ocf));	struct hci_filter nf, of;	hci_event_hdr *hdr;	int err, len, try;	len = sizeof(of);	if (getsockopt(dd, SOL_HCI, HCI_FILTER, &of, &len) < 0)		return -1;	hci_filter_clear(&nf);	hci_filter_set_ptype(HCI_EVENT_PKT,  &nf);	hci_filter_set_event(EVT_CMD_STATUS, &nf);	hci_filter_set_event(EVT_CMD_COMPLETE, &nf);	hci_filter_set_event(r->event, &nf);	hci_filter_set_opcode(opcode, &nf);	if (setsockopt(dd, SOL_HCI, HCI_FILTER, &nf, sizeof(nf)) < 0)		return -1;	if (hci_send_cmd(dd, r->ogf, r->ocf, r->clen, r->cparam) < 0)		goto failed;	try = 10;	while (try--) {		evt_cmd_complete *cc;		evt_cmd_status   *cs;		if (to) {			struct pollfd p;			int n;			p.fd = dd; p.events = POLLIN;			while ((n = poll(&p, 1, to)) < 0) {				if (errno == EAGAIN || errno == EINTR)					continue;				goto failed;			}			if (!n) {				errno = ETIMEDOUT;				goto failed;			}			to -= 10;			if (to < 0) to = 0;		}		while ((len = read(dd, buf, sizeof(buf))) < 0) {			if (errno == EAGAIN || errno == EINTR)				continue;			goto failed;		}		hdr = (void *) (buf + 1);		ptr = buf + (1 + HCI_EVENT_HDR_SIZE);		len -= (1 + HCI_EVENT_HDR_SIZE);		switch (hdr->evt) {		case EVT_CMD_STATUS:			cs = (void *) ptr;			if (cs->opcode != opcode)				continue;			if (cs->status) {				errno = EIO;				goto failed;			}			break;		case EVT_CMD_COMPLETE:			cc = (void *) ptr;			if (cc->opcode != opcode)				continue;			ptr += EVT_CMD_COMPLETE_SIZE;			len -= EVT_CMD_COMPLETE_SIZE;			r->rlen = MIN(len, r->rlen);			memcpy(r->rparam, ptr, r->rlen);			goto done;		default:			if (hdr->evt != r->event)				break;			r->rlen = MIN(len, r->rlen);			memcpy(r->rparam, ptr, r->rlen);			goto done;		}	}	errno = ETIMEDOUT;failed:	err = errno;	setsockopt(dd, SOL_HCI, HCI_FILTER, &of, sizeof(of));	errno = err;	return -1;done:	setsockopt(dd, SOL_HCI, HCI_FILTER, &of, sizeof(of));	return 0;}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;}int hci_disconnect(int dd, uint16_t handle, uint8_t reason, int to){	evt_disconn_complete rp;	disconnect_cp cp;	struct hci_request rq;	memset(&cp, 0, sizeof(cp));	cp.handle = handle;	cp.reason = reason;	memset(&rq, 0, sizeof(rq));	rq.ogf    = OGF_LINK_CTL;	rq.ocf    = OCF_DISCONNECT;	rq.event  = EVT_DISCONN_COMPLETE;	rq.cparam = &cp;	rq.clen   = DISCONNECT_CP_SIZE;	rq.rparam = &rp;	rq.rlen   = EVT_DISCONN_COMPLETE_SIZE;	if (hci_send_req(dd, &rq, to) < 0)		return -1;	if (rp.status) {		errno = EIO;		return -1;	}	return 0;}int hci_read_local_name(int dd, int len, char *name, int to){	read_local_name_rp rp;	struct hci_request rq;	memset(&rq, 0, sizeof(rq));	rq.ogf    = OGF_HOST_CTL;	rq.ocf    = OCF_READ_LOCAL_NAME;	rq.rparam = &rp;	rq.rlen   = READ_LOCAL_NAME_RP_SIZE;	if (hci_send_req(dd, &rq, to) < 0)		return -1;	if (rp.status) {		errno = EIO;		return -1;	}	rp.name[247] = '\0';	strncpy(name, rp.name, len);	return 0;}int hci_write_local_name(int dd, const char *name, int to){	change_local_name_cp cp;	struct hci_request rq;	memset(&cp, 0, sizeof(cp));	strncpy(cp.name, name, sizeof(cp.name));	memset(&rq, 0, sizeof(rq));	rq.ogf    = OGF_HOST_CTL;	rq.ocf    = OCF_CHANGE_LOCAL_NAME;	rq.cparam = &cp;	rq.clen   = CHANGE_LOCAL_NAME_CP_SIZE;	if (hci_send_req(dd, &rq, to) < 0)		return -1;	return 0;}int hci_read_remote_name_with_clock_offset(int dd, const bdaddr_t *bdaddr, uint8_t pscan_rep_mode, uint16_t clkoffset, int len, char *name, int to){	evt_remote_name_req_complete rn;	remote_name_req_cp cp;	struct hci_request rq;	memset(&cp, 0, sizeof(cp));	bacpy(&cp.bdaddr, bdaddr);	cp.pscan_rep_mode = pscan_rep_mode;	cp.clock_offset   = clkoffset;	memset(&rq, 0, sizeof(rq));	rq.ogf    = OGF_LINK_CTL;	rq.ocf    = OCF_REMOTE_NAME_REQ;	rq.cparam = &cp;	rq.clen   = REMOTE_NAME_REQ_CP_SIZE;	rq.event  = EVT_REMOTE_NAME_REQ_COMPLETE;	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, 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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -