本文转自:https://blog.csdn.net/YSSJZ960427031/article/details/50990372

前言
如题,如果你也想用C#在windows上操控电脑自带蓝牙,但是,不知从何下手,那就该看看这篇文章——这篇文章将带领你入道。也正是这样,这篇文章的主要内容是介绍操控蓝牙所需的支持库,以及从哪里下载最新版的支持库,并教你如何自学与蓝牙开发相关的更多知识等。本文涵盖了经典蓝牙(蓝牙2.0版本)和低功耗蓝牙(即BLE,蓝牙4.0版本)。

正文
有过一定编程经验的人都知道,要想操控某个平台上的一个硬件,第一件事就是搞清楚这个系统平台提供了哪些与该硬件相关的API给开发者用,或者,操控该硬件的第三方支持库有哪些。找到这些是第一步,也是最关键的一步。就像治病,首先要找到能治这个病的药,然后找到药的说明书,照着说明书“按时按量吃药治病”——做了个比较形象的比喻。之于开发人员,在找到支持库后,就该去找支持库作者提供的使用指南,然后按照使用指南学习使用这个支持库。那么,针对“不知道如何操控Windows上的蓝牙”这个病该用哪味药呢?——药就是这篇文章啦。现在就来按照说明书吃药啦。
下面分别介绍经典蓝牙和BLE相关的支持库。

经典蓝牙
稍微用诸如“C# 蓝牙”这样的关键词百度、Google下,就会发现InTheHand.Net.Personal.dll这个支持库,对!操控经典蓝牙就用这个。

简要介绍
InTheHand.Net.Personal.dll这个支持库是In The Hand公司下32FEET.NET这个项目的成果。该公司由Peter Foot创办,注册在英国。下文贴一张摘自官网的照片——看!就是这么帅,这才是男神级别的人物!

可通过如下链接了解更多的信息:

In The Hand官网
官网中对32FEET.NET项目的介绍
32FEET.NET项目的源码托管地址
当给出了如上三个链接后,尤其是第三个,这部分的重点内容基本都讲完了。因为在“32FEET.NET项目的源码托管地址”这个页面中,就可以下载到最新版本的InTheHand.Net.Personal.dll这个支持库,也有这个库的使用指南,如下图所示:

下载支持库
说了这么多,这有个重点:生活在天朝,由于墙的存在,我们错过了很多人间的精彩。所以,你懂了……我为大家下载了最新的(2016.3.20下载) .Net 3.5和 .Net 3.7版本的InTheHand.Net.Personal.dll,你可从如下地址下载,里面附有简要的使用说明,使用零门槛:

CSDN下载:C#蓝牙编程开源库_InTheHand.Net.Personal.dll
百度云盘下载:InTheHand.Net.Personal
使用示例
具体使用可参照官方的指导文档,也可以看看相关的博客,下面仅以我写过的控制笔记本电脑蓝牙来开门的代码演示下,要特别注意我在下边代码的注释中提到的3个注意——我是从这些坑中爬出来的有经验的人。

using System;
using System.IO;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
// [注意1]:要添加如下三个命名空间
using InTheHand.Net;
using InTheHand.Net.Bluetooth;
using InTheHand.Net.Sockets;

