首页 > 编程语言 >C# 在PC上的通过蓝牙(bluetooth)发送数据到手机

C# 在PC上的通过蓝牙(bluetooth)发送数据到手机

时间:2023-03-07 19:15:32浏览次数:48  
标签:tSendByte ConnectPacket C# bluetooth int offset 发送数据 byte OpenNETCF

C# 在PC上的通过蓝牙(bluetooth)发送数据到手机

2023-01-27 09:32·opendotnet

概述

在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 != ) { stream.Close(); } if (client != ) { 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; // term tSendByte[offset + 2] = 0x00; // 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; // 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; // 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#,bluetooth,int,offset,发送数据,byte,OpenNETCF
From: https://www.cnblogs.com/sexintercourse/p/17189210.html

相关文章

  • web界面的HMI/SCADA组态
    web界面的HMI/SCADA组态2022-12-0207:39·程序员修仙之路一、项目简介今天要说的是一个web界面的HMI/SCADA组态,支持各种图形,支持拖拽,支持放缩。大致流程是,通过拖拽控件......
  • 优化 CSS 代码的12个小技巧
    优化CSS代码的12个小技巧2022-11-2509:03·Echa攻城狮 大家好,我是Echa。今天来分享12个优化CSS代码小技巧!1.避免高消耗属性分析表明,一些CSS属性的渲染速......
  • 2-warmup_csaw_2016
    warmup_csaw_2016题目链接https://buuoj.cn/challenges#warmup_csaw_2016检查保护IDA分析mainsub_40060D栈_v5漏洞:此处的gets存在栈溢出运行问题此处movap......
  • 48个高颜值的CSS在线工具大全
    48个高颜值的CSS在线工具大全原创2023-01-1308:00·Echa攻城狮 大家好,我是Echa。最近有一部分粉丝们总是私信小编,作为一个前端或者全栈程序员怎么系统化学CSS,怎么......
  • [ARC085E] MUL
    [ARC085E]MUL随机化贪心初探,真不错。有一个显然的贪心:每次选一个数,考虑删去它的倍数是否能使答案更优,然后贪心做,这样显然是错的。但是我们乱搞一下,每次做之前随机一个......
  • 浅析 SplitChunksPlugin 及代码分割的意义
    起因有同事分享webpack的代码分割,其中提到了SplitChunksPlugin,对于文档上的描述大家有着不一样的理解,所以打算探究一下。Q:什么是SplitChunksPlugin?SplitChunksPlugin是......
  • 推荐 7 个有用的 JavaScript 库,也许你会用的上
    推荐7个有用的JavaScript库,也许你会用的上原创2023-02-1016:52·前端达人使用这7个库,加速你的项目开发 当我们可以通过使用库轻松实现相同的结果时,为什么还要......
  • S2 - Lesson 42 - Not very musical
    Words musicalsnake market movement snakecharmer continue pipe dance obviouslytune difference glimpseIndian       ......
  • Ubuntu18.04安装Docker完整教程
    1.更新软件源列表sudoaptupdate2.安装软件包依赖sudoaptinstallapt-transport-httpsca-certificatescurlsoftware-properties-common3.在系统中添加Docker的......
  • C#随记04
    面向对象程序设计将数据和对数据的操作看作是一个不可分割的整体,力求将现实问题简单化。尽量复合人们的思维习惯,提高软件的开发效率,并方便后期的维护。对象具有唯一性......