Engenharia de Front-end Mobile

História

John Doe adquiriu 3 sensores compatíveis com a plataforma proposta. Ao abrir o aplicativo, com sua conta, registrou os 3 sensores no app, cada um para um propósito diferente, o primeiro "Controle de ambiente do escritório", monitorando "Temperatura", em ºC, e "Luminosidade", em lux. O segundo, "Freezer do armazém", medindo apenas "Temperatura", em ºC. O terceiro, "Oxigenação do aquário", monitorando a concentração de "Oxigênio", em mg/L.

De acordo com o modelo de domínio, cada sensor e stream recebe uma chave de identificação (key), uma string alfanumérica (semelhante a 10dd35008a0f4d838c3dc22856660928 ) ao ser cadastrada. Com essa chave a ativação dos sensores físicos pode ser concluída, e considerando os sensores do John Doe já funcionando, seus dados já estão sendo publicados na plataforma IoT e consequentemente podem ser acompanhados no app.

A equipe de back-end da plataforma desenvolveu uma RESTful API que suporta as operações que o usuário deve ser capaz de desempenhar através dos aplicativos, de forma que cabe a equipe de front-end mobile desenvolver os aplicativos utilizando esta API.

Objetivo

Desenvolver um aplicativo Android do ponto de vista funcional, que permita (I) listar os sensores já existentes na conta do usuário, (II) visualizar os detalhes de um sensor, (III) acompanhar os dados mais recentes de uma stream(IV) além de registrar, tanto novos sensores quanto novas streams.

Quanto a característica funcional da proposta, significa que o projeto deve ser voltado para a arquitetura da aplicação e design, UI e UX não estão no escopo da atividade. Considere que o aprimoramento visual do app será realizado por outra equipe ou em outra iteração.

É solicitado que o desenvolvimento do aplicativo empregue a arquitetura MVP (Model-View-Presenter), considerando a familiaridade da equipe mobile da Evológica a esse design pattern. Abaixo algumas telas de como ao final do sprint a aplicação deveria se comportar.

Sensores do Usuário

Detalhe do Sensor

Detalhe da Stream

Ferramentas e Ajuda

Android Básico
Rest API

Após iterações de desenvolvimento com a equipe de design o app (fora do scopo do seu projeto) se aproximaria desse layout:

Sensores do Usuário Detalhe do Sensor Detalhe da Stream

 

RESTful API

Primeiramente, para utilizar a API, é necessário enviar um token de autenticação (X-AUTH-TOKEN) no header de cada requisição HTTP. A URL base dos resources da API é http://multicast.vix.br:8082. O token que você deve utilizar é:

cba991ae0c38408a84cf01687c60d075

Ex: 

curl --request GET \
--url http://multicast.vix.br:8082/sensors \
--header 'content-type: application/json' \
--header 'x-auth-token: cba991ae0c38408a84cf01687c60d075'

 Endpoints

GET /sensors
Get user sensors
<= response
[
{
    "oid": 4,
    "key": "9887c50623bd4584bd106d37d84d6bcc",
   "name": "wifi001",
   "description": "wifi001",
"owner": {
"oid": 3,
"firstName": "Leonardo",
"lastName": "Santos",
"username": "leonardo",
"email": "leo_am.snts@yahoo.com.br"
},
   "streams": [
      {
        "oid": 6,
        "key": "985bf2cde9b54a54b8fcd3423d89ad89",
        "name": "temperature",
        "sensor": 1,
        "totalSize": 75554
      }
    ]
  },
...
]
POST /sensors

Register new sensor

request =>

{
  "label": "Kitchen's freezer sensor",
  "description": "Kitchen's freezer sensor (Arduino)",
}

<= response

{
  "oid": 10,
  "key": "a32ee5ecc36d48cd912ed60b9efe3446",
  "name": "Kitchen's freezer sensor",
  "description": "Kitchen's freezer sensor (Arduino)",
"owner": {
"oid": 3,
"firstName": "Leonardo",
"lastName": "Santos",
"username": "leonardo",
"email": "leo_am.snts@yahoo.com.br"
},
  "streams": []
}
GET /sensors/{sensorOid}

Get user sensor by Id

<= response

{
  "oid": 4,
  "key": "9887c50623bd4584bd106d37d84d6bcc",
  "name": "wifi001",
  "description": "wifi001",
"owner": {
"oid": 3,
"firstName": "Leonardo",
"lastName": "Santos",
"username": "leonardo",
"email": "leo_am.snts@yahoo.com.br"
},
  "streams": [
    {
      "oid": 6,
      "key": "985bf2cde9b54a54b8fcd3423d89ad89",
      "name": "temperature",
      "sensor": 1,
      "totalSize": 75554
    }
  ]
}

 

POST /sensors/{sensorOid}/streams

Register new stream

request =>

{
  "label": "temperature",
}

<= response

{
"oid": 14,
"key": "9fde557f8f8a4511af14767958c8d521",
"name": "temperature",
"sensor": {
"oid": 11,
"key": "a32ee5ecc36d48cd912ed60b9efe3446",
"name": "sensor 001",
"description": "sensor 001",
"owner": {
"oid": 3,
"firstName": "Leonardo",
"lastName": "Santos",
"username": "leonardo",
"email": "leo_am.snts@yahoo.com.br"
},
"streams": [14]
}
}
GET /sensors/{sensorOid}/streams/{streamOid}
Get stream info and recent data
<= response
{
"oid": 6,
"key": "985bf2cde9b54a54b8fcd3423d89ad89",
"name": "temperature",
"sensor": {
"oid": 4,
"key": "9887c50623bd4584bd106d37d84d6bcc",
"name": "wifi001",
"description": "wifi001",
"owner": {
"oid": 3,
"firstName": "Leonardo",
"lastName": "Santos",
"username": "leonardo",
"email": "leo_am.snts@yahoo.com.br"
},
"streams": [6]
},
"totalSize": 75639,
"data": [
{
"oid": 305744,
"sensorTimestamp": 1507031461,
"serverTimestamp": 1507042264485,
"values": [
{
"oid": 305826,
"key": "temp",
"value": "29.6"
}
]
},
...
]