Bluetooth LE ist nicht so beängstigend oder wie man die Benutzererfahrung ohne großen Aufwand verbessert

Vor kurzem hat unser Team die Funktion des Geldtransfers auf dem Luftweg mithilfe der Bluetooth LE-Technologie entwickelt und implementiert. Ich möchte Ihnen sagen, wie wir es gemacht haben und was Apple uns von den Tools zur Verfügung stellt. Viele Entwickler halten Bluetooth für schwierig, da es sich um ein Protokoll auf niedriger Ebene handelt und es nicht viele Experten gibt. Aber alles ist nicht so beängstigend, und tatsächlich ist die Verwendung dieser Funktion sehr einfach! Und die Funktionen, die mit Bluetooth LE implementiert werden können, sind sicherlich interessant und werden anschließend Ihre Anwendung unter den Mitbewerbern hervorheben.



Lassen Sie uns zunächst verstehen, um welche Art von Technologie es sich handelt und was den Unterschied zum klassischen Bluetooth ausmacht.

Was ist Bluetooth LE?


Warum haben die Bluetooth-Entwickler diese Technologie Low Energy genannt? Immerhin war der Stromverbrauch mit jeder neuen Bluetooth-Version bereits um ein Vielfaches niedriger. Die Antwort liegt in dieser Batterie.


Sein Durchmesser beträgt nur 2 cm und die Kapazität beträgt ca. 220 mA * h. Als Ingenieure Bluetooth LE entwickelten, wollten sie, dass das Gerät mit einem solchen Akku mehrere Jahre lang funktioniert. Und sie haben es geschafft! Bluetooth LE-Geräte mit einem solchen Akku können ein Jahr lang funktionieren. Wie viele von Ihnen schalten das Bluetooth Ihres Telefons immer noch auf die altmodische Weise aus, um Energie zu sparen, wie Sie es im Jahr 2000 getan haben? Vergebens tun Sie dies - die Einsparungen betragen weniger als 10 Sekunden des Telefons pro Tag. Und Sie deaktivieren sehr große Funktionen wie Handoff, AirDrop und andere.

Was haben die Ingenieure durch die Entwicklung von Bluetooth LE erreicht? Haben sie das klassische Protokoll verfeinert? Energieeffizienter gemacht? Nur alle Prozesse optimiert? Nein. Sie haben die Architektur des Bluetooth-Stacks komplett neu gestaltet und die Tatsache erreicht, dass Sie jetzt, um für alle anderen Geräte sichtbar zu sein, weniger Zeit benötigen, um in der Luft zu sein und den Kanal zu belegen. Dies ermöglichte wiederum eine gute Einsparung beim Energieverbrauch. Und mit der neuen Architektur kann jetzt jedes neue Gerät standardisiert werden, dank dessen Entwickler aus der ganzen Welt mit dem Gerät kommunizieren und daher problemlos neue Anwendungen schreiben können, um es zu verwalten. Darüber hinaus ist das Prinzip der Selbsterkennung in die Architektur eingebettet: Wenn Sie eine Verbindung zu einem Gerät herstellen, müssen Sie keine PIN-Codes eingeben. Wenn Ihre Anwendung mit diesem Gerät kommunizieren kann, dauert die Verbindung einige Millisekunden.

  • Weniger Zeit in der Luft.
  • Weniger Stromverbrauch.
  • Neue Architektur.
  • Reduzierte Verbindungszeit.

Wie haben die Ingenieure einen so großen Sprung in der Energieeffizienz geschafft?

Die Frequenz blieb gleich: 2,4 GHz, nicht zertifiziert und in vielen Ländern kostenlos. Die Verbindungsverzögerung ist jedoch geringer geworden: 15-30 ms statt 100 ms mit klassischem Bluetooth. Der Arbeitsabstand blieb gleich - 100 m. Das Übertragungsintervall war nicht stark, sondern änderte sich - statt 0,625 ms wurden es 3 ms.