namespace TestBluetooth
{
class Program
{
static void Main(string[] args)
{
BluetoothRadio bluetoothRadio = BluetoothRadio.PrimaryRadio;
if (bluetoothRadio == null)
{
Console.WriteLine("没有找到本机蓝牙设备!");
}
else
{
Program p = new Program();
p.localAdapterInfo(bluetoothRadio);
p.openDoor();
}
}

/**
* 连接目标蓝牙设备发送开门指令
* **/
private void openDoor()
{
BluetoothClient cli = new BluetoothClient();
BluetoothAddress addr = null;
BluetoothEndPoint ep = null;
try
{
// [注意2]:要注意MAC地址中字节的对应关系,直接来看顺序是相反的,例如
// 如下对应的MAC地址为——12:34:56:78:9a:bc
addr = new BluetoothAddress(new byte[] { 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12 });
ep = new BluetoothEndPoint(addr, BluetoothService.SerialPort);
cli.Connect(ep); // 连接蓝牙
if (cli.Connected)
{
Stream peerStream = cli.GetStream();
peerStream.WriteByte(0xBB); // 发送开门指令
}
}
catch (SocketException e)
{
Console.WriteLine(e.Message);
}
finally
{
if (cli != null)
{
// [注意3]:要延迟一定时间(例如1000毫秒)
//避免因连接后又迅速断开而导致蓝牙进入异常(傻逼)状态
Thread.Sleep(1000);
cli.Close();
}
}
}

/**
*
* 显示本地蓝牙的信息
*
* **/
private void localAdapterInfo(BluetoothRadio bluetoothRadio)
{
Console.WriteLine("ClassOfDevice: " + bluetoothRadio.ClassOfDevice);
Console.WriteLine("HardwareStatus: " + bluetoothRadio.HardwareStatus);
Console.WriteLine("HciRevision: " + bluetoothRadio.HciRevision);
Console.WriteLine("HciVersion: " + bluetoothRadio.HciVersion);
Console.WriteLine("LmpSubversion: " + bluetoothRadio.LmpSubversion);
Console.WriteLine("LmpVersion: " + bluetoothRadio.LmpVersion);
Console.WriteLine("LocalAddress: " + bluetoothRadio.LocalAddress);
Console.WriteLine("Manufacturer: " + bluetoothRadio.Manufacturer);
Console.WriteLine("Mode: " + bluetoothRadio.Mode);
Console.WriteLine("Name: " + bluetoothRadio.Name);
Console.WriteLine("Remote:" + bluetoothRadio.Remote);
Console.WriteLine("SoftwareManufacturer: " + bluetoothRadio.SoftwareManufacturer);
Console.WriteLine("StackFactory: " + bluetoothRadio.StackFactory);
}
}
}
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
BLE
(PS:以下所述,都是假设你的笔记本上的蓝牙是支持BLE特性的)
毕竟智能硬件兴起,还玩经典蓝牙显得有点Low。那么,问题来了,在电脑上可不可以使用BLE呢?答案是——可以!
但是,有条件限制:只能在Windows 8、Windows 8.1、Windows 10上玩。这个消息也不算太坏哈。
Q:为什么Windows 7上不能玩呢?
A:因为Windows 7及其以下的Windows操作系统中的蓝牙协议栈不支持BLE特性。这就比如,你分明在你的笔记本上接了一台带扫描功能的打印机,但是你只能打印却用不了扫描功能,因为你装的驱动不支持扫描功能。电脑面对的是一台既可以打印又可以扫描的的机器,但是就是不知道如何去控制它来进行扫描。同理,如果硬件支持了BLE(即蓝牙4.0)特性,但是蓝牙协议栈里缺少一些支持这些特性的内容,就没得玩了。
Q:那么,我可以装个强大点的“驱动”么?
A:不可以,这个协议栈不同于一般的驱动,Windows的源码是微软老大哥一手掌控的,没有源码,我们装不进去!
Q:那么,真的就没得完了么?
A:换系统呗,换成8及其以上的,一切妥妥的!
想知道Windows系统对蓝牙的具体支持情况,请点击:General Bluetooth Support in Windows

BLE支持库
首先,InTheHand.Net.Personal.dll这个库不支持BLE,因为,Windows系统有与BLE相关的API了,作者表示暂时没有考虑在Windows的API上再包一层,详情可见论坛的帖子:Bluetooth Low Energy Support,男神是这么回复的:

不过回复时间是2013.5.15,有点久远了,最新的情况,有兴趣的可以继续一探究竟。
使用Windows的提供API:详情见Windows.Devices.Bluetooth.GenericAttributeProfile namespace
与Windows开发相关的“说明书”,可以从Windows开发者中心获得。沿着这条路,你也可以直接走到与蓝牙开发相关的部分:
Windows 开发者中心—>文档—>应用—>API参考—>Windows运行时API
—> Windows.Devices.Bluetooth.GenericAttributeProfile namespace
温馨提示
学习GATT协议是进行BLE开发的基础,BLE的通讯方式和经典蓝牙的通讯方式有很大的区别,要注意思维转换,如果还是从Socket通讯的方式来学习BLE的话,可能会遇到麻烦。

结语
我用C#操作笔记本电脑的蓝牙来开门也是出于兴趣,上文正是记录了我从当初的无处下爪到最后有成果这个过程中的经验所得,记录并将其分享出来,希望能够给大家一些帮助、鼓励甚至启发,如果能通过我的文字让别人不要走我走过的弯路,哪怕只有一个,也甚是欣慰了。
---------------------
作者:Geek-Boy
来源:CSDN
原文:https://blog.csdn.net/YSSJZ960427031/article/details/50990372
版权声明:本文为博主原创文章,转载请附上博文链接!

