📄 blue.cpp
字号:
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 + -