BLE-Protokoll

Steuern Sie Ihr OSSM drahtlos über Bluetooth Low Energy (BLE) von jedem kompatiblen Gerät oder jeder kompatiblen Anwendung aus.

Das OSSM nutzt Bluetooth Low Energy (BLE) zur drahtlosen Steuerung und Überwachung. Sie können Clientanwendungen erstellen, die eine Verbindung zum OSSM herstellen, um Befehle zu senden und Statusaktualisierungen in Echtzeit zu empfangen.

BLE bietet drahtlose Steuerung mit geringer Latenz, automatischer Wiederverbindung und Statussynchronisierung.

Bevor Sie beginnen

Um über BLE eine Verbindung zu Ihrem OSSM herzustellen, stellen Sie sicher:

  • Ihr Gerät unterstützt Bluetooth Low Energy (BLE 4.0+)
  • Der OSSM ist eingeschaltet und nicht mit einem anderen BLE-Client verbunden
  • Sie befinden sich in einem Umkreis von ca. 10 Metern um das Gerät

Servicearchitektur

Das OSSM implementiert einen benutzerdefinierten BLE-Dienst mit mehreren Merkmalen, die in Funktionsgruppen organisiert sind.

UUID des primären Dienstes

522b443a-4f53-534d-0001-420badbabe69

Die Merkmale sind zur einfachen Erweiterung und Entdeckung nach Namensraumbereichen organisiert.

Referenz der Merkmale

Befehlsmerkmale (beschreibbar)

Nutzen Sie diese Merkmale, um Befehle zu senden und den OSSM zu konfigurieren.

Primäres Befehlsmerkmal

EigenschaftWert
UUID522b443a-4f53-534d-1000-420badbabe69
EigenschaftenREAD, WRITE
ZweckSenden Sie Befehle, um das OSSM-Verhalten zu steuern

Befehlsformat

set:<parameter>:<value>
go:<state>

Verfügbare Befehle

BefehlParameterWertebereichBeschreibung
set:speed:<value>speed0-100Stellen Sie den Prozentsatz der Hubgeschwindigkeit ein
set:stroke:<value>stroke0-100Stellen Sie den Prozentsatz der Hublänge ein
set:depth:<value>depth0-100Stellen Sie den Prozentsatz der Eindringtiefe ein
set:sensation:<value>sensation0-100Stellen Sie den Prozentsatz der Empfindungsintensität ein
set:pattern:<value>pattern0-6Hubmuster einstellen (siehe Muster)
go:simplePenetration--Wechseln Sie im Menü in den einfachen Penetrationsmodus
go:strokeEngine--Wechseln Sie im Menü in den Stroke Engine-Modus
go:streaming--Wechseln Sie über das Menü in den Streaming-Modus (experimentell).
go:menu--Von jedem Modus aus zum Hauptmenü zurückkehren
stream:<pos>:<time>pos, timepos: 0-100, time: msSenden Sie einen Positionsbefehl im Streaming-Modus (experimentell)

Antwortformat

AntwortBedeutung
ok:<original_command>Befehl erfolgreich ausgeführt
fail:<original_command>Befehl fehlgeschlagen (Format oder aktuellen Status prüfen)

Warten Sie immer auf die Antwort, bevor Sie einen weiteren Befehl senden. Befehle werden nacheinander abgearbeitet.

Konfigurationsmerkmal des Geschwindigkeitsknopfs

EigenschaftWert
UUID522b443a-4f53-534d-1010-420badbabe69
EigenschaftenREAD, WRITE
ZweckKonfigurieren Sie, ob der physische Geschwindigkeitsknopf BLE-Geschwindigkeitsbefehle begrenzt

Konfigurationswerte

WertBeschreibung
true, 1, tGeschwindigkeitsknopf fungiert als Obergrenze (Standard)
false, 0, fGeschwindigkeitsregler und BLE-Geschwindigkeit sind unabhängig

Bei der Einstellung true werden BLE-Geschwindigkeitsbefehle (0-100) als Prozentsatz der aktuellen physischen Knopfposition behandelt.

Beispiel: Knopf auf 50 %, BLE-Befehl set:speed:80 → Effektive Geschwindigkeit = 40 %

Dieser Modus bietet eine Hardware-Sicherheitsgrenze, die Benutzer physisch steuern können.

Antwortformat

AntwortBedeutung
true oder falseAktueller Konfigurationswert
error:invalid_valueUngültige Eingabe bereitgestellt

Konfigurationsmerkmal für die Latenzkompensation

EigenschaftWert
UUID522b443a-4f53-534d-1030-420badbabe69
EigenschaftenREAD, WRITE
ZweckKonfigurieren Sie, ob der OSSM versucht, die Latenz zu kompensieren

Konfigurationswerte

WertBeschreibung
true, 1, tDie Latenzkompensation ist aktiv
false, 0, fLatenzkompensation ist inaktiv (Standard)

Bei der Einstellung true erwartet der OSSM, die genauen Befehle und Zeitangaben aus dem Funscript zu empfangen und dass die Befehle mit derselben Verzögerung zwischen den Befehlen wie der Zeitwert gesendet werden. Durch die Berechnung der Zeit zwischen empfangenen Befehlen und der Zeitvariable kann der OSSM die durch BLE verursachte Latenz bestimmen und durch geringfügige Änderungen der Bewegungsgeschwindigkeit korrigieren. Wenn die Zeit zwischen den Befehlen nicht mit der intime-Variable übereinstimmt, sollte diese Option nicht aktiviert werden. Die Puffereinstellung wird verwendet, um allen Bewegungen künstlich eine Verzögerung hinzuzufügen. So hat der OSSM Zeit, den nächsten Befehl zu empfangen, bevor der vorherige abgeschlossen ist. Dadurch lassen sich Verzögerungen durch verspätete Befehle beseitigen und Bewegungen durch das Kombinieren gleichgerichteter Bewegungen glätten. Funscript-Player sollten diesen Pufferwert zu ihrem Wiedergabe-Offset hinzufügen und eine zusätzliche Einstellung zur Feinabstimmung des Wiedergabe-Offsets vorsehen, um die Übertragungszeit und etwaige Verzögerungen des Funscripts selbst zu berücksichtigen.

Antwortformat

AntwortBedeutung
true oder falseAktueller Konfigurationswert
error:invalid_valueUngültige Eingabe bereitgestellt

WiFi-Konfigurationsmerkmal

EigenschaftWert
UUID522b443a-4f53-534d-1020-420badbabe69
EigenschaftenREAD, WRITE
ZweckWiFi-Anmeldeinformationen konfigurieren und den Verbindungsstatus prüfen

Format schreiben

set:wifi:<ssid>|<password>

Das Pipe-Zeichen (|) wird als Trennzeichen zwischen SSID und Passwort verwendet. Dadurch können sowohl SSID als auch Passwort Doppelpunkte enthalten.

Format lesen (JSON)

{
  "connected": true,
  "ssid": "NetworkName",
  "ip": "192.168.1.100",
  "rssi": -45
}

Wenn keine Verbindung besteht, enthält das Feld ssid die zuletzt gespeicherte SSID (falls vorhanden), ip ist leer und rssi ist 0.

Antwortformat

AntwortBedeutung
ok:wifi:connectedErfolgreich verbunden
ok:wifi:savedAnmeldedaten gespeichert, Verbindung wird versucht
fail:wifi:invalid_formatBefehlsformat falsch (Pipe-Trennzeichen fehlt)
fail:wifi:invalid_ssidSSID-Länge ungültig (muss 1–32 Zeichen lang sein)
fail:wifi:invalid_passwordPasswortlänge ungültig (muss 8–63 Zeichen lang sein)
fail:wifi:connection_failedEs konnte keine Verbindung zum Netzwerk hergestellt werden
fail:wifi:save_failedAnmeldeinformationen konnten nicht im NVS gespeichert werden

