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

[WinError -2140864509] Error Writing Attribute with Bleak Library on Windows #1635

Open
TancredeJean opened this issue Sep 4, 2024 · 1 comment
Labels
Backend: WinRT Issues or PRs relating to the WinRT backend more info required Issues does not have a reproducible test case, has insufficent logs or otherwise needs more feedback

Comments

@TancredeJean
Copy link

TancredeJean commented Sep 4, 2024

  • bleak version: 0.22.2
  • Python version: 3.9.13
  • Operating System: Windows 11 and windows 10

Description

What I Was Trying to Achieve:

I was attempting to use the Bleak library to establish a connection with a Bluetooth Low Energy (BLE) device and enable notifications for a specific characteristic. My goal was to receive real-time data from the device via BLE notifications.

What Happened:

When trying to start notifications for the BLE characteristic, I encountered the following error:

OSError: [WinError -2140864509] The attribute cannot be written

What Went Wrong:

The specific error [WinError -2140864509] The attribute cannot be written suggests that the system encountered an issue while trying to write to the characteristic attribute. This prevents the Bleak client from successfully enabling notifications.

What I Expected to Happen:

I expected the Bleak client to successfully enable notifications for the specified characteristic and start receiving real-time data. The notification handler should be called whenever new data is available from the BLE device.

What I Did

import asyncio
from bleak import BleakScanner, BleakClient

# Define the target device name and characteristic UUIDs
target_name = "***"
target_address = None
CHAR_ACC_UUID = "5266237b-0a94-45f6-b9d6-9a8f2482bac3"

async def notification_handler(sender, data):
    # This function will be called whenever a notification is received.
    print("Notification from {}: {}".format(sender, data.decode('utf-8')))

async def main():
    global target_address
    # Discover BLE devices
    devices = await BleakScanner.discover()
    for d in devices:
        print(d)
        if target_name == d.name:
            target_address = d.address
            print(f"Found target {target_name} Bluetooth device with address {target_address}")
            break

    if target_address is not None:
        async with BleakClient(target_address) as client:
            print(f"Connected: {client.is_connected}")

            # Start notifications
            await client.start_notify(CHAR_ACC_UUID, notification_handler)
            print("Started notifications...")

            # Keep the program running to receive notifications
            try:
                while True:
                    await asyncio.sleep(1)
            except KeyboardInterrupt:
                print("Program interrupted by user.")
                await client.stop_notify(CHAR_ACC_UUID)
    else:
        print("Could not find target Bluetooth device nearby")

asyncio.run(main())

Logs

Device: 03:E0:DF:64:48:A9, Name: None
Device: 2D:BE:65:5C:25:4C, Name: None
Device: 46:FD:14:21:86:EE, Name: None
Device: 7E:57:58:2B:E2:99, Name: None
Device: F0:F5:BD:51:A8:91, Name: ***
Found target *** Bluetooth device with address F0:F5:BD:51:A8:91
Connected: True
Traceback (most recent call last):
  File "your_script_name.py", line 41, in <module>
    asyncio.run(main())
  File "C:\Python\Lib\asyncio\runners.py", line 44, in run
    return loop.run_until_complete(main())
  File "C:\Python\Lib\asyncio\base_events.py", line 647, in run_until_complete
    return future.result()
  File "your_script_name.py", line 28, in main
    await client.start_notify(CHAR_ACC_UUID, notification_handler)
  File "C:\Python\Lib\site-packages\bleak\__init__.py", line 844, in start_notify
    await self._backend.start_notify(characteristic, wrapped_callback, **kwargs)
  File "C:\Python\Lib\site-packages\bleak\backends\winrt\client.py", line 981, in start_notify
    await winrt_char.write_client_characteristic_configuration_descriptor_async(
OSError: [WinError -2140864509] Impossible d’écrire l’attribut

Additional Attempts

I have also tried using the following during the initialization of the Bleak client to disable cached services:

BleakClient(..., winrt=dict(use_cached_services=False))

Unfortunately, this did not solve the issue.

@dlech dlech added the Backend: WinRT Issues or PRs relating to the WinRT backend label Sep 4, 2024
@dlech
Copy link
Collaborator

dlech commented Sep 4, 2024

Does this charcateristic actually support notifications? You can tell by running the service explorer example.

And I would suggest logging Bluetooth packets (see troubleshooting page in the docs) to see what the device is actually doing.

@dlech dlech added the more info required Issues does not have a reproducible test case, has insufficent logs or otherwise needs more feedback label Sep 4, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Backend: WinRT Issues or PRs relating to the WinRT backend more info required Issues does not have a reproducible test case, has insufficent logs or otherwise needs more feedback
Projects
None yet
Development

No branches or pull requests

2 participants