我正在开发一个带有表单的c#desktop api,我希望从BLE服务器接收ACC数据并在图表中显示它们。 所以我正在运行连接问题,我找不到任何解决方案。 我可以用观察者找到我的LE服务器设备。
DevicePairingResult dpr = await device.DeviceInformation.Pairing.PairAsync(DevicePairingProtectionLevel.Encryption);
给我回复“AlreadyPaired”
但是当我做的时候
device = await BluetoothLEDevice.FromBluetoothAddressAsync(bluetoothAddress: eventArgs.BluetoothAddress);
mGattService = device.GetGattService(MotionService_GUID);
mCharacteristic = mGattService.GetCharacteristics(ACC_Characteristic_GUID)[0];
然后
var con = device.ConnectionStatus;
我在con。
中收到“Disconnected”我在Windows上与de device绑定(我在Windows中搜索并输入了代码)但我没有连接(基于Windows信息中心的状态)。 我已经在windows c#开发者页面中的另一个线程中读到,不再需要手动配对设备了。
我非常害羞我的其余代码可以正常工作,因为有时我可以获得连接(对我来说很混乱)并在我的图表中看到正确的数据。 现在我只想在更改代码的其他部分之前建立稳定的连接。 任何人都知道如何解决这个问题? Thx medTech
编辑: 以下是本准则的一部分:
扫描BLE
private void button1_Click(object sender, EventArgs e)
{
// Create Bluetooth Listener
var watcher = new BluetoothLEAdvertisementWatcher();
watcher.ScanningMode = BluetoothLEScanningMode.Active;
// Register callback for when we see an advertisements
watcher.Received += OnAdvertisementReceivedAsync;
// Wait 5 seconds to make sure the device is really out of range
watcher.SignalStrengthFilter.OutOfRangeTimeout = TimeSpan.FromMilliseconds(5000);
watcher.SignalStrengthFilter.SamplingInterval = TimeSpan.FromMilliseconds(2000);
// Starting watching for advertisements
watcher.Start();
}
连接到服务器:
private async void OnAdvertisementReceivedAsync(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs)
{
// Filter for specific Device
if (eventArgs.Advertisement.LocalName == "MYDEVICE")
{
watcher.Stop();
var MotionService_GUID = new Guid("00002000-0000-1000-8000-00805F9B34FB");
var ACC_Characteristic_GUID = new Guid("00002001-0000-1000-8000-00805F9B34FB");
device = await BluetoothLEDevice.FromBluetoothAddressAsync(bluetoothAddress: eventArgs.BluetoothAddress);
DevicePairingResult dpr = await device.DeviceInformation.Pairing.PairAsync(DevicePairingProtectionLevel.Encryption);
mGattService = device.GetGattService(MotionService_GUID);
mCharacteristic = mGattService.GetCharacteristics(ACC_Characteristic_GUID)[0];
GattDeviceServicesResult result = await device.GetGattServicesAsync();
GattCommunicationStatus status1 = await ReadFromCharacteristicAsync(mCharacteristic);
var con = device.ConnectionStatus;
while (status1 == GattCommunicationStatus.Success)
{
try
{
status1 = await ReadFromCharacteristicAsync(mCharacteristic);
}
catch
{
Console.WriteLine("ERROR");
status1 = GattCommunicationStatus.Unreachable;
}
}
}
}
从特征中读取:
异步任务ReadFromCharacteristicAsync(GattCharacteristic mCharacteristic) {
GattReadResult readResult = await mCharacteristic.ReadValueAsync(BluetoothCacheMode.Uncached);
if (readResult.Status == GattCommunicationStatus.Success)
{
byte[] data = new byte[readResult.Value.Length];
DataReader.FromBuffer(readResult.Value).ReadBytes(data);
if (chart1.IsHandleCreated)
{
this.Invoke((MethodInvoker)delegate { updateChart(data); });
}
return readResult.Status;
}
return readResult.Status;
}
终止连接
private async Task<bool> ClearBluetoothLEDeviceAsync()
{
mCharacteristic.Service.Dispose();
mGattService.Dispose();
await device.DeviceInformation.Pairing.UnpairAsync();
device?.Dispose();
device = null;
GC.Collect();
return true;
}
现在,当我第一次连接到服务器时,我只收到零,这表明可能存在身份验证错误。 之后,我总是收到此错误: mscorlib.dll中的“System.ArgumentException”,其中包含noch可执行代码的通知,因为所有线程都在执行某些异步操作。 当我尝试从特征中读取时,会抛出此错误。 我之前从未在c#中编码,所以如果我的异步部分或通信部分出现错误,我就不会感到害羞。 谢谢你
答案 0 :(得分:0)
配对与连接不一样! 我真的建议使用BLE-advertisementWatcher选择并连接到您的设备。 原因是许多BLE设备不能保存其配对状态。 在Windows设备观察器配对后,即使设备已关闭或无法触及,设备也会保持配对状态。 此外,还会多次保持连接状态,除非设备未配对并在代码中处理或在Windows设置中删除。
我知道的所有BLE设备在一段时间内没有连接就会立即开始广告。 这个时间取决于设备,但大部分时间都在几秒钟内。
所以不要配对,但只要设备正在做广告就可以连接。