WiFi-Anmeldeinformationen werden im nichtflüchtigen Speicher (NVS) gespeichert und bleiben auch nach Geräteneustarts erhalten. Das Gerät versucht beim Start, mithilfe der gespeicherten Anmeldeinformationen automatisch eine Verbindung herzustellen.

WiFi-Anmeldeinformationen werden im Klartext über BLE übertragen. Stellen Sie sicher, dass Sie der Verbindung vertrauen und sich in einer sicheren Umgebung befinden, wenn Sie die WiFi-Einstellungen konfigurieren.

Beispielverwendung

// Configure WiFi
const wifiCommand = "set:wifi:MyNetwork|MyPassword123";
await commandChar.writeValue(new TextEncoder().encode(wifiCommand));

// Read the response
const response = await commandChar.readValue();
console.log(new TextDecoder().decode(response)); // "ok:wifi:connected"

// Check WiFi status
const wifiConfigChar = await service.getCharacteristic(
  "522b443a-4f53-534d-1020-420badbabe69"
);
const statusValue = await wifiConfigChar.readValue();
const status = JSON.parse(new TextDecoder().decode(statusValue));
console.log(status);
// { "connected": true, "ssid": "MyNetwork", "ip": "192.168.1.100", "rssi": -45 }

Zustandsmerkmale (schreibgeschützt)

Abonnieren Sie diese Merkmale, um den aktuellen Zustand des OSSM zu überwachen.

Aktuelles Zustandsmerkmal

EigenschaftWert
UUID522b443a-4f53-534d-2000-420badbabe69
EigenschaftenREAD, NOTIFY
ZweckÜberwachen Sie den aktuellen OSSM-Status und die aktuellen Einstellungen

JSON-Format des Zustands

{
  "state": "<state_name>",
  "speed": 0-100,
  "stroke": 0-100,
  "sensation": 0-100,
  "depth": 0-100,
  "pattern": 0-6
}

Benachrichtigungsverhalten

  • Zustandsänderungen lösen sofortige Benachrichtigungen aus
  • Regelmäßige Benachrichtigungen alle 1000 ms, wenn keine Statusänderung auftritt
  • Benachrichtigungen werden gestoppt, wenn keine Clients verbunden sind

Musterinformationsmerkmale

Merkmal der Musterliste

EigenschaftWert
UUID522b443a-4f53-534d-3000-420badbabe69
EigenschaftenREAD
ZweckVerfügbare Hubmuster abrufen

Antwortformat

[
  { "name": "Simple Stroke", "idx": 0 },
  { "name": "Teasing Pounding", "idx": 1 },
  { "name": "Robo Stroke", "idx": 2 },
  { "name": "Half'n'Half", "idx": 3 },
  { "name": "Deeper", "idx": 4 },
  { "name": "Stop'n'Go", "idx": 5 },
  { "name": "Insist", "idx": 6 }
]

Musterbeschreibungsmerkmal

EigenschaftWert
UUID522b443a-4f53-534d-3010-420badbabe69
EigenschaftenREAD, WRITE
ZweckBeschreibungen einzelner Hubmuster abrufen

So rufen Sie eine Musterbeschreibung ab:

Schreiben Sie den Musterindex

Schreiben Sie die Indexnummer (0-6) in das Merkmal.

Lesen Sie die Beschreibung

Lesen Sie das Merkmal, um die Musterbeschreibungszeichenfolge zu erhalten.

Musterbeschreibungen

MusterIndexBeschreibung
Simple Stroke0Beschleunigung, Ausrollen und Verzögerung gleichmäßig aufgeteilt; keine Empfindung
Teasing Pounding1Geschwindigkeitswechsel mit Empfindung; gleicht schnellere Hübe aus
Robo Stroke2Empfindung variiert Beschleunigung; von roboterhaft bis schrittweise
Half'n'Half3Hübe mit voller und halber Tiefe wechseln sich ab; die Empfindung beeinflusst die Geschwindigkeit
Deeper4Die Hubtiefe erhöht sich pro Zyklus; die Empfindung bestimmt die Anzahl
Stop'n'Go5Pausen zwischen den Hüben; die Empfindung passt die Länge an
Insist6Ändert die Länge, behält die Geschwindigkeit bei; Empfindung beeinflusst die Richtung

Streaming-Befehle (experimentell)

Das Positionsstreaming ist experimentell und wird nicht für den allgemeinen Gebrauch empfohlen. Das Protokoll und das Verhalten können sich in zukünftigen Firmware-Updates ändern.

Im Streaming-Modus (go:streaming) akzeptiert das OSSM Echtzeit-Positionsbefehle, die eine synchronisierte Wiedergabe mit externen Inhalten wie Funscripts ermöglichen.

Stream-Positionsbefehl

EigenschaftWert
Formatstream:<position>:<time>
Position0-100 (Prozentsatz des Hubs)
ZeitMillisekunden bis zum Erreichen der Zielposition

Beispielbefehle

stream:0:200      # Move to 0% (retracted) in 200ms
stream:100:150    # Move to 100% (extended) in 150ms
stream:50:300     # Move to 50% (mid-stroke) in 300ms

Wie es funktioniert

  1. Wechseln Sie mit go:streaming in den Streaming-Modus
  2. Das OSSM fährt Position 0 an (vollständig eingefahren)
  3. Senden Sie stream:<pos>:<time>-Befehle, um die Bewegung zu steuern
  4. Die Firmware berechnet die erforderliche Geschwindigkeit, um die Zielposition innerhalb der vorgegebenen Zeit zu erreichen
  5. Die Bewegung nutzt maximale Beschleunigung für ein reaktionsfreudiges Gefühl

Position 0 bedeutet vollständig eingefahren (Home), und Position 100 bedeutet vollständig ausgefahren. Der Zeitparameter gibt an, wie lange die Bewegung dauern sollte, sodass der OSSM die geeignete Geschwindigkeit für eine reibungslose Wiedergabe berechnen kann.

Anforderungen

  • Firmware-Version 3.0 oder höher
  • OSSM muss sich im Streaming-Modus befinden (Status: streaming oder streaming.idle).
  • Befehle, die über das primäre Befehlsmerkmal gesendet werden

Informationen zur Funscript-Wiedergabe finden Sie im Tool Funscript-Player, das das Timing und die Befehlsgenerierung automatisch übernimmt.

GPIO-Merkmale

GPIO-Steuermerkmal

EigenschaftWert
UUID522b443a-4f53-534d-4000-420badbabe69
EigenschaftenREAD, WRITE
ZweckSteuern Sie GPIO-Ausgangspins für Zubehör und Integrationen

Schreiben Sie Befehle im Format <pin>:<state>, wobei Pin 1-4 ist und der Status high/low oder 1/0 ist.

Pin-Zuordnung:

Logischer PinESP32 GPIO
1GPIO 2
2GPIO 15
3GPIO 22
4GPIO 33

Antwortformat:

AntwortBedeutung
ok:<pin>:<state>Pin erfolgreich gesetzt
error:invalid_formatBefehlsformat nicht erkannt
error:pin_out_of_rangePin-Nummer nicht 1-4

Eine ausführliche GPIO-Dokumentation einschließlich Hardware-Integrationsbeispielen finden Sie unter GPIO-Steuerung.

Fleshy Thrust Sync-Emulation (nur zum Testen)

Diese Funktion dient nur Entwicklungstests und wird nicht zur Verwendung empfohlen. Sie erfordert einen speziellen Firmware-Build und kann in zukünftigen Versionen entfernt werden.

