400-028-6601
建站资讯

网站建设资讯

为你提供网站建设行业资讯、网站优化知识、主机域名邮箱、网站开发常见问题等。

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

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

网站题目:C#在PC上的通过蓝牙(Bluetooth)发送数据到手机,你会吗?
文章链接:http://www.hnjierui.cn/article/dheggod.html

其他资讯