蓝牙设备向pc传输数据「C在PC上的通过蓝牙(bluetooth)发送数据到手机」

时间:2023-07-03 12:26:44阅读:2157
概述在PC端用.NET开发一个蓝牙下载的程序。实现在PC上查找周围的蓝牙设备(主要是手机),并将PC上的文件通过蓝牙传输到手机上。目前我采用的是OpenNETCF.Net.Bluetooth,能够正常发现周围的蓝牙设备,手机也能够正…

概述

在PC端用.NET开发一个蓝牙下载的程序。实现在PC上查找周围的蓝牙设备(主要是手机),并将PC上的文件通过蓝牙传输到手机上。目前我采用的是OpenNETCF.Net.Bluetooth,能够正常发现周围的蓝牙设备,手机也能够正常进行蓝牙连接并接收文件。

代码实现

1、查找周围蓝牙设备

BluetoothClient bc = new BluetoothClient; BluetoothDeviceInfo bdi; bdi = bc.DiscoverDevices(10);//查找周围最多10个蓝牙设备 if (bdi.Length == 0) { this.ShowErrMsg("请确认您的蓝牙已开启!"); return; }

2、打开数据流

#region OBEXOpenStream public bool OBEXOpenStream(string BTMAC) { // serial port UUID Guid spguid = OpenNETCF.Net.Bluetooth.BluetoothService.ObexObjectPush; OpenNETCF.Net.BluetoothAddress btaddress = OpenNETCF.Net.BluetoothAddress.Parse(BTMAC); client = new OpenNETCF.Net.Sockets.BluetoothClient; // define endpoint OpenNETCF.Net.BluetoothEndPoint endpoint = new OpenNETCF.Net.BluetoothEndPoint(btaddress, spguid); try { //open socket client.Connect(endpoint); } catch { //unable to connect (server not listening on spguid) return false; } //connect socket stream = client.GetStream; return true; } #endregion

3、配对连接

