이것은 Kardia.io 생태계에서 테스트된 개발자를 위한 예시로 제공되는 Swift iOS 앱(XCode 6.1.1로 구축)입니다. 현재 RedBearLabs 웹사이트에서 권장하는 펌웨어가 로드된 RedBearLabs Blend Micro 장치에 연결하고 데이터를 읽으려면 하드코딩되어 있습니다. 우리는 실제 ECG 추적을 시뮬레이션하는 모의 데이터를 내보내도록 이러한 장치를 프로그래밍했습니다. 이 앱은 휴대폰을 기기에 연결하고 방출되는 데이터를 Kardia.io의 서버(node.js 및 Python)로 중계합니다. 또한 앱은 서버에서 돌아오는 분석을 수신하고 표시합니다.
저장소를 복제하고 XCode에서 엽니다. 휴대폰에 앱을 로드하세요. 앱은 적절한 서비스 및 특성 UUID(아래 참조)를 사용하여 근처 BLE 장치에 자동으로 연결하고 kardia.io로 데이터 스트리밍을 시작합니다. 분석된 데이터는 실시간으로 앱으로 돌아옵니다. 비정상적인 이벤트(부정맥)는 왼쪽이나 오른쪽으로 스와이프하여 액세스할 수 있는 테이블 보기에 기록됩니다. 이러한 이벤트는 왼쪽으로 당겨 삭제할 수 있습니다.
앱은 Arduino에서 내보내는 데이터에 해당하는 특성 UUID 713D0002-503E-4C75-BA94-3148F18D941E를 포함하는 UUID 713D0000-503E-4C75-BA94-3148F18D941E 서비스를 찾습니다. 이 값은 RedBearLabs 웹사이트에 링크된 Blend Micro용 펌웨어에 정의되어 있습니다.
앱이 BLE 장치에 연결되면(간단한 설명은 아래 참조) 하드웨어의 데이터 특성 상태 변경에 대한 리스너를 등록합니다. 이 데이터는 부동 소수점으로 해석되어 두 개의 콜백 함수에 전달됩니다. 그래프 렌더링을 위해 최근 데이터 포인트의 버퍼에 이를 추가합니다. 다른 하나는 이를 소켓 이벤트로 내보냅니다. 하드웨어에서 수신된 값에 해당하는 "amplitude" 및 "time" 키와 소켓 이벤트가 발생한 ISO8601 시간을 각각 포함하는 JSON 개체로 내보내집니다.
또한 앱은 "heartRate"(자체 설명) 및 "statusCode" 키가 있는 JSON 개체인 서버의 응답을 수신합니다. 상태 코드는 ViewController.swift에 정의된 사전에서 조회되고 statusView로 메인 뷰로 변환됩니다.
우리는 Objective-C 라이브러리인 Socket Rocket을 래핑하는 SocketIOClient 라이브러리를 사용합니다. 다음 이벤트가 사용됩니다.
실시간 ECG 추적을 렌더링하기 위해 Swift-Linechart 라이브러리를 사용합니다. 우리의 요구 사항을 완전히 충족하지 못하여 다음과 같이 수정했습니다.
앱이 새로운 이상을 등록하면 테이블 보기의 데이터 소스 역할을 하는 arrhythmiaTimes 전역에 이를 기록합니다. 이 경우 "신선"은 서버에서 보고 중인 상태가 비정상적인 이벤트(이 경우 부정맥)로 변경되는 경우에만 이벤트가 기록되므로 반복되는 부정맥 이벤트가 모두 기록되지는 않음을 의미합니다.
이 저장소의 문제 섹션을 참조하세요.
다음은 Swift를 사용하여 BLE 장치를 iOS 장치에 연결하는 방법에 대한 좋은 튜토리얼입니다. 간단히 말해서 앱은 특정 서비스 UUID를 광고하는 Bluetooth 주변 장치 검색을 시작합니다. 발견되면 특정 특성의 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에서 또는 코드에서 프로그래밍 방식으로 뷰를 만들고 제한할 수 있습니다. 이 앱은 두 가지를 혼합하여 사용합니다. 기본 보기는 모두 후자 스타일로 수행되고 테이블 보기는 전자를 사용합니다.