O projeto inclui tanto o lado do servidor quanto o aplicativo web projetado para se comunicar com dispositivos smartwatch infantis equipados com rastreador GPS de diversos modelos e conhecidos por diversas marcas. Por exemplo, pode funcionar com Q50, Q60, Q80, Q90, Q100, Q360, Q523, Q730, Q750, Q8, GW100, GW100S, GW200, GW200S, GW300, GW300S, GW400S, GW400X, GW500S, GW600S, GW700, GW800, GW900, GW900S, GW1000, GW1000S, EW100, EW100S, EW200, K911, W8, W9, W10, Y3, G36 SEGURANÇA, DS18, T58, T100, I8, G10, G100, D99, D100, D100S e muitos outros. Grosso modo, ele faz o mesmo que aplicativos como SeTracker, FindMyKids e assim por diante. A principal diferença é que todos os dados pessoais, como contatos, posições, histórico de comunicação, etc., tornam-se verdadeiramente privados, pois são armazenados em hardware controlado pelo usuário.
Outra questão abordada é o modelo de segurança dos aplicativos de comunicação e rastreamento de smartwatches infantis. Por padrão, qualquer pessoa pode assumir o controle do dispositivo, desde que o identificador do dispositivo seja conhecido, sem nenhuma confirmação adicional de ser proprietário do dispositivo. O identificador, por sua vez, pode ser facilmente obtido através do envio de uma mensagem de texto ao dispositivo, caso o número do celular do dispositivo seja conhecido. É claro que existe uma senha, mas todos os dispositivos possuem a mesma senha de fábrica e não há notificações irritantes pedindo para alterá-la, portanto ninguém faz isso.
Nesta aplicação foram implementados os seguintes cenários de segurança:
E por último, mas não menos importante, é gratuito e sem anúncios :).
Construir o projeto é tão simples quanto
docker compose -f docker-builder.yml run --rm builder
Durante a construção, é criado um certificado SSL necessário para conexões https
. É possível especificar um domínio e/ou um endereço IP usando variáveis de ambiente DOMAIN
e IP
docker compose -f docker-builder.yml run --rm -e DOMAIN=example.com -e IP=123.45.67.89 builder
A aplicação pode ser apoiada por diferentes bancos de dados, à sua escolha. O cenário mais leve é usar banco de dados H2 incorporado. Neste caso, o aplicativo pode ser iniciado com o comando
docker compose --profile h2 up -d
Também é possível usar PostreSQL, seja em contêiner ou autônomo. No primeiro caso você pode iniciar o aplicativo com o comando
docker compose --profile pg up -d
Neste último caso você deve preencher o arquivo db.env
com URL e credenciais do banco de dados e então executar o comando
docker compose --profile pg_ext up -d
Se a sua versão do Compose não oferece suporte a perfis, você pode usar arquivos Compose dedicados para cada cenário
docker compose -f h2.yml up -d
docker compose -f pg.yml up -d
docker compose -f pg_ext.yml up -d
No último caso, você ainda precisa preencher o arquivo db.env
com URL e credenciais do banco de dados.
Também é possível pular a fase chata de construção e executar o binário anexado ao lançamento (java 8 ou superior deve estar instalado)
java -jar kidtracker.jar
O binário está configurado para usar banco de dados H2 incorporado. Três pastas são criadas na primeira inicialização no diretório de trabalho:
data
contêm registros de banco de dados para localizações de dispositivos, números de telefone, etc., esta data é confidencial, portanto, mantenha-a segura!logs
autodescritivos o suficiente, contém logs, tanto para o próprio aplicativo quanto para dispositivos quando a depuração do dispositivo está ativa,media
esta pasta é usada para converter o áudio recebido no formato amr em mp3 A UI da Web está disponível em https://<hostname>:8003
. Para fazer login, use as credenciais padrão admin
/ password
.
Para atribuir um dispositivo a um usuário cadastrado na aplicação, a aplicação deverá estar disponível em redes públicas, ou seja, deverá possuir um endereço IP público e, provavelmente, um nome de domínio associado. Por padrão, o aplicativo escuta dispositivos na porta 8001
, suponha que a mesma porta esteja mapeada para a rede pública. Em seguida, a seguinte mensagem de texto enviada ao dispositivo faz com que ele comece a se conectar ao aplicativo:
pw,123456,ip,<public IP address or domain>,8001#
Aqui, 123456
é a senha padrão, que provavelmente está definida no dispositivo. Outras senhas padrão conhecidas são 523681
, 54321
e 654321
. Se, no entanto, a senha foi alterada, a nova senha deverá ser usada em vez da senha padrão.
É altamente recomendável alterar a senha padrão!
Em seguida, clique no botão no lado direito da barra de navegação e, a seguir, clique no botão no rodapé. O identificador do dispositivo é necessário para que o dispositivo seja atribuído. Assim que o dispositivo estiver conectado ao aplicativo, um token de confirmação de quatro dígitos será enviado ao dispositivo. Para confirmar que o usuário é o proprietário do dispositivo, esse token deve ser inserido no formulário pop-up durante os próximos 5 minutos, após esse tempo o token expirar.
Qualquer usuário registrado no aplicativo pode ser um usuário normal ou um administrador. Os administradores podem registrar outros usuários, enquanto os usuários normais não, esta é a única diferença. Os administradores podem criar usuários regulares e outros administradores. Para o usuário existente, o privilégio de administrador não pode ser concedido nem revogado; a única maneira de modificá-lo é remover a conta do usuário e recriá-la novamente.
Por motivos de segurança, o número do celular do usuário também não pode ser modificado. Novamente, para alterá-lo, a conta do usuário deve ser removida e recriada. Para remover a conta do usuário, todos os dispositivos devem ser desatribuídos a ela.
Quando executado pela primeira vez, há uma conta de usuário padrão com privilégio de administrador com login admin
e password
password . Recomenda-se remover esta conta quando outras contas de usuário forem criadas ou alterar a senha padrão. Se houver apenas uma conta com privilégios de administrador, ela não poderá ser removida. A conta de administrador padrão não possui um número de celular válido e nenhum dispositivo pode ser atribuído a ela.
Os dispositivos se comunicam com o aplicativo por meio de mensagens. Existem vários tipos de mensagens, algumas podem fornecer informações sobre a localização do dispositivo e alertas, outras contêm a carga real da bateria e o valor do pedômetro.
Algumas mensagens também podem ser enviadas pelo aplicativo para um dispositivo para que ele execute diversas ações ou modifique suas configurações. Para garantir que o dispositivo recebeu a mensagem, ele envia uma mensagem de confirmação de volta ao aplicativo. Enquanto aguarda a mensagem de confirmação, a IU permanece bloqueada. Se nenhuma confirmação for recebida em 10 segundos (configurável), a mensagem inicial é considerada não confirmada.
Os marcadores de posição de todos os dispositivos atribuídos juntamente com o marcador de posição do usuário compartilham o mesmo mapa. Os marcadores do dispositivo contêm informações sobre a hora da última localização conhecida, carga da bateria, valor do pedômetro e, eventualmente, alerta de decolagem do dispositivo, alerta de bateria fraca, alerta de perda de conexão e alerta de localização obsoleta. O dispositivo é considerado perdido se a última mensagem do dispositivo foi recebida há mais de 15 minutos.
O dispositivo pode fornecer a sua localização real, com base em dados GPS diretos, quando disponíveis, bem como a última posição detectada, quando a observação GPS direta não estiver disponível, principalmente no interior de edifícios ou na presença de ruído eletromagnético; nesses casos, os dados GPS
é considerado obsoleto. Quando os dados de localização recebidos são obsoletos, o alerta de dados obsoletos é mostrado.
Observe que o alerta de bateria fraca e o valor real da carga aparecem em diferentes tipos de mensagens. Mensagens com cobrança real chegam com mais frequência (a cada 5 minutos) do que mensagens com localizações e alertas, que demoram horas para serem enviadas. Portanto, não é incomum que um marcador mostre 100% de carga da bateria junto com um alerta de bateria fraca. Neste caso a prioridade é para o valor numérico da carga da bateria e o alerta de bateria fraca pode ser ignorado.
O dispositivo envia mensagens de alarme quando o botão SOS é pressionado. O marcador do dispositivo fica vermelho neste caso e um som de sirene é reproduzido até que o marcador seja clicado. O clique no marcador resulta em movê-lo para cima e alternar a seleção infantil. Quando a seleção infantil é alterada, o marcador do dispositivo selecionado fica no topo.
O dispositivo pode enviar mensagens de áudio e (se equipado com câmera) instantâneos para o aplicativo. Quando uma nova mensagem desse tipo chega, o marcador do dispositivo fica azul e o som do toque do telefone antigo é reproduzido até que o marcador seja clicado. Como no caso do alarme, clicar no marcador resulta em movê-lo para cima e alternar a seleção infantil.
Em qualquer lugar da interface do usuário, os carimbos de data e hora são clicáveis e, com um clique, podem ser alternados entre o valor absoluto de data e hora e o intervalo de tempo a partir de agora.
Existem dois ícones que possuem dois estados, preenchido e conectado. O primeiro fica preenchido quando a visualização do mapa segue o marcador do dispositivo selecionado. Seu estado pode ser alterado clicando nele. Outro é preenchido quando a visualização do mapa segue o marcador de posição do usuário. Seu estado também pode ser alternado clicando nele. Quando um ícone é preenchido, outro fica conectado e vice-versa. Ambos os ícones ficam conectados quando o mapa é arrastado.
Ao clicar em um comando para ativar o GPS e fornecer a posição atual é enviado ao dispositivo. A visualização do mapa começa a seguir o marcador do dispositivo, o ícone de seguir o dispositivo fica preenchido.
O bate-papo com o dispositivo é assimétrico. Mensagens de chat de texto podem ser enviadas para o dispositivo com o botão , enquanto o dispositivo pode enviar mensagens curtas de áudio e, se o dispositivo estiver equipado com câmera, instantâneos. O dispositivo também pode ser forçado a tirar uma foto com o botão ou fazer uma gravação de áudio de 15 segundos com o botão .
A caixa de diálogo Histórico permite escolher o intervalo de tempo em dois modos, a data, de uma meia-noite até a próxima, e geral, onde o início e o fim do intervalo podem ser escolhidos pelo usuário. Para alternar entre os modos, clique nos rótulos do seletor de data e hora.
Quando o intervalo de tempo é escolhido, o histórico de bate-papo ou o pedômetro e o gráfico de carga da bateria podem ser mostrados. A trilha do dispositivo para o intervalo de tempo escolhido também pode ser colocada no mapa. Um controle deslizante aparece no canto superior direito e é usado para mover o marcador do dispositivo ao longo da trilha. Quando o histórico é inspecionado, o ícone da caixa de diálogo do histórico é alterado para . Para remover a trilha e voltar às posições dos marcadores online, clique nela.
A caixa de diálogo Contatos permite editar o administrador do dispositivo primário e secundário, números SOS, contatos do dispositivo, números permitidos para fazer chamadas para o dispositivo e números de chamada rápida atribuídos aos botões do dispositivo. Para todas as categorias de contacto existe um número fixo de vagas que podem ser preenchidas. Por padrão, os slots vazios ficam ocultos, mas podem ser exibidos clicando no botão no rodapé da caixa de diálogo.
A caixa de diálogo Crianças permite ao usuário atribuir e cancelar a atribuição de dispositivos infantis, alterar o polegar e obter algumas informações gerais sobre o dispositivo e seu status real. Na coluna do lado esquerdo, um polegar clicável é colocado, clicando nele resulta na caixa de diálogo de edição infantil. Na coluna do meio está o identificador do dispositivo. Se o dispositivo estiver online, seu identificador estará em verde, caso contrário, estará em vermelho. Abaixo do identificador do dispositivo está a hora em que a última mensagem foi recebida do dispositivo. Todos os usuários que têm acesso ao dispositivo são listados na coluna mais à direita com seus celulares.