分享

用C#在windows上操控电脑自带蓝牙(入道指南)

 goodwangLib 2019-03-09

前言

如题,如果你也想用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创办,注册在英国。下文贴一张摘自官网的照片——看!就是这么帅,这才是男神级别的人物!
这里写图片描述

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

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

下载支持库

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

使用示例

具体使用可参照官方的指导文档,也可以看看相关的博客,下面仅以我写过的控制笔记本电脑蓝牙来开门的代码演示下,要特别注意我在下边代码的注释中提到的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);
        }
    }
}

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#操作笔记本电脑的蓝牙来开门也是出于兴趣,上文正是记录了我从当初的无处下爪到最后有成果这个过程中的经验所得,记录并将其分享出来,希望能够给大家一些帮助、鼓励甚至启发,如果能通过我的文字让别人不要走我走过的弯路,哪怕只有一个,也甚是欣慰了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多