Die OSSM-Firmware kann optional das Fleshy Thrust Sync (FTS) BLE-Protokoll für Kompatibilitätstests mit Anwendungen wie faptap.net emulieren. Diese Funktion ist standardmäßig deaktiviert und erfordert das Kompilieren der Firmware mit dem Flag PRETEND_TO_BE_FLESHY_THRUST_SYNC.

FTS-Dienst

EigenschaftWert
Dienst-UUID0000ffe0-0000-1000-8000-00805f9b34fb
Merkmals-UUID0000ffe1-0000-1000-8000-00805f9b34fb
EigenschaftenREAD, WRITE, NOTIFY, INDICATE

Binäres Protokollformat

FTS verwendet ein kompaktes Binärformat anstelle von Textbefehlen:

ByteBeschreibungBereich
0Position0-180 (uint8)
1Zeit High-ByteMSB der Zeit in ms
2Zeit-Low-ByteLSB der Zeit in ms

Positionszuordnung: 0 = vollständig eingefahren, 180 = vollständig ausgefahren

Zeitformat: 16-Bit-Ganzzahl ohne Vorzeichen im Big-Endian (Netzwerk-Byte-Reihenfolge)

Beispiel

Um in 250 ms auf Position 90 (50 % ausgefahren) zu gelangen:

Byte 0: 0x5A (90 decimal - position)
Byte 1: 0x00 (250 >> 8 = 0)
Byte 2: 0xFA (250 & 0xFF = 250)

Die FTS-Emulation verwendet denselben zugrunde liegenden Streaming-Mechanismus wie der native Befehl stream:pos:time. Damit die Befehle wirksam werden, muss sich das OSSM im Streaming-Modus befinden.

Warum nicht empfohlen

  • Das FTS-Protokoll ist eine Spezifikation eines Drittanbieters, die nicht vom OSSM-Projekt kontrolliert wird
  • Protokolländerungen in FTS-kompatiblen Anwendungen können die Kompatibilität beeinträchtigen
  • Für neue Integrationen wird das native OSSM-Streaming-Protokoll (stream:pos:time) bevorzugt
  • Diese Funktion dient hauptsächlich zum Testen der Kompatibilität mit bestehenden FTS-Ökosystemen

Geräteinformationsdienst

Das OSSM implementiert den Standard-BLE-Geräteinformationsdienst zur Identifizierung.

MerkmalUUIDWert
Service180AGeräteinformationsdienst
Herstellername2A29"Research And Desire"
System-ID2A2388:1A:14:FF:FE:34:29:63

UUID-Namespace-Struktur

Das OSSM verwendet einen strukturierten UUID-Namespace für die organisierte Erweiterung.

Dienst-UUID

0x0001 = Service UUID

Namespacebereiche

BereichHex-BereichBeschreibung
0x00x0000–0x0FFFReserviert für Systemmeldungen
0x10x1000–0x1FFFBefehle und Konfiguration
0x20x2000–0x2FFFStatusinformationen
0x30x3000–0x3FFFMusterinformationen
0x40x4000–0x4FFFGPIO-Pin-Einstellung
0x5–0xD0x5000–0xDFFFFür zukünftige Verwendung reserviert
0xE0xE000–0xEFFFReserviert für Statistiken
0xF0xF000–0xFFFFExperimentell / Sandbox (flüchtig)

Aktuelle Merkmalszuordnungen

522b443a-4f53-534d-1000-420badbabe69  # Primary command
522b443a-4f53-534d-1010-420badbabe69  # Speed knob configuration
522b443a-4f53-534d-1020-420badbabe69  # WiFi configuration

Verbindungsmanagement

Advertising

EinstellungWert
GerätenameOSSM
Dienst-UUIDsPrimärer Dienst + Geräteinformationsdienst
Advertising-Intervall20–40 ms (optimiert für Zuverlässigkeit)
Automatischer NeustartAdvertising wird fortgesetzt, wenn alle Clients die Verbindung trennen

Sicherheit

EinstellungWert
Kopplung„Just Works“ (keine Authentifizierung erforderlich)
VerschlüsselungBLE Secure Connections aktiviert
BondingDeaktiviert (keine dauerhafte Kopplung)

Das OSSM verwendet zur Vereinfachung der Verwendung die „Just Works“-Kopplung. Jeder innerhalb der BLE-Reichweite kann eine Verbindung herstellen, wenn das Gerät Advertising betreibt.

Sicherheit bei Verbindungstrennung

Wenn eine BLE-Verbindung unerwartet verloren geht, verringert das OSSM automatisch die Geschwindigkeit, um einen außer Kontrolle geratenen Betrieb zu verhindern.

Ramp-Down-Verhalten:

  1. Verbindungsverlust festgestellt
  2. 1 Sekunde Verzögerung – ermöglicht kurze Signalausfälle ohne Auslösung
  3. 2-Sekunden-Rampe – Die Geschwindigkeit nimmt mithilfe der Ease-in-out-Sinuskurve vom aktuellen Wert auf Null ab
  4. Das Gerät fährt mit der Geschwindigkeit Null weiter, bis es wieder verbunden oder manuell gestoppt wird

Die Ease-in-out-Sinuskurve sorgt für eine sanfte Verzögerung, die sich natürlich anfühlt und die mechanische Belastung reduziert. Wenn die Geschwindigkeit beim Trennen bereits Null war, erfolgt keine Rampe.

Überlegungen für Clients:

  • Implementieren Sie eine Verbindungsüberwachung, um Verbindungsabbrüche schnell zu erkennen
  • Erwägen Sie die automatische Wiederverbindungslogik
  • Die lokalen Bedienelemente (Potentiometer, Encoder) bleiben während und nach der Trennung aktiv
  • Benutzer können manuell über den Geschwindigkeitsknopf anhalten oder für einen Notstopp lange drücken

Leitfaden zur Client-Implementierung

Verbindungsfluss

Befolgen Sie diese Schritte, um eine Verbindung herzustellen und mit der Steuerung Ihres OSSM zu beginnen:

Suchen Sie nach dem Gerät

Suchen Sie nach BLE-Geräten mit dem Namen „OSSM“.

Das Gerät wird in den Scanergebnissen angezeigt.

Stellen Sie eine Verbindung zum Gerät her

Initiieren Sie eine GATT-Verbindung zum OSSM.

Entdecken Sie Dienste

Entdecken Sie alle Dienste und Merkmale auf dem Gerät.

Die primäre Dienst-UUID 522b443a-4f53-534d-0001-420badbabe69 wurde gefunden.

Abonnieren Sie Statusbenachrichtigungen

Aktivieren Sie Benachrichtigungen zum Statusmerkmal, um Echtzeitaktualisierungen zu erhalten.

Ausgangszustand lesen

Lesen Sie den aktuellen Status und die Musterliste, um Ihre Anwendung zu initialisieren.

Befehle senden

Beginnen Sie mit dem Senden von Befehlen zur Steuerung des OSSM.

Best Practices

Befehlsverarbeitung

  • Überprüfen Sie das Befehlsformat vor dem Senden
  • Verarbeiten Sie sowohl die Antworten ok: als auch fail:
  • Implementieren Sie eine Wiederholungslogik für kritische Befehle
  • Überwachen Sie Statusänderungen, um die Befehlsausführung zu bestätigen

Statusüberwachung

  • Abonnieren Sie Benachrichtigungen zu Statusmerkmalen
  • Analysieren Sie JSON-Statusaktualisierungen zuverlässig
  • Behandeln Sie Zustandsübergänge angemessen
  • Implementieren Sie die Timeout-Behandlung für fehlende Updates

