Xamarin BLE портит полученные байты - PullRequest
0 голосов
/ 02 мая 2020

В настоящее время я работаю над приложением, написанным на Xamarin.Forms, которое связывается с устройством ESP через BLE. Я уже установил связь, и я также смог отправить некоторые Данные на Устройство и даже получить их.

Когда я пытаюсь получить немного более длинный фрагмент конфигурации, начало сообщения вроде как запутано. Деформация сообщения кажется детерминированной c, поскольку она всегда одинакова.

Я получаю следующее сообщение:

    async private Task<string> ReadDeviceConfiguration(IDevice device) {
        ICharacteristic characteristic = await GetCharacteristic(device, WTServiceUUIDs.CHARACT_CONFIG);
        if (characteristic.CanRead) {
            try {
                var bytes = await characteristic.ReadAsync();
                var str = Encoding.UTF8.GetString(bytes,0,bytes.Length);
                return str;
            } catch (Exception ex) {
                Debug.WriteLine(ex.Message);
            }
        }
        return null;
    }



    private async Task<ICharacteristic> GetCharacteristic(IDevice device, Guid wtServiceCharacteristicUUID) {
        IService service = await device.GetServiceAsync(WTServiceUUIDs.SERVICE);
        if (service != null) {
            var characteristic = await service.GetCharacteristicAsync(wtServiceCharacteristicUUID);
            if (characteristic != null) {
                return characteristic;
            }
        }
        return null;
    }

Сообщение, которое я хочу получить, начинается как this:

{"MODE": 0, "DEVICE_ID": 123456789, "DEVICE_NAME": "Имя теста", ... et c

Что вместо этого я нахожу:

{"DEVICE_NAME": "Test N123456789," DEVICE_NAME ":" Test Name ", ... et c

в основном первая часть DEVICE_NAME, за которой следует значение DEVICE_ID. MODE полностью опущен.

Я посмотрел на массив байтов, выходящий из ReadAsyn c () (в случае неправильной кодировки), и он отображает те же ошибки.

Я также проверил вывод моего устройства ESP с помощью приложения nRF Connect на моем Android телефоне, и он отображает правильное и ожидаемое сообщение.

** РЕДАКТИРОВАТЬ: Удалил несвязанные sidenote, и я получил обновление:

Я немного перешел и реализовал функцию Ion, где я посылаю некоторую информацию Wi-Fi на устройство ESP, которое в свою очередь проверяет, является ли информация правильной и возвращает результат. если результаты в порядке, я запрашиваю конфигурацию, как описано выше, и получаю ту же ошибку, НО я понял, что строка, которая находится в начале, является частью информационного сообщения Wi-Fi, которое я ранее отправил на устройство. Я решил запросить конфиг дважды в строке и закодировать байты в строку, и вот результат:

{"TYPE": "WIFI_CHECK", "123456789," DEVICE_NAME ":" Test Имя ", ... et c

{" MODE ": 0," DEVICE_ID ": 123456789," DEVICE_NAME ":" Имя теста ", ... et c

Первое сообщение должно быть ошибочным, второе сообщение, как я и ожидал. Поэтому я считаю, что должен быть буфер, который не был очищен, и в этом случае оказывается, что он переопределяет первые 22 символа. Я могу использовать это в качестве обходного пути, но очевидно, что это не решение. Для интерфейса ICharacteristi c нет никакого гриппа sh или метода очистки. Есть ли что-нибудь еще, чтобы я мог избежать этой проблемы?

Надеюсь, у кого-нибудь есть подсказка, как с этим справиться. Заранее спасибо.

...