【发布时间】:2018-04-20 11:15:21
【问题描述】:
我最近开始开发 UWP 项目,并一直在尝试与 'Minew S1' BLE 设备建立连接,根据其文档,该设备运行三个主要服务。
文档没有指出这种方式,但我发现在 BLE 扫描期间可以读取设备数据(frameType、productModel、batteryLevel、温度、湿度、MAC 地址),因为设备会响应(?)使用未记录的服务 (UUID: 0000ffe1-0000-1000-8000-00805f9b34fb) 和相应的 serviceData 字符串进行这些扫描。
我创建了一个简单的 BluetoothLEAdvertisementWatcher 对象并订阅了它的 Received 事件。这样,我在运行时只从该对象获取一个 serviceData 字符串。代码sn-p如下:
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 + "==");
}
}
}
}
}
问题一: 上面的代码使用我写的S1Sensor辅助类方法成功打印出需要的数据。唯一的问题是设备的广告间隔默认设置为 1000 毫秒,但在应用程序运行期间我只收到一次(很少两次)这个字符串。有没有办法更频繁地接收和处理这些 serviceData ? (最好每 1000 毫秒)
问题 2: 我的另一个问题是,此代码仅在设备与我的计算机配对时返回值。我认为即使设备未与计算机配对,我也应该能够在不连接的情况下扫描设备并查看它们的响应(serviceData)。 即使运行此应用程序的计算机未与设备配对,是否有办法查询 serviceData 字符串?
感谢您的宝贵时间。
【问题讨论】:
标签: c# uwp bluetooth-lowenergy iot