繁体   English   中英

蓝牙LE C#广告和扫描间隔

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM