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

📄 blue.cpp

📁 blue-usu: (Search, Connect, Playback, Record) with bluetooth devices like headset. Rely on usu dr
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		if ((ritorno = hciBus.hci_waitRes(1000))<0) return mainErr(PROTO_ERR);		if (lkn.done()) {			/* Recupero linkKey.*/			char tmp[6];			lkn.scanRes(tmp,6);			lkn.scanRes(linkkey,16);			lkn.scanRes(tmp,1); /* Key type.*/			if ((ritorno = hciBus.hci_waitRes(1000))<0) return mainErr(PROTO_ERR);		}	}	if (connectComplete.done()) {		char tmp[2];		connectComplete.scanRes(tmp,1); /* status, must be 0. Is returned by hci_waitRes().*/		connectComplete.scanRes(tmp,2); /* Connection handle.*/		hciHandle=tmp[0]+(tmp[1]<<8);		Dprintf("=== HciHandle = 0x%x ===\n",hciHandle);		int fd=open("data.txt",O_WRONLY|O_CREAT,0666);		if (fd==-1 || write(fd,tmp,2)!=2) Dprintf("Non riesco a salvare lo stato!\n");		HciCmd linkPol(WRITE_LINK_POLICY);		linkPol.compileReq(tmp,2);		linkPol.compileReq("\x0f\x00",2);		if (hciBus.schedule(linkPol)<0) {if (fd!=-1) close(fd); return mainErr(SCHEDULE_ERR);}		while (hciBus.hci_waitRes(1000)<0 && !linkPol.done()) {}		if (fd!=-1) close(fd);		ritorno=0;	}	return ritorno;}		int HciConn::connectL2cap() {	static int configuredL2cap=0;	int ritorno=0;	char hciH[2];	int fd=open("data.txt",O_RDWR,0666);	if (fd==-1 || read(fd,hciH,2)!=2)		hciH[0]=hciH[1]=0;	char tmp[12];/*	if (read(fd,tmp,4)!=4) {*/	while (hciBus.l2cap_waitRes(0)==-ESRCH) {}	HciL2cap::setHciHandle(hciH[0]);	memcpy(tmp,"\x01\x00\x40\x00",4);	if (configuredL2cap) {		tmp[0]+=2;		tmp[2]++;	}	HciL2cap connReq(1,CONNECT_REQ,tmp); /* psm 3.*/	if (hciBus.schedule(connReq)<0) {return mainErr(SCHEDULE_ERR);}	if (hciBus.hci_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);	if ((ritorno=hciBus.l2cap_waitRes(5000))<0) return mainErr(PROTO_ERR);	if (!connReq.done() && (ritorno=hciBus.l2cap_waitRes(1000))<0) return mainErr(PROTO_ERR);	/* So avoid to discard other hci data/event !related to l2cap level.	HciEvt numComplPacket(NUM_COMPL_PACKET)	if (hciBus.schedule(numComplPacket)<0) return mainErr(SCHEDULE_ERR);	while ((ritorno=hciBus.hci_waitRes(0))==-ESRCH) {}	if (!numComplPacket.done()) return mainErr(PROTO_ERR);*/		connReq.scanRes(tmp,12);	connReq.scanRes(tmp,4);	hciL2capHandleDst=tmp[0]+(tmp[1]<<8);	hciL2capHandleSrc=tmp[2]+(tmp[3]<<8);	Dprintf("=== HciL2capHandle(dst,src) = (0x%x,0x%x) ===\n",hciL2capHandleDst,hciL2capHandleSrc);	if (fd==-1 || write(fd,tmp,2)!=2 || write(fd,tmp+2,2)!=2) Dprintf("Non riesco a salvare lo stato!\n");	if (fd!=-1) close(fd);/* Done with sdp.*//*	}*/	#if 1	if (!configuredL2cap) {		Dprintf("\nConfigREQ:\n");		tmp[2]=tmp[3]=0;		HciL2cap confReq(1,CONFIG_REQ,tmp,4); 		if (hciBus.schedule(confReq)<0) {return mainErr(SCHEDULE_ERR);}		if (hciBus.hci_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);		if ((ritorno=hciBus.l2cap_waitRes(1000))<0) return mainErr(PROTO_ERR);		Dprintf("\nEVT MTU48.\n");		if ((ritorno=hciBus.l2cap_waitRes(1000))!=-ESRCH) return mainErr(PROTO_ERR);		*((int*)(tmp+2))=0;		HciL2cap confMtu48(1,CONFIG_RES,tmp);		if (hciBus.schedule(confMtu48)<0) {return mainErr(SCHEDULE_ERR);}		if (hciBus.hci_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);		hciBus.clear(confMtu48);		ritorno=disconnectL2cap(hciL2capHandleDst,hciL2capHandleSrc);		if (ritorno<0) return ritorno;		configuredL2cap++;		return connectL2cap();	}	/* MTU 1013.*/	Dprintf("\nMTU1013:\n");	HciL2cap confMtuReq(1,CONFIG_REQ,NULL); 	confMtuReq.compileReq(tmp,2);	confMtuReq.compileReq("\x00\x00",2);	confMtuReq.compileReq("\x01\x02\xf5\x03",4);	if (hciBus.schedule(confMtuReq)<0) {return mainErr(SCHEDULE_ERR);}	if (hciBus.hci_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);	if ((ritorno=hciBus.l2cap_waitRes(1000))<0) return mainErr(PROTO_ERR);	if ((ritorno=hciBus.l2cap_waitRes(1000))!=-ESRCH) return mainErr(PROTO_ERR);	HciL2cap confMtuRes(1,CONFIG_RES,NULL); 	confMtuRes.compileReq(tmp,2);	confMtuRes.compileReq("\x00\x00\x00\x00",4);	if (hciBus.schedule(confMtuRes)<0) {return mainErr(SCHEDULE_ERR);}	if (hciBus.hci_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);	hciBus.clear(confMtuRes);	/* RFCOMM1 SABM/UA.*/	Dprintf("\nRFCOMM1 SABM/UA\n");	HciL2cap rfComm1(1,NO_CODE,NULL);	rfComm1.compileReq("\x08\x00\x04\x00",4);	rfComm1.compileReq(tmp,2);	rfComm1.compileReq("\x03\x3f\x01\x1c",4);	if (hciBus.schedule(rfComm1)<0) {return mainErr(SCHEDULE_ERR);}	if (hciBus.hci_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);	if (hciBus.l2cap_waitRes(1000)<0) return mainErr(PROTO_ERR);	/* RFCOMM2 PN_CMD/PN_RSP.	 * This should break last bytes onto new packet.*/	int len;	Dprintf("\nRFCOMM2 PN_CMD/RSP\n");	HciL2cap rfComm2(1,NO_CODE,NULL);	rfComm2.compileReq("\x12\x00\x0e\x00",4);	rfComm2.compileReq(tmp,2);	rfComm2.compileReq("\x03\xef\x15\x83\x11\x02\xf0\x07\x00\xf0\x03\x00\x07\x70",14);	if (hciBus.schedule(rfComm2)<0) {return mainErr(SCHEDULE_ERR);}	if (hciBus.hci_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);	if ((len=hciBus.l2cap_waitRes(1000))<0) return mainErr(PROTO_ERR);	if (len==21)		if ((len=hciBus.l2cap_waitRes(1000))<0) return mainErr(PROTO_ERR);	/* RFCOMM3 SABM/UA.*/	Dprintf("\nRFCOMM3 SABM/UA\n");	HciL2cap rfComm3(1,NO_CODE,NULL);	rfComm3.compileReq("\x08\x00\x04\x00",4);	rfComm3.compileReq(tmp,2);	rfComm3.compileReq("\x0b\x3f\x01\x59",4);	if (hciBus.schedule(rfComm3)<0) {return mainErr(SCHEDULE_ERR);}	if (hciBus.hci_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);	if (hciBus.l2cap_waitRes(1000)<0) return mainErr(PROTO_ERR);	/* RFCOMM4 EVT MSC CMD/RSP.*/	Dprintf("\nRFCOMM4 EVT MSC CMD/RSP\n");	if (hciBus.l2cap_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);	HciL2cap rfComm4(1,NO_CODE,NULL);	rfComm4.compileReq("\x0c\x00\x08\x00",4);	rfComm4.compileReq(tmp,2);	rfComm4.compileReq("\x03\xef\x09\xe1\x05\x0b\x0d\x70",8);	if (hciBus.schedule(rfComm4)<0) {return mainErr(SCHEDULE_ERR);}	if (hciBus.hci_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);	hciBus.clear(rfComm4);	/* RFCOMM5 MSC CMD/RSP.*/	Dprintf("\nRFCOMM5 MSC CMD/RSP\n");	HciL2cap rfComm5(1,NO_CODE,NULL);	rfComm5.compileReq("\x0c\x00\x08\x00",4);	rfComm5.compileReq(tmp,2);	rfComm5.compileReq("\x03\xef\x09\xe3\x05\x0b\x8d\x70",8);	if (hciBus.schedule(rfComm5)<0) {return mainErr(SCHEDULE_ERR);}	if (hciBus.hci_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);	if (hciBus.l2cap_waitRes(1000)<0) return mainErr(PROTO_ERR);	/* RFCOMM6 EVT: UIH/UIH.*/	Dprintf("\nRFCOMM6 EVT UIH/UIH\n");	if (hciBus.l2cap_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);	HciL2cap rfComm6(1,NO_CODE,NULL);	rfComm6.compileReq("\x09\x00\x05\x00",4);	rfComm6.compileReq(tmp,2);	rfComm6.compileReq("\x0b\xff\x01\x21\x86",5);	if (hciBus.schedule(rfComm6)<0) {return mainErr(SCHEDULE_ERR);}	if (hciBus.hci_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);	hciBus.clear(rfComm6);	/* RFCOMM7 UIH: AT+VGS=7.*/	Dprintf("\nRFCOMM7 AT+VGS=7\n");	HciL2cap rfComm7(1,NO_CODE,NULL);	rfComm7.compileReq("\x11\x00\x0d\x00",4);	rfComm7.compileReq(tmp,2);	rfComm7.compileReq("\x0b\xef\x13",3);	rfComm7.compileReq("AT+VGS=7\x0d\x9a",10);	if (hciBus.schedule(rfComm7)<0) {return mainErr(SCHEDULE_ERR);}/*	if (hciBus.hci_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);	if (hciBus.l2cap_waitRes(1000)<0) return mainErr(PROTO_ERR);*/	hciBus.clear(rfComm7);	/* RFCOMM8 UIH: AT+VGM=1.*/	Dprintf("\nRFCOMM8 AT+VGM=1\n");	HciL2cap rfComm8(1,NO_CODE,NULL);	rfComm8.compileReq("\x11\x00\x0d\x00",4);	rfComm8.compileReq(tmp,2);	rfComm8.compileReq("\x0b\xef\x13",3);	rfComm8.compileReq("AT+VGM=1\x0d\x9a",10);	if (hciBus.schedule(rfComm8)<0) {return mainErr(SCHEDULE_ERR);}	if (hciBus.hci_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);	if (hciBus.l2cap_waitRes(1000)<0) return mainErr(PROTO_ERR);	/* RFCOMM9 UIH: OK.*/	Dprintf("\nRFCOMM9 OK\n");	HciL2cap rfComm9(1,NO_CODE,NULL);	rfComm9.compileReq("\x0e\x00\x0a\x00",4);	rfComm9.compileReq(tmp,2);	rfComm9.compileReq("\x0b\xef\x0d\x0d\x0a\x4f\x4b\x0d\x0a\x9a",10);	if (hciBus.schedule(rfComm9)<0) {return mainErr(SCHEDULE_ERR);}	if (hciBus.hci_waitRes(1000)!=-ESRCH) return mainErr(PROTO_ERR);	hciBus.clear(rfComm9);#endif	return 0;}int HciConn::connectSco() {	int ritorno=0;	char hciH[2];	char tmp[4];	int fd=open("data.txt",O_RDWR,0666);	if (fd==-1 || read(fd,hciH,2)!=2)		hciH[0]=hciH[1]=0;	/* Skip l2cap handle.*/	if (fd!=-1 && hciH[0])		if (read(fd,tmp,4)!=4) {			close(fd);fd=-1;		}						HciCmd addSco(ADD_SCO_CONNECTION);	addSco.compileReq(hciH,2);	addSco.compileReq("\xe0\x00",2);	if (hciBus.schedule(addSco)<0) {if (fd!=-1) close(fd); return mainErr(SCHEDULE_ERR);}	while (hciBus.hci_waitRes(1000)<0 && !addSco.done()) {}		char hciS[2];	HciEvt connectComplete(CONNECT_COMPLETE);	if (hciBus.schedule(connectComplete)<0) {if (fd!=-1) close(fd); return mainErr(SCHEDULE_ERR);}	while ((ritorno=hciBus.hci_waitRes(5000))==-ESRCH && !connectComplete.done()) {}	if (connectComplete.done() && ritorno>0) {		connectComplete.scanRes(hciS,1);		connectComplete.scanRes(hciS,2);		int hciScoHandle=hciS[0] + (hciS[1]<<8);		Dprintf("=== HciScoHandle = 0x%x ===\n",hciScoHandle);		if (fd==-1 || write(fd,hciS,2)!=2) Dprintf("Non riesco a salvare lo stato!\n");	}	if (fd!=-1) close(fd);	ritorno=0;	return ritorno;}int HciConn::disconnectL2cap(int dstHandle, int srcHandle) {	int ritorno=0;	char tmp[2];	while (hciBus.l2cap_waitRes(0)==-ESRCH) {}	Dprintf("\nDdisconnectL2CAP:\n");	HciL2cap discReq(1,DISCONN_REQ,NULL);	tmp[0]=dstHandle; tmp[1]=dstHandle>>8;	discReq.compileReq(tmp,2);	tmp[0]=srcHandle; tmp[1]=srcHandle>>8;	discReq.compileReq(tmp,2);	if (hciBus.schedule(discReq)<0) {return mainErr(SCHEDULE_ERR);}	if ((ritorno=hciBus.l2cap_waitRes(1000))<0) return mainErr(PROTO_ERR);#if 0#endif	return ritorno;}int HciConn::disconnectHci(int handle) {	char tmp[2];	tmp[0]=handle;	tmp[1]=handle>>8;	HciCmd disc(DISCONNECT);	disc.compileReq(tmp,2);		/* Handle.*/	disc.compileReq("\x13",1);	/* Reason: user terminated.*/	if (hciBus.schedule(disc)<0) return mainErr(SCHEDULE_ERR);	while (hciBus.hci_waitRes(1000)==-ESRCH) {}	HciEvt disconnectComplete(DISCONN_COMPLETE);	if (hciBus.schedule(disconnectComplete)<0) return mainErr(SCHEDULE_ERR);	hciBus.hci_waitRes(1000);	if (disconnectComplete.done()) {		disconnectComplete.scanRes(tmp,1); /* status. */		disconnectComplete.scanRes(tmp,2); /* handle. */		disconnectComplete.scanRes(tmp,1); /* Reason. */	} else		hciBus.clear(disconnectComplete);	return 0;}int HciConn::disconnect() {	/* 1) Discard all msg.*/	while (hciBus.hci_waitRes(0)==-ESRCH) {}	int fd=open("data.txt",O_RDONLY,0666);	if (fd!=-1) {		char tmp[2];		if (fd!=-1 && read(fd,tmp,2)!=2) {close(fd);fd=-1;}		if (fd!=-1 && hciHandle==0) hciHandle=tmp[0]+(tmp[1]<<8);		if (hciL2capHandleDst==0) {			HciL2cap::setReqNumber(1);			HciL2cap::setHciHandle(hciHandle);		}		if (fd!=-1 && read(fd,tmp,2)!=2) {close(fd);fd=-1;}		if (fd!=-1 && hciL2capHandleDst==0) hciL2capHandleDst=tmp[0]+(tmp[1]<<8);		if (fd!=-1 && read(fd,tmp,2)!=2) {close(fd);fd=-1;}		if (fd!=-1 && hciL2capHandleSrc==0) hciL2capHandleSrc=tmp[0]+(tmp[1]<<8);		if (fd!=-1 && read(fd,tmp,2)!=2) {close(fd);fd=-1;}		if (fd!=-1 && hciScoHandle==0) hciScoHandle=tmp[0]+(tmp[1]<<8);		if (fd!=-1) close(fd);		if (hciScoHandle) disconnectHci(hciScoHandle);		if (hciL2capHandleDst && hciL2capHandleSrc) disconnectL2cap(hciL2capHandleDst,hciL2capHandleSrc);		if (hciHandle) disconnectHci(hciHandle);	}	return 0;}int HciConn::getMac(char usc[6]) {	memcpy(usc,mac,6);	return 0;}int HciConn::getPin(char usc[16]) {	memcpy(usc,pin,16);	return 0;}int HciConn::getLinkKey(char usc[16]) {	memcpy(usc,linkkey,16);	return 0;}int HciConn::setMac(char ing[6]) {	memcpy(mac,ing,6);	return 0;}int HciConn::setPin(char ing[16]) {	memcpy(pin,ing,16);	return 0;}int HciConn::setLinkKey(char ing[16]) {	memcpy(linkkey,ing,16);	return 0;}#if 0BlueDevice::BlueDevice(char* mac, HciConn* c) {	setMac(mac);	setConn(c);}BlueDevice::~BlueDevice() {}void BlueDevice::setMac(char* m) {	memcpy(mac,m,6);}void BlueDevice::setConn(HciConn* c) {	conn = c;}struct Tipoa {	int a;	int b;};struct Tipoa ta[]={1,2,3,4};static struct HciCmd::HciCmdT hc[2]={	"qwwqqw", HciCmd::LINK_CTL,0x23,2,1,	/* QWWQQW */	"sasda",  HciCmd::INFO_PAR,0x22,1,0	/* SASDA  */};	/* Event is response:	 * [0] -> '\xe'   event	 * [1] ->         len of remaining bytes,	 * [2] ->  n      number of pending command,	 * [3] -> cmd.byte1	 * [4] -> cmd.byte2	 * [5] -> status  0->NOERROR, ... (net/bluetooth/lib.c)	 * ...		  remaining n-1 bytes.	 */	responseModel[0]='\xe';	responseModel[1]='\x4';	responseModel[2]='\x1';  /* TODO: have Pr<1.*/	responseModel[3]=buf[0];	responseModel[4]=buf[1];	responseModelLen=5;	HciReqRes writeVoiceSetting("\x26\x0c\x02\x60\x00",5);	HciReqRes writeAuthEnabled ("\x20\x0c\x01\x00",4);	writeHci("\x20\x0c\x01\x00",4);	readHci ("\x0e\x04\x01\x26\x0c\x00",6);	readHci ("\x0e\x04\x01\x20\x0c\x00",6);	while (!writeVoiceSetting.done() || !writeAuthEnabled.done()) {		struct timespec sn;		sn.tv_sec=0;		sn.tv_nsec=100*1000; /* 100msec.*/		nanosleep(&sn,0);	}#endif

⌨️ 快捷键说明

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