首页 > 编程语言 >如何用C#在PC上查找连接蓝牙设备并实现数据传输

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

时间:2023-08-04 16:34:51浏览次数:41  
标签:tSendByte ConnectPacket C# 蓝牙 PC int offset byte OpenNETCF

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

#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、配对连接

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 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、发送文本内容

1 2 3 4 5 6 7 8 9 10 //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
}

标签:tSendByte,ConnectPacket,C#,蓝牙,PC,int,offset,byte,OpenNETCF
From: https://www.cnblogs.com/skynight/p/17606336.html

相关文章

  • 一些有趣的C++代码
    本文混合搅碎剁烂转载。。。 1:绘制曲线 #include<bits/stdc++.h>usingnamespacestd;intmain(){intx,m;for(doublei=1;i>=-1;i-=0.1){m=acos(i)*10;for(x=1;x<m;x++)cout<<"";cout<&l......
  • TSINGSEE青犀视频安防监控EasyCVR平台海康大华设备国标GB28181告警布防的报文说明
    TSINGSEE青犀视频监控综合管理平台EasyCVR基于云边端协同,可支持海量视频的轻量化接入与汇聚管理。平台既具备传统安防视频监控的能力,比如:视频监控直播、云端录像、云存储、录像检索与回看、告警上报、平台级联、云台控制、语音对讲等,也能接入AI智能分析的能力,包括人脸检测、车辆检......
  • C#调用打印机实现打印
    一、引用BarcodeStandard.dll#regionBarcodeStandard.dll/***使用说明需要通过NuGet进行安装BarcodeLib.dll,必不可少*/stringinputString;///<summary>///获取所以打印机驱动名称///</s......
  • k8s部署DataEase1.16.0cluster模式
    1.下载官方helm  chart包下载地址:https://github.com/mfanoffice/dataease-helm/releases,当前最新为1.16.0#下载并解压helmchart包wgethttps://github.com/mfanoffice/dataease-helm/releases/download/1.16.0/dataease-1.16.0.tgztarxfdataease-1.16.0.tgzcddataease......
  • [Javascript] event target and currentTarget
    <Parent><child><button/></child></Parent>functiononClick(event){console.log('target:',event.target)//buttonconsole.log('currentTarget',event.currentTarget)//parent}pa......
  • 使用Locust进行接口性能测试:安装、命令参数解析与示例解读(一)
    “Locust是一款开源的Python性能测试工具,它可以模拟大量并发用户对网站或者其他接口进行压力测试”一、Locust简介与安装1.使用pip安装Locust:pip3installlocust2.通过GitHub克隆项目并安装(推荐Python3):gitclonehttps://github.com/locustio/locustcdlocustpython......
  • Mitsubishi 三菱FXPLC学习之数据处理指令(下)
    本来打算花一篇文章的篇幅来写数据处理指令的,但写着写着发现,一篇文章根本写不完QAQ。上篇文章结束得有点突兀,那这里也再不啰嗦,我们直奔主题吧。01、字交换指令XCH字交换指令,顾名思义,就是将两个字软元件的数据相互交换。从编程手册的截图可以看到,XCH指令可以用于16位和32位......
  • Js中的Function和function
    Js中的Function和function起因最近收到一份渗透测试报告,里面指出了一个xss漏洞。在看报告的过程中,对于payload的生效有一些疑问。于是查询了一些js语法的相关内容,总结一下关于Funtion和funtion的相关知识。最后也列举一下目前常用的xss绕过技巧。生效载核:Function(atob`YWxlcn......
  • C语言学习笔记(七)初识结构体
    初识结构体结构体的声明结构体的基础知识结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构的声明struct标签{ 值; 值; ……}变量列表;例://定义一个结构体类型structStu//struct-结构体关键字Stu-结构体标签structStu-结......
  • 使用Locust进行接口性能测试:Locust and TaskSet类详细分析(二)
    “Locust是一款开源的Python性能测试工具,它可以模拟大量并发用户对网站或者其他接口进行压力测试”一、Locust类详细说明在Locust中,Locust类是整个负载测试工具的核心。它用于创建并发用户场景,模拟用户行为。示例:fromlocustimportLocust,TaskSet,task#每一个Locust类,......