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

📄 sdptool.c

📁 这是Linux环境下的蓝牙源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	sdp_uuid16_create(&ftrn_uuid, OBEX_FILETRANS_SVCLASS_ID);	svclass_id = sdp_list_append(0, &ftrn_uuid);	sdp_set_service_classes(&record, svclass_id);	sdp_uuid16_create(&profile[0].uuid, OBEX_FILETRANS_PROFILE_ID);	profile[0].version = 0x0100;	pfseq = sdp_list_append(0, &profile[0]);	sdp_set_profile_descs(&record, pfseq);	sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);	proto[0] = sdp_list_append(0, &l2cap_uuid);	apseq = sdp_list_append(0, proto[0]);	sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);	proto[1] = sdp_list_append(0, &rfcomm_uuid);	channel = sdp_data_alloc(SDP_UINT8, &u8);	proto[1] = sdp_list_append(proto[1], channel);	apseq = sdp_list_append(apseq, proto[1]);	sdp_uuid16_create(&obex_uuid, OBEX_UUID);	proto[2] = sdp_list_append(0, &obex_uuid);	apseq = sdp_list_append(apseq, proto[2]);	aproto = sdp_list_append(0, apseq);	sdp_set_access_protos(&record, aproto);	sdp_set_info_attr(&record, "OBEX File Transfer", 0, 0);	if (sdp_device_record_register(session, &interface, &record, SDP_RECORD_PERSIST) < 0) {		printf("Service Record registration failed\n");		ret = -1;		goto end;	}	printf("OBEX File Transfer service registered\n");end:	sdp_data_free(channel);	sdp_list_free(proto[0], 0);	sdp_list_free(proto[1], 0);	sdp_list_free(proto[2], 0);	sdp_list_free(apseq, 0);	sdp_list_free(aproto, 0);	return ret;}static int add_directprint(sdp_session_t *session, svc_info_t *si){	sdp_list_t *svclass_id, *pfseq, *apseq, *root;	uuid_t root_uuid, opush_uuid, l2cap_uuid, rfcomm_uuid, obex_uuid;	sdp_profile_desc_t profile[1];	sdp_list_t *aproto, *proto[3];	sdp_record_t record;	uint8_t chan = si->channel ? si->channel : 12;	sdp_data_t *channel;	int ret = 0;	memset(&record, 0, sizeof(sdp_record_t));	record.handle = si->handle;	sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);	root = sdp_list_append(0, &root_uuid);	sdp_set_browse_groups(&record, root);	sdp_uuid16_create(&opush_uuid, DIRECT_PRINTING_SVCLASS_ID);	svclass_id = sdp_list_append(0, &opush_uuid);	sdp_set_service_classes(&record, svclass_id);	sdp_uuid16_create(&profile[0].uuid, BASIC_PRINTING_PROFILE_ID);	profile[0].version = 0x0100;	pfseq = sdp_list_append(0, profile);	sdp_set_profile_descs(&record, pfseq);	sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);	proto[0] = sdp_list_append(0, &l2cap_uuid);	apseq = sdp_list_append(0, proto[0]);	sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);	proto[1] = sdp_list_append(0, &rfcomm_uuid);	channel = sdp_data_alloc(SDP_UINT8, &chan);	proto[1] = sdp_list_append(proto[1], channel);	apseq = sdp_list_append(apseq, proto[1]);	sdp_uuid16_create(&obex_uuid, OBEX_UUID);	proto[2] = sdp_list_append(0, &obex_uuid);	apseq = sdp_list_append(apseq, proto[2]);	aproto = sdp_list_append(0, apseq);	sdp_set_access_protos(&record, aproto);	sdp_set_info_attr(&record, "Direct Printing", 0, 0);	if (sdp_device_record_register(session, &interface, &record, SDP_RECORD_PERSIST) < 0) {		printf("Service Record registration failed\n");		ret = -1;		goto end;	}	printf("Direct Printing service registered\n");end:	sdp_data_free(channel);	sdp_list_free(proto[0], 0);	sdp_list_free(proto[1], 0);	sdp_list_free(proto[2], 0);	sdp_list_free(apseq, 0);	sdp_list_free(aproto, 0);	return ret;}static int add_nap(sdp_session_t *session, svc_info_t *si){	sdp_list_t *svclass_id, *pfseq, *apseq, *root;	uuid_t root_uuid, ftrn_uuid, l2cap_uuid, bnep_uuid;	sdp_profile_desc_t profile[1];	sdp_list_t *aproto, *proto[2];	sdp_record_t record;	uint16_t lp = 0x000f, ver = 0x0100;	sdp_data_t *psm, *version;	int ret = 0;	memset(&record, 0, sizeof(sdp_record_t));	record.handle = si->handle;	sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);	root = sdp_list_append(0, &root_uuid);	sdp_set_browse_groups(&record, root);	sdp_uuid16_create(&ftrn_uuid, NAP_SVCLASS_ID);	svclass_id = sdp_list_append(0, &ftrn_uuid);	sdp_set_service_classes(&record, svclass_id);	sdp_uuid16_create(&profile[0].uuid, NAP_PROFILE_ID);	profile[0].version = 0x0100;	pfseq = sdp_list_append(0, &profile[0]);	sdp_set_profile_descs(&record, pfseq);	sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);	proto[0] = sdp_list_append(0, &l2cap_uuid);	psm = sdp_data_alloc(SDP_UINT16, &lp);	proto[0] = sdp_list_append(proto[0], psm);	apseq = sdp_list_append(0, proto[0]);	sdp_uuid16_create(&bnep_uuid, BNEP_UUID);	proto[1] = sdp_list_append(0, &bnep_uuid);	version  = sdp_data_alloc(SDP_UINT16, &ver);	proto[1] = sdp_list_append(proto[1], version);	{		uint16_t ptype[4] = { 0x0010, 0x0020, 0x0030, 0x0040 };		sdp_data_t *head, *pseq;		int p;		for (p = 0, head = NULL; p < 4; p++) {			sdp_data_t *data = sdp_data_alloc(SDP_UINT16, &ptype[p]);			head = sdp_seq_append(head, data);		}		pseq = sdp_data_alloc(SDP_SEQ16, head);		proto[1] = sdp_list_append(proto[1], pseq);	}	apseq = sdp_list_append(apseq, proto[1]);	aproto = sdp_list_append(0, apseq);	sdp_set_access_protos(&record, aproto);	sdp_set_info_attr(&record, "Network Access Point Service", 0, 0);	if (sdp_device_record_register(session, &interface, &record, SDP_RECORD_PERSIST) < 0) {		printf("Service Record registration failed\n");		ret = -1;		goto end;	}	printf("NAP service registered\n");end:	sdp_data_free(version);	sdp_data_free(psm);	sdp_list_free(proto[0], 0);	sdp_list_free(proto[1], 0);	sdp_list_free(apseq, 0);	sdp_list_free(aproto, 0);	return ret;}static int add_gn(sdp_session_t *session, svc_info_t *si){	sdp_list_t *svclass_id, *pfseq, *apseq, *root;	uuid_t root_uuid, ftrn_uuid, l2cap_uuid, bnep_uuid;	sdp_profile_desc_t profile[1];	sdp_list_t *aproto, *proto[2];	sdp_record_t record;	uint16_t lp = 0x000f, ver = 0x0100;	sdp_data_t *psm, *version;	int ret = 0;	memset(&record, 0, sizeof(sdp_record_t));	record.handle = si->handle;	sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);	root = sdp_list_append(0, &root_uuid);	sdp_set_browse_groups(&record, root);	sdp_uuid16_create(&ftrn_uuid, GN_SVCLASS_ID);	svclass_id = sdp_list_append(0, &ftrn_uuid);	sdp_set_service_classes(&record, svclass_id);	sdp_uuid16_create(&profile[0].uuid, GN_PROFILE_ID);	profile[0].version = 0x0100;	pfseq = sdp_list_append(0, &profile[0]);	sdp_set_profile_descs(&record, pfseq);	sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);	proto[0] = sdp_list_append(0, &l2cap_uuid);	psm = sdp_data_alloc(SDP_UINT16, &lp);	proto[0] = sdp_list_append(proto[0], psm);	apseq = sdp_list_append(0, proto[0]);	sdp_uuid16_create(&bnep_uuid, BNEP_UUID);	proto[1] = sdp_list_append(0, &bnep_uuid);	version = sdp_data_alloc(SDP_UINT16, &ver);	proto[1] = sdp_list_append(proto[1], version);	apseq = sdp_list_append(apseq, proto[1]);	aproto = sdp_list_append(0, apseq);	sdp_set_access_protos(&record, aproto);	sdp_set_info_attr(&record, "Group Network Service", 0, 0);	if (sdp_device_record_register(session, &interface, &record, SDP_RECORD_PERSIST) < 0) {		printf("Service Record registration failed\n");		ret = -1;		goto end;	}	printf("GN service registered\n");end:	sdp_data_free(version);	sdp_data_free(psm);	sdp_list_free(proto[0], 0);	sdp_list_free(proto[1], 0);	sdp_list_free(apseq, 0);	sdp_list_free(aproto, 0);	return ret;}static int add_panu(sdp_session_t *session, svc_info_t *si){	sdp_list_t *svclass_id, *pfseq, *apseq, *root;	uuid_t root_uuid, ftrn_uuid, l2cap_uuid, bnep_uuid;	sdp_profile_desc_t profile[1];	sdp_list_t *aproto, *proto[2];	sdp_record_t record;	uint16_t lp = 0x000f, ver = 0x0100;	sdp_data_t *psm, *version;	int ret = 0;	memset(&record, 0, sizeof(sdp_record_t));	record.handle = si->handle;	sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);	root = sdp_list_append(NULL, &root_uuid);	sdp_set_browse_groups(&record, root);	sdp_list_free(root, NULL);	sdp_uuid16_create(&ftrn_uuid, PANU_SVCLASS_ID);	svclass_id = sdp_list_append(NULL, &ftrn_uuid);	sdp_set_service_classes(&record, svclass_id);	sdp_list_free(svclass_id, NULL);	sdp_uuid16_create(&profile[0].uuid, PANU_PROFILE_ID);	profile[0].version = 0x0100;	pfseq = sdp_list_append(NULL, &profile[0]);	sdp_set_profile_descs(&record, pfseq);	sdp_list_free(pfseq, NULL);	sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);	proto[0] = sdp_list_append(NULL, &l2cap_uuid);	psm = sdp_data_alloc(SDP_UINT16, &lp);	proto[0] = sdp_list_append(proto[0], psm);	apseq = sdp_list_append(NULL, proto[0]);	sdp_uuid16_create(&bnep_uuid, BNEP_UUID);	proto[1] = sdp_list_append(NULL, &bnep_uuid);	version = sdp_data_alloc(SDP_UINT16, &ver);	proto[1] = sdp_list_append(proto[1], version);	apseq = sdp_list_append(apseq, proto[1]);	aproto = sdp_list_append(NULL, apseq);	sdp_set_access_protos(&record, aproto);	sdp_set_info_attr(&record, "PAN User", NULL, NULL);	if (sdp_device_record_register(session, &interface, &record, SDP_RECORD_PERSIST) < 0) {		printf("Service Record registration failed\n");		ret = -1;		goto end;	}	printf("PANU service registered\n");end:	sdp_data_free(version);	sdp_data_free(psm);	sdp_list_free(proto[0], 0);	sdp_list_free(proto[1], 0);	sdp_list_free(apseq, 0);	sdp_list_free(aproto, 0);	return ret;}static int add_hid_keyb(sdp_session_t *session, svc_info_t *si){	sdp_record_t record;	sdp_list_t *svclass_id, *pfseq, *apseq, *root;	uuid_t root_uuid, hidkb_uuid, l2cap_uuid, hidp_uuid;	sdp_profile_desc_t profile[1];	sdp_list_t *aproto, *proto[3];	sdp_data_t *psm, *lang_lst, *lang_lst2, *hid_spec_lst, *hid_spec_lst2;	int i;	uint8_t dtd = SDP_UINT16;	uint8_t dtd2 = SDP_UINT8;	uint8_t dtd_data = SDP_TEXT_STR8;	void *dtds[2];	void *values[2];	void *dtds2[2];	void *values2[2];	int leng[2];	uint8_t hid_spec_type = 0x22;	uint16_t hid_attr_lang[] = { 0x409, 0x100 };	static const uint16_t ctrl = 0x11;	static const uint16_t intr = 0x13;	static const uint16_t hid_attr[] = { 0x100, 0x111, 0x40, 0x0d, 0x01, 0x01 };	static const uint16_t hid_attr2[] = { 0x0, 0x01, 0x100, 0x1f40, 0x01, 0x01 };	const uint8_t hid_spec[] = { 		0x05, 0x01, // usage page		0x09, 0x06, // keyboard		0xa1, 0x01, // key codes		0x85, 0x01, // minimum		0x05, 0x07, // max		0x19, 0xe0, // logical min		0x29, 0xe7, // logical max		0x15, 0x00, // report size		0x25, 0x01, // report count		0x75, 0x01, // input data variable absolute		0x95, 0x08, // report count		0x81, 0x02, // report size		0x75, 0x08, 		0x95, 0x01, 		0x81, 0x01, 		0x75, 0x01, 		0x95, 0x05,		0x05, 0x08,		0x19, 0x01,		0x29, 0x05, 		0x91, 0x02,		0x75, 0x03,		0x95, 0x01,		0x91, 0x01,		0x75, 0x08,		0x95, 0x06,		0x15, 0x00,		0x26, 0xff,		0x00, 0x05,		0x07, 0x19,		0x00, 0x2a,		0xff, 0x00,		0x81, 0x00,		0x75, 0x01,		0x95, 0x01,		0x15, 0x00,		0x25, 0x01,		0x05, 0x0c,		0x09, 0xb8,		0x81, 0x06,		0x09, 0xe2,		0x81, 0x06,		0x09, 0xe9,		0x81, 0x02,		0x09, 0xea,		0x81, 0x02,		0x75, 0x01,		0x95, 0x04,		0x81, 0x01,		0xc0         // end tag	};	memset(&record, 0, sizeof(sdp_record_t));	record.handle = si->handle;	sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);	root = sdp_list_append(0, &root_uuid);	sdp_set_browse_groups(&record, root);	add_lang_attr(&record);	sdp_uuid16_create(&hidkb_uuid, HID_SVCLASS_ID);	svclass_id = sdp_list_append(0, &hidkb_uuid);	sdp_set_service_classes(&record, svclass_id);	sdp_uuid16_create(&profile[0].uuid, HID_PROFILE_ID);	profile[0].version = 0x0100;	pfseq = sdp_list_append(0, profile);	sdp_set_profile_descs(&record, pfseq);	/* protocols */	sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);	proto[1] = sdp_list_append(0, &l2cap_uuid);	psm = sdp_data_alloc(SDP_UINT16, &ctrl);	proto[1] = sdp_list_append(proto[1], psm);	apseq = sdp_list_append(0, proto[1]);	sdp_uuid16_create(&hidp_uuid, HIDP_UUID);	proto[2] = sdp_list_append(0, &hidp_uuid);	apseq = sdp_list_append(apseq, proto[2]);	aproto = sdp_list_append(0, apseq);	sdp_set_access_protos(&record, aproto);	/* additional protocols */	proto[1] = sdp_list_append(0, &l2cap_uuid);	psm = sdp_data_alloc(SDP_UINT16, &intr);	proto[1] = sdp_list_append(proto[1], psm);	apseq = sdp_list_append(0, proto[1]);	sdp_uuid16_create(&hidp_uuid, HIDP_UUID);	proto[2] = sdp_list_append(0, &hidp_uuid);	apseq = sdp_list_append(apseq, proto[2]);	aproto = sdp_list_append(0, apseq);	sdp_set_add_access_protos(&record, aproto);	sdp_set_info_attr(&record, "HID Keyboard", NULL, NULL);	for (i = 0; i < sizeof(hid_attr) / 2; i++)		sdp_attr_add_new(&record,					SDP_ATTR_HID_DEVICE_RELEASE_NUMBER + i,					SDP_UINT16, &hid_attr[i]);	dtds[0] = &dtd2;	values[0] = &hid_spec_type;	dtds[1] = &dtd_data;	values[1] = (uint8_t *) hid_spec;	leng[0] = 0;	leng[1] = sizeof(hid_spec);	hid_spec_lst = sdp_seq_alloc_with_length(dtds, values, leng, 2);	hid_spec_lst2 = sdp_data_alloc(SDP_SEQ8, hid_spec_lst);	sdp_attr_add(&record, SDP_ATTR_HID_DESCRIPTOR_LIST, hid_spec_lst2);	for (i = 0; i < sizeof(hid_attr_lang) / 2; i++) {		dtds2[i] = &dtd;		values2[i] = &hid_attr_lang[i];	

⌨️ 快捷键说明

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