Zum Inhalt springen
>_marc-oltersdorf.de

Garmin Connect IQ: BLE-Gerät mit PIN-Kopplung meldet INSUFFICIENT_AUTHENTICATION – Grenze und Ausweg

Marc Oltersdorf 2 Min. Lesezeit

Ich wollte die Lichtanlage meines Fahrrads direkt vom Garmin Edge 1050 per Connect-IQ-BLE steuern. Gefunden, verbunden und gekoppelt wurde das Gerät, jeder Schreibzugriff endete aber mit STATUS_GATT_INSUFFICIENT_AUTHENTICATION_FAIL. Das Gerät verlangt eine Kopplung mit Passkey, die Connect IQ nicht kann. Gelöst habe ich es mit einer Android-Brücke.

$ git log --graph Der Weg zur Lösung

  1. Problem Schreiben scheitert

    Der Edge findet und koppelt das Gerät, jedes Schreiben endet mit STATUS_GATT_INSUFFICIENT_AUTHENTICATION_FAIL.

  2. Irrweg Andere Kopplungswege

    requestBond von Hand, CONNECTION_STRATEGY_SECURE_PAIR_BOND und eine neue App-ID blieben ohne Wirkung.

  3. Erkenntnis Security Level 3

    Die Firmware verlangt eine Kopplung mit Passkey, Connect IQ kann nur Just Works.

  4. Lösung Android-Brücke

    Das Handy koppelt mit Passkey, der Edge spricht per Connect IQ Mobile SDK mit dem Handy.

Die Lichtanlage (Canyon ECLIPS) spricht Nordic UART: Ein Byte auf 6E400002 schaltet, die Statusantwort kommt als Notification auf 6E400003. Unter Android wird sie mit einem 6-stelligen Passkey gekoppelt, den letzten sechs Ziffern der Seriennummer. Mein Ziel war ein Connect-IQ-Programm auf dem Edge 1050, das direkt per Toybox.BluetoothLowEnergy schaltet, ohne Handy.

Das Problem

Der Edge fand das Gerät, verband sich, die Kopplung lief durch, und der Link war verschlüsselt. Trotzdem scheiterten das Einschalten der Notifications (CCCD-Write) und jedes Write-with-Response mit:

STATUS_GATT_INSUFFICIENT_AUTHENTICATION_FAIL

Aus Sicht des Programms sah alles richtig aus: bekannte Dienste, korrekte UUIDs, Status „gekoppelt“ und „verschlüsselt“. Nur schreiben durfte es nicht.

Die Ursache

In den Texten der Geräte-Firmware steht „Security L3 requested“. Das Gerät verlangt eine authentifizierte Kopplung (LE Security Mode 1, Level 3), hier mit festem Passkey. Connect IQ kann beim Koppeln keinen Passkey eingeben und koppelt nur „Just Works“. Das ergibt Level 2: verschlüsselt, aber nicht authentifiziert. Für die Firmware reicht das nicht, und ändern lässt sie sich nicht, weil sie signiert ist.

Ohne Erfolg ausprobiert:

  • requestBond() von Hand aus dem Menü des Programms. Die Kopplung klappt, der Fehler bleibt.
  • CONNECTION_STRATEGY_SECURE_PAIR_BOND (ab API 5.1). Keine Änderung.
  • Eine neue App-ID für frische Kopplungsdaten. Keine Änderung.

Der Ausweg: Handy als Brücke

Android kann den Passkey im normalen Kopplungsdialog abfragen. Also übernimmt eine kleine Android-App die BLE-Verbindung, und der Edge redet über das Connect IQ Mobile SDK mit ihr:

  • Edge (Datenfeld) zum Handy: Communications.transmit({"c" => Befehlsbyte, "n" => Nr})
  • Das Handy schreibt das Byte an das Gerät und schickt die Statuswerte zurück (sendMessage mit einem Dictionary aus Strings).
  • Das Datenfeld empfängt sie mit Communications.registerForPhoneAppMessages und zeigt sie an.

Das läuft seitdem: Licht schalten per Tipp auf das Datenfeld, Akkustand und Ladestrom am Edge. Der Preis ist, dass das Handy mitfahren muss. Die Alternative wäre ein eigener Mikrocontroller am Rad, etwa ein ESP32, der sich mit Passkey koppeln kann. Das habe ich nicht ausprobiert.

Stolperfallen

  • Bevor man lange am eigenen Code sucht: nachsehen, ob das Gerät Level 3 verlangt. Wenn ja, ist Connect IQ direkt chancenlos. Ein Hinweis darauf ist, dass unter Android eine PIN abgefragt wird.
  • BLE im Connect-IQ-Simulator geht nur mit einem nRF52-Dongle. Die Oberfläche lässt sich ohne testen, die Kopplung nicht.
  • Eigene Service-UUIDs müssen im BLE-Profil des Programms registriert werden, und die Zahl der Profile ist begrenzt.

Hat dir das geholfen?

RSS abonnieren

$ ls ../ Passt dazu