Diese Swift iOS-App (erstellt in XCode 6.1.1) dient als Beispiel für Entwickler, die sich für das Kardia.io-Ökosystem interessieren. Es ist derzeit fest codiert, um eine Verbindung zu RedBearLabs Blend Micro-Geräten herzustellen und Daten von ihnen zu lesen, die mit der auf der RedBearLabs-Website empfohlenen Firmware geladen sind. Wir haben diese Geräte so programmiert, dass sie Scheindaten aussenden, die eine echte EKG-Kurve simulieren. Diese App verbindet das Telefon mit dem Gerät und leitet die ausgegebenen Daten an die Server (node.js und python) bei Kardia.io weiter. Die App wartet auch auf Analysen, die von den Servern zurückkommen, und zeigt diese an.
Klonen Sie das Repo und öffnen Sie es in XCode. Laden Sie die App auf Ihr Telefon. Die App stellt automatisch eine Verbindung zu nahegelegenen BLE-Geräten mit dem entsprechenden Dienst und den charakteristischen UUIDs (siehe unten) her und beginnt mit dem Streamen von Daten an kardia.io. Die analysierten Daten kommen in Echtzeit an die App zurück. Alle abnormalen Ereignisse (Arrhythmien) werden in der Tabellenansicht aufgezeichnet, die durch Wischen nach links oder rechts aufgerufen werden kann. Diese Ereignisse können durch Ziehen nach links gelöscht werden.
Die App sucht nach der Dienst-UUID 713D0000-503E-4C75-BA94-3148F18D941E, die die charakteristische UUID 713D0002-503E-4C75-BA94-3148F18D941E enthält, die den vom Arduino ausgegebenen Daten entspricht. Diese Werte sind in der Firmware für den Blend Micro definiert, die auf der RedBearLabs-Website verlinkt ist.
Sobald die App eine Verbindung zu einem BLE-Gerät herstellt (eine kurze Erklärung finden Sie unten), registriert sie einen Listener für Änderungen im Status der Dateneigenschaft der Hardware. Diese Daten werden als Float interpretiert und an zwei Callback-Funktionen übergeben. Man fügt es einem Puffer aktueller Datenpunkte hinzu, um es im Diagramm darzustellen. Der andere gibt es als Socket-Ereignis aus. Es wird als JSON-Objekt mit den Schlüsseln „Amplitude“ und „Zeit“ ausgegeben, die dem von der Hardware empfangenen Wert bzw. der ISO8601-Zeit entsprechen, zu der das Socket-Ereignis ausgegeben wurde.
Die App wartet auch auf Antworten vom Server, bei denen es sich um JSON-Objekte mit den Schlüsseln „heartRate“ (selbsterklärend) und „statusCode“ handelt. Der Statuscode wird in einem in ViewController.swift definierten Wörterbuch nachgeschlagen und als statusView in die Hauptansicht übersetzt.
Wir verwenden die SocketIOClient-Bibliothek, die die Objective-C-Bibliothek Socket Rocket umschließt. Folgende Ereignisse werden verwendet:
Wir verwenden die Swift-Linechart-Bibliothek, um die Live-EKG-Kurven darzustellen. Da es unseren Anforderungen nicht ganz entsprach, haben wir es wie folgt geändert:
Wenn die App eine neue Anomalie registriert, zeichnet sie diese in der globalen Datei arrhythmiaTimes auf, die als Datenquelle für die Tabellenansicht dient. „Frisch“ bedeutet in diesem Fall, dass ein Ereignis nur dann aufgezeichnet wird, wenn sich der vom Server gemeldete Status in ein abnormales Ereignis (in diesem Fall Arrhythmie) ändert , sodass nicht alle wiederholten Arrhythmieereignisse protokolliert werden.
Bitte lesen Sie den Abschnitt „Probleme“ in diesem Repo.
Hier ist eine gute Anleitung zum Verbinden eines BLE-Geräts mit einem iOS-Gerät mithilfe von Swift. Kurz gesagt, die App beginnt mit der Suche nach Bluetooth-Peripheriegeräten, die eine bestimmte Dienst-UUID ankündigen. Wenn einer gefunden wird, stellt er eine Verbindung her und sucht nach einer bestimmten charakteristischen UUID. Wenn dies gefunden wird, beginnt es, diese Daten abzuhören.
Jedes Mal, wenn die Ansicht aktualisiert werden muss, müssen Sie diesen Code im Hauptthread (UI) ausführen. Deshalb sehen Sie Codeblöcke wie diesen:
dispatch_async(dispatch_get_main_queue()) {
// UI-updating code goes here
}
Ereignisse werden vom NSNotificationCenter verarbeitet – das Registrieren von Listenern und das Auslösen von Ereignissen ist ziemlich selbsterklärend. Hier ist eine kurze Swift: Javascript-Übersetzung von Begriffen:
Beispiel:
foo.on('bar', doAThing)
wird
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("doAThing"), name: "bar", object: nil)
Funktionen können den gleichen Namen haben, solange sie unterschiedliche Parameter haben – das passiert häufig bei Protokollen.
Ansichten können entweder in Main.storyboard oder programmgesteuert im Code erstellt und eingeschränkt werden. Diese App verwendet eine Mischung aus beiden – die Hauptansicht ist vollständig im letztgenannten Stil gestaltet, während die Tabellenansicht den ersteren verwendet.