Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Disconnected peripherals, Reading specific characteristics. #6

Open
Quget opened this issue Jan 21, 2021 · 5 comments
Open

Disconnected peripherals, Reading specific characteristics. #6

Quget opened this issue Jan 21, 2021 · 5 comments

Comments

@Quget
Copy link

Quget commented Jan 21, 2021

Hello!

I started using this library today in my Unity Project, seems nice to use so far.
I am able to scan, connect(trough 'polling' services), subscribe and write to specific characteristics 👍

But I did end up with 2 problems.

I can't figure out how to see if my peripheral got disconnected.
This is quite handy to know if I want to automaticly reconnect to the device.

I also can't figure out how to read a specific characteristic.

@adabru
Copy link
Owner

adabru commented Jan 21, 2021

Hi @Quget,

checking the connection status and requesting a value from the device is not implemented as I didn't had the need for that yet.

For the connection status, I guess you can try using a GattSession with MaintainConnection set to true, as it is mentioned in the note on this doc page. The session has also an event in the case the connection-status changes.

Reading/Requesting a specific characteristic value from the device can be done with the ReadValueAsync function . You can use the code of SendData as template for that. This is the easier one. Alternatively you can write to one characterstic and program your device so that it will trigger a notification of the characteristic you're interested in.

@adabru adabru added the good first issue Good for newcomers label Jan 21, 2021
@Quget
Copy link
Author

Quget commented Jan 22, 2021

Thanks for the quick reply! I did try to go trough the source code.
But I don't know c++ so well. It will take me a while to understand it.

@adabru
Copy link
Owner

adabru commented Jan 22, 2021

You can checkout the Microsoft sample (C# and equivalent C++ code) as reference for ReadValueAsync.

In my case I first got it to work in C# UWP, then in a C++ winrt console program and then in the dll. If you'll have specific questions regarding the code, feel free to ask.

@Quget
Copy link
Author

Quget commented Jan 22, 2021

I think I manage to get the read one in. Just got to test it out.
Using the same queue as the subscribed characteristic.

Connection status will be a bit of a problem but I will get there I think :)

@adabru
Copy link
Owner

adabru commented Mar 22, 2023

As reference for reading specific characteristics:

tufeixp's ReadDataAsync function: #30 (comment)

SendData code as comparison if you want to add error handling or blocking read:

fire_and_forget SendDataAsync(BLEData data, condition_variable* signal, bool* result) {
try {
auto characteristic = co_await retrieveCharacteristic(data.deviceId, data.serviceUuid, data.characteristicUuid);
if (characteristic != nullptr) {
// create IBuffer from data
DataWriter writer;
writer.WriteBytes(array_view<uint8_t const> (data.buf, data.buf + data.size));
IBuffer buffer = writer.DetachBuffer();
auto status = co_await characteristic.WriteValueAsync(buffer, GattWriteOption::WriteWithoutResponse);
if (status != GattCommunicationStatus::Success)
saveError(L"%s:%d Error writing value to characteristic with uuid %s", __WFILE__, __LINE__, data.characteristicUuid);
else if (result != 0)
*result = true;
}
}
catch (hresult_error& ex)
{
saveError(L"%s:%d SendDataAsync catch: %s", __WFILE__, __LINE__, ex.message().c_str());
}
if (signal != 0)
signal->notify_one();
}
bool SendData(BLEData* data, bool block) {
mutex _mutex;
unique_lock<mutex> lock(_mutex);
condition_variable signal;
bool result = false;
// copy data to stack so that caller can free its memory in non-blocking mode
SendDataAsync(*data, block ? &signal : 0, block ? &result : 0);
if (block)
signal.wait(lock);
return result;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants