Невозможно записать большой байтовый массив на устройство BLE с помощью API-интерфейсов UWP - например, Напишите значение в асинхронном режиме - PullRequest
0 голосов
/ 15 ноября 2018

Я использую Windows 10 build 14393.2156. Версия адаптера Bluetooth LMP - 6.X (версия Bluetooth 4.0). Я не могу записать данные байтового массива длиной 350. Однако я могу записать данные байтового массива длиной около 60 и получить ожидаемые данные с устройства BLE. Когда я пишу байтовый массив большой длины, например 350, я получаю исключение Windows: «Исключение: указанный сервер не может выполнить запрошенную операцию. (Исключение из HRESULT: 0x8007003A)». Ниже приведен код:

private async Task CoreWrite(byte[] data)
    {
        var writeBuffer = CryptographicBuffer.CreateFromByteArray(data);
        var result = await _txCharacteristic.WriteValueAsync(writeBuffer);
        if (result != GattCommunicationStatus.Success)
        {
            throw new IOException($"Failed to write to bluetooth device. Status: {nameof(result)}");
        }
    }

Обратите внимание, что устройство уже сопряжено. Существует ли какое-либо ограничение полезной нагрузки, которое может повлиять на ограничение длины полезной нагрузки в спецификации Bluetooth 4.0 по сравнению с 4.2. Или вы предлагаете более высокую версию Windows 10 с более поздней версией Bluetooth LMP 8.X, которая поможет решить проблему. Ценю любой совет или помощь.

Большое спасибо.

1 Ответ

0 голосов
/ 03 декабря 2018

Удивительно, но мы обнаружили, что Длина данных атрибута характеристики была ограничена 244 байтами.Следовательно, я не смог записать данные больше 244 байтов.Однако выполнение нескольких записей по 244 байта за раз решает эту проблему.Я мог видеть ожидаемый ответ от устройства BLE.

Пример:

int offset = 0;
int AttributeDataLen = 244;
while (offset < data.Length)
{
   int length = data.Length - offset;
   if (length > AttributeDataLen)
   {
      length = AttributeDataLen;
   }

   byte[] subset = new byte[length];

   Array.Copy(data, offset, subset, 0, length);
   offset += length;

   var writeBuffer = CryptographicBuffer.CreateFromByteArray(subset);
   var result = await _txCharacteristic.WriteValueAsync(writeBuffer);
   if (result != GattCommunicationStatus.Success)
   {
      throw new IOException(
        $"Failed to write to bluetooth device. Status: {nameof(result)}");
   }
}
...