之前做项目的时候,需要使用电脑程序通过蓝牙向硬件设备发送指令,于是便研究了一下怎么用C#程序和蓝牙进行通信。
1、思路
- 电脑蓝牙和蓝牙模块配对连接
和我们平时正常连接蓝牙设备一样,需要先搜索附近的蓝牙设备,然后根据设备名来选择要连接的蓝牙模块,连接时就根据该蓝牙模块的地址(惟一标识号)来进行连接。 - 发送数据给蓝牙模块
发送的过程就和平时读写文件很类似,只是IO流不一样的区别
2、实现
2.1 使用的库
C#进行蓝牙操作需要用到的库是 InTheHand.Net。在VS中可以直接在Nuget中安装,这是我觉得VS最好用的一个找各种库的最好的方法。
工具菜单->NuGet包管理器->管理解决方案的Nuget程序包
然后直接搜索 InTheHand.Net,选择对应的库文件之后点击安装即可使用
2.2 搜索附近的蓝牙设备
BluetoothClient client = new BluetoothClient(); //处理蓝牙的对象
BluetoothRadio radio = BluetoothRadio.PrimaryRadio; //获取电脑蓝牙
radio.Mode = RadioMode.Connectable; //设置电脑蓝牙可被搜索到
BluetoothAddress blueAddress ; //需要连接的蓝牙模块的唯一标识符
BluetoothDeviceInfo[] devices = client.DiscoverDevices(); //搜索蓝牙设备,10秒
//从搜索到的所有蓝牙设备中选择需要的那个
foreach (var item in devices)
{
if(item.DeviceName.Equals("需要连接的蓝牙模块名字")) //根据蓝牙名字找
{
Console.WriteLine(item.DeviceAddress);
Console.WriteLine(item.DeviceName);
blueAddress = item.DeviceAddress; //获得蓝牙模块的唯一标识符
break;
}
Console.WriteLine(item.DeviceAddress);
Console.WriteLine(item.DeviceName);
}
搜索蓝牙设备的目的是为了得到想要连接的那个蓝牙模块的唯一标识符,如果之前这个蓝牙设备已经和电脑连接过,那么电脑上就会有设备记录,可以直接找到唯一标识符从而就可以省去上面的这一步直接进行连接。
控制面板->设备和打印机-》右键想要连接的蓝牙设备->属性->蓝牙->唯一标识符
在代码中只需要创建一个蓝牙唯一标识符的对象即可,但是填写唯一标识符的时候需要倒着填并且用16进制表示
BluetoothAddress blueAddress = new BluetoothAddress(new byte[] { 0x21, 0x18, 0x28, 0x03, 0x19, 0x20 }) ;
3、样例代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using InTheHand.Net;
using InTheHand.Net.Bluetooth;
using InTheHand.Net.Sockets;
namespace BluetoothStudy
{
class Program
{
static void Main(string[] args)
{
BluetoothClient client = new BluetoothClient(); //处理蓝牙的对象
BluetoothRadio radio = BluetoothRadio.PrimaryRadio; //获取电脑蓝牙
radio.Mode = RadioMode.Connectable; //设置电脑蓝牙可被搜索到
BluetoothAddress blueAddress ; //需要连接的蓝牙模块的唯一标识符
BluetoothDeviceInfo[] devices = client.DiscoverDevices(); //搜索蓝牙设备,10秒
//从搜索到的所有蓝牙设备中选择需要的那个
foreach (var item in devices)
{
if(item.DeviceName.Equals("需要连接的蓝牙模块名字")) //根据蓝牙名字找
{
Console.WriteLine(item.DeviceAddress);
Console.WriteLine(item.DeviceName);
blueAddress = item.DeviceAddress; //获得蓝牙模块的唯一标识符
break;
}
Console.WriteLine(item.DeviceAddress);
Console.WriteLine(item.DeviceName);
}
BluetoothEndPoint ep = new BluetoothEndPoint(blueAddress, BluetoothService.SerialPort);
Console.WriteLine("正在连接!");
client.Connect(ep); //开始配对 蓝牙4.0不需要setpin
if(client.Connected)
{
Console.WriteLine("连接成功!");
Stream peerStream = client.GetStream(); //创建IO流对象
string str = "发送的内容";
peerStream.Write(str,0,str.Length); // 发送开门指令
Console.WriteLine("发送成功!");
}
}
}
}
4、总结
- 处理类似蓝牙等和硬件相关的程序,一定是存在某个库专门来处理的,就拿InTheHand.Net这个库来举例子,我看了他们的官网,除了可以对蓝牙进行处理之外,还可以对NFC进行处理。所以在遇到一些不知道不同东西怎么结合的情况时,就多上网查有没有什么类似的库可以用
- 一般拿到一个库时,大多数情况只需要一些最基本的功能,最好的学习方法就是找一个经典的代码例子,看懂了基本就知道怎么用了。但如果需要深度使用的话,最好就是上官网,官网都会有开发文档介绍具体的用法