ApiIot é uma API para cadastro de usuários, cadastro e controle de dispositivos.
- Criar um usuário
- Realizar login
- Alterar senha do usuário
- Adicionar controlador
- Buscar controlador pelo ID
- Buscar controlador pelo endereço IP
- Buscar controlador pelo endereço MAC
- Buscar controlador pelo endereço IP
- Adicionar termistor ao controlador
- Buscar termistor pela número da porta do controlador
- Adicionar valor de temperatura ao termistor
- Buscar última temperatura registrada pelo termistor
- Buscar paginada de temperaturas registradas pelo termistor a partir de um range de datas
- Buscar termistor pela número da porta do controlador
- Ter o NodeJS instalado na máquina;
- Ter o NestJS instalado na máquina;
- Ter o MySql instalado na máquina;
- Realizar o clone desse repositório
git clone https://github.com/andersonaguia/api-iot.git
- Acessar a pasta do projeto;
cd api-iot
- Instalar as dependências;
npm install
- Renomear o arquivo
.env_examplepara.enve inserir os dados conforme sua configuração do MySQL;
Exemplo:
#Port number
PORT=3001
#Database
DB_DIALECT=mysql
DB_HOST=localhost ou endereço do servidor de banco de dados
DB_PORT=3306
DB_USER="nome de usuário do banco de dados"
DB_PASS="senha do banco de dados"
DB_NAME=automation
#Jwt Secret
JWT_SECRET="sua senha para utilizar na autenticação JWT"
- Criar um database no
MySQLchamadoautomationpara utilizar no projeto;
mysql -u root -p
Enter password:
mysql> CREATE DATABASE automation CHARACTER SET utf8 COLLATE utf8_general_ci;
- Instalar o cross-env e rodar as migrations para criar as tabelas do banco de dados automaticamente
npm install --save-dev cross-env
npm run migration:run
- Servir a aplicação em modo desenvolvimento;
npm run start:dev
Para criar um usuário basta realizar uma requisição do tipo POST com os dados do Body conforme indicado abaixo. Para o campo role os seguintes valores serão aceitos:
ADMIN = "admin"
SUPERVISOR = "supervisor"
MANAGER = "manager"
USER = "user"
POST: http://localhost:3001/auth/signup
Headers: {
"Content-Type": "application/json"
}
Body: {
"fullName": "My Name",
"email": "my_email@email.com",
"password": "aA123@456!",
"passwordConfirmation": "aA123@456!",
"occupation": "Supervisor",
"role": "supervisor"
}
Resultado:
{
"status": 201,
"headers": {},
"body": {
"statusCode": 201,
"message": "Usuário cadastrado com sucesso"
}
}
Para fazer login na aplicação você realizar uma requisição do tipo POST com os dados do Body conforme indicado abaixo. Você receberá um `Token JWT`` para acesso às rotas protegidas da aplicação.
POST: http://localhost:3001/auth/signin
Headers: {
"Content-Type": "application/json"
}
Body: {
"email": "my_email@email.com",
"password": "aA123@456!"
}
Resultado:
{
"status": 200,
"headers": {},
"body": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiZmlyc3ROYW1lIjoiQW5kZXJzb24iLCJvY2N1cGF0aW9uIjoiVMOpY25pY28gZW0gTWFudXRlbsOnw6NvIiwiZW1haWwiOiJhbmRlcnNvbmxhZ3VpYXJAZ21haWwuY29tIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNjk4MDkwMDU1LCJleHAiOjE2OTg2OTQ4NTV9.At1l6IXX2bnBgVdPpCFLmV63-y3YHJp-ZMTzON4twJI"
}
}
Para alterar a senha do usuário você realizar uma requisição do tipo PATCH com os dados do Body conforme indicado abaixo. No cabeçalho da requisição você deverá enviar o TOKEN recebido no momento da realização do login.
PATCH: http://localhost:3001/auth/changepassword
Headers: {
"Content-Type": "application/json",
"Authorization": "Bearer SEU_TOKEN_AQUI"
}
Body: {
"email": "my_email@email.com",
"oldPassword": "aA123@456!",
"newPassword": "bB123@456!",
"newPasswordConfirmation": "bB123@456!"
}
Resultado:
{
"status": 200,
"headers": {},
"body": {
"statusCode": 200,
"message": "Senha alterada com sucesso"
}
}
Para adicionar um novo controlador você deve realizar uma requisição do tipo POST com os dados do Body conforme indicado abaixo:
POST: http://localhost:3001/controllers/create
Headers: {
"Content-Type": "application/json",
"Authorization": "Bearer SEU_TOKEN_AQUI"
}
Body: {
"name": "CONT-TER-001",
"model": "ESP32",
"connectionType": "wifi",
"ipAddress": "172.31.210.183",
"macAddress": "2E:3D:4B:AD:EF",
"location": "Sala de Máquinas"
}
Resultado:
{
"status": 201,
"headers": {},
"body": {
"statusCode": 201,
"message": "Dispositivo cadastrado com sucesso",
"data": {
"name": "CONT-TER-001",
"model": "ESP32",
"connectionType": "wifi",
"ipAddress": "172.31.210.183",
"macAddress": "2E:3D:4B:AD:EF",
"createdAt": "2023-10-31T21:55:36.193Z",
"location": "Sala de Automação",
"updatedAt": "2023-10-31T21:55:36.214Z",
"deletedAt": null,
"id": 1
}
}
}
Para buscar um controlador pelo ID você deve realizar uma requisição do tipo GET utilizando Route params conforme indicado abaixo:
GET: http://localhost:3001/controllers/findbyid/1
Headers: {
"Content-Type": "application/json",
"Authorization": "Bearer SEU_TOKEN_AQUI"
}
Resultado:
{
"status": 200,
"headers": {},
"body": {
"statusCode": 200,
"data": {
"id": 1,
"createdAt": "2023-10-31T21:55:36.193Z",
"updatedAt": "2023-10-31T21:55:36.214Z",
"deletedAt": null,
"name": "CONT-TER-001",
"model": "ESP32",
"connectionType": "wifi",
"ipAddress": "172.31.210.183",
"macAddress": "2E:3D:4B:AD:EF",
"location": "Sala de Automação"
}
}
}
Para buscar um controlador pelo endereço de IP você deve realizar uma requisição do tipo GET utilizando Query params conforme indicado abaixo:
GET: http://localhost:3001/controllers/findbyip?ipAddress=172.31.210.183
Headers: {
"Content-Type": "application/json",
"Authorization": "Bearer SEU_TOKEN_AQUI"
}
Resultado:
{
"status": 200,
"headers": {},
"body": {
"statusCode": 200,
"data": {
"id": 1,
"createdAt": "2023-10-31T21:55:36.193Z",
"updatedAt": "2023-10-31T21:55:36.214Z",
"deletedAt": null,
"name": "CONT-TER-001",
"model": "ESP32",
"connectionType": "wifi",
"ipAddress": "172.31.210.183",
"macAddress": "2E:3D:4B:AD:EF",
"location": "Sala de Automação"
}
}
}
Para buscar um controlador pelo endereço de IP você deve realizar uma requisição do tipo GET utilizando Query params conforme indicado abaixo:
GET: http://localhost:3001/controllers/findbymac?macAddress=84%3A0D%3A8E%3A3B%3A19%3ABA
Headers: {
"Content-Type": "application/json",
"Authorization": "Bearer SEU_TOKEN_AQUI"
}
Resultado:
{
"status": 200,
"headers": {},
"body": {
"statusCode": 200,
"data": {
"id": 1,
"createdAt": "2023-10-31T21:55:36.193Z",
"updatedAt": "2023-10-31T21:55:36.214Z",
"deletedAt": null,
"name": "CONT-TER-001",
"model": "ESP32",
"connectionType": "wifi",
"ipAddress": "172.31.210.183",
"macAddress": "2E:3D:4B:AD:EF",
"location": "Sala de Automação"
}
}
}
Para adicionar um termistor ao controlador você deve realizar uma requisição do tipo POST informando os dados conforme indicado abaixo:
POST: http://localhost:3001/thermistors/add
Headers: {
"Content-Type": "application/json",
"Authorization": "Bearer SEU_TOKEN_AQUI"
}
Body: {
"controllerId" : 1,
"controllerPort": 34,
"location": "Subsolo",
"manufacturer": "Full Gauge",
"minRange": -50,
"maxRange": 105,
"model": "SB-41",
"nominalResistance": 10000,
"voltageDividerResistance": 4700
}
Resultado:
{
"status": 201,
"headers": {},
"body": {
"statusCode": 201,
"message": "Termistor cadastrado com sucesso"
}
}
Para buscar um termistor pelo controlador informando a porta você deve realizar uma requisição do tipo GET utilizando Query params conforme indicado abaixo:
GET: http://172.31.210.101:3004/thermistors/findbycontrollerport/?controllerId=1&controllerPort=34
Headers: {
"Content-Type": "application/json",
"Authorization": "Bearer SEU_TOKEN_AQUI"
}
Resultado:
{
"status": 200,
"headers": {},
"body": {
"statusCode": 200,
"data": {
"id": 1,
"createdAt": "2023-10-30T17:36:51.589Z",
"updatedAt": "2023-10-30T17:36:51.589Z",
"deletedAt": null,
"manufacturer": "Full Gauge",
"model": "SB-41",
"minRange": "-50.00",
"maxRange": "105.00",
"nominalResistance": "10000.00",
"voltageDividerResistance": "4700.00",
"controllerPort": 34,
"location": "Sala de Automação"
}
}
}
Para adicionar o valor de leitura do termistor você deve realizar uma requisição do tipo POST informando os dados conforme indicado abaixo:
POST: http://localhost:3001/thermistordata/add
Headers: {
"Content-Type": "application/json",
"Authorization": "Bearer SEU_TOKEN_AQUI"
}
Body: {
"thermistorId" : 1,
"value": 25.10
}
Resultado:
{
"status": 201,
"headers": {},
"body": {
"statusCode": 201,
"message": "Termistor cadastrado com sucesso"
}
}
Para buscar o último valor registrado pelo termistor você deve realizar uma requisição do tipo GET informando o ID do termistor como Route params conforme indicado abaixo:
GET: http://localhost:3001/thermistordata/findactualvalue/1
Headers: {
"Content-Type": "application/json",
"Authorization": "Bearer SEU_TOKEN_AQUI"
}
Resultado:
{
"status": 200,
"headers": {},
"body": {
"statusCode": 200,
"data": [
{
"id": 1,
"createdAt": "2023-10-31T21:55:54.643Z",
"updatedAt": "2023-10-31T21:55:54.643Z",
"deletedAt": null,
"value": "22.39",
"thermistor": {
"id": 1,
"createdAt": "2023-10-31T21:55:41.842Z",
"updatedAt": "2023-10-31T21:55:41.842Z",
"deletedAt": null,
"manufacturer": "Full Gauge",
"model": "SB-41",
"minRange": "-50.00",
"maxRange": "105.00",
"nominalResistance": "10000.00",
"voltageDividerResistance": "4700.00",
"controllerPort": 34,
"location": "Sala de Automação"
}
}
]
}
}
Para as temperaturas registradas pelo termistor ao longo de um período você deve realizar uma requisição do tipo GET utilizando Query params para informar a data inicial, final, número de páginas e itens por página conforme indicado abaixo:
GET: http://localhost:3001/thermistordata/find-values-by-date/?thermistorId=2&startDate=2023-10-27&endDate=2023-10-28&page=1&limit=10
Headers: {
"Content-Type": "application/json",
"Authorization": "Bearer SEU_TOKEN_AQUI"
}
Resultado:
{
"status": 200,
"headers": {},
"body": {
"statusCode": 200,
"data": {
"total": 3,
"values": [
{
"id": 4,
"createdAt": "2023-10-27T00:25:20.677Z",
"updatedAt": "2023-10-27T00:25:20.677Z",
"deletedAt": null,
"value": "18.90"
},
{
"id": 6,
"createdAt": "2023-10-27T11:02:12.925Z",
"updatedAt": "2023-10-27T11:02:12.925Z",
"deletedAt": null,
"value": "21.99"
},
{
"id": 7,
"createdAt": "2023-10-27T11:28:16.017Z",
"updatedAt": "2023-10-27T11:28:16.059Z",
"deletedAt": null,
"value": "22.39"
}
]
}
}
}
Este projeto está sob a licença MIT.