如何用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#,蓝牙,数据传输
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
解决SpringBoot框架因post数据量过大没反应问题(踩坑)
2023-11-28 11:59:30
Android Jetpack组件中LifeCycle作用详细介绍
2022-05-14 04:56:15
![](https://img.aspxhome.com/file/2023/2/89542_0s.png)
mybatis plus使用redis作为二级缓存的方法
2023-11-19 08:34:58
![](https://img.aspxhome.com/file/2023/0/63150_0s.png)
Java经典排序算法之插入排序
2022-08-29 11:08:39
![](https://img.aspxhome.com/file/2023/7/72367_0s.jpg)
为什么不建议使用Java自定义Object作为HashMap的key
2021-09-21 06:15:05
![](https://img.aspxhome.com/file/2023/6/72616_0s.webp)
C#与C++ dll之间传递字符串string wchar_t* char* IntPtr问题
2022-09-16 09:34:53
Java实现添加,读取和删除Excel图片的方法详解
2023-11-27 06:29:33
![](https://img.aspxhome.com/file/2023/8/60328_0s.png)
解决java启动时报线程占用报错:Exception in thread “Thread-14“ java.net.BindException: Address already in use: bind
2021-07-05 04:26:23
![](https://img.aspxhome.com/file/2023/3/83583_0s.png)
Android SDK Manager解决更新时的问题 :Failed to fetch URL...
2023-03-17 23:23:36
解析Spring事件发布与监听机制
2022-09-01 09:52:19
![](https://img.aspxhome.com/file/2023/6/88586_0s.jpg)
Jmeter分布式压力测试实现过程详解
2022-03-23 21:32:44
![](https://img.aspxhome.com/file/2023/0/63040_0s.png)
SpringMVC中的几个模型对象
2021-09-01 19:25:44
详解IDEA启动多个微服务的配置方法
2023-11-24 09:22:24
![](https://img.aspxhome.com/file/2023/0/59660_0s.png)
Java创建和启动线程的两种方式实例分析
2023-12-05 08:26:59
RecyclerView实现拖拽排序效果
2022-09-14 01:23:40
![](https://img.aspxhome.com/file/2023/7/93307_0s.gif)
Spring Boot详解配置文件的用途与用法
2022-08-01 20:37:27
![](https://img.aspxhome.com/file/2023/4/77954_0s.png)
java反射之Method的invoke方法实现教程详解
2023-07-09 20:24:36
![](https://img.aspxhome.com/file/2023/2/66632_0s.png)
SpringBoot集成EasyExcel的应用场景分析
2023-01-09 07:47:45
![](https://img.aspxhome.com/file/2023/6/78876_0s.png)
Java实现在线聊天室(层层递进)
2022-06-13 11:03:47
![](https://img.aspxhome.com/file/2023/3/91093_0s.jpg)
C#开发教程之利用特性自定义数据导出到Excel
2023-03-02 22:55:42
![](https://img.aspxhome.com/file/2023/1/82231_0s.png)