C# 在PC上的通过蓝牙(bluetooth)发送数据到手机
生活随笔
收集整理的這篇文章主要介紹了
C# 在PC上的通过蓝牙(bluetooth)发送数据到手机
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
概述
在PC端用.NET開發(fā)一個(gè)藍(lán)牙下載的程序。實(shí)現(xiàn)在PC上查找周圍的藍(lán)牙設(shè)備(主要是手機(jī)),并將PC上的文件通過藍(lán)牙傳輸?shù)绞謾C(jī)上。目前我采用的是OpenNETCF.Net.Bluetooth,能夠正常發(fā)現(xiàn)周圍的藍(lán)牙設(shè)備,手機(jī)也能夠正常進(jìn)行藍(lán)牙連接并接收文件。
代碼實(shí)現(xiàn)
1、查找周圍藍(lán)牙設(shè)備
2、打開數(shù)據(jù)流
#region OBEXOpenStreampublic bool OBEXOpenStream(string BTMAC){// serial port UUIDGuid spguid = OpenNETCF.Net.Bluetooth.BluetoothService.ObexObjectPush;OpenNETCF.Net.BluetoothAddress btaddress = OpenNETCF.Net.BluetoothAddress.Parse(BTMAC);client = new OpenNETCF.Net.Sockets.BluetoothClient();// define endpointOpenNETCF.Net.BluetoothEndPoint endpoint = new OpenNETCF.Net.BluetoothEndPoint(btaddress, spguid);try{//open socketclient.Connect(endpoint);}catch{//unable to connect (server not listening on spguid)return false;}//connect socketstream = client.GetStream();return true;}#endregion3、配對(duì)連接
private bool OBEXConnect(){//send client requestbyte[] ConnectPacket = new byte[7];ConnectPacket[0] = 0x80; // ConnectConnectPacket[1] = 0x00; // Packetlength Hi ByteConnectPacket[2] = 0x07; // Packetlength Lo ByteConnectPacket[3] = 0x10; // Obex v1ConnectPacket[4] = 0x00; // no flagsConnectPacket[5] = 0x20; // 8k max packet size Hi ByteConnectPacket[6] = 0x00; // 8k max packet size Lo Bytestream.Write(ConnectPacket, 0, ConnectPacket.Length);//listen for server responsebyte[] ReceiveBufferA = new byte[3];stream.Read(ReceiveBufferA, 0, 3);if (ReceiveBufferA[0] == 160) // 0xa0{//success, decode rest of packetint plength = (0xff * ReceiveBufferA[1]) + ReceiveBufferA[2]; //length of packet is...//listen for rest of packetbyte[] ReceiveBufferB = new byte[plength - 3];stream.Read(ReceiveBufferB, 0, plength - 3);int obver = ReceiveBufferB[0]; //server obex version (16 = v1.0)int cflags = ReceiveBufferB[1]; //connect flagsint maxpack = (0xff * ReceiveBufferB[2]) + ReceiveBufferB[3]; //max packet sizereturn true;}else{return false;}}4、發(fā)送文本內(nèi)容
完整代碼
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Net.Sockets; using OpenNETCF; using OpenNETCF.Net; using OpenNETCF.Net.Bluetooth; using OpenNETCF.Net.Sockets;public partial class _Default : System.Web.UI.Page {//Stream stream;NetworkStream stream;OpenNETCF.Net.Sockets.BluetoothClient client;protected void Page_Load(object sender, EventArgs e) {}#region ShowErrMsgprivate void ShowErrMsg(string err) {string str;str = "<script language='javascript'>";str += " alert('" + err + "')";str += "</script>";this.RegisterStartupScript("", str);}#endregionprotected void btnSend_Click(object sender, EventArgs e) {if (this.txtContent.Text.Trim() == string.Empty){this.ShowErrMsg("請(qǐng)輸入發(fā)送內(nèi)容!");return;}BluetoothClient bc = new BluetoothClient();BluetoothDeviceInfo[] bdi;bdi = bc.DiscoverDevices(10);//查找周圍最多10個(gè)藍(lán)牙設(shè)備if (bdi.Length == 0){this.ShowErrMsg("請(qǐng)確認(rèn)您的藍(lán)牙已開啟!");return;}bool SendSuccess = false;try{foreach (BluetoothDeviceInfo bd in bdi){if (OBEXOpenStream(bd.DeviceID.ToString())){if (OBEXConnect()){//send client request, start putstring tName = "BRT優(yōu)惠卷.txt";string tType = "";string tFileContent = "優(yōu)惠卷內(nèi)容:" + this.txtContent.Text.Trim();int result = OBEXRequest("PUT", tName, tType, tFileContent);if (result == 160){SendSuccess = true;}}OBEXCloseStream();}else{this.ShowErrMsg("連接失敗!" + bd.DeviceName.ToString());}}if (SendSuccess){this.ShowErrMsg("發(fā)送成功,謝謝使用!");}}finally{OBEXCloseStream();}}#region OBEXOpenStreampublic bool OBEXOpenStream(string BTMAC) {// serial port UUIDGuid spguid = OpenNETCF.Net.Bluetooth.BluetoothService.ObexObjectPush;OpenNETCF.Net.BluetoothAddress btaddress = OpenNETCF.Net.BluetoothAddress.Parse(BTMAC);client = new OpenNETCF.Net.Sockets.BluetoothClient();// define endpointOpenNETCF.Net.BluetoothEndPoint endpoint = new OpenNETCF.Net.BluetoothEndPoint(btaddress, spguid);try{//open socketclient.Connect(endpoint);}catch{//unable to connect (server not listening on spguid)return false;}//connect socketstream = client.GetStream();return true;}#endregion#region OBEXCloseStreamprivate void OBEXCloseStream() {if (stream != null){stream.Close();}if (client != null){client.Close();}}#endregion#region OBEXConnectprivate bool OBEXConnect() {//send client requestbyte[] ConnectPacket = new byte[7];ConnectPacket[0] = 0x80; // ConnectConnectPacket[1] = 0x00; // Packetlength Hi ByteConnectPacket[2] = 0x07; // Packetlength Lo ByteConnectPacket[3] = 0x10; // Obex v1ConnectPacket[4] = 0x00; // no flagsConnectPacket[5] = 0x20; // 8k max packet size Hi ByteConnectPacket[6] = 0x00; // 8k max packet size Lo Bytestream.Write(ConnectPacket, 0, ConnectPacket.Length);//listen for server responsebyte[] ReceiveBufferA = new byte[3];stream.Read(ReceiveBufferA, 0, 3);if (ReceiveBufferA[0] == 160) // 0xa0{//success, decode rest of packetint plength = (0xff * ReceiveBufferA[1]) + ReceiveBufferA[2]; //length of packet is...//listen for rest of packetbyte[] ReceiveBufferB = new byte[plength - 3];stream.Read(ReceiveBufferB, 0, plength - 3);int obver = ReceiveBufferB[0]; //server obex version (16 = v1.0)int cflags = ReceiveBufferB[1]; //connect flagsint maxpack = (0xff * ReceiveBufferB[2]) + ReceiveBufferB[3]; //max packet sizereturn true;}else{return false;}}#endregion#region OBEXRequestprivate int OBEXRequest(string tReqType, string tName, string tType, string tFileContent) {//send client requestint i;int offset;int packetsize;byte reqtype = 0x82;int tTypeLen = 0x03;int typeheadsize;int typesizeHi = 0x00;int typesizeLo = 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; // 131 GET-Final}if (tReqType == "PUT"){reqtype = 0x82; // 130 PUT-Final}packetsize = 3;//Name Headerint tNameLength = tName.Length;int nameheadsize = (3 + (tNameLength * 2) + 2);int namesizeHi = (nameheadsize & 0xff00) / 0xff;int namesizeLo = nameheadsize & 0x00ff;packetsize = packetsize + nameheadsize;if (tType != ""){//Type HeadertTypeLen = tType.Length;typeheadsize = 3 + tTypeLen + 1;typesizeHi = (typeheadsize & 0xff00) / 0xff;typesizeLo = typeheadsize & 0x00ff;packetsize = packetsize + typeheadsize;}//Bodyint fileLen = System.Text.Encoding.Default.GetBytes(tFileContent).Length;//tFileContent.Length;int fileheadsize = 3 + fileLen;int filesizeHi = (fileheadsize & 0xff00) / 0xff; ;int filesizeLo = fileheadsize & 0x00ff; ;packetsize = packetsize + fileheadsize;int packetsizeHi = (packetsize & 0xff00) / 0xff;int packetsizeLo = packetsize & 0x00ff;byte[] tSendByte = new byte[packetsize];//PUT-final HeadertSendByte[0] = reqtype; // Request type e.g. PUT-final 130tSendByte[1] = Convert.ToByte(packetsizeHi); // Packetlength HitSendByte[2] = Convert.ToByte(packetsizeLo); // Packetlength Looffset = 2;//Name HeadertSendByte[offset + 1] = 0x01; // HI for Name header tSendByte[offset + 2] = Convert.ToByte(namesizeHi); // Length of Name header (2 bytes per char)tSendByte[offset + 3] = Convert.ToByte(namesizeLo); // Length of Name header (2 bytes per char)// Name+\n\n in unicodebyte[] tNameU = System.Text.Encoding.BigEndianUnicode.GetBytes(tName);tNameU.CopyTo(tSendByte, offset + 4);offset = offset + 3 + (tNameLength * 2);tSendByte[offset + 1] = 0x00; // null termtSendByte[offset + 2] = 0x00; // null termoffset = offset + 2;if (tType != ""){//Type HeadertSendByte[offset + 1] = 0x42; // HI for Type Header 66tSendByte[offset + 2] = Convert.ToByte(typesizeHi); // Length of Type HeadertSendByte[offset + 3] = Convert.ToByte(typesizeLo); // Length of Type Headerfor (i = 0; i <= (tTypeLen - 1); i++){tSendByte[offset + 4 + i] = Convert.ToByte(Convert.ToChar(tType.Substring(i, 1)));}tSendByte[offset + 3 + tTypeLen + 1] = 0x00; // null terminatoroffset = offset + 3 + tTypeLen + 1;}//BodytSendByte[offset + 1] = 0x49; //HI End of Body 73tSendByte[offset + 2] = Convert.ToByte(filesizeHi); //tSendByte[offset + 3] = Convert.ToByte(filesizeLo); //1k payload + 3 for HI header//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; // null terminatoroffset = offset + 3 + fileLen;stream.Write(tSendByte, 0, tSendByte.Length);//listen for server response//TODO: can hang here forever waiting response...bool x = stream.DataAvailable; // changed bluetoothclient - public NetworkStream GetStream()byte[] tArray4 = new byte[3];stream.Read(tArray4, 0, 3);x = stream.DataAvailable;if (tArray4[0] == 160) // 0xa0{int plength = (tArray4[1] * 256) + tArray4[2] - 3;byte[] tArray5 = new byte[plength];if (plength > 0){stream.Read(tArray5, 0, plength);//TODO: data in returned packet to deal with}return 160;}if (tArray4[0] == 197) // 0xc5 Method not allowed{return 197;}if (tArray4[0] == 192) // 0xc0 Bad Request{return 192;}return 0;}#endregion }總結(jié)
以上是生活随笔為你收集整理的C# 在PC上的通过蓝牙(bluetooth)发送数据到手机的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在 .NET 中使用 Flurl 高效处
- 下一篇: TIOBE 3月榜单:新功能将加入,C语