Aus diesem Grund konnte der Energieverbrauch nicht verzehnfacht werden. Natürlich musste etwas leiden. Und das ist die Geschwindigkeit: Statt 24 Mbit / s wurden es 0,27 Mbit / s. Sie werden wahrscheinlich sagen, dass dies für 2018 eine lächerliche Geschwindigkeit ist.

Wo wird Bluetooth LE verwendet?




Diese Technologie ist nicht jung, sie erschien zuerst im iPhone 4s. Und schon geschafft, viele Gebiete zu erobern. Bluetooth LE wird in allen Smart-Home-Geräten und tragbaren Elektronikgeräten verwendet. Jetzt gibt es sogar Pommes in der Größe von Kaffeebohnen.



Und wie wird diese Technologie in Software angewendet?

Da Apple als erstes Unternehmen Bluetooth in sein Gerät integriert und in Betrieb genommen hat, haben sie inzwischen gute Fortschritte erzielt und Technologie in ihr Ökosystem integriert. Und jetzt können Sie diese Technologie in Diensten wie AirDrop, Schnellstart von Geräten, Teilen von Passwörtern und Übergabe erfüllen. Und selbst die Benachrichtigungen in der Uhr erfolgen über Bluetooth LE. Darüber hinaus hat Apple eine öffentlich zugängliche Dokumentation veröffentlicht, wie Sie sicherstellen können, dass Benachrichtigungen von allen Anwendungen auf Ihre eigenen Geräte gelangen. Welche Rolle spielen Geräte in Bluetooth LE?



Brodcaster. Sendet Nachrichten an alle Personen in der Nähe. Sie können keine Verbindung zu diesem Gerät herstellen. Nach diesem Prinzip funktionieren iBeacons und Indoor-Navigation.

Beobachter. Hört zu, was gerade passiert, und empfängt Daten nur von öffentlichen Nachrichten. Erstellt keine Verbindungen.

Aber mit Central und Peripheral interessanter. Warum wurden sie nicht einfach Server-Client genannt? Logischerweise nach dem Namen zu urteilen. Aber nein.

Weil Peripheral tatsächlich als Server fungiert. Dies ist ein Peripheriegerät, das weniger Strom verbraucht und eine Verbindung zum leistungsstärkeren Central herstellt. Peripheral kann Sie darüber informieren, dass es in der Nähe ist und welche Dienste es hat. Es kann nur ein Gerät eine Verbindung herstellen, und Peripheral verfügt über einige Daten. Und Central kann die Luft nach Geräten durchsuchen, Verbindungsanfragen senden, eine Verbindung zu einer beliebigen Anzahl von Geräten herstellen, Daten von Peripheral lesen, schreiben und abonnieren.

Worauf haben wir als Entwickler im Apple-Ökosystem Zugriff?

Was steht uns zur Verfügung?


iOS / Mac OS:

  • Peripherie und zentral.
  • Hintergrundmodus.
  • Wiederherstellung des Staates.
  • Verbindungsintervall 15 ms.

watchOS / tvOS:

  • watchOS 4+ / tvOS 9+.
  • Nur zentral.
  • Maximal zwei Verbindungen.
  • Apple Watch Serie 2+ / AppleTv 4+.
  • Herunterfahren beim Aufrufen des Hintergrunds.
  • Verbindungsintervall 30 ms.

Der wichtigste Unterschied ist das Verbindungsintervall. Was betrifft es? Um diese Frage zu beantworten, müssen Sie zunächst verstehen, wie das Bluetooth LE-Protokoll funktioniert und warum ein so kleiner Unterschied in den absoluten Werten sehr wichtig ist.

Wie das Protokoll funktioniert


Wie ist der Such- und Verbindungsprozess?

Peripheral meldet seine Anwesenheit bei der Häufigkeit des Werbeintervalls, sein Paket ist sehr klein und enthält nur wenige vom Gerät bereitgestellte Dienstkennungen sowie den Gerätenamen. Das Intervall kann sehr groß sein und hängt vom aktuellen Status des Geräts, dem Energiesparmodus und anderen Einstellungen ab. Apple empfiehlt Entwicklern externer Geräte, die Länge des Intervalls an den Beschleunigungsmesser zu binden: Erhöhen Sie das Intervall, wenn das Gerät nicht verwendet wird, und verringern Sie es, wenn es aktiv ist, um das Gerät schnell zu finden. Das Ankündigungsintervall korreliert nicht mit dem Verbindungsintervall und wird vom Gerät selbst abhängig vom Stromverbrauch und seinen Einstellungen festgelegt. Es ist im Apple-Ökosystem nicht zugänglich und uns unbekannt, es wird vollständig vom System gesteuert.



Nachdem wir das Gerät gefunden haben, senden wir eine Verbindungsanforderung, und hier tritt das Verbindungsintervall in die Szene ein - die Zeit, nach der das zweite Gerät auf die Anforderung antworten kann. Aber dies ist beim Verbinden, aber was passiert beim Lesen / Schreiben?



Das Verbindungsintervall wird auch beim Lesen von Daten angezeigt. Durch zweimaliges Reduzieren wird die Datenübertragungsrate erhöht. Sie müssen jedoch verstehen, dass, wenn beide Geräte nicht dasselbe Intervall unterstützen, das Maximum ausgewählt wird.

Schauen wir uns an, woraus ein Informationspaket besteht, das Peripheral übergibt.

Die MTU (maximale Übertragungseinheit) eines solchen Pakets wird während des Verbindungsprozesses bestimmt und variiert von Gerät zu Gerät und abhängig vom Betriebssystem. In der Protokollversion 4.0 betrug die MTU etwa 30, und die Größe der Nutzlast überschritt 20 Byte nicht. In Version 4.2 hat sich alles geändert, jetzt können Sie ca. 520 Bytes übertragen. Leider unterstützen nur Geräte, die jünger als das iPhone 5s sind, diese Version des Protokolls. Die Größe des Overheads beträgt unabhängig von der Größe der MTU 7 Byte: Dies schließt ATT- und L2CAP-Header ein. Mit der Aufzeichnung im Allgemeinen eine ähnliche Situation.



Es gibt nur zwei Modi: mit und ohne Antwort. Der unbeantwortete Modus beschleunigt die Datenübertragung erheblich, da vor der nächsten Aufzeichnung kein Wartezeitintervall besteht. Dieser Modus ist jedoch nicht immer verfügbar, nicht auf allen Geräten und nicht auf allen Systemen. Der Zugriff auf diesen Aufzeichnungsmodus kann vom System selbst eingeschränkt werden, da er als weniger energieeffizient angesehen wird. In iOS gibt es eine Methode, mit der Sie vor der Aufzeichnung überprüfen können, ob dieser Modus verfügbar ist.

Schauen wir uns nun an, woraus das Protokoll besteht.



Das Protokoll besteht aus 5 Ebenen. Die Anwendungsschicht ist Ihre Logik, die über CoreBluetooth beschrieben wird. GATT (Generic Attributes Layer) wird verwendet, um Dienste und Eigenschaften auszutauschen, die sich auf den Geräten befinden. ATT (Attributes Layer) wird verwendet, um Ihre Eigenschaften zu verwalten und Ihre Daten zu übertragen. L2CAP ist ein Datenaustauschprotokoll auf niedriger Ebene. Controller ist der BT-Chip selbst.

Sie fragen sich wahrscheinlich, was GATT ist und wie wir damit arbeiten können?

Das GATT besteht aus Funktionen und Diensten. Ein Merkmal ist ein Objekt, in dem Ihre Daten wie eine Variable gespeichert sind. Und ein Dienst ist eine Gruppe, in der sich Ihre Merkmale befinden, wie ein Namespace. Der Dienst hat einen Namen - UUID, Sie wählen ihn selbst aus. Ein Dienst kann einen Nebendienst enthalten.



Das Merkmal hat auch eine eigene UUID - tatsächlich einen Namen. Der Wert des Merkmals ist NSData. Hier können Sie Daten aufzeichnen und speichern. Deskriptoren sind eine Beschreibung Ihres Merkmals. Sie können beschreiben, welche Daten Sie in diesem Merkmal erwarten oder was sie bedeuten. Es gibt viele Deskriptoren im Bluetooth-Protokoll, aber bisher sind auf Apple-Systemen nur zwei verfügbar: die menschliche Beschreibung und das Datenformat. Es gibt auch Berechtigungen für Ihre Funktion:



