hbldh / bleak

A cross platform Bluetooth Low Energy Client for Python using asyncio
MIT License
1.74k stars 292 forks source link

Bleak issue of time to display data #1598

Closed cha99cg closed 3 months ago

cha99cg commented 3 months ago

Description

i'm using bleak to just recover distance every 50ms in fact the recovery is in 200ms or more. the distance is between two shields NXP.

What I Did

i did a script to just display the real distance like this

import asyncio
import timeit
from bleak import BleakScanner
from bleak.backends.scanner import AdvertisementData
import csv
output = 'Recup_Data.csv'
from bleak.backends.scanner import AdvertisementData
with open(output, 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(["Counter", "Distance","Adresse MAC"])
last_counter = None
timeit.timeit(lambda: "-".join(map(str, range(100))), number=10000)
async def get_advertisement_data_between_macs():
    def detection_callback(device, advertisement_data: AdvertisementData):
        global last_counter
        if (advertisement_data.local_name == "W"):
            print(advertisement_data)
            print(advertisement_data.manufacturer_data[0xFFFF])
            counter = advertisement_data.manufacturer_data[0xFFFF][0] + (advertisement_data.manufacturer_data[0xFFFF][1] << 8)
            print("Compteur :",counter) 
            if counter != last_counter :
                last_counter = counter
                Mac_adrr = advertisement_data.manufacturer_data[0xFFFF][2:9] 
                mac_address_str = ':'.join(f'{b:02x}' for b in Mac_adrr)
                print("MAC Address :",mac_address_str )
                Distance = advertisement_data.manufacturer_data[0xFFFF][9] + (advertisement_data.manufacturer_data[0xFFFF][10] )
                print("Distance : " , Distance)           
                with open(output, 'a', newline='') as f:
                    writer = csv.writer(f)
                    writer.writerow([counter, Distance, mac_address_str])
    async with BleakScanner(detection_callback, scanning_mode ='passive') as scanner:
        while True:
            await asyncio.sleep(0.05)  
asyncio.run(get_advertisement_data_between_macs())

Logs

every 200ms there is a new distance but i want iin every 50ms