Datenübertragung via Bluetooth

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MatLan
User
Beiträge: 9
Registriert: Freitag 14. Oktober 2022, 09:14

Hallo :) ich habe ein kleines Problem mit der Laufzeit

Ich habe einen Raspberry Pi 3B und somit Bluetooth 4.1. Wenn ich nun aber die Verbindung aufbaue zu meinem Rollentrainer dauert es ca eine Sekunde bis der neue Frame ankommt. Für die Umsetzung in einer virtuellen Welt ist dies jedoch um einiges zu langsam und die Laufzeit würde ich gerne verbessern. Ich habe bereits einige await Funktionen rausgehauen, benötige dennoch eine, die ich nicht rausbringe.

Hier der Code:

import asyncio
from bleak import BleakClient
from pycycling.tacx_trainer_control import TacxTrainerControl

resistance = 1


async def run(address):
# Abfrage über Bluetooth an den TACX Hometrainer
async with BleakClient(address) as bleakclient:

def my_page_handler(data):
ret=client.publish("Python/MQTT",str(data))
print("DATA :",data)



print("Verbindungsaufbau mit Trainer")
#await bleakclient.is_connected()
trainer = TacxTrainerControl(bleakclient)



trainer.set_general_fe_data_page_handler(my_page_handler)
print("Trainer set : ",trainer.set_general_fe_data_page_handler(my_page_handler))

await trainer.enable_fec_notifications()
#print("Trainer enable :",trainer.enable_fec_notifications())

print("Verbunden mit Trainer")
#duration = 0.0005
#duration = 0.1

try:
while True:

await trainer.set_basic_resistance(resistance)
except KeyboardInterrupt:
pass




#Diese Funktion wird als erstes Durchlaufen
if __name__ == "__main__":
print("Hier angekommen")
#Debugmeldungen aktivieren
os.environ["PYTHONASYNCIODEBUG"] = str(1)

#Adresse des Heimtrainers

subprocess.Popen(["bluetoothctl","remove", "XX:XX:XX:XX"])

address = "XX:XX:XX:XX"


#Starten der asynchronen Schleife mit Verbindung zu Trainer und MQTT Server
asyncio.run(run(address))

print("get_Loop")

# ENDE

Der Code wurde eigentlich zum großen Teil aus Github übernommen und funktioniert fehlerfrei. Nur die Laufzeit stellt mich noch nicht ganz zu frieden .

Meine einzige Idee war die await funktionen einzusparen. Vielleicht hat jemand noch eine Idee was ich ändern könnte.



Vielen Dank im Voraus und frohes Codieren :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie willst du denn die await-Funktionen einsparen, wenn das die Funktionen sind, die mit deinem Geraet kommunizieren? Und in Zukunft bitte code-Tags benutze, das ist der </>-Knopf im vollstaendigen Editor.
MatLan
User
Beiträge: 9
Registriert: Freitag 14. Oktober 2022, 09:14

Danke für die schnell Antwort :),

ja das mit dem Einrücken hatte ich eigenlich mit Leerzeichen ein bisschen hingeschmiert aber es wird jedes mal eingerückt ^^ Danke für den Tipp

Ja das mit der await Funktion war meine Hoffnung. ich hatte eine await Funktion rausgeschmissen mit der Verbindung zum Rollentrainer, da diese nicht gebraucht wurde und konnte somit die Laufzeit ein wenig verbessern. Da ich diese await Funktion aber nicht ersetzen kann oder zumindest nicht genau weiß wie ich das machen könnte dachte ich, ich schreibe mal in das Forum :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Code ist so nicht lauffaehig, da gibt es zB verweise auf nicht-existente Namen wie "client", und ich sehe auch nicht, wo genau jetzt was wie zu langsam ist. Es wirkt so, als ob du asyncio mit normalem Code mischst, und das kann auch verantwortlich sein. Alles schwer zu sagen, vor allem, weil hier auch niemand dein Geraet rumstehen hat, um damit zu spielen. Hat also Grenzen, wieviel Spass jemand anders hier beim Programmieren entwickeln kann.

Der uebliche Ansatz: teile und Herrsche. Wenn du die reine Bluetooth-Kommunikation, nur mit print-Ausgaben, schnell genug hinbekommst, liegt es nicht daran.
MatLan
User
Beiträge: 9
Registriert: Freitag 14. Oktober 2022, 09:14

Ohje stimmt das client hab ich vergessen rauszuschmeißen ^^. ich habe da tatsächlich noch eine Verbindung zu einem MQTT-Broker drinnen aber den Teil hatte ich bewusst weg gelassen .

Ja klar das mit dem Rollentrainer ist mir soweit bewusst ich dachte nur das der ein oder andere mir eventuell sagen kann, was ich anstatt der await funktion nehmen kann oder vlt sogar selbst mal den rollentrainer implementiert hat und so ein Gerät zuhause stehen hat :)

ja das mit den print Funktionen ist leider auch zu langsam. Meine Idee war es auch mal den Bluetooth Traffic in Linux anzeigen zu lassen aber dazu habe ich leider nichts gefunden. Wäre dieser genauso schnell wie im Code dann könnte ich eindeutig dem Rollentrainer die Schuld in die Schuhe schieben^^
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Den Traffic bekommst du mit hcidump. Und da Bluetooth an sich problemlos Daten mit niedriger Latenz üBertragen kann, liegt das schon irgendwie im konkreten code und oder gerät begründet. Allgemeine Hinweise sind mir da nicht bekannt.
Antworten