本文转载自微信公众号《后端Q》,作者柯南。转载请联系后台Q公众号。.NET开发PC端蓝牙下载程序概述。实现在PC上查找周围的蓝牙设备(主要是手机),并通过蓝牙将PC上的文件传输到手机上。目前我使用的是OpenNETCF.Net.Bluetooth,可以正常发现周围的蓝牙设备,手机也可以正常连接蓝牙和接收文件。代码实现1.查找周围的蓝牙设备BluetoothClientbc=newBluetoothClient();BluetoothDeviceInfo[]bdi;bdi=bc.DiscoverDevices(10);//最多查找10个周围的蓝牙设备if(bdi.Length==0){this.ShowErrMsg("PleaseconfirmthatyourBluetoothisopened!");return;}2.打开数据流.Net.BluetoothAddress.Parse(BTMAC);client=newOpenNETCF.Net.Sockets.BluetoothClient();//defineendpointOpenNETCF.Net.BluetoothEndPointendpoint=newOpenNETCF.Net.BluetoothEndPoint(btaddress,spguid);try{//opensocketclient.Connect(端点);}catch{//unabletoconnect(servernotlisteningonspguid)returnfalse;}//connectsocketstream=client.GetStream();returntrue;}#endregion3,配对连接privateboolOBEXConnect(){//sendclientrequestbyte[]ConnectPacket=newbyte[7];ConnectPacket[0]=0x80;//ConnectConnectPacket[1]=0x00;//PacketlengthHiByteConnectPacket[2]=0x07;//PacketlengthLoByteConnectPacket[3]=0x10;//Obexv1ConnectPacket[4]=0x00;//noflagsConnectPacket[5]=0x20;//8kmaxpacketsizeHiByteConnectPacket[6]=0x00;//8kmaxpacketsizeLoBytestream.Write(ConnectPacket,0,ConnectPacket.Length);//listenforserverresponsebyte[]ReceiveBufferA=newbyte[3];stream.Read(ReceiveBufferA,0,3);if(ReceiveBufferA[0]==160)//0xa0{//成功,decoderestofpacketintplength=(0xff*ReceiveBufferA[1])+ReceiveBufferA[2];//lengthofpacketis...//listenforrestofpacketbyte[]ReceiveBufferB=newbyte[plength-3];stream.Read(ReceiveBufferB,0,plength-3);intobver=ReceiveBufferB[0];//serverobexversion(16=v1.0)intcflags=ReceiveBufferB[1];//connectflagsintmaxpack=(0xff*ReceiveBufferB[2])+ReceiveBufferB[3];//maxpacketsizereturntrue;}else{returnfalse;}}4、发送文档内容//sendclientrequest,startputstringtName="BRT优惠卷.txt";stringtType="";stringtFileContent="优惠卷内容:"+this.txtContent.Text.Trim();intresult=OBEXRequest("PUT",tName,tType,tFileContent);if(result==160){发送成功cess=true;}完整代码usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Web;usingSystem.Web.Security;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingSystem.Web.UI.WebControls.WebParts;usingSystem.Web.UI.HtmlControls;usingSystem.Net.Sockets;usingOpenNETCF;usingOpenNETCF.Net;usingOpenNETCF.Net.Bluetooth;usingOpenNETCF.Net.Sockets;publicpartialclass_Default:System.Web.UI.Page{//Streamstream;NetworkStreamstream;OpenNETCF.Net.Sockets.BluetoothClientclient;protectedvoidPage_Load(objectsender,EventArgse){}#regionShowErrMsgprivatevoidShowErrMsg(stringerr){stringstr;str="";this.RegisterStartupScript("",str);}#endregionprotectedvoidbtnSend_Click(objectsender,EventArgse){if(this.txtContent.Text.Trim()==string.Empty){this.ShowErrMsg("请输入发送内容!");return;}BluetoothClientbc=newBluetoothClient();BluetoothDeviceInfo[]bdi;bdi=bc.DiscoverDevices(10);//查找周围最多10个蓝牙设备if(bdi.Length==0){this.ShowErrMsg("请确保您的蓝牙已开启!");返回;}boolSendSuccess=false;try{foreach(BluetoothDeviceInfobdinbdi){if(OBEXOpenStream(bd.DeviceID.ToString())){if(OBEXConnect()){//sendclientrequest,startputstringtName="BRTCoupon.txt";stringtType="";stringtFileContent="优惠券内容:"+this.txtContent.Text.Trim();intresult=OBEXRequest("PUT",tName,tType,tFileContent);if(result==160){SendSuccess=true;}}OBEXCloseStream();}else{this.ShowErrMsg("连接失败!"+bd.DeviceName.ToString());}}if(SendSuccess){this.ShowErrMsg("发送成功,感谢使用!");}}最后{OBEXCloseStream();}}#regionOBEXOpenStreampublicboolOBEXOpenStream(stringBTMAC){//serialportUUIDGuidspguid=OpenNETCF.Net.Bluetooth.BluetoothService.ObexObjectPush;OpenNETCF.Net.BluetoothAddressbtaddress=OpenNETCF.Net.BluetoothAddress.Parse(BTMAC);客户端.Sockets。BluetoothClient();//定义端点intOpenNETCF.Net.BluetoothEndPointendpoint=newOpenNETCF.Net.BluetoothEndPoint(btaddress,spguid);try{//opensocketclient.Connect(endpoint);}catch{//unabletoconnect(servernotlisteningonspguid)returnfalse;}//connectsocketstream=client.GetStream();returntrue;}#endregion#regionOBEXCloseStreamprivatevoidOBEXCloseStream(){if(stream!=null){stream.Close();}if(client!=null){client.Close();}}#endregion#regionOBEXConnectprivateboolOBEXConnect(){//sendclientrequestbyte[]ConnectPacket=newbyte[7];ConnectPacket[0]=0x80;//ConnectConnectPacket[1]=0x00;//PacketlengthHiByteConnectPacket[2]=0x07;//PacketlengthLoByteConnectPacket[3]=0x10;//Obexv1ConnectPacket[4]=0x00;//noflagsConnectPacket[5]=0x20;//8kmaxpacketsizeHiByteConnectPacket[6]=0x00;//8kmaxpacketsizeLoBytestream.Write(ConnectPacket,0,ConnectPacket.Length);//listenforserverresponsebyte[]ReceiveBufferA=newbyte[3];stream.Read(ReceiveBufferA,0,3);if(ReceiveBufferA[0]==160)//0xa0{//成功,decoderestofpacketintplength=(0xff*ReceiveBufferA[1])+ReceiveBufferA[2];//lengthofpacketis...//listenforrestofpacketbyte[]ReceiveBufferB=newbyte[plength-3];stream.Read(ReceiveBufferB,0,plength-3);intobver=ReceiveBufferB[0];//serverobexversion(16=v1.0)intcflags=ReceiveBufferB[1];//connectflagsintmaxpack=(0xff*ReceiveBufferB[2])+ReceiveBufferB[3];//maxpacketsizereturntrue;}else{returnfalse;}}#endregion#regionOBEXRequestprivateintOBEXRequest(stringtReqType,stringtName,stringtType,stringtFileContent){//sendclientrequestinti;intoffset;intpacketsize;bytereqtype=0x82;inttTypeLen=0x03;inttypeheadsize;inttypesizeHi=0x00;inttypesizeLo=0x03;//tName="contact.vcf";//tType="text/x-vCard";//tFileContent="BEGIN:VCARD\r\nVERSION:2.1\r\nN:;aardvark\r\nFN:aardvark\r\nEND:VCARD\r\n";if(tReqType=="GET"){reqtype=0x83;//131GET-Final}if(tReqType=="PUT"){reqtype=0x82;//130PUT-Final}packetsize=3;//NameHeaderinttNameLength=tName.Length;intnameheadsize=(3+(tNameLength*2)+2);intnamesizeHi=(nameheadsize&0xff00)/0xff;intnamesizeLo=nameheadsize&0x00ff;packetsize=packetsize+nameheadsize;if(tType!=""){//TypeHeadertTypeLen=tType.Length;typeheadsize=3+tTypeLen+1;typesizeHi=(typeheadsize&0xff00)/0xff;typesizeLo=typeheadsize&0x00ff;packetsize=packetsize+typeheadsize;}//BodyintfileLen=System.Text.Encoding.Default.GetBytes(tFileContent).Length;//tFileContent.Length;intfileheadsize=3+fileLen;intfilesizeHi=(fileheadsize&0xff00)/0xff;intfilesizeLo=fileheadsize&0x00ff;;packetsize=packetsize+fileheadsize;intpacketsizeHi=(packetsize&0xff00)/0xff;intpacketsizeLo=packetsize&0x00ff;byte[]tSendByte=newbyte[packetsize];//PUT-finalHeadertSendByte[0]=reqtype;//请求类型e.g.PUT-final130tSendByte[1]=Convert.ToByte(packetsizeHi);//PacketlengthHitSendByte[2]=Convert.ToByte(packetsizeLo);//PacketlengthLooffset=2;//NameHeadertSendByte[offset+1]=0x01;//HIforNameheadertSendByte[offset+2]=Convert.ToByte(namesizeHi);//LengthofNameheader(2bytesperchar)tSendByte[offset+3]=Convert.ToByte(namesizeLo);//LengthofNameheader(2bytesperchar)//Name+\n\ninunicodebyte[]tNameU=System.Text.Encoding.BigEndianUnicode.GetBytes(tName);tNameU.CopyTo(tSendByte,offset+4);offset=offset+3+(tNameLength*2);tSendByte[offset+1]=0x00;//nulltermtSendByte[offset+2]=0x00;//nulltermoffset=offset+2;if(tType!=""){//TypeHeadertSendByte[offset+1]=0x42;//HIforTypeHeader66tSendByte[offset+2]=Convert.ToByte(typesizeHi);//LengthofTypeHeadertSendByte[offset+3]=Convert.ToByte(typesizeLo);//LengthofTypeHeaderfor(i=0;i<=(tTypeLen-1);i++){tSendByte[offset+4+i]=Convert.ToByte(Convert.ToChar(tType.Substring(i,1)));}tSendByte[offset+3+tTypeLen+1]=0x00;//nullterminatoroffset=offset+3+tTypeLen+1;}//BodytSendByte[offset+1]=0x49;//HIEndofBody73tSendByte[offset+2]=Convert.ToByte(filesizeHi);//tSendByte[offset+3]=Convert.ToByte(filesizeLo);//1kpayload+3forHIheader//for(i=0;i<=(fileLen-1);i++)//{//tSendByte[offset+4+i]=Convert.ToByte(tFileContent.Substring(i,1));//Convert.ToByte(Convert.ToChar(tFileContent.Substring(i,1)));//byte[]bfile=System.Text.Encoding.Default.GetBytes(tFileContent);for(i=0;i<=bfile.Length-1;i++){tSendByte[offset+4+i]=bfile[i];}//tSendByte[offset+4+fileLen]=0x00;//nullterminatoroffset=offset+3+fileLen;stream.Write(tSendByte,0,tSendByte.Length);//listenforserverresponse//TODO:canhanghhereforeverwaitingresponse...boolx=stream.DataAvailable;//更改蓝牙客户端-publicNetworkStreamGetStream()byte[]tArray4=newbyte[3];stream.Read(tArray4,0,3);x=stream.DataAvailable;if(tArray4[0]==160)//0xa0{intplength=(tArray4[1]*256)+tArray4[2]-3;byte[]tArray5=newbyte[plength];if(plength>0){stream.Read(tArray5,0,plength);//TODO:datainreturnedpackettodealwith}return160;}if(tArray4[0]==197)//0xc5Methodnotallowed{return197;}if(tArray4[0]==192)//0xc0BadRequest{return192;}return0;}#endregion}