Lass es uns selbst versuchen


Wir hatten die Idee, Geld auf dem Luftweg zu überweisen, ohne dass der Empfänger etwas benötigt. Stellen Sie sich vor, Sie rätseln über eine sehr interessante Aufgabe, schreiben den perfekten Code, und hier schlägt ein Kollege vor, Kaffee zu trinken. Und Sie sind so begeistert von der Aufgabe, dass Sie nicht weggehen können und ihn bitten, Ihnen eine Tasse köstlichen Cappuccino zu kaufen. Er bringt dir Kaffee und du musst ihm das Geld zurückgeben. Sie können nach Telefonnummer übersetzen, es funktioniert gut. Aber hier ist eine unangenehme Situation - Sie kennen seine Nummer nicht. Nun, so arbeitest du seit drei Jahren, aber sie haben keine Nummern ausgetauscht :)

Aus diesem Grund haben wir uns entschlossen, Geld an Personen in der Nähe zu überweisen, ohne Benutzerdaten eingeben zu müssen. Wie in AirDrop. Wählen Sie einfach einen Benutzer aus und senden Sie den benötigten Betrag. Mal sehen, was wir dafür brauchen.



PUSH-Zuordnung


Wir brauchen den Absender:

  1. Ich konnte alle Geräte in der Nähe finden und unseren Service unterstützen.
  2. Ich konnte die Details lesen.
  3. Und er konnte dem Empfänger eine Nachricht senden, dass er ihm das Geld erfolgreich geschickt hatte.

Der Empfänger muss seinerseits in der Lage sein, die umliegenden Absender darüber zu informieren, dass er über einen Dienst mit den erforderlichen Daten verfügt, und Nachrichten vom Absender empfangen können. Ich denke, es lohnt sich nicht zu beschreiben, wie der Prozess der Geldüberweisung durch Details bei unserer Bank abläuft. Versuchen wir nun, dies umzusetzen.

Zuerst müssen Sie die Namen unserer Dienstleistungen und Merkmale finden. Wie gesagt, das ist die UUID. Wir generieren sie einfach und speichern sie auf Peripheral und Central, sodass sie auf beiden Geräten gleich sind.



Es steht Ihnen frei, UUIDs zu verwenden, mit Ausnahme derjenigen, die wie folgt enden: XXXXXXXX- 0000-1000-8000-00805F9B34FB - sie sind für verschiedene Unternehmen reserviert. Sie selbst können eine solche Nummer kaufen und niemand wird sie verwenden. Es kostet 2500 Dollar.

Als nächstes müssen wir Manager erstellen: einen zum Überweisen von Geldern, den anderen zum Empfangen. Sie müssen nur Delegaten angeben. Wir werden Zentral senden, Peripherie empfangen. Wir erstellen beide, weil sowohl der Absender als auch der Empfänger zu unterschiedlichen Zeiten eine Person sein können.



Jetzt müssen wir es ermöglichen, den Empfänger zu erkennen und die Details des Empfängers in unser Merkmal einzutragen.



Erstellen Sie zunächst einen Dienst. Wir werden die UUID registrieren und angeben, dass sie primär ist - das heißt, der Dienst ist der Hauptdienst für dieses Gerät. Ein gutes Beispiel: ein Herzfrequenzmesser, bei dem die aktuelle Herzfrequenz der Hauptdienst ist und der Batteriestatus eine sekundäre Information ist.

Als Nächstes erstellen wir zwei Merkmale: eines zum Lesen der Details des Empfängers und das zweite zum Schreiben, damit der Empfänger mehr über das Senden von Geld erfahren kann. Wir registrieren sie in unserem Dienst, fügen sie dann dem Manager hinzu, starten die Ermittlung und geben die UUID des Dienstes an, damit alle Geräte in der Nähe Informationen zu unserem Dienst erhalten können, bevor sie eine Verbindung herstellen. Diese Daten werden in das Paket gestellt, das Central während der Übertragung sendet.

