我最近开始开发UWP项目,并一直在尝试与' Minew S1' BLE设备建立连接,根据其文档,该设备有三种主要服务运行
文档没有指出这种方式,但我发现有可能在BLE扫描期间读取设备数据(frameType,productModel,batteryLevel,温度,湿度,MAC地址),因为设备响应(?)使用未记录的服务(UUID:0000ffe1-0000-1000-8000-00805f9b34fb)和相应的serviceData字符串进行这些扫描。
我创建了一个简单的BluetoothLEAdvertisementWatcher对象并订阅了它的Received事件。这样我在运行时只从该对象获得一个serviceData字符串。代码段如下:
BluetoothLEAdvertisementWatcher bleWatcher;
bleWatcher = new BluetoothLEAdvertisementWatcher();
bleWatcher.ScanningMode = BluetoothLEScanningMode.Active;
bleWatcher.Received += BleWatcher_Received;
bleWatcher.Stopped += BleWatcher_Stopped;
bleWatcher.Start();
private void BleWatcher_Received(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args)
{
DataReader dataReader;
foreach (var item in args.Advertisement.ServiceUuids)
{
if (item == new Guid("0000ffe1-0000-1000-8000-00805f9b34fb"))
{
foreach (var data in args.Advertisement.DataSections)
{
dataReader = DataReader.FromBuffer(data.Data);
byte[] bytes = new byte[data.Data.Length];
dataReader.ReadBytes(bytes);
if (BitConverter.ToString(bytes).Length > 5)
{
S1Sensor s1 = new 1Sensor(BitConverter.ToString(bytes));
Debug.WriteLine("New S1 Sensor advertisement received:");
Debug.WriteLine("Timestamp: " + DateTime.Now + ", Battery level: " + s1.BatteryLevel + "%, Temperature: " +
s1.Temperature + "°C, " + "Humidity: " + s1.Humidity + "%, MAC Address: " + s1.MAC_Address + "==");
}
}
}
}
}
问题1:上面的代码使用我编写的S1Sensor助手类方法成功打印了所需的数据。唯一的问题是默认情况下设备的广告时间间隔设置为1000毫秒,但我在应用程序运行期间只收到一次这个字符串(很少两次)。有没有办法更频繁地接收和处理这些serviceData? (最好每1000毫秒)
问题2: 我的另一个问题是,此代码仅在设备与我的计算机配对时返回值。我想我应该能够在没有连接的情况下扫描设备并查看它们的响应(serviceData),即使设备未与计算机配对也是如此。 有没有办法查询serviceData字符串,即使运行此应用程序的计算机未与设备配对?
感谢您的时间。
答案 0 :(得分:2)
问题1:有没有办法接收和处理这些serviceData 更频繁? (最好每1000毫秒)
如果设备处于连接状态而不是广告状态,它将不会做广告,并且可能导致您无法再接收serviceData。您需要断开设备才能将其重新置于广告状态。您可以查看thread。
问题2:有没有办法查询serviceData字符串,即使是 运行此应用程序的计算机未配对 设备
From Windows 10 Creators Update,这可以通过使用BluetoothLEDevice.GetGattServicesAsync()
,GattDeviceService.GetCharacteristicsAsync()
以及GattCharacteristic.GetDescriptorsAsync()
查询远程设备而无需配对来实现。
我使用TI SensorTag BLE设备测试UWP蓝牙低功耗样本。如果没有配对,我可以读取这样的设备数据: