[英]Bluetooth LE C# Advertising and Scan Interval
我最近开始开发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字符串吗?
感谢您的时间。
问题1:是否可以更频繁地接收和处理这些serviceData? (最好每1000毫秒一次)
如果设备处于连接状态而不是通告状态,则它将不会通告,并且可能导致您不再接收serviceData。 您需要断开设备的连接才能使其恢复广告状态。 您可以检查此线程 。
问题2:即使正在运行此应用程序的计算机未与设备配对,也可以查询serviceData字符串吗?
从Windows 10 Creators Update中 ,可以通过使用BluetoothLEDevice.GetGattServicesAsync()
, GattDeviceService.GetCharacteristicsAsync()
以及GattCharacteristic.GetDescriptorsAsync()
来查询不配对的远程设备来实现。
我使用TI SensorTag BLE设备测试了UWP蓝牙低功耗示例。 无需配对,我可以读取设备数据,如下所示:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.