Это приложение Swift для iOS (построенное на основе XCode 6.1.1) предоставляется в качестве примера для разработчиков, интересующихся экосистемой Kardia.io. В настоящее время он жестко запрограммирован для подключения и чтения данных с устройств RedBearLabs Blend Micro, в которые загружена прошивка, рекомендованная веб-сайтом RedBearLabs. Мы запрограммировали эти устройства на выдачу имитационных данных, имитирующих реальную запись ЭКГ. Это приложение подключает телефон к устройству и передает данные, отправляемые на серверы (node.js и python) в Kardia.io. Приложение также прослушивает и отображает анализ, поступающий с серверов.
Клонируйте репозиторий и откройте его в XCode. Загрузите приложение на свой телефон. Приложение автоматически подключится к близлежащим устройствам BLE с соответствующей службой и характерными UUID (см. ниже) и начнет потоковую передачу данных на kardia.io. Проанализированные данные возвращаются в приложение в режиме реального времени. Любые аномальные события (аритмии) будут записываться в виде таблицы, доступ к которой можно получить, проведя пальцем влево или вправо. Эти события можно удалить, потянув их влево.
Приложение ищет сервис UUID 713D0000-503E-4C75-BA94-3148F18D941E, который содержит характерный UUID 713D0002-503E-4C75-BA94-3148F18D941E, соответствующий данным, отправляемым Arduino. Эти значения определены в прошивке Blend Micro, ссылка на которую доступна на веб-сайте RedBearLabs.
Как только приложение подключается к устройству BLE (краткое объяснение см. ниже), оно регистрирует прослушиватель изменений в состоянии характеристик данных оборудования. Эти данные интерпретируются как число с плавающей запятой и передаются двум функциям обратного вызова. Его добавляют в буфер последних точек данных для рендеринга на графике. Другой испускает его как событие сокета. Он создается как объект JSON с ключами «амплитуда» и «время», соответствующими значению, полученному от оборудования, и времени ISO8601, когда было создано событие сокета, соответственно.
Приложение также прослушивает ответы от сервера, которые представляют собой объекты JSON с ключами «heartRate» (очевидно) и «statusCode». Код состояния ищется в словаре, определенном в ViewController.swift, и переводится в основное представление как statusView.
Мы используем библиотеку SocketIOClient, которая является оболочкой библиотеки Objective-C Socket Rocket. Используются следующие события:
Мы используем библиотеку Swift-Linechart для визуализации кривых ЭКГ в реальном времени. Он не полностью отвечал нашим потребностям, поэтому мы модифицировали его следующим образом:
Когда приложение регистрирует новую аномалию, оно записывает ее в глобальный файл arythmiaTimes, который служит источником данных для табличного представления. «Свежий» в данном случае означает, что событие записывается только в том случае, если статус, о котором сообщает сервер, меняется на аномальное событие (в данном случае аритмию), поэтому не все повторяющиеся события аритмии регистрируются.
Пожалуйста, ознакомьтесь с разделом проблем этого репозитория.
Вот хорошее руководство по подключению устройства BLE к устройству iOS с помощью Swift. Короче говоря, приложение начинает поиск периферийных устройств Bluetooth, рекламирующих UUID определенной службы. Когда он найден, он подключается и ищет UUID с определенной характеристикой. Если он найден, он начинает прослушивать эти данные.
Каждый раз, когда представление нуждается в обновлении, вам необходимо запускать этот код в основном потоке (UI). Вот почему вы увидите такие блоки кода:
dispatch_async(dispatch_get_main_queue()) {
// UI-updating code goes here
}
События обрабатываются NSNotificationCenter — регистрация прослушивателей и запуск событий не требует пояснений. Вот быстрый перевод терминов на Swift: Javascript:
Пример:
foo.on('bar', doAThing)
становится
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("doAThing"), name: "bar", object: nil)
Функции могут иметь одно и то же имя, но при этом иметь разные параметры — такое часто случается с протоколами.
Представления можно создавать и ограничивать либо в Main.storyboard, либо программно в коде. В этом приложении используется комбинация этих двух стилей: основное представление выполнено в последнем стиле, а табличное представление использует первый.