private bool OBEXConnect { //send client request byte ConnectPacket = new byte[7]; ConnectPacket[0] = 0x80; // Connect ConnectPacket[1] = 0x00; // Packetlength Hi Byte ConnectPacket[2] = 0x07; // Packetlength Lo Byte ConnectPacket[3] = 0x10; // Obex v1 ConnectPacket[4] = 0x00; // no flags ConnectPacket[5] = 0x20; // 8k max packet size Hi Byte ConnectPacket[6] = 0x00; // 8k max packet size Lo Byte stream.Write(ConnectPacket, 0, ConnectPacket.Length); //listen for server response byte ReceiveBufferA = new byte[3]; stream.Read(ReceiveBufferA, 0, 3); if (ReceiveBufferA[0] == 160) // 0xa0 { //success, decode rest of packet int plength = (0xff * ReceiveBufferA[1]) ReceiveBufferA[2]; //length of packet is... //listen for rest of packet byte 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 flags int maxpack = (0xff * ReceiveBufferB[2]) ReceiveBufferB[3]; //max packet size return true; } else { return false; } }

4、发送文本内容

//send client request, start put string tName = "BRT优惠卷.txt"; string tType = ""; string tFileContent = "优惠卷内容:" this.txtContent.Text.Trim; int result = OBEXRequest("PUT", tName, tType, tFileContent); if (result == 160) { SendSuccess = true; }完整代码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 ShowErrMsg private void ShowErrMsg(string err){ string str; str = ""; this.RegisterStartupScript("", str); } #endregion protected void btnSend_Click(object sender, EventArgs e){ if (this.txtContent.Text.Trim == string.Empty) { this.ShowErrMsg("请输入发送内容!"); return; } BluetoothClient bc = new BluetoothClient; BluetoothDeviceInfo bdi; bdi = bc.DiscoverDevices(10);//查找周围最多10个蓝牙设备 if (bdi.Length == 0) { this.ShowErrMsg("请确认您的蓝牙已开启!"); return; } bool SendSuccess = false; try { foreach (BluetoothDeviceInfo bd in bdi) { if (OBEXOpenStream(bd.DeviceID.ToString)) { if (OBEXConnect) { //send client request, start put string tName = "BRT优惠卷.txt"; string tType = ""; string tFileContent = "优惠卷内容:" 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("发送成功,谢谢使用!"); } } finally { OBEXCloseStream; } } #region OBEXOpenStream public bool OBEXOpenStream(string BTMAC){ // serial port UUID Guid spguid = OpenNETCF.Net.Bluetooth.BluetoothService.ObexObjectPush; OpenNETCF.Net.BluetoothAddress btaddress = OpenNETCF.Net.BluetoothAddress.Parse(BTMAC); client = new OpenNETCF.Net.Sockets.BluetoothClient; // define endpoint OpenNETCF.Net.BluetoothEndPoint endpoint = new OpenNETCF.Net.BluetoothEndPoint(btaddress, spguid); try { //open socket client.Connect(endpoint); } catch { //unable to connect (server not listening on spguid) return false; } //connect socket stream = client.GetStream; return true; } #endregion #region OBEXCloseStream private void OBEXCloseStream{ if (stream != ) { stream.Close; } if (client != ) { client.Close; } } #endregion #region OBEXConnect private bool OBEXConnect{ //send client request byte ConnectPacket = new byte[7]; ConnectPacket[0] = 0x80; // Connect ConnectPacket[1] = 0x00; // Packetlength Hi Byte ConnectPacket[2] = 0x07; // Packetlength Lo Byte ConnectPacket[3] = 0x10; // Obex v1 ConnectPacket[4] = 0x00; // no flags ConnectPacket[5] = 0x20; // 8k max packet size Hi Byte ConnectPacket[6] = 0x00; // 8k max packet size Lo Byte stream.Write(ConnectPacket, 0, ConnectPacket.Length); //listen for server response byte ReceiveBufferA = new byte[3]; stream.Read(ReceiveBufferA, 0, 3); if (ReceiveBufferA[0] == 160) // 0xa0 { //success, decode rest of packet int plength = (0xff * ReceiveBufferA[1]) ReceiveBufferA[2]; //length of packet is... //listen for rest of packet byte 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 flags int maxpack = (0xff * ReceiveBufferB[2]) ReceiveBufferB[3]; //max packet size return true; } else { return false; } } #endregion #region OBEXRequest private int OBEXRequest(string tReqType, string tName, string tType, string tFileContent){ //send client request int 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:VCARDrnVERSION:2.1rnN:;aardvarkrnFN:aardvarkrnEND:VCARDrn"; if (tReqType == "GET") { reqtype = 0x83; // 131 GET-Final } if (tReqType == "PUT") { reqtype = 0x82; // 130 PUT-Final } packetsize = 3; //Name Header int tNameLength = tName.Length; int nameheadsize = (3 (tNameLength * 2) 2); int namesizeHi = (nameheadsize & 0xff00) / 0xff; int namesizeLo = nameheadsize & 0x00ff; packetsize = packetsize nameheadsize; if (tType != "") { //Type Header tTypeLen = tType.Length; typeheadsize = 3 tTypeLen 1; typesizeHi = (typeheadsize & 0xff00) / 0xff; typesizeLo = typeheadsize & 0x00ff; packetsize = packetsize typeheadsize; } //Body int 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 Header tSendByte[0] = reqtype; // Request type e.g. PUT-final 130 tSendByte[1] = Convert.ToByte(packetsizeHi); // Packetlength Hi tSendByte[2] = Convert.ToByte(packetsizeLo); // Packetlength Lo offset = 2; //Name Header tSendByte[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 nn in unicode byte tNameU = System.Text.Encoding.BigEndianUnicode.GetBytes(tName); tNameU.CopyTo(tSendByte, offset 4); offset = offset 3 (tNameLength * 2); tSendByte[offset 1] = 0x00; // term tSendByte[offset 2] = 0x00; // term offset = offset 2; if (tType != "") { //Type Header tSendByte[offset 1] = 0x42; // HI for Type Header 66 tSendByte[offset 2] = Convert.ToByte(typesizeHi); // Length of Type Header tSendByte[offset 3] = Convert.ToByte(typesizeLo); // Length of Type Header for (i = 0; i 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}

蓝牙设备向pc传输数据「C在PC上的通过蓝牙(bluetooth)发送数据到手机」

鐢佃剳鎬庝箞鐢ㄨ摑鐗欎紶涓滆タ鍒版墜鏈哄憿锛

      
      1銆侀栧厛鎵嬫満鍜岀數鑴戦兘瑕佹湁钃濈墮銆
    杩旂瀻  2銆佹墦寮钃濈墮锛屽湪鎵嬫満钃濈墮閫夐」閲屾湁涓椤瑰氨鏄鎺ュ彈鐢佃剳鎺у埗锛
      3銆佹妸鐢佃剳涓婇攢涓栧皹鐨勮摑鐗欐墦寮杩炴帴鎵嬫満灏卞ソ浜嗐
      4銆佸傛灉鐢佃剳涓婃病钃濈墮闇瑕佷拱涓钃濈墮閫傞厤鍣ㄨ呬笂鍘诲氨鍙浠ヤ娇鐢ㄨ摑鐗欎簡銆
      5銆佺數鑴戜笂瀹夎呭畬濂椾欢浠ュ悗锛屼細鎻愮ず浣犺繛鎺ユ墜鏈恒傜敤鏁版嵁绾胯仈涓婏紝杩欐椂鎵嬫満浼氬脊鍑洪夋嫨鑿滃崟锛屾垜浠閫夋嫨浜忕呪淧C濂椾欢妯″紡鈥濄傜劧鍚庣數鑴戜笂鐨勫椾欢灏变細鑷鍔ㄤ负鏁版嵁绾胯呴┍鍔ㄣ

蓝牙设备向pc传输数据「C在PC上的通过蓝牙(bluetooth)发送数据到手机」

鐢佃剳鍙涓嶅彲浠ョ敤钃濈墮浼犱笢瑗垮埌鎵嬫満涓

鐢佃剳鍙浠ョ敤钃濈墮浼犱笢瑗垮埌鎵嬫満涓娿

1锛岀數鑴戝惎鐢ㄨ摑鐗欍

2锛屽彸閿钃濈墮鍥炬爣锛岄夋嫨閫夐」銆

3锛岃繘鍏ヨ摑鐗欑▼搴忕殑璁剧疆绐楀彛鍚庯紝鐐瑰嚮瀹夊叏鎬ч夐」鍗★紝濡傚浘璁剧疆銆

鐐瑰嚮鑷瀹氫箟绾у埆銆

鐐瑰嚮"bluetooth淇℃伅浜ゆ崲鍣ㄢ滐紝閫夋嫨寤虹珛蹇鎹锋柟寮忋

鐒跺悗妗岄潰灏变細澶氬嚭涓涓鍥炬爣锛

4锛屽彸閿鐐瑰嚮鎵樼洏涓鐨勮摑鐗欑﹀彿锛岄夋嫨鏃犵嚎鏂囦欢浼犺緭銆傚悓鏃讹紝鎵嬫満鎵撳紑钃濋傛秷鐗欍

5锛屽唽杞鐢佃剳钃濈墮鎼滅储鍒颁簡鎵嬫満锛屽苟娣诲姞鍒颁紶閫佸圭浉澶勩傚傛灉鎵嬫満钃濈墮瀵硅薄寰堝氾紝鍙浠ラ夋嫨鍏朵腑鍑犱釜浣滀负鍙戦佸硅薄銆

6锛岀劧鍚庣偣娣诲姞鏂囦欢鎴栬呮枃浠跺す銆傞夋嫨鍙戦併傛ゆ椂浼氬脊鍑轰竴涓鍙戦佹枃浠剁殑绐楀彛銆備絾姝ゆ椂骞朵笉鐪熺殑鍙戦佹枃浠躲傝繖闇瑕佺瓑寰呰緭鍏ュ瘑鐮併

7锛屾墜鏈轰細寮瑰嚭杈撳叆瀵嗙爜绐楀彛銆傚~鍏ュ瘑鐮佸悗锛岀數鑴戠涔熷脊鍑轰竴涓宸炴ū淇¢渶瑕佽緭鍏ュ瘑鐮佺殑绐楀彛銆

8锛岃緭鍏ユg‘瀵嗙爜鍚庯紝浼犻佹枃浠躲傛ゆ椂鎵嬫満绔浼氭彁绀烘槸鍚︽帴鍙楄ユ枃浠讹紝纭瀹氬悗锛屾敹鍒扮數鑴戜紶鏉ョ殑鏂囦欢銆備紶杈撶粨鏉熴

评论

  • 评论加载中...