Отправить уведомление Gatt BLE из носимого приложения tizen в приложение Android

Я пытаюсь отправить уведомление из носимого приложения Tizen Watch (периферийное устройство в качестве сервера) в приложение для смартфона Android (центральное устройство в качестве клиента). Но у меня возникла ошибка при отправке уведомления из носимого приложения.

В приложении tizen Wearable (с использованием .net API) я отправляю уведомление следующим образом:

string remoteDeviceAddress = "10:C7:53:50:C4:E5";
server.SendNotification(charc, remoteDeviceAddress);

Что вызывает ошибку ниже:

11-25 10:46:05.969  Error   8874    8874    CAPI_NETWORK_BLUETOOTH  bluetooth-gatt.c: bt_gatt_server_notify_characteristic_changed_value(2964) > [bt_gatt_server_notify_characteristic_changed_value] INVALID_PARAMETER(0callback=NULL)

11-25 17:20:18.225  Error   15042   15042   Tizen.Network.Bluetooth BluetoothGattImpl.cs: SendNotification(113) > Failed to send value changed notification for characteristic uuid 00000002-1000-2000-3000-111122223333, err: InvalidParameter

В приложении Android я подписываюсь на уведомления, как показано ниже:

mBluetoothGatt.setCharacteristicNotification(characteristic, true);

BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
                    UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(descriptor);

Я не понимаю, почему возникает эта ошибка. Я проверил это:

  • клиентское устройство Android подключено к часам BLE.
  • сервис Gatt, предоставляемый серверным приложением Gatt, находит клиентское приложение.
  • Bluetooth-адрес удаленного устройства часов точно такой, который отображается Android в настройках Bluetooth.

Ошибка, похоже, означает, что .net API вызывает собственную функцию API bt_gatt_server_notify_characteristic_changed_value (), которая ожидает обратного вызова, но метод SendNotification () .net API не требует такого обратного вызова в своих спецификациях, как здесь

person Yann31    schedule 25.11.2019    source источник


Ответы (2)


Возможно, последовательность неправильная, или значение не изменилось.

Можете ли вы сделать следующий шаг?

1) Зарегистрируйте обратный вызов изменения состояния уведомления (на стороне сервера GATT) -> Используя это (charc.NotificationStateChanged + = Charc_NotificationStateChanged;) 2) Включите уведомление (на стороне клиента GATT) 3) После получения события «NotificationStateChanged» a) Измените значение (charc.SetValue (_valueChanged);) б) Вызывает SendIndicationAsync (_server.SendIndicationAsync (charc, null);)

Вы можете сослаться на эту процедуру по следующему URL-адресу. (общедоступная функция async Task ClientAddress_PROPERTY_READ_ONLY ())

                EventHandler<NotificationSentEventArg> Server_NotificationSent = null;

            Server_NotificationSent = (sender, e) => {
                _server.NotificationSent -= Server_NotificationSent;
                Assert.IsNotNull(e.ClientAddress, "[TestCase][ClientAddress_PROPERTY_READ_ONLY] Failed");
                Assert.IsInstanceOf<string>(e.ClientAddress, "[TestCase][ClientAddress_PROPERTY_READ_ONLY] Failed");
                BluetoothHelper.DisplayPassLabel("ClientAddress_PROPERTY_READ_ONLY");
            };

            EventHandler<NotificationStateChangedEventArg> Charc_NotificationStateChanged = null;

            Charc_NotificationStateChanged = (sender, e) => {
                try
                {
                    Log.Info(Globals.LogTag, "Charc_NotificationStateChanged");
                    _server.NotificationSent += Server_NotificationSent;

                    origin_val = charc.GetValue(0);
                    charc.SetValue(_valueChanged);
                    _server.SendIndicationAsync(charc, null);

                    charc.SetValue(origin_val);
                }
                catch (Exception ex)
                {
                    Assert.Fail("[TestCase][ClientAddress_PROPERTY_READ_ONLY] FAIL " + ex.Message);
                }
            };

            srv = _server.GetService(_svcUuid);
            charc = srv.GetCharacteristic(_charUuid);

            charc.NotificationStateChanged += Charc_NotificationStateChanged;
person DoHyun Pyun    schedule 28.11.2019

Можете ли вы использовать метод SendIndicationAsync вместо SendNotification?

Ex)

server.SendIndicationAsync (символ, ноль);

person DoHyun Pyun    schedule 26.11.2019
comment
Я пробовал, но на стороне клиента ничего не получено. Я получаю это только на стороне серверного приложения в журналах: 11-26 15: 17: 52.249 Информация 11804 11804 BLUETOOTH_FRWK_SERVICE bt-service-event-Receiver.c: __bt_gatt_char_property_changed_event (1850) ›Уведомление включено - person Yann31; 26.11.2019
comment
Я имею в виду, что метод onCharacteristicChanged () никогда не вызывается на стороне клиента после вызова server.SendIndicationAsync (charc, null) на стороне сервера. - person Yann31; 26.11.2019