Beispielcode

// Connect to OSSM
const device = await navigator.bluetooth.requestDevice({
  filters: [{ name: "OSSM" }],
  optionalServices: ["522b443a-4f53-534d-0001-420badbabe69"],
});

const server = await device.gatt.connect();
const service = await server.getPrimaryService(
  "522b443a-4f53-534d-0001-420badbabe69"
);

// Get characteristics
const commandChar = await service.getCharacteristic(
  "522b443a-4f53-534d-1000-420badbabe69"
);
const stateChar = await service.getCharacteristic(
  "522b443a-4f53-534d-2000-420badbabe69"
);
const speedKnobConfigChar = await service.getCharacteristic(
  "522b443a-4f53-534d-1010-420badbabe69"
);
const wifiConfigChar = await service.getCharacteristic(
  "522b443a-4f53-534d-1020-420badbabe69"
);
const patternsChar = await service.getCharacteristic(
  "522b443a-4f53-534d-3000-420badbabe69"
);

// Subscribe to state updates
await stateChar.startNotifications();
stateChar.addEventListener("characteristicvaluechanged", (event) => {
  const state = JSON.parse(new TextDecoder().decode(event.target.value));
  console.log("State update:", state);
});

// Configure speed knob behavior (true = knob as limit, false = independent)
await speedKnobConfigChar.writeValue(new TextEncoder().encode("true"));

// Configure WiFi
await wifiConfigChar.writeValue(new TextEncoder().encode("set:wifi:MyNetwork|MyPassword123"));

// Check WiFi status
const wifiStatus = await wifiConfigChar.readValue();
console.log("WiFi:", JSON.parse(new TextDecoder().decode(wifiStatus)));

// Send a command
const command = "set:speed:75";
await commandChar.writeValue(new TextEncoder().encode(command));

// Read available patterns
const patterns = await patternsChar.readValue();
const patternList = JSON.parse(new TextDecoder().decode(patterns));
console.log("Available patterns:", patternList);
import asyncio
import json
from bleak import BleakClient

SERVICE_UUID = "522b443a-4f53-534d-0001-420badbabe69"
COMMAND_UUID = "522b443a-4f53-534d-1000-420badbabe69"
STATE_UUID = "522b443a-4f53-534d-2000-420badbabe69"
SPEED_KNOB_UUID = "522b443a-4f53-534d-1010-420badbabe69"
WIFI_CONFIG_UUID = "522b443a-4f53-534d-1020-420badbabe69"

def state_callback(sender, data):
    """Handle state update notifications."""
    state = json.loads(data.decode())
    print(f"State update: {state}")

async def connect_to_ossm():
    async with BleakClient("OSSM") as client:
        # Subscribe to state updates
        await client.start_notify(STATE_UUID, state_callback)

        # Configure speed knob behavior
        await client.write_gatt_char(
            SPEED_KNOB_UUID,
            "true".encode()  # Knob acts as upper limit
        )

        # Configure WiFi
        await client.write_gatt_char(
            WIFI_CONFIG_UUID,
            "set:wifi:MyNetwork|MyPassword123".encode()
        )

        # Check WiFi status
        wifi_status = await client.read_gatt_char(WIFI_CONFIG_UUID)
        print(f"WiFi status: {json.loads(wifi_status.decode())}")

        # Send a command
        command = "set:speed:75"
        await client.write_gatt_char(COMMAND_UUID, command.encode())

        # Keep connection alive to receive notifications
        await asyncio.sleep(10)

asyncio.run(connect_to_ossm())

Fehlerbehebung

Debug-Informationen

Aktivieren Sie die ESP32-Protokollierung auf DEBUG-Ebene, um detaillierte Protokollinformationen zu erhalten. Überwachen Sie den BLE-Verbindungsstatus, MTU-Änderungen und Zustandsmaschinenübergänge.

Auf dieser Seite