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

时间:2018-04-20 11:15:22

标签: c# uwp bluetooth-lowenergy iot

我最近开始开发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 个答案:

答案 0 :(得分:2)

  

问题1:有没有办法接收和处理这些serviceData   更频繁? (最好每1000毫秒)

如果设备处于连接状态而不是广告状态,它将不会做广告,并且可能导致您无法再接收serviceData。您需要断开设备才能将其重新置于广告状态。您可以查看thread

  

问题2:有没有办法查询serviceData字符串,即使是   运行此应用程序的计算机未配对   设备

From Windows 10 Creators Update,这可以通过使用BluetoothLEDevice.GetGattServicesAsync()GattDeviceService.GetCharacteristicsAsync()以及GattCharacteristic.GetDescriptorsAsync()查询远程设备而无需配对来实现。

我使用TI SensorTag BLE设备测试UWP蓝牙低功耗样本。如果没有配对,我可以读取这样的设备数据:

enter image description here

相关问题