C# 在PC上的通过蓝牙(Bluetooth)发送数据到手机,你会吗?

开发 后端
在PC端用.NET开发一个蓝牙下载的程序。实现在PC上查找周围的蓝牙设备(主要是手机),并将PC上的文件通过蓝牙传输到手机上。

[[403076]]

本文转载自微信公众号「后端Q」,作者conan。转载本文请联系后端Q公众号。

概述

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

代码实现

1、查找周围蓝牙设备

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

2、打开数据流

  1. #region OBEXOpenStream 
  2.     public bool OBEXOpenStream(string BTMAC) 
  3.     { 
  4.  
  5.         // serial port UUID 
  6.         Guid spguid = OpenNETCF.Net.Bluetooth.BluetoothService.ObexObjectPush; 
  7.         OpenNETCF.Net.BluetoothAddress btaddress = OpenNETCF.Net.BluetoothAddress.Parse(BTMAC); 
  8.         client = new OpenNETCF.Net.Sockets.BluetoothClient(); 
  9.  
  10.         // define endpoint 
  11.         OpenNETCF.Net.BluetoothEndPoint endpoint = new OpenNETCF.Net.BluetoothEndPoint(btaddress, spguid); 
  12.  
  13.         try 
  14.         { 
  15.             //open socket 
  16.             client.Connect(endpoint); 
  17.         } 
  18.         catch 
  19.         { 
  20.             //unable to connect (server not listening on spguid) 
  21.             return false
  22.         } 
  23.  
  24.         //connect socket 
  25.         stream = client.GetStream(); 
  26.         return true
  27.     } 
  28.     #endregion 

3、配对连接

  1. private bool OBEXConnect() 
  2.     { 
  3.         //send client request 
  4.         byte[] ConnectPacket = new byte[7]; 
  5.  
  6.         ConnectPacket[0] = 0x80;      // Connect 
  7.         ConnectPacket[1] = 0x00;      // Packetlength Hi Byte 
  8.         ConnectPacket[2] = 0x07;      // Packetlength Lo Byte 
  9.         ConnectPacket[3] = 0x10;      // Obex v1 
  10.         ConnectPacket[4] = 0x00;      // no flags 
  11.         ConnectPacket[5] = 0x20;      // 8k max packet size Hi Byte 
  12.         ConnectPacket[6] = 0x00;      // 8k max packet size Lo Byte 
  13.  
  14.         stream.Write(ConnectPacket, 0, ConnectPacket.Length); 
  15.  
  16.         //listen for server response 
  17.         byte[] ReceiveBufferA = new byte[3]; 
  18.         stream.Read(ReceiveBufferA, 0, 3); 
  19.  
  20.         if (ReceiveBufferA[0] == 160) // 0xa0 
  21.         { 
  22.  
  23.             //success, decode rest of packet 
  24.             int plength = (0xff * ReceiveBufferA[1]) + ReceiveBufferA[2]; //length of packet is... 
  25.  
  26.             //listen for rest of packet 
  27.             byte[] ReceiveBufferB = new byte[plength - 3]; 
  28.             stream.Read(ReceiveBufferB, 0, plength - 3); 
  29.  
  30.             int obver = ReceiveBufferB[0]; //server obex version (16 = v1.0) 
  31.             int cflags = ReceiveBufferB[1]; //connect flags 
  32.             int maxpack = (0xff * ReceiveBufferB[2]) + ReceiveBufferB[3]; //max packet size 
  33.  
  34.             return true
  35.         } 
  36.         else 
  37.         { 
  38.             return false
  39.         } 
  40.     } 

4、发送文本内容

  1. //send client request, start put 
  2.                         string tName = "BRT优惠卷.txt"
  3.                         string tType = ""
  4.                         string tFileContent = "优惠卷内容:" + this.txtContent.Text.Trim(); 
  5.  
  6.                         int result = OBEXRequest("PUT", tName, tType, tFileContent); 
  7.                         if (result == 160) 
  8.                         { 
  9.                             SendSuccess = true
  10.                         } 

完整代码

  1. using System; 
  2. using System.Data; 
  3. using System.Configuration; 
  4. using System.Web; 
  5. using System.Web.Security; 
  6. using System.Web.UI; 
  7. using System.Web.UI.WebControls; 
  8. using System.Web.UI.WebControls.WebParts; 
  9. using System.Web.UI.HtmlControls; 
  10. using System.Net.Sockets; 
  11. using OpenNETCF; 
  12. using OpenNETCF.Net; 
  13. using OpenNETCF.Net.Bluetooth; 
  14. using OpenNETCF.Net.Sockets; 
  15.  
  16. public partial class _Default : System.Web.UI.Page  
  17.     //Stream stream; 
  18.     NetworkStream stream; 
  19.     OpenNETCF.Net.Sockets.BluetoothClient client; 
  20.     protected void Page_Load(object sender, EventArgs e) 
  21.  
  22.     } 
  23.  
  24.     #region ShowErrMsg 
  25.     private void ShowErrMsg(string err) 
  26.         string str; 
  27.         str = "<script language='javascript'>"
  28.         str += " alert('" + err + "')"
  29.         str += "</script>"
  30.         this.RegisterStartupScript("", str); 
  31.     } 
  32.     #endregion 
  33.     protected void btnSend_Click(object sender, EventArgs e) 
  34.         if (this.txtContent.Text.Trim() == string.Empty) 
  35.         { 
  36.             this.ShowErrMsg("请输入发送内容!"); 
  37.             return
  38.         } 
  39.         BluetoothClient bc = new BluetoothClient(); 
  40.         BluetoothDeviceInfo[] bdi; 
  41.         bdi = bc.DiscoverDevices(10);//查找周围最多10个蓝牙设备 
  42.         if (bdi.Length == 0) 
  43.         { 
  44.             this.ShowErrMsg("请确认您的蓝牙已开启!"); 
  45.             return
  46.         } 
  47.         bool SendSuccess = false
  48.         try 
  49.         { 
  50.             foreach (BluetoothDeviceInfo bd in bdi) 
  51.             { 
  52.                 if (OBEXOpenStream(bd.DeviceID.ToString())) 
  53.                 { 
  54.  
  55.                     if (OBEXConnect()) 
  56.                     { 
  57.                         //send client request, start put 
  58.                         string tName = "BRT优惠卷.txt"
  59.                         string tType = ""
  60.                         string tFileContent = "优惠卷内容:" + this.txtContent.Text.Trim(); 
  61.  
  62.                         int result = OBEXRequest("PUT", tName, tType, tFileContent); 
  63.                         if (result == 160) 
  64.                         { 
  65.                             SendSuccess = true
  66.                         } 
  67.                     } 
  68.                     OBEXCloseStream(); 
  69.                 } 
  70.                 else 
  71.                 { 
  72.                     this.ShowErrMsg("连接失败!" + bd.DeviceName.ToString()); 
  73.                 } 
  74.  
  75.             } 
  76.             if (SendSuccess) 
  77.             { 
  78.                 this.ShowErrMsg("发送成功,谢谢使用!"); 
  79.             } 
  80.         } 
  81.         finally 
  82.         { 
  83.             OBEXCloseStream(); 
  84.         } 
  85.     } 
  86.  
  87.  
  88.     #region OBEXOpenStream 
  89.     public bool OBEXOpenStream(string BTMAC) 
  90.  
  91.         // serial port UUID 
  92.         Guid spguid = OpenNETCF.Net.Bluetooth.BluetoothService.ObexObjectPush; 
  93.         OpenNETCF.Net.BluetoothAddress btaddress = OpenNETCF.Net.BluetoothAddress.Parse(BTMAC); 
  94.         client = new OpenNETCF.Net.Sockets.BluetoothClient(); 
  95.  
  96.         // define endpoint 
  97.         OpenNETCF.Net.BluetoothEndPoint endpoint = new OpenNETCF.Net.BluetoothEndPoint(btaddress, spguid); 
  98.  
  99.         try 
  100.         { 
  101.             //open socket 
  102.             client.Connect(endpoint); 
  103.         } 
  104.         catch 
  105.         { 
  106.             //unable to connect (server not listening on spguid) 
  107.             return false
  108.         } 
  109.  
  110.         //connect socket 
  111.         stream = client.GetStream(); 
  112.         return true
  113.     } 
  114.     #endregion 
  115.  
  116.     #region OBEXCloseStream 
  117.     private void OBEXCloseStream() 
  118.         if (stream != null
  119.         { 
  120.             stream.Close(); 
  121.         } 
  122.         if (client != null
  123.         { 
  124.             client.Close(); 
  125.         } 
  126.     } 
  127.     #endregion 
  128.  
  129.     #region  OBEXConnect 
  130.     private bool OBEXConnect() 
  131.         //send client request 
  132.         byte[] ConnectPacket = new byte[7]; 
  133.  
  134.         ConnectPacket[0] = 0x80;      // Connect 
  135.         ConnectPacket[1] = 0x00;      // Packetlength Hi Byte 
  136.         ConnectPacket[2] = 0x07;      // Packetlength Lo Byte 
  137.         ConnectPacket[3] = 0x10;      // Obex v1 
  138.         ConnectPacket[4] = 0x00;      // no flags 
  139.         ConnectPacket[5] = 0x20;      // 8k max packet size Hi Byte 
  140.         ConnectPacket[6] = 0x00;      // 8k max packet size Lo Byte 
  141.  
  142.         stream.Write(ConnectPacket, 0, ConnectPacket.Length); 
  143.  
  144.         //listen for server response 
  145.         byte[] ReceiveBufferA = new byte[3]; 
  146.         stream.Read(ReceiveBufferA, 0, 3); 
  147.  
  148.         if (ReceiveBufferA[0] == 160) // 0xa0 
  149.         { 
  150.  
  151.             //success, decode rest of packet 
  152.             int plength = (0xff * ReceiveBufferA[1]) + ReceiveBufferA[2]; //length of packet is... 
  153.  
  154.             //listen for rest of packet 
  155.             byte[] ReceiveBufferB = new byte[plength - 3]; 
  156.             stream.Read(ReceiveBufferB, 0, plength - 3); 
  157.  
  158.             int obver = ReceiveBufferB[0]; //server obex version (16 = v1.0) 
  159.             int cflags = ReceiveBufferB[1]; //connect flags 
  160.             int maxpack = (0xff * ReceiveBufferB[2]) + ReceiveBufferB[3]; //max packet size 
  161.  
  162.             return true
  163.         } 
  164.         else 
  165.         { 
  166.             return false
  167.         } 
  168.     } 
  169.     #endregion 
  170.  
  171.     #region OBEXRequest 
  172.     private int OBEXRequest(string tReqType, string tName, string tType, string tFileContent) 
  173.         //send client request 
  174.  
  175.         int i; 
  176.         int offset; 
  177.         int packetsize; 
  178.         byte reqtype = 0x82; 
  179.  
  180.         int tTypeLen = 0x03; 
  181.         int typeheadsize; 
  182.         int typesizeHi = 0x00; 
  183.         int typesizeLo = 0x03; 
  184.  
  185.         //tName = "contact.vcf"
  186.         //tType = "text/x-vCard"
  187.         //tFileContent = "BEGIN:VCARD\r\nVERSION:2.1\r\nN:;aardvark\r\nFN:aardvark\r\nEND:VCARD\r\n"
  188.  
  189.         if (tReqType == "GET"
  190.         { 
  191.             reqtype = 0x83;      // 131 GET-Final 
  192.         } 
  193.  
  194.         if (tReqType == "PUT"
  195.         { 
  196.             reqtype = 0x82;      // 130 PUT-Final 
  197.         } 
  198.  
  199.         packetsize = 3; 
  200.  
  201.         //Name Header 
  202.         int tNameLength = tName.Length; 
  203.         int nameheadsize = (3 + (tNameLength * 2) + 2); 
  204.         int namesizeHi = (nameheadsize & 0xff00) / 0xff; 
  205.         int namesizeLo = nameheadsize & 0x00ff; 
  206.         packetsize = packetsize + nameheadsize; 
  207.  
  208.         if (tType != ""
  209.         { 
  210.             //Type Header 
  211.             tTypeLen = tType.Length; 
  212.             typeheadsize = 3 + tTypeLen + 1; 
  213.             typesizeHi = (typeheadsize & 0xff00) / 0xff; 
  214.             typesizeLo = typeheadsize & 0x00ff; 
  215.             packetsize = packetsize + typeheadsize; 
  216.         } 
  217.  
  218.         //Body 
  219.         int fileLen = System.Text.Encoding.Default.GetBytes(tFileContent).Length;//tFileContent.Length; 
  220.         int fileheadsize = 3 + fileLen; 
  221.         int filesizeHi = (fileheadsize & 0xff00) / 0xff; ; 
  222.         int filesizeLo = fileheadsize & 0x00ff; ; 
  223.  
  224.         packetsize = packetsize + fileheadsize; 
  225.  
  226.         int packetsizeHi = (packetsize & 0xff00) / 0xff; 
  227.         int packetsizeLo = packetsize & 0x00ff; 
  228.  
  229.         byte[] tSendByte = new byte[packetsize]; 
  230.  
  231.         //PUT-final Header 
  232.         tSendByte[0] = reqtype;                    // Request type e.g. PUT-final 130 
  233.         tSendByte[1] = Convert.ToByte(packetsizeHi);        // Packetlength Hi 
  234.         tSendByte[2] = Convert.ToByte(packetsizeLo);        // Packetlength Lo 
  235.  
  236.         offset = 2; 
  237.  
  238.         //Name Header 
  239.         tSendByte[offset + 1] = 0x01;                  // HI for Name header     
  240.         tSendByte[offset + 2] = Convert.ToByte(namesizeHi);      // Length of Name header (2 bytes per char
  241.         tSendByte[offset + 3] = Convert.ToByte(namesizeLo);      // Length of Name header (2 bytes per char
  242.  
  243.         // Name+\n\n in unicode 
  244.         byte[] tNameU = System.Text.Encoding.BigEndianUnicode.GetBytes(tName); 
  245.         tNameU.CopyTo(tSendByte, offset + 4); 
  246.  
  247.         offset = offset + 3 + (tNameLength * 2); 
  248.         tSendByte[offset + 1] = 0x00;                  // null term 
  249.         tSendByte[offset + 2] = 0x00;                  // null term 
  250.  
  251.         offset = offset + 2; 
  252.  
  253.         if (tType != ""
  254.         { 
  255.             //Type Header 
  256.             tSendByte[offset + 1] = 0x42;                  // HI for Type Header 66 
  257.             tSendByte[offset + 2] = Convert.ToByte(typesizeHi);      // Length of Type Header 
  258.             tSendByte[offset + 3] = Convert.ToByte(typesizeLo);      // Length of Type Header 
  259.  
  260.             for (i = 0; i <= (tTypeLen - 1); i++) 
  261.             { 
  262.                 tSendByte[offset + 4 + i] = Convert.ToByte(Convert.ToChar(tType.Substring(i, 1))); 
  263.             } 
  264.             tSendByte[offset + 3 + tTypeLen + 1] = 0x00;            // null terminator 
  265.  
  266.             offset = offset + 3 + tTypeLen + 1; 
  267.         } 
  268.  
  269.         //Body 
  270.         tSendByte[offset + 1] = 0x49;                  //HI End of Body 73 
  271.         tSendByte[offset + 2] = Convert.ToByte(filesizeHi);      // 
  272.         tSendByte[offset + 3] = Convert.ToByte(filesizeLo);      //1k payload + 3 for HI header 
  273.  
  274.         //for (i = 0; i <= (fileLen - 1); i++) 
  275.         //{ 
  276.         //    tSendByte[offset + 4 + i] = Convert.ToByte(tFileContent.Substring(i, 1));//Convert.ToByte(Convert.ToChar(tFileContent.Substring(i, 1))); 
  277.         //} 
  278.         byte[] bfile = System.Text.Encoding.Default.GetBytes(tFileContent); 
  279.         for (i = 0; i <= bfile.Length - 1; i++) 
  280.         { 
  281.             tSendByte[offset + 4 + i] = bfile[i]; 
  282.         } 
  283.  
  284.         //tSendByte[offset+4+fileLen] = 0x00;              // null terminator 
  285.  
  286.         offset = offset + 3 + fileLen; 
  287.  
  288.         stream.Write(tSendByte, 0, tSendByte.Length); 
  289.  
  290.         //listen for server response 
  291.  
  292.         //TODO: can hang here forever waiting response... 
  293.  
  294.         bool x = stream.DataAvailable; // changed bluetoothclient - public NetworkStream GetStream() 
  295.  
  296.         byte[] tArray4 = new byte[3]; 
  297.         stream.Read(tArray4, 0, 3); 
  298.  
  299.         x = stream.DataAvailable; 
  300.  
  301.         if (tArray4[0] == 160) // 0xa0 
  302.         { 
  303.             int plength = (tArray4[1] * 256) + tArray4[2] - 3; 
  304.             byte[] tArray5 = new byte[plength]; 
  305.             if (plength > 0) 
  306.             { 
  307.                 stream.Read(tArray5, 0, plength); 
  308.                 //TODO: data in returned packet to deal with 
  309.             } 
  310.             return 160; 
  311.         } 
  312.  
  313.         if (tArray4[0] == 197) // 0xc5 Method not allowed 
  314.         { 
  315.             return 197; 
  316.         } 
  317.  
  318.         if (tArray4[0] == 192) // 0xc0 Bad Request 
  319.         { 
  320.             return 192; 
  321.         } 
  322.  
  323.         return 0; 
  324.     } 
  325.  
  326.     #endregion 

 

 

责任编辑:武晓燕 来源: 后端Q
相关推荐

2021-04-14 06:53:52

C# 修饰符 Public

2012-02-02 17:10:35

Windows PhoC#发送短信

2021-02-27 10:37:20

WindowsDocker版本

2012-02-24 09:04:51

云计算

2010-02-07 13:31:49

Ubuntu连接

2021-08-19 15:36:09

数据备份存储备份策略

2021-07-27 06:49:11

C#存储检索

2012-03-01 15:02:01

程凯傲游移动浏览器

2021-09-22 09:42:41

鸿蒙HarmonyOS应用

2009-09-03 17:31:34

C#发送邮件

2024-02-22 08:31:26

数据恢复工具MySQL回滚SQL

2012-03-05 10:19:23

微软Hadoop编程

2020-10-13 13:50:53

PCPC市场出货量

2016-12-01 13:06:31

技术大数据数据分析

2020-11-03 14:56:09

手机安全信息泄露漏洞

2011-06-28 09:27:07

2023-09-26 07:38:53

c#Lambda表达式

2009-09-03 17:40:25

C#发送短信

2021-03-02 07:33:13

开发C#字符

2012-08-02 09:17:55

云计算PC
点赞
收藏

51CTO技术栈公众号