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

概述

在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 OBEXOpenStreampublic bool OBEXOpenStream(string BTMAC){// serial port UUIDGuid spguid = OpenNETCF.Net.Bluetooth.BluetoothService.ObexObjectPush;OpenNETCF.Net.BluetoothAddress btaddress = OpenNETCF.Net.BluetoothAddress.Parse(BTMAC);client = new OpenNETCF.Net.Sockets.BluetoothClient();// define endpointOpenNETCF.Net.BluetoothEndPoint endpoint = new OpenNETCF.Net.BluetoothEndPoint(btaddress, spguid);try{//open socketclient.Connect(endpoint);}catch{//unable to connect (server not listening on spguid)return false;}//connect socketstream = client.GetStream();return true;}#endregion

3、配对连接

 private bool OBEXConnect(){//send client requestbyte[] ConnectPacket = new byte[7];ConnectPacket[0] = 0x80;      // ConnectConnectPacket[1] = 0x00;      // Packetlength Hi ByteConnectPacket[2] = 0x07;      // Packetlength Lo ByteConnectPacket[3] = 0x10;      // Obex v1ConnectPacket[4] = 0x00;      // no flagsConnectPacket[5] = 0x20;      // 8k max packet size Hi ByteConnectPacket[6] = 0x00;      // 8k max packet size Lo Bytestream.Write(ConnectPacket, 0, ConnectPacket.Length);//listen for server responsebyte[] ReceiveBufferA = new byte[3];stream.Read(ReceiveBufferA, 0, 3);if (ReceiveBufferA[0] == 160) // 0xa0{//success, decode rest of packetint plength = (0xff * ReceiveBufferA[1]) + ReceiveBufferA[2]; //length of packet is...//listen for rest of packetbyte[] 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 flagsint maxpack = (0xff * ReceiveBufferB[2]) + ReceiveBufferB[3]; //max packet sizereturn true;}else{return false;}}

4、发送文本内容

   //send client request, start putstring 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 ShowErrMsgprivate void ShowErrMsg(string err)
{string str;str = "<script language='javascript'>";str += " alert('" + err + "')";str += "</script>";this.RegisterStartupScript("", str);}#endregionprotected 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 putstring 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 OBEXOpenStreampublic bool OBEXOpenStream(string BTMAC)
{// serial port UUIDGuid spguid = OpenNETCF.Net.Bluetooth.BluetoothService.ObexObjectPush;OpenNETCF.Net.BluetoothAddress btaddress = OpenNETCF.Net.BluetoothAddress.Parse(BTMAC);client = new OpenNETCF.Net.Sockets.BluetoothClient();// define endpointOpenNETCF.Net.BluetoothEndPoint endpoint = new OpenNETCF.Net.BluetoothEndPoint(btaddress, spguid);try{//open socketclient.Connect(endpoint);}catch{//unable to connect (server not listening on spguid)return false;}//connect socketstream = client.GetStream();return true;}#endregion#region OBEXCloseStreamprivate void OBEXCloseStream()
{if (stream != null){stream.Close();}if (client != null){client.Close();}}#endregion#region  OBEXConnectprivate bool OBEXConnect()
{//send client requestbyte[] ConnectPacket = new byte[7];ConnectPacket[0] = 0x80;      // ConnectConnectPacket[1] = 0x00;      // Packetlength Hi ByteConnectPacket[2] = 0x07;      // Packetlength Lo ByteConnectPacket[3] = 0x10;      // Obex v1ConnectPacket[4] = 0x00;      // no flagsConnectPacket[5] = 0x20;      // 8k max packet size Hi ByteConnectPacket[6] = 0x00;      // 8k max packet size Lo Bytestream.Write(ConnectPacket, 0, ConnectPacket.Length);//listen for server responsebyte[] ReceiveBufferA = new byte[3];stream.Read(ReceiveBufferA, 0, 3);if (ReceiveBufferA[0] == 160) // 0xa0{//success, decode rest of packetint plength = (0xff * ReceiveBufferA[1]) + ReceiveBufferA[2]; //length of packet is...//listen for rest of packetbyte[] 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 flagsint maxpack = (0xff * ReceiveBufferB[2]) + ReceiveBufferB[3]; //max packet sizereturn true;}else{return false;}}#endregion#region OBEXRequestprivate int OBEXRequest(string tReqType, string tName, string tType, string tFileContent)
{//send client requestint 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 Headerint tNameLength = tName.Length;int nameheadsize = (3 + (tNameLength * 2) + 2);int namesizeHi = (nameheadsize & 0xff00) / 0xff;int namesizeLo = nameheadsize & 0x00ff;packetsize = packetsize + nameheadsize;if (tType != ""){//Type HeadertTypeLen = tType.Length;typeheadsize = 3 + tTypeLen + 1;typesizeHi = (typeheadsize & 0xff00) / 0xff;typesizeLo = typeheadsize & 0x00ff;packetsize = packetsize + typeheadsize;}//Bodyint 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 HeadertSendByte[0] = reqtype;                    // Request type e.g. PUT-final 130tSendByte[1] = Convert.ToByte(packetsizeHi);        // Packetlength HitSendByte[2] = Convert.ToByte(packetsizeLo);        // Packetlength Looffset = 2;//Name HeadertSendByte[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 unicodebyte[] tNameU = System.Text.Encoding.BigEndianUnicode.GetBytes(tName);tNameU.CopyTo(tSendByte, offset + 4);offset = offset + 3 + (tNameLength * 2);tSendByte[offset + 1] = 0x00;                  // null termtSendByte[offset + 2] = 0x00;                  // null termoffset = offset + 2;if (tType != ""){//Type HeadertSendByte[offset + 1] = 0x42;                  // HI for Type Header 66tSendByte[offset + 2] = Convert.ToByte(typesizeHi);      // Length of Type HeadertSendByte[offset + 3] = Convert.ToByte(typesizeLo);      // Length of Type Headerfor (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 terminatoroffset = offset + 3 + tTypeLen + 1;}//BodytSendByte[offset + 1] = 0x49;                  //HI End of Body 73tSendByte[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 terminatoroffset = 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
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新浪股票接口 java_新浪股票接口Android SDK(非官方)

新浪股票接口AndroidSDK昨天想到一个点子&#xff0c;需要访问股票行情。于是在网上搜了一下免费的股市行情的接口。发现新浪股票的数据接口比较稳定&#xff0c;于是就用它了。网上对于新浪股票的数据接口介绍比较详细&#xff0c;并且实现也很简单&#xff0c;所以花了一下午…

VC++的dll中接收消息

LRESULT CALLBACK MessageWinProc(HWND hwnd, // handle to windowUINT uMsg, // message identifierWPARAM wParam, // first message parameterLPARAM lParam // second message parameter)//用于处理消息窗口接收到的消息{switch(uMsg){case WM_CLOSE:DestroyW…

在职场中,长得漂亮真的有用吗?

非常有用。下面五张图&#xff0c;每张图介绍一个研究&#xff0c;都可以从一个侧面回答问题。01 企业对求职者的颜值有多看重&#xff1f;这张图来自两位学者对国内某网站超过100万份招聘广告的分析结果。总的来看&#xff0c;有7.7%的企业会对应聘者的外貌提出要求&#xff0…

TIOBE 3月榜单:新功能将加入,C语言仍高居榜首

喜欢就关注我们吧&#xff01;TIOBE 公布了 2021 年 3 月的编程语言排行榜。本月 TIOBE 指数没有什么有趣的变化。因此&#xff0c;TIOBE CEO Paul Jansen 表示&#xff0c;其打算透露一些近期将加入至榜单中的新功能。第一个问题涉及到一个 bug 修复。由于使用了复杂的算法&am…

java jdk win10安装_Java 安装 JDK WIN10

JDK的全称是Java SE Development Kit它的官方网站只要用Goole搜索下即可找到&#xff0c;官方提供JDK8、11、12的下载入口。我们点击Java SE Development Kit 8进入下载。我们下载的版本是jdk-8u91-windows-x64.exe安装过程按导向默认安装&#xff0c;中途什么选项都不改。安装…

twitter达人不能不知的缩写

今天上午有人在新闻编辑室问“嘿&#xff0c;Twitter上的MT是什么意思&#xff1f;”&#xff0c;让我们觉得编制一个Twitter缩写的列表可能会有帮助。 这就是为什么我们要做这些的原因。想要全面地完成其实不容易&#xff0c;所以请在评论中增加这个列表中缺失的缩写吧。技术类…

50张神图……好不容易才找到完整版!

描述&#xff1a;1.耶鲁大学耗时5年的研究成果。 如果你看见这个舞女是顺时针转&#xff0c;说明你用的是右脑 如果是逆时针转&#xff0c;说明你用的左脑。 据说&#xff0c;14%的美国人可以两个方向都能看见 可以和别人一起看&#xff0c;测试下&#xff0c;一般不同人同时看…

BeetleX.Http.Clients V1.5发布

组件开始设计是针对以接口的方式来定义HTTP/HTTPS访问&#xff0c;虽然基于接口来操作有很大的便利性&#xff0c;但定义起来就比较麻烦了。所以在1.5版本中实现了一个HttpClient类来简化调用。HttpClient 该类支持HTTP的GET,POST,DELETE和PUT操作&#xff0c;通过这几个…

java set spliterator_Java HashSet spliterator() 方法

Java HashSet spliterator() 方法spliterator() 用于在HashSet中的元素上创建后绑定和故障快速的Spliterator。将后期绑定的Spliterator绑定到元素的来源意味着HashSet在第一次遍历&#xff0c;第一次拆分或第一次查询估计大小时&#xff0c;而不是在创建Spliterator时。它可以…

系统的crontab设定:/etc/crontab

crontab -e 是针对用户的cron来设计的&#xff0c;如果是系统的例行性任务&#xff0c;该怎么办&#xff1f;是否还是需要以crontab -e来管理例行性命令&#xff1f;当然不需要&#xff0c;您只需要编辑/etc/crontab文件就可以了。需要注意的是&#xff1a;crontab -e的作用其实…

编程到底难在哪里?

写在前面&#xff1a;这篇回答并不是讲述在生活中程序员如何买苹果&#xff0c;而是以买苹果为例说明程序员如何解决问题。程序员需要对问题进行透彻的分析&#xff0c;理清其涉及的所有细节&#xff0c;预测可能发生的所有意外与非意外的情况&#xff0c;列出解决方案的所有步…

DDD实战课--学习笔记

目录学好了DDD&#xff0c;你能做什么&#xff1f;领域驱动设计&#xff1a;微服务设计为什么要选择DDD&#xff1f;领域、子域、核心域、通用域和支撑域&#xff1a;傻傻分不清&#xff1f;限界上下文&#xff1a;定义领域边界的利器实体和值对象&#xff1a;从领域模型的基础…

java 字符utf8编码_java字符串转utf8编码

Java中ASC码与字符互相转化_计算机软件及应用_IT/计算机_专业资料。Java 中 ASC 码与字符互相转化 packagecom.ljq.test; /** * Java 中 ASC 码与字符互相转化......JAVA 字符串转日期或日期转字符串(转) 2010-08-16 16:34:03| 分类: java |字号 订阅 JAVA 字符串转日期或日期转…

如何预测未来房价的发展

1946年2月16日&#xff0c;是一个值得纪念的日子。在这一天&#xff0c;人类历史上真正意义上的第一台电子计算机诞生了&#xff0c;此后计算机便随着科技的发展以强大的生命力飞速发展着。而作为用来定义计算机程序的形式语言——编程语言也紧跟计算机其后蓬勃发展&#xff0c…

《进击吧!Blazor!》系列入门教程 第一章 7.图表

作者备注《进击吧&#xff01;Blazor&#xff01;》是本人与张善友老师合作的Blazor零基础入门系列视频&#xff0c;此系列能让一个从未接触过Blazor的程序员掌握开发Blazor应用的能力。视频地址&#xff1a;https://space.bilibili.com/483888821/channel/detail?cid151273Bl…

java 最好 入门_C++和Java哪个比较好入门?初学者该如何选择?

选择好的方向比努力更重要&#xff0c;对于初学编程的人来说选择一门合适的编程语言关系到自己以后的职业发展。c和Java那个更适合作为入门语言?给大家简单科普一下~C语言它是正宗的C语言的嫡系&#xff0c;由C语言发展而来。C支持多种编程范式 --面向对象编程、泛型编程和过程…

为什么要实施服务器虚拟化

实施了服务器虚拟化能为我们带来什么&#xff1f;1.基础架构的利用率。通过将基础架构资源池化并打破一个应用一台物理机的藩篱&#xff0c;虚拟化大幅提升了资源利用率。通过减少额外硬件的采购&#xff0c;企业可以获得大幅成本节约。2. 安全性。通过将操作系统和应用从服务器…

一日一技:ASP.NET Core Api网关Ocelot初探

概述Ocelot面向使用.NET运行微型服务/面向服务的体系结构的人员&#xff0c;这些体系结构需要在系统中具有统一的入口点。特别是我想与IdentityServer参考和承载令牌轻松集成。Ocelot是按特定顺序排列的一堆中间件。Ocelot将HttpRequest对象操作到由其配置指定的状态&#xff0…

盘点那些让程序员目瞪口呆的Bug都有什么?

程序员一生与bug奋战&#xff0c;可谓是杀敌无数&#xff0c;见怪不怪了&#xff01;在某知识社交平台中&#xff0c;一个“有哪些让程序员目瞪口呆的bug”的话题引来了6700多万的阅读&#xff0c;可见程序员们对这个话题的敏感度有多高。1、麻省理工“只能发500英里的邮件”该…

mysql heartbeat 慢_MySQL 主从延迟监控脚本(pt-heartbeat)

对于MySQL数据库主从复制延迟的监控&#xff0c;我们可以借助percona的有力武器pt-heartbeat来实现。pt-heartbeat通过使用时间戳方式在主库上更新特定表&#xff0c;然后在从库上读取被更新的时间戳然后与本地系统时间对比来得出其延迟。本文主要是通过脚本来定期检查从库与主…