Este aplicativo Swift iOS (construído em XCode 6.1.1) é fornecido como exemplo para desenvolvedores interessados no ecossistema Kardia.io. Atualmente, ele está codificado para conectar e ler dados de unidades RedBearLabs Blend Micro que são carregadas com o firmware recomendado pelo site RedBearLabs. Programamos essas unidades para emitir dados simulados que simulam um traçado de ECG real. Este aplicativo conecta o telefone ao dispositivo e retransmite os dados emitidos para os servidores (node.js e python) em Kardia.io. O aplicativo também escuta e exibe análises provenientes dos servidores.
Clone o repositório e abra no XCode. Carregue o aplicativo em seu telefone. O aplicativo se conectará automaticamente a unidades BLE próximas com o serviço apropriado e UUIDs característicos (veja abaixo) e começará a transmitir dados para kardia.io. Os dados analisados voltam para o aplicativo em tempo real. Quaisquer eventos anormais (arritmia) serão registrados na visualização de tabela que pode ser acessada deslizando para a esquerda ou direita. Esses eventos podem ser excluídos puxando-os para a esquerda.
O aplicativo procura o serviço UUID 713D0000-503E-4C75-BA94-3148F18D941E que contém a característica UUID 713D0002-503E-4C75-BA94-3148F18D941E que corresponde aos dados emitidos pelo Arduino. Esses valores são definidos no firmware do Blend Micro vinculado ao site RedBearLabs.
Depois que o aplicativo se conecta a um dispositivo BLE (veja abaixo uma breve explicação), ele registra um ouvinte para alterações no status das características de dados do hardware. Esses dados são interpretados como float e passados para duas funções de retorno de chamada. É adicionado a um buffer de pontos de dados recentes para renderização no gráfico. O outro emite como um evento de soquete. É emitido como um objeto JSON com as chaves "amplitude" e "time" correspondentes ao valor recebido do hardware e ao horário ISO8601 em que o evento do soquete foi emitido, respectivamente.
O aplicativo também escuta respostas do servidor, que são objetos JSON que possuem chaves "heartRate" (autoexplicativas) e "statusCode". O código de status é consultado em um dicionário definido em ViewController.swift e traduzido para a visualização principal como statusView.
Usamos a biblioteca SocketIOClient, que envolve a biblioteca Socket Rocket do Objective-C. Os seguintes eventos são usados:
Usamos a biblioteca Swift-Linechart para renderizar os traços de ECG ao vivo. Ele não atendeu totalmente às nossas necessidades, então o modificamos da seguinte forma:
Quando o aplicativo registra uma nova anormalidade, ele a registra no arrhythmiaTimes global, que serve como fonte de dados para a visualização da tabela. "Fresco", neste caso, significa que um evento só será registrado se o status relatado pelo servidor mudar para um evento anormal (neste caso, arritmia), de modo que nem todos os eventos de arritmia repetidos sejam registrados.
Consulte a seção de problemas deste repositório.
Aqui está um bom tutorial sobre como conectar um dispositivo BLE a um dispositivo iOS usando Swift. Resumindo, o aplicativo começa a procurar periféricos Bluetooth que anunciam um UUID de serviço específico. Quando um é encontrado, ele se conecta e procura um UUID de característica específica. Se isso for encontrado, ele começará a ouvir esses dados.
Sempre que a visualização precisar ser atualizada, você deverá executar esse código no thread principal (UI). É por isso que você verá blocos de código como este:
dispatch_async(dispatch_get_main_queue()) {
// UI-updating code goes here
}
Os eventos são tratados pelo NSNotificationCenter - registrar ouvintes e disparar eventos é bastante autoexplicativo. Aqui está uma rápida tradução de termos em Swift: Javascript:
Exemplo:
foo.on('bar', doAThing)
torna-se
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("doAThing"), name: "bar", object: nil)
As funções podem ter o mesmo nome, desde que tenham parâmetros diferentes - isso acontece frequentemente com protocolos.
As visualizações podem ser criadas e restritas em Main.storyboard ou programaticamente em código. Este aplicativo usa uma mistura dos dois - a visualização principal é toda feita no último estilo, enquanto a visualização de tabela usa o primeiro.