[转]用C#在windows上操控电脑自带蓝牙(入道指南)的更多相关文章

  1. 电脑出现“损坏的图像”窗口提示dll没有被指定在Windows上运行如何解决

    电脑中出现了无法运行应用程序的情况,弹出一个“***.exe - 损坏的图像”的窗口,上面提示“***.dll没有被指定在Windows上运行……”,如果我们遇到这样的问题,应该要如何解决呢? 1.我 ...

  2. # 【ARM-Linux开发】在Win7的电脑上直接运行安装Ubuntu14.04发生的问题 标签(空格分隔): 【Linux开发】 --- > 一段时间以来,一直是在Windows上安装虚拟机

    [ARM-Linux开发]在Win7的电脑上直接运行安装Ubuntu14.04发生的问题 标签(空格分隔): [Linux开发] 一段时间以来,一直是在Windows上安装虚拟机,然后安装Ubuntu ...

  3. Windows 上安装 Jekyll.

    Jekyll是一个静态网站生成工具.它允许用户使用HTML.Markdown或Textile来建立静态页面,然后通过模板引擎Liquid(Liquid Templating Engine)来运行. 原 ...

  4. 在Mac/Linux/Windows上编译corefx遇到的问题及解决方法

    这两天尝试在Mac/Linux/Windows三大平台上编译.NET跨平台三驾马车(coreclr/corefx/dnx)之一的corefx(.NET Core Framework),结果三个平台的编 ...

  5. Windows上搭个Nginx集群环境玩玩

    一.在windows上安装nginx 1.从这里下载nginx的windows版本 2.把压缩文件解压至c盘根目录,并将文件夹重命名成nginx 3.在conf目录下的nginx.conf文件中,指定 ...

  6. Maven 3.3.9在Windows上的安装

    开始学Maven了,可是我一个项目都木有做过.听过Maven 的大名,用来构建项目的. 下面记录下我安装Maven的过程 1.确认电脑上安装了JDK 在cmd下执行下列命令: java –versio ...

  7. 如何解决Python脚本在Linux和Windows上的格式问题

    python是一种对缩进有严格要求的语言, Python脚本可以使用非常多的工具进行编写,笔者在Linux系统使用JEdit进行Python脚本编写,由于在Linux编写脚本比较痛苦,比如想一眼看出相 ...

  8. 写一个Windows上的守护进程(8)获取进程路径

    写一个Windows上的守护进程(8)获取进程路径 要想守护某个进程,就先得知道这个进程在不在.我们假设要守护的进程只会存在一个实例(这也是绝大部分情形). 我是遍历系统上的所有进程,然后判断他们的路 ...

  9. EJBCA 在windows上的安装

    为了做EJBCA的封装測试,在我自己电脑上装了个,可是在国内的开发上面的介绍实在是太少.有的也仅仅是些傻瓜式的安装介绍,这是介绍在Windows上安装的过程,(后面介绍下 linux 红帽上的),有些 ...

随机推荐

  1. Apache Tomcat Eclipse Integration

    An Illustrated Quick Start Guide Apache Tomcat makes hosting your applications easy. The Eclipse IDE ...

  2. Drools为什么没有规则流Flow Flie

    哪个大神能告诉我,我安装的是Drools7.7.0,为什么没有网上说的flow file啊?怎么才能出来规则流呢? 上图是我本地的显示,下图是网上的图片.

  3. VSCode插件开发全攻略(九)常用API总结

    更多文章请戳VSCode插件开发全攻略系列目录导航. 本文提炼一些常见的API使用场景供参考,本文内容有待完善. 编辑器相关 修改当前激活编辑器内容 替换当前编辑器全部内容: vscode.windo ...

  4. 快速制作U盘启动盘和U盘安装盘的方法

    制作U盘启动盘的方法: 1. 安装UltraISO; 2. 安装完成后,用管理员权限打开UltraISO; 3. 打开启动盘文件,一般为ISO文件: 4. 插入U盘: 5. 选择 启动 -> 写 ...

  5. 动态调试|Maccms SQL 注入分析(附注入盲注脚本)

    0x01 前言 已经有一周没发表文章了,一个朋友叫我研究maccms的代码审计,碰到这个注入的漏洞挺有趣的,就在此写一篇分析文. 0x02 环境 Web: phpstudySystem: Window ...

  6. CentOS7设置固定IP

    在安装完CentOS7后,当我每次启动CentOS并使用SecureCRT链接时,都发现CentOS的IP总是在变,这就很苦恼了,总不能每次链接的时候都先查一下虚拟机的IP吧,所以打算把它设置成固定I ...

  7. C++ Opencv split()通道分离函数 merge()通道合并函数 使用操作详解

    一. split()通道分离函数 split()函数的C++版本有两个原型,他们分别是: C++: void split(const Mat& src, Mat*mvbegin);//& ...

  8. 《http权威指南》读书笔记18

    概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...

  9. str() vs repr() in Python

    str() 和 repr() 都是用作一个对象的字符表示. 1 str()的举例: s = 'Hello, Geeks.' print str(s) print str(2.0/11.0) 输出结果: ...

  10. Scala - 快速学习06 - 面向对象

    1- 类 1.1- 简介:类.方法及对象 类是用来创建对象的蓝图. Scala文件中包含的多个类之间,都是彼此可见的,不需要声明为public. 创建对象 定义好类以后,就可以使用new关键字来创建对 ...