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-420badbabe69Die 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
| Eigenschaft | Wert |
|---|---|
| UUID | 522b443a-4f53-534d-1000-420badbabe69 |
| Eigenschaften | READ, WRITE |
| Zweck | Senden Sie Befehle, um das OSSM-Verhalten zu steuern |
Befehlsformat
set:<parameter>:<value>
go:<state>Verfügbare Befehle
| Befehl | Parameter | Wertebereich | Beschreibung |
|---|---|---|---|
set:speed:<value> | speed | 0-100 | Stellen Sie den Prozentsatz der Hubgeschwindigkeit ein |
set:stroke:<value> | stroke | 0-100 | Stellen Sie den Prozentsatz der Hublänge ein |
set:depth:<value> | depth | 0-100 | Stellen Sie den Prozentsatz der Eindringtiefe ein |
set:sensation:<value> | sensation | 0-100 | Stellen Sie den Prozentsatz der Empfindungsintensität ein |
set:pattern:<value> | pattern | 0-6 | Hubmuster 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, time | pos: 0-100, time: ms | Senden Sie einen Positionsbefehl im Streaming-Modus (experimentell) |
Antwortformat
| Antwort | Bedeutung |
|---|---|
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
| Eigenschaft | Wert |
|---|---|
| UUID | 522b443a-4f53-534d-1010-420badbabe69 |
| Eigenschaften | READ, WRITE |
| Zweck | Konfigurieren Sie, ob der physische Geschwindigkeitsknopf BLE-Geschwindigkeitsbefehle begrenzt |
Konfigurationswerte
| Wert | Beschreibung |
|---|---|
true, 1, t | Geschwindigkeitsknopf fungiert als Obergrenze (Standard) |
false, 0, f | Geschwindigkeitsregler 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.
Bei der Einstellung false werden BLE-Geschwindigkeitsbefehle (0-100) direkt als Geschwindigkeitswert verwendet, wobei die Knopfposition ignoriert wird.
Beispiel: BLE-Befehl set:speed:80 → Effektive Geschwindigkeit = 80 %
Im unabhängigen Modus können BLE-Befehle den physischen Knopf außer Kraft setzen. Stellen Sie sicher, dass Ihre Anwendung geeignete Sicherheitskontrollen implementiert.
Antwortformat
| Antwort | Bedeutung |
|---|---|
true oder false | Aktueller Konfigurationswert |
error:invalid_value | Ungültige Eingabe bereitgestellt |
Konfigurationsmerkmal für die Latenzkompensation
| Eigenschaft | Wert |
|---|---|
| UUID | 522b443a-4f53-534d-1030-420badbabe69 |
| Eigenschaften | READ, WRITE |
| Zweck | Konfigurieren Sie, ob der OSSM versucht, die Latenz zu kompensieren |
Konfigurationswerte
| Wert | Beschreibung |
|---|---|
true, 1, t | Die Latenzkompensation ist aktiv |
false, 0, f | Latenzkompensation 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.
Bei der Einstellung false führt der OSSM Befehle aus, sobald sie empfangen werden. Verspätet eintreffende Befehle werden verspätet ausgeführt.
Befehle, die früher eintreffen, werden ausgeführt, wenn der vorherige Befehl beendet ist.
Antwortformat
| Antwort | Bedeutung |
|---|---|
true oder false | Aktueller Konfigurationswert |
error:invalid_value | Ungültige Eingabe bereitgestellt |
WiFi-Konfigurationsmerkmal
| Eigenschaft | Wert |
|---|---|
| UUID | 522b443a-4f53-534d-1020-420badbabe69 |
| Eigenschaften | READ, WRITE |
| Zweck | WiFi-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
| Antwort | Bedeutung |
|---|---|
ok:wifi:connected | Erfolgreich verbunden |
ok:wifi:saved | Anmeldedaten gespeichert, Verbindung wird versucht |
fail:wifi:invalid_format | Befehlsformat falsch (Pipe-Trennzeichen fehlt) |
fail:wifi:invalid_ssid | SSID-Länge ungültig (muss 1–32 Zeichen lang sein) |
fail:wifi:invalid_password | Passwortlänge ungültig (muss 8–63 Zeichen lang sein) |
fail:wifi:connection_failed | Es konnte keine Verbindung zum Netzwerk hergestellt werden |
fail:wifi:save_failed | Anmeldeinformationen 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
| Eigenschaft | Wert |
|---|---|
| UUID | 522b443a-4f53-534d-2000-420badbabe69 |
| Eigenschaften | READ, 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
}| Zustand | Beschreibung |
|---|---|
idle | Initialisierung |
homing | Homing-Sequenz aktiv |
homing.forward | Vorwärtsreferenzierung läuft |
homing.backward | Rückwärtsreferenzierung läuft |
menu | Hauptmenü angezeigt |
menu.idle | Ruhezustand des Menüs |
simplePenetration | Einfacher Penetrationsmodus |
simplePenetration.idle | Einfache Penetration im Leerlauf |
simplePenetration.preflight | Vorabprüfungen |
strokeEngine | Stroke Engine-Modus |
strokeEngine.idle | Stroke Engine inaktiv |
strokeEngine.preflight | Vorabprüfungen |
strokeEngine.pattern | Musterauswahl |
streaming | Streaming-Modus (experimentell) |
update | Update-Modus |
update.checking | Suche nach Updates |
update.updating | Aktualisierung läuft |
update.idle | Update im Leerlauf |
wifi | WiFi-Setup-Modus |
wifi.idle | WiFi-Setup im Leerlauf |
help | Hilfebildschirm |
help.idle | Hilfe im Leerlauf |
error | Fehlerstatus |
error.idle | Fehler im Leerlauf-Unterstatus |
error.help | Fehlerhilfe |
restart | Neustartstatus |
Die vollständige Implementierung des Zustandsautomaten finden Sie unter OSSM.h im Quell-Repository.
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
| Eigenschaft | Wert |
|---|---|
| UUID | 522b443a-4f53-534d-3000-420badbabe69 |
| Eigenschaften | READ |
| Zweck | Verfü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
| Eigenschaft | Wert |
|---|---|
| UUID | 522b443a-4f53-534d-3010-420badbabe69 |
| Eigenschaften | READ, WRITE |
| Zweck | Beschreibungen 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
| Muster | Index | Beschreibung |
|---|---|---|
| Simple Stroke | 0 | Beschleunigung, Ausrollen und Verzögerung gleichmäßig aufgeteilt; keine Empfindung |
| Teasing Pounding | 1 | Geschwindigkeitswechsel mit Empfindung; gleicht schnellere Hübe aus |
| Robo Stroke | 2 | Empfindung variiert Beschleunigung; von roboterhaft bis schrittweise |
| Half'n'Half | 3 | Hübe mit voller und halber Tiefe wechseln sich ab; die Empfindung beeinflusst die Geschwindigkeit |
| Deeper | 4 | Die Hubtiefe erhöht sich pro Zyklus; die Empfindung bestimmt die Anzahl |
| Stop'n'Go | 5 | Pausen zwischen den Hüben; die Empfindung passt die Länge an |
| Insist | 6 | Ä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
| Eigenschaft | Wert |
|---|---|
| Format | stream:<position>:<time> |
| Position | 0-100 (Prozentsatz des Hubs) |
| Zeit | Millisekunden 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 300msWie es funktioniert
- Wechseln Sie mit
go:streamingin den Streaming-Modus - Das OSSM fährt Position 0 an (vollständig eingefahren)
- Senden Sie
stream:<pos>:<time>-Befehle, um die Bewegung zu steuern - Die Firmware berechnet die erforderliche Geschwindigkeit, um die Zielposition innerhalb der vorgegebenen Zeit zu erreichen
- 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:
streamingoderstreaming.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
| Eigenschaft | Wert |
|---|---|
| UUID | 522b443a-4f53-534d-4000-420badbabe69 |
| Eigenschaften | READ, WRITE |
| Zweck | Steuern 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 Pin | ESP32 GPIO |
|---|---|
| 1 | GPIO 2 |
| 2 | GPIO 15 |
| 3 | GPIO 22 |
| 4 | GPIO 33 |
Antwortformat:
| Antwort | Bedeutung |
|---|---|
ok:<pin>:<state> | Pin erfolgreich gesetzt |
error:invalid_format | Befehlsformat nicht erkannt |
error:pin_out_of_range | Pin-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
| Eigenschaft | Wert |
|---|---|
| Dienst-UUID | 0000ffe0-0000-1000-8000-00805f9b34fb |
| Merkmals-UUID | 0000ffe1-0000-1000-8000-00805f9b34fb |
| Eigenschaften | READ, WRITE, NOTIFY, INDICATE |
Binäres Protokollformat
FTS verwendet ein kompaktes Binärformat anstelle von Textbefehlen:
| Byte | Beschreibung | Bereich |
|---|---|---|
| 0 | Position | 0-180 (uint8) |
| 1 | Zeit High-Byte | MSB der Zeit in ms |
| 2 | Zeit-Low-Byte | LSB 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.
| Merkmal | UUID | Wert |
|---|---|---|
| Service | 180A | Geräteinformationsdienst |
| Herstellername | 2A29 | "Research And Desire" |
| System-ID | 2A23 | 88: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 UUIDNamespacebereiche
| Bereich | Hex-Bereich | Beschreibung |
|---|---|---|
| 0x0 | 0x0000–0x0FFF | Reserviert für Systemmeldungen |
| 0x1 | 0x1000–0x1FFF | Befehle und Konfiguration |
| 0x2 | 0x2000–0x2FFF | Statusinformationen |
| 0x3 | 0x3000–0x3FFF | Musterinformationen |
| 0x4 | 0x4000–0x4FFF | GPIO-Pin-Einstellung |
| 0x5–0xD | 0x5000–0xDFFF | Für zukünftige Verwendung reserviert |
| 0xE | 0xE000–0xEFFF | Reserviert für Statistiken |
| 0xF | 0xF000–0xFFFF | Experimentell / 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 configuration522b443a-4f53-534d-2000-420badbabe69 # Current state522b443a-4f53-534d-3000-420badbabe69 # Pattern list
522b443a-4f53-534d-3010-420badbabe69 # Pattern description522b443a-4f53-534d-4000-420badbabe69 # GPIO controlVerbindungsmanagement
Advertising
| Einstellung | Wert |
|---|---|
| Gerätename | OSSM |
| Dienst-UUIDs | Primärer Dienst + Geräteinformationsdienst |
| Advertising-Intervall | 20–40 ms (optimiert für Zuverlässigkeit) |
| Automatischer Neustart | Advertising wird fortgesetzt, wenn alle Clients die Verbindung trennen |
Sicherheit
| Einstellung | Wert |
|---|---|
| Kopplung | „Just Works“ (keine Authentifizierung erforderlich) |
| Verschlüsselung | BLE Secure Connections aktiviert |
| Bonding | Deaktiviert (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:
- Verbindungsverlust festgestellt
- 1 Sekunde Verzögerung – ermöglicht kurze Signalausfälle ohne Auslösung
- 2-Sekunden-Rampe – Die Geschwindigkeit nimmt mithilfe der Ease-in-out-Sinuskurve vom aktuellen Wert auf Null ab
- 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 auchfail: - 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
Symptome: Das OSSM kann nicht erkannt oder keine Verbindung hergestellt werden.
Lösungen:
- Stellen Sie sicher, dass das OSSM eingeschaltet ist und sich in Reichweite (~10 Meter) befindet.
- Stellen Sie sicher, dass derzeit kein anderes Gerät mit dem OSSM verbunden ist
- Starten Sie den OSSM neu, um den BLE-Stack zurückzusetzen
- Versuchen Sie, näher an das Gerät heranzukommen
Symptome: Befehle geben fail: zurück oder haben keine Wirkung.
Lösungen:
- Stellen Sie sicher, dass das Befehlsformat genau mit der Spezifikation übereinstimmt
- Überprüfen Sie, ob sich der OSSM in einem Zustand befindet, der Befehle akzeptiert (z. B.
strokeEngineodersimplePenetration). - Verwenden Sie zuerst
go:strokeEngineodergo:simplePenetration, wenn Sie sich im Menüstatus befinden - Lesen Sie den aktuellen Status, um zu verstehen, welche Befehle gültig sind
Symptome: Das Statusmerkmal wird nach dem Abonnieren nie aktualisiert.
Lösungen:
- Überprüfen Sie, ob das Benachrichtigungsabonnement erfolgreich war
- Überprüfen Sie, ob Ihre BLE-Bibliothek Benachrichtigungen unterstützt
- Stellen Sie sicher, dass Sie Benachrichtigungen von der richtigen Merkmals-UUID lesen
- Versuchen Sie, die Verbindung zu trennen und erneut herzustellen
Symptome: Empfang unerwarteter oder fehlerhafter Daten.
Lösungen:
- Stellen Sie sicher, dass Sie Antworten als UTF-8-Text dekodieren
- Stellen Sie sicher, dass die JSON-Analyse das Statusformat korrekt verarbeitet
- Suchen Sie nach Codierungsproblemen in Ihrer BLE-Bibliothek
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.