Как исправить GattStatus: исключение 3 — WriteNotPermitted для приложения BLE Xamarin forms?

#c# #xamarin.forms #bluetooth-lowenergy #bluetooth-gatt

#c# #xamarin.forms #bluetooth-низкое энергопотребление #bluetooth-gatt

Вопрос:

Я работаю над приложением BLE. Я могу подключиться к MI band и получать сервисы через мое приложение Xamarin forms BLE. Но когда я пытаюсь записать характеристики, я получаю исключение. Я получаю исключение

Характеристика не поддерживает запись.

для метода WriteAsync() . Это мой код, в котором я пишу характеристики:

 private async Task<string> ProcessDeviceInformationService(IService deviceInfoService)
    {
        try
        {
           await adapter.ConnectToDeviceAsync(device);
            var sb = new StringBuilder("Getting information from Device Information service: n");
            var characteristics = await deviceInfoService.GetCharacteristicsAsync();
            var characteristic = await deviceInfoService.GetCharacteristicAsync(Guid.Parse("00002A27-0000-1000-8000-00805F9B34FB"));
           // characteristic.CanWrite = true;
            //foreach (var characteristic in characteristics)
            //{
                try
                {
                   // await Task.Delay(300);
                    var bytes = await characteristic.ReadAsync();
                    var str = Encoding.UTF8.GetString(bytes, 0, 0);
                    ManufacturerLabel.Text = str;
                    //var characteristic = await deviceInfoService.GetCharacteristicAsync(GattCharacteristicIdentifiers.DataExchange);
                    if (characteristic != null)
                    {
                        byte[] senddata = Encoding.UTF8.GetBytes(string.IsNullOrEmpty(SendMessageLabel.Text) ? "jenx.si was here" : SendMessageLabel.Text);
                        await Task.Delay(300);
                        var newbytes = await characteristic.WriteAsync(senddata);
                        var strnew = Encoding.UTF8.GetString(senddata, 0, 0);
                        ManufacturerLabel.Text = newbytes.ToString();
                        //var strnew = Encoding.UTF8.GetString(newbytes, 0, 0);
                    }
                   
                   // ManufacturerLabel.Text = str;
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            //}

            return sb.ToString();
        }
  

Я понятия не имею, как это исправить, какие-либо предложения?

Комментарии:

1. Вы читаете / записываете в обратном направлении. Вы хотите прочитать характеристики из BLE и записать результаты в байтовый массив. Вы записываете характеристики из массива байтов.

2. @jdweng можете ли вы объяснить это с помощью кода. Извините, я новичок в этом.

3. Далее выполняется запись в controlCharacteristic . Вы хотите прочитать.: controlCharacteristic . WriteAsync(новый байт[] {COMMAND_BYTE, COMMAND_HEART_RATE_CONTINUOUS, COMMAND_ON});

4. @jdweng Я также читаю характеристики, прежде чем записывать их в байтовый массив. Я редактирую свой пост, и вы можете заглянуть в него.

5. Смотрите код на следующей странице. Параметр записи представляет собой перечисление (а не массив байтов): github.com/jeroendesloovere/examples-windows/blob/master /…

Ответ №1:

Я решил эту проблему. Прежде всего, нам нужно проверить, есть ли в характеристике операция записи, для этого вы можете загрузить приложение под названием BLE scanner из play Store и подключиться к этому устройству. Когда мы подключимся к этому BLE, мы сможем увидеть доступные службы и характеристики периферийного устройства BLE. И там нам нужно проверить, какие характеристики имеет операция записи. Итак, если вы попытаетесь выполнить запись характеристик для характеристик, для которых нет операции записи на периферийном устройстве, это приведет к тому, что запись исключения не разрешена.