Reedyuk / blue-falcon

A Bluetooth kotlin multiplatform "Cross-Platform" library for iOS and Android
https://bluefalcon.dev
Apache License 2.0
321 stars 43 forks source link

The characteristic value change delegate never fire #83

Closed renatosmf closed 2 years ago

renatosmf commented 2 years ago

Describe the bug I'm trying to run the recording event without response and listening to the characteristic value change, but the delegate never notify the characteristic value change, but on my peripheral, I can see that it received the recording event.

Reproduce Steps to reproduce the behavior:

  1. Set to notify characteristic value change
  2. Write about an unanswered feature
  3. It should get notification of value changes, but it's not working properly.

Expected behavior Receive notification about the change in the value of entered features.

Smartphone (fill in the following information):

Reedyuk commented 2 years ago

Can you produce a sample project with the problem?

renatosmf commented 2 years ago

@Reedyuk You can reproduce this issue by just running your Example project trying to write the characteristic value without response and you will see that delegates method didCharacteristcValueChanged never is called.

nilskasseckert commented 2 years ago

Hi @Reedyuk , I have a similar problem. Possibly it is related to this: I send with Response on my iPhone. I can see on the device that the message is received and would now expect the response to arrive in the "didCharacteristcValueChanged" method. But it is never called?

Is this the same error or did I do something wrong?

BTW: The method has a typo I just noticed

Reedyuk commented 2 years ago

hard to tell exactly, depends on how the bluetooth device behaves. Also depends on the device firmware and that if it broadcasts out a characteristic value changed event.

nilskasseckert commented 2 years ago

It confirms the received data, via the standard Bluetooth way.

But let's ask differently: how would it have to acknowledge for the library to recognize it? We develop the firmware ourselves.

If I only use iOS and the Apple Framework, there is the possibility to send with reponse. Everything works With this way.

Reedyuk commented 2 years ago

For when i was using the library for my own project, i was subscribing to the changes. I believe you may need to register to subscribe on value changes. I was using this library for a simple use case, maybe yours is more complicated and requires a change the library to support such a feature.

twyatt commented 2 years ago

You can reproduce this issue by just running your Example project trying to write the characteristic value without response and you will see that delegates method didCharacteristcValueChanged never is called.

Unlike when performing a write with response, when performing a write without response the didCharacteristcValueChanged will not be called. This is expected behavior, per documentation:

Core Bluetooth invokes this method only when your app calls the writeValue(_:for:type:) method with the CBCharacteristicWriteType.withResponse constant specified as the write type.

@Reedyuk in order to support write without response, Blue Falcon will need to expose canSendWriteWithoutResponse and peripheralIsReady(toSendWriteWithoutResponse:), then library consumers will need to wait for peripheralIsReady(toSendWriteWithoutResponse:) if canSendWriteWithoutResponse is true when performing a write. If canSendWriteWithoutResponse is false, then no callback will occur and writes can continue until canSendWriteWithoutResponse is true.

Reedyuk commented 2 years ago

@twyatt - thanks for the detailed explanation.

I'm happy for others to contribute to the repository and put in a pull request for their changes.

nilskasseckert commented 2 years ago

@Reedyuk How to subscribe to changes? In your native code you never watch for didWriteValueFor

The docu says:

When you call this method to write the value of a characteristic, the peripheral calls the peripheral(_:didWriteValueFor:error:) method of its delegate object only if you specified the write type as CBCharacteristicWriteType.withResponse. The response you receive through the peripheral(_:didWriteValueFor:error:) delegate method indicates whether the write was successful; if the write failed, it details the cause of the failure in an error.

But I can not find where you watch for this event.

Reedyuk commented 2 years ago

I believe you need to write the characteristic to subscribe. Then the characteristic value did changed should call back on changes.

nilskasseckert commented 2 years ago

I opened a PR for this.