C#Windows 10蓝牙LE无法连接到服务器

时间:2018-04-20 06:43:24

标签: c# windows windows-10 bluetooth-lowenergy

我正在开发一个带有表单的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#中编码,所以如果我的异步部分或通信部分出现错误,我就不会感到害羞。 谢谢你

1 个答案:

答案 0 :(得分:0)

配对与连接不一样! 我真的建议使用BLE-advertisementWatcher选择并连接到您的设备。 原因是许多BLE设备不能保存其配对状态。 在Windows设备观察器配对后,即使设备已关闭或无法触及,设备也会保持配对状态。 此外,还会多次保持连接状态,除非设备未配对并在代码中处理或在Windows设置中删除。

我知道的所有BLE设备在一段时间内没有连接就会立即开始广告。 这个时间取决于设备,但大部分时间都在几秒钟内。

所以不要配对,但只要设备正在做广告就可以连接。