Il s'agit de l'application Swift iOS (construite dans XCode 6.1.1) qui est fournie à titre d'exemple pour les développeurs intéressés par l'écosystème Kardia.io. Il est actuellement codé en dur pour se connecter et lire les données des unités RedBearLabs Blend Micro chargées avec le micrologiciel recommandé par le site Web de RedBearLabs. Nous avons programmé ces unités pour émettre des données simulées qui simulent un véritable tracé ECG. Cette application connecte le téléphone à l'appareil et relaie les données émises vers les serveurs (node.js et python) de Kardia.io. L'application écoute et affiche également les analyses provenant des serveurs.
Clonez le dépôt et ouvrez-le dans XCode. Chargez l'application sur votre téléphone. L'application se connectera automatiquement aux unités BLE à proximité avec le service approprié et les UUID caractéristiques (voir ci-dessous) et commencera à diffuser des données sur kardia.io. Les données analysées reviennent à l'application en temps réel. Tout événement anormal (arythmie) sera enregistré dans la vue tableau accessible en faisant glisser votre doigt vers la gauche ou la droite. Ces événements peuvent être supprimés en les tirant vers la gauche.
L'application recherche le service UUID 713D0000-503E-4C75-BA94-3148F18D941E qui contient la caractéristique UUID 713D0002-503E-4C75-BA94-3148F18D941E qui correspond aux données émises par l'Arduino. Ces valeurs sont définies dans le firmware du Blend Micro lié sur le site Web de RedBearLabs.
Une fois que l'application se connecte à un appareil BLE (voir ci-dessous pour une brève explication), elle enregistre un auditeur pour les changements dans l'état des caractéristiques des données du matériel. Ces données sont interprétées comme un flottant et transmises à deux fonctions de rappel. On l'ajoute à un tampon de points de données récents pour le rendu dans le graphique. L'autre l'émet comme un événement socket. Il est émis sous forme d'objet JSON avec les clés « amplitude » et « temps » correspondant respectivement à la valeur reçue du matériel et à l'heure ISO8601 à laquelle l'événement socket a été émis.
L'application écoute également les réponses du serveur, qui sont des objets JSON dotés des clés « heartRate » (explicatif) et « statusCode ». Le code d'état est recherché dans un dictionnaire défini dans ViewController.swift et traduit dans la vue principale en tant que statusView.
Nous utilisons la bibliothèque SocketIOClient, qui enveloppe la bibliothèque Objective-C Socket Rocket. Les événements suivants sont utilisés :
Nous utilisons la bibliothèque Swift-Linechart pour restituer les traces ECG en direct. Il ne répondait pas entièrement à nos besoins, nous l'avons donc modifié comme suit :
Lorsque l'application enregistre une nouvelle anomalie, elle l'enregistre dans le fichier global arythmiaTimes, qui sert de source de données pour la vue tabulaire. « Frais » dans ce cas signifie qu'un événement n'est enregistré que si l'état signalé par le serveur devient un événement anormal (dans ce cas, une arythmie), de sorte que les événements d'arythmie répétés ne soient pas tous enregistrés.
Veuillez consulter la section Problèmes de ce dépôt.
Voici un bon tutoriel sur la connexion d'un appareil BLE à un appareil iOS à l'aide de Swift. En bref, l'application commence à rechercher des périphériques Bluetooth annonçant un UUID de service spécifique. Lorsqu’il en trouve un, il se connecte et recherche un UUID caractéristique spécifique. Si cela est trouvé, il commence à écouter ces données.
Chaque fois que la vue doit être mise à jour, vous devez exécuter ce code sur le thread principal (UI). C'est pourquoi vous verrez des blocs de code comme celui-ci :
dispatch_async(dispatch_get_main_queue()) {
// UI-updating code goes here
}
Les événements sont gérés par NSNotificationCenter - l'enregistrement des auditeurs et le déclenchement des événements sont assez explicites. Voici une traduction rapide des termes en Swift : Javascript :
Exemple:
foo.on('bar', doAThing)
devient
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("doAThing"), name: "bar", object: nil)
Les fonctions peuvent porter le même nom à condition qu'elles aient des paramètres différents - cela arrive souvent avec les protocoles.
Les vues peuvent être créées et contraintes soit dans Main.storyboard, soit par programmation dans le code. Cette application utilise un mélange des deux : la vue principale est entièrement réalisée dans ce dernier style tandis que la vue tableau utilise le premier.