Der Empfänger ist bereit, fahren Sie mit dem Absender fort. Führen Sie die Suche aus und stellen Sie eine Verbindung her.



Wenn Sie den Manager einschalten, starten wir mit unserem Service die Suche nach Geräten. Wenn wir sie finden, erhalten wir sie in der Delegate-Methode und stellen sofort eine Verbindung her. Wichtig: Sie müssen eine starke Verbindung zu allen Peripheriegeräten aufrechterhalten, mit denen Sie arbeiten, da sie sonst auslaufen.



Nach erfolgreicher Verbindung konfigurieren wir den Delegaten, der mit diesem Gerät arbeiten wird, und wir erhalten den Dienst, den wir vom Gerät benötigen.



Wir haben uns erfolgreich mit dem Empfänger verbunden, jetzt müssen Sie dessen Details lesen.

Nach dem Verbinden haben wir bereits alle Dienste vom Gerät angefordert. Nach dem Empfang wird die Delegate-Methode aufgerufen, in der alle auf diesem Gerät verfügbaren Dienste aufgelistet sind. Wir finden die richtige und fordern ihre Eigenschaften an. Das Ergebnis kann von der UUID in der Delegate-Methode gefunden werden, die die Daten für die Übersetzung speichert. Wir versuchen sie zu lesen und bekommen in der Delegate-Methode wieder das Gewünschte. Alle Dienste, Merkmale und ihre Werte werden vom System zwischengespeichert, sodass es nicht erforderlich ist, sie jedes Mal später anzufordern.



Das ist alles, wir haben Geld für Kaffee geschickt, es ist Zeit, dem Empfänger eine schöne Nachricht zu zeigen, damit er auf Rubel auf seinem Konto wartet. Dazu müssen Sie den Prozess des Sendens einer Nachricht implementieren.

Wir erhalten das benötigte Merkmal vom Absender, in diesem Fall haben wir es dem gespeicherten Wert entnommen. Aber vorher müssen Sie es vom Gerät holen, wie wir es zuvor getan haben. Und dann schreiben Sie einfach die Daten in das gewünschte Merkmal.

Danach erhalten wir auf dem anderen Gerät eine Schreibanforderung in der Delegate-Methode. Hier können Sie die an Sie gesendeten Daten lesen, auf Fehler reagieren, z. B. keinen Zugriff haben oder diese Eigenschaft nicht vorhanden ist. Alles wird funktionieren, aber nur, wenn beide Geräte eingeschaltet und Anwendungen aktiv sind. Und wir müssen im Hintergrund arbeiten!



Mit Apple können Sie Bluetooth im Hintergrund verwenden. Dazu müssen Sie in info.plist den Schlüssel angeben, in welchem ​​Modus wir verwenden möchten, in Peripheral oder Central.



Als Nächstes müssen Sie im Manager den Wiederherstellungsschlüssel angeben und eine Delegatmethode erstellen. Jetzt steht uns der Hintergrundmodus zur Verfügung. Wenn die Anwendung einschläft oder aus dem Speicher entladen wird, wird sie beim Auffinden des gewünschten Peripheriegeräts oder beim Anschließen von Central aktiviert und der Manager mit Ihrem Schlüssel wiederhergestellt.



