使用BluetoothLEAdvertisementWatcher类来接收附近的蓝牙广播,这个是UWP的类,关于如何在WPF或者命令行程序中使用这个类,随便一搜就有了,很简单,.NET6之后简单设置一下项目属性就可以了。
private BluetoothLEAdvertisementWatcher bleWatcher;
bleWatcher = new BluetoothLEAdvertisementWatcher()
{
ScanningMode = BluetoothLEScanningMode.Active,
AllowExtendedAdvertisements = true
};
bleWatcher.Received += BleWatcher_Received;
bleWatcher.Start();
这里是接收附近所有的BLE广播,如果想要只接收自己的,可以设置过滤,只接收CompanyId=0x0942的广播
var manufacturerDataWriter = new DataWriter();
var manufacturerData = new BluetoothLEManufacturerData { CompanyId = 0x0942 };
this.bleWatcher.AdvertisementFilter.Advertisement.ManufacturerData.Add(manufacturerData);
在Received中处理接收到的广播,几个会用到的属性,args是事件的参数:
args.BluetoothAddress: 发出BLE广播地址,这是个随机地址,并非蓝牙地址
args.IsScanResponse: 扫描响应,一般广播者的设备名称会包含在这个扫描响应里
args.Advertisement.LocalName: 广播者的蓝牙名称
args.Advertisement.DataSections: 这个是广播的原始数据,这是一个数组,里面包含的是广播的数据
args.Advertisement.ManufacturerData: 微软文档中说明这是特定于制造商的数据,一般广播者会把自己的数据放在这里面
解析ManufacturerData数据:
foreach (var item in args.Advertisement.ManufacturerData)
{
var dataBuffer = item.Data;
var message = new byte[dataBuffer.Length];
using (var reader = DataReader.FromBuffer(dataBuffer))
{
reader.ReadBytes(message);
}
Console.WriteLine(BitConverter.ToString(message));
// Console.WriteLine($" [{System.Text.Encoding.Default.GetString(message)}]");
}
最终效果:
空了会写一个完整的DEMO
接下来的内容:
1. 如何发布自定义的蓝牙广播,配合广播接收,可以实现设备的发现和测距
2. 蓝牙GATT协议
3. C#中使用蓝牙GATT进行蓝牙通信