Я использую мой 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);
}
}
Как видите, код полон отладочных подсказок, , но при возникновении сбоя соединения исключение не возникает.Я действительно с нетерпением жду любой помощи, потому что после нескольких месяцев борьбы я действительно предпочел бы получить стабильное решение без каких-либо взломов или обходных путей.
Спасибо за вашу помощь: -)