Нестабильное соединение Bluetooth в Windows IoT Core - даже с использованием внешнего ключа - PullRequest
0 голосов
/ 29 сентября 2019

Я использую мой RaspberryPis (v3) под управлением последней стабильной версии Windows IoT Core (v.10.0.17763.737) для получения данных и управления моими термостатами Bluetooth.Я довольно долго борюсь со стабильностью соединения bluetooth.Несколько месяцев назад я переключил все свои узлы на внешние ключи (один из списка совместимости Microsoft: ORICO BTA-403), что улучшило ситуацию, но все еще далеко от стабильности.

Через некоторое время(варьируется от минут до дней) перестает работать соединение Bluetooth.Я уже реализовал скрипт powershell для проверки таких ситуаций и запуска команды «devcon restart USB ».Это помогает, но только в 50% всех сбоев.Если это не решит ситуацию, я должен перезагрузить узел.Однако, это не удовлетворяет, потому что время от времени узлы зависают во время загрузки, и я понял, что слишком много перезагрузок сократит срок службы карты micro SD.

После нескольких часов анализа я обнаружил, чтоОказалось, что служба поддержки Bluetooth может быть проблемой.До разрыва соединения я могу легко перезапустить службу поддержки Bluetooth с помощью powershell.После того, как проблема возникла, это больше не возможно.Перезапуск службы зависает, и состояние службы говорит, что она ожидает перезапуска или что-то вроде этого.Или моя реализация Bluetooth соединения слишком плохая?Я прикрепил функцию, чтобы вы посмотрели:

private async Task Connect()
    {
        try
        {
            int count = 0;
            do
            {
                count++;
                if (count > 10)
                {
                    m_IsInitialized = false;
                    //throw new Exception("More than 10 tries have not been successfull for connecting with thermostat module. Stopping.");
                }
                m_IsInitialized = false;

                m_Device = await BluetoothLEDevice.FromIdAsync(m_DeviceID);
                if (m_Device == null)
                {
                    throw new Exception("Device was not found.");
                }

                m_Characteristics = new Dictionary<ushort, GattCharacteristic>();
                GattDeviceServicesResult gattServices = await m_Device.GetGattServicesAsync();
                foreach (GattDeviceService service in gattServices.Services)
                {
                    try
                    {
                        GattCharacteristicsResult characteristicsResult = await service.GetCharacteristicsAsync();
                        IReadOnlyList<GattCharacteristic> characteristics = characteristicsResult.Characteristics;
                        foreach (GattCharacteristic characteristic in characteristics)
                        {
                            try
                            {
                                m_Characteristics.Add(characteristic.AttributeHandle, characteristic);
                                GattCharacteristicProperties properties = characteristic.CharacteristicProperties;
                                if (properties.HasFlag(GattCharacteristicProperties.Notify))
                                {
                                    try
                                    {
                                        GattCommunicationStatus status = await characteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);
                                        if (status == GattCommunicationStatus.Success)
                                        {
                                            characteristic.ValueChanged += Characteristic_ValueChanged;
                                            m_IsInitialized = true;
                                            //Logger.ServiceLog(string.Format("Thermostat has been initialized successfully ({0} tries).", count));
                                            return;
                                        }
                                    }
                                    catch (Exception ex4)
                                    {
                                        throw new Exception("4: GattCommunicationStatus: " + ex4.Message + "\nStackTrace: " + ex4.StackTrace);
                                    }
                                }
                            }
                            catch (Exception ex3)
                            {
                                throw new Exception("3: GattCharacteristic: " + ex3.Message + "\nStackTrace: " + ex3.StackTrace);
                            }
                        }
                    }
                    catch (Exception ex2)
                    {
                        throw new Exception("2: GattDeviceService: " + ex2.Message + "\nStackTrace: " + ex2.StackTrace);
                    }
                }
                //Logger.ServiceLog(string.Format("Thermostat:Connect: Unsuccessful try: {0}", count));
                await Task.Delay(1 * 60 * 1000);
            }
            while (!m_IsInitialized);
        }
        catch (Exception ex)
        {
            Logger.ServiceLog("1: Thermostat.cs Connect", ex);
        }
    }

Как видите, код полон отладочных подсказок, , но при возникновении сбоя соединения исключение не возникает.Я действительно с нетерпением жду любой помощи, потому что после нескольких месяцев борьбы я действительно предпочел бы получить стабильное решение без каких-либо взломов или обходных путей.

Спасибо за вашу помощь: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...