Alles ist in Ordnung, bereit, veröffentlicht zu werden. Aber hier kommen Designer zu uns gerannt und sagen: „Wir möchten Fotos von Benutzern einfügen, damit sie sich leichter finden können.“ Was tun? In unserer Eigenschaft können Sie nur etwa 500 Bytes schreiben, aber auf einigen Geräten im Allgemeinen 20 :(



Geh tiefer


Um dieses Problem zu lösen, mussten wir tiefer gehen.



Jetzt haben wir mit Geräten auf GATT / ATT-Ebene gesprochen. In iOS 11 haben wir jedoch Zugriff auf das L2CAP-Protokoll. In diesem Fall müssen Sie sich jedoch selbst um die Datenübertragung kümmern. Pakete werden mit 2 Kb MTU gesendet, es muss nichts neu codiert werden, es wird regulärer NSStream angewendet. Datenraten bis zu 394 Kbit / s laut Apple.

Angenommen, Sie übertragen alle Daten Ihres Dienstes in Form normaler Merkmale von Peripheral nach Central. Und ich brauchte, um den Kanal zu öffnen. Sie öffnen es auf Peripheral, erhalten dafür PSM - dies ist die Nummer des Kanals, mit dem Sie eine Verbindung herstellen können, und Sie müssen es mit denselben Eigenschaften an Central übertragen. Die Nummer ist dynamisch, das System selbst wählt aus, welches PSM gerade geöffnet werden soll. Nach der Übertragung können Sie bereits eine Verbindung zu Peripheral auf der Zentrale herstellen und Daten in einem für Sie geeigneten Format austauschen. Schauen wir uns an, wie das geht.

Öffnen Sie zunächst den verschlüsselten Port von Peripheral. Sie können dies ohne Verschlüsselung tun, dies beschleunigt die Übertragung ein wenig.



Als nächstes erhalten wir in der Delegate-Methode das PSM und senden es an ein anderes Gerät.



Nach dem Anschließen eines anderen Geräts werden wir als Methode bezeichnet, mit der wir den NSStream abrufen können, den wir für die Übertragung vom Kanal benötigen.



Central ist noch einfacher, wir verbinden uns einfach mit der gewünschten Nummer mit dem Kanal ...



... und danach bekommen wir die Streams, die wir brauchen. In ihnen können Sie absolut alle Daten jeder Größe übertragen und Ihr Protokoll auf L2CAP aufbauen. Also haben wir die Übertragung von Empfängerfotos realisiert.



Aber es gibt Fallstricke, auf die man verzichten kann.

Fallstricke


Schauen wir uns die Fallstricke bei der Arbeit im Hintergrund an. Da Ihnen die Rollen Peripheral und Central zur Verfügung stehen, könnten Sie denken. dass Sie im Hintergrund bestimmen können, welche Geräte sich im Hintergrund in der Nähe befinden und welche aktiv sind. Theoretisch hätte es so sein sollen, aber Apple hat eine Einschränkung eingeführt: Telefone im Hintergrund, ob zentral oder peripher, sind für andere Telefone, die sich ebenfalls im Hintergrund befinden, nicht verfügbar. Telefone im Hintergrund sind auf Nicht-iOS-Geräten nicht sichtbar. Schauen wir uns an, warum dies passiert.

Wenn Ihr Gerät aktiv ist, sendet es ein reguläres Broadcast-Paket, das den Gerätenamen und eine Liste der Dienste enthalten kann. dass dieses Gerät bietet. Und Überlaufdaten sind alles, was nicht passte.



Wenn das Gerät in den Hintergrund tritt, überträgt es den Namen nicht und überträgt die Liste der unterstützten Dienste an Überlaufdaten. Wenn die Anwendung aktiv ist, liest sie diese Daten beim Scannen von einem iOS-Gerät und ignoriert sie beim Umschalten in den Hintergrund. Wenn Sie zum Hintergrund wechseln, können Sie daher keine Anwendungen sehen, die sich ebenfalls im Hintergrund befinden.Andere Apple-Betriebssysteme ignorieren Überlaufdaten immer. Wenn Sie also nach Geräten suchen, die Ihren Dienst unterstützen, erhalten Sie ein leeres Array. Wenn Sie eine Verbindung zu jedem Gerät in der Nähe herstellen und unterstützte Dienste anfordern, enthält die Liste möglicherweise Ihren Dienst, und Sie können damit arbeiten.



Dann machten wir uns bereit, sie zum Testen einzureichen, korrigierten kleinere Fehler und beschäftigten uns mit der Optimierung. Und plötzlich, irgendwann, wurde dieser Fehler in der Konsole angezeigt:

CoreBluetooth[WARNING] Unknown error: 124 

Das Schlimmste war, dass keine Delegatenmethode aufgerufen wurde, wir konnten diesen Fehler für den Benutzer nicht einmal beseitigen. Nur eine Nachricht im Protokoll - und Stille, alles erstarrte. Da keine wesentlichen Änderungen vorgenommen wurden, haben wir begonnen, die Commits zurückzusetzen. Und sie stellten fest, dass sie den Code einmal optimiert und die Art und Weise, Daten zu schreiben, überarbeitet hatten. Das Problem war, dass nicht alle Clients aktualisiert wurden, sodass dieser Fehler auftrat.

 .write != .writeWithoutResponse 

Wir waren froh, dass wir alles repariert haben, liefen lieber, um es zu testen, und sie kehrten fast sofort zu uns zurück: „Ihre Modefotos funktionieren nicht. Sie sind alle unterladen. “ Wir haben angefangen, es zu versuchen, und es ist wahr, dass manchmal auf verschiedenen Geräten kaputte Fotos zu unterschiedlichen Zeiten auftreten. Sie begannen nach einem Grund zu suchen.

Und dann sahen sie wieder den vorherigen Fehler. Dachte sofort, dass es in verschiedenen Versionen war. Nach dem vollständigen Entfernen der alten Version von allen Testgeräten wurde der Fehler jedoch weiterhin reproduziert. Wir waren traurig ...

 CoreBluetooth[WARNING] Unknown error: 722 CoreBluetooth[WARNING] Unknown error: 249 CoreBluetooth[WARNING] Unknown error: 312 

Wir haben nach einem Debugging-Tool gesucht. Das erste, was uns begegnete, war der Apple Bluetooth Explorer. Als leistungsstarkes Programm kann es viele Dinge tun, aber zum Debuggen des Bluetooth LE-Protokolls gibt es eine kleine Registerkarte mit der Suche nach Geräten und dem Abrufen von Merkmalen. Und wir mussten L2CAP analysieren.

Dann fanden sie LightBlue Explorer. Es stellte sich heraus, dass es ein ziemlich anständiges Programm war, obwohl es ein Design von iOS 7 hatte. Es kann dasselbe wie Bluetooth Explorer und weiß auch, wie man Spezifikationen abonniert. Und es funktioniert stabiler. Alles ist in Ordnung, aber wieder ohne L2CAP.

Und dann erinnerten wir uns an den bekannten WireShark-Schnüffler.

Es stellte sich heraus, dass er mit Bluetooth LE vertraut war: Er kann L2CAP lesen, aber nur unter Windows. Obwohl es nicht beängstigend ist, dass wir Windows oder etwas anderes nicht finden. Das größte Minus - das Programm funktioniert nur mit einem bestimmten Gerät. Das heißt, Sie mussten das Gerät irgendwo im offiziellen Laden finden. Und Sie selbst verstehen, dass ein großes Unternehmen den Kauf eines unverständlichen Geräts auf einem Flohmarkt wahrscheinlich nicht genehmigen wird. Wir haben sogar angefangen, in Online-Shops in Übersee zu stöbern.

Aber hier fanden sie das PacketLogger-Programm in Additional Xcode Tools. Sie können den Datenverkehr auf dem OS X-Gerät überwachen. Warum nicht unseren MoneyDrop unter OS X umschreiben? Wir hatten bereits eine separate Bibliothek. Wir haben gerade UIImage durch NSImage ersetzt, alles begann nach 10 Minuten.



Schließlich konnten wir die zwischen Geräten ausgetauschten Pakete lesen. Es wurde sofort klar, dass zum Zeitpunkt der Datenübertragung über L2CAP eines der Merkmale aufgezeichnet wurde. Und aufgrund der Tatsache, dass der Kanal vollständig mit der Übertragung von Fotos beschäftigt war, ignorierte iOS die Aufzeichnung und der Absender nach dem Ignorieren brach den Kanal. Nach Behebung der Probleme mit der Übertragung von Fotos wurde nicht.



Das ist alles, danke fürs Lesen :)

Nützliche Links


WWDC / CoreBluetooth:


Bluetooth


YouTube

  • Pfeilelektronik → Bluetooth Low Energy-Serie

Source: https://habr.com/ru/post/de452278/


All Articles