如何用C#在PC上查找连接蓝牙设备并实现数据传输

作者:UP技术控 时间:2021-11-04 07:54:42 

目录
  • 概述

  • 代码实现

  • 完整代码

概述

在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 = "<script language='javascript'>";
 str += " alert('" + err + "')";
 str += "</script>";
 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 != null)
 {
  stream.Close();
 }
 if (client != null)
 {
  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: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 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+\n\n in unicode
 byte[] tNameU = System.Text.Encoding.BigEndianUnicode.GetBytes(tName);
 tNameU.CopyTo(tSendByte, offset + 4);

offset = offset + 3 + (tNameLength * 2);
 tSendByte[offset + 1] = 0x00;     // null term
 tSendByte[offset + 2] = 0x00;     // null 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 <= (tTypeLen - 1); i++)
  {
   tSendByte[offset + 4 + i] = Convert.ToByte(Convert.ToChar(tType.Substring(i, 1)));
  }
  tSendByte[offset + 3 + tTypeLen + 1] = 0x00;   // null terminator

offset = offset + 3 + tTypeLen + 1;
 }

//Body
 tSendByte[offset + 1] = 0x49;     //HI End of Body 73
 tSendByte[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 terminator

offset = 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
}

来源:https://www.cnblogs.com/lyl6796910/p/14518304.html

标签:c#,蓝牙,数据传输
0
投稿

猜你喜欢

  • 解决SpringBoot框架因post数据量过大没反应问题(踩坑)

    2023-11-28 11:59:30
  • Android Jetpack组件中LifeCycle作用详细介绍

    2022-05-14 04:56:15
  • mybatis plus使用redis作为二级缓存的方法

    2023-11-19 08:34:58
  • Java经典排序算法之插入排序

    2022-08-29 11:08:39
  • 为什么不建议使用Java自定义Object作为HashMap的key

    2021-09-21 06:15:05
  • C#与C++ dll之间传递字符串string wchar_t* char* IntPtr问题

    2022-09-16 09:34:53
  • Java实现添加,读取和删除Excel图片的方法详解

    2023-11-27 06:29:33
  • 解决java启动时报线程占用报错:Exception in thread “Thread-14“ java.net.BindException: Address already in use: bind

    2021-07-05 04:26:23
  • Android SDK Manager解决更新时的问题 :Failed to fetch URL...

    2023-03-17 23:23:36
  • 解析Spring事件发布与监听机制

    2022-09-01 09:52:19
  • Jmeter分布式压力测试实现过程详解

    2022-03-23 21:32:44
  • SpringMVC中的几个模型对象

    2021-09-01 19:25:44
  • 详解IDEA启动多个微服务的配置方法

    2023-11-24 09:22:24
  • Java创建和启动线程的两种方式实例分析

    2023-12-05 08:26:59
  • RecyclerView实现拖拽排序效果

    2022-09-14 01:23:40
  • Spring Boot详解配置文件的用途与用法

    2022-08-01 20:37:27
  • java反射之Method的invoke方法实现教程详解

    2023-07-09 20:24:36
  • SpringBoot集成EasyExcel的应用场景分析

    2023-01-09 07:47:45
  • Java实现在线聊天室(层层递进)

    2022-06-13 11:03:47
  • C#开发教程之利用特性自定义数据导出到Excel

    2023-03-02 22:55:42
  • asp之家 软件编程 m.aspxhome.com