https://github.com/dougfsilva/myiot-backend
O projeto é uma plataforma na qual o usuário cria uma conta, se conecta e cadastra dispositivos que poderão enviar dados para um Broker MQTT e receber comandos do tipo analógico e digital. A API então será responsável por receber os dados do Broker e por salvar as informações no banco de dados, e também oferecer uma interface para envio de comandos para os dispositivos.
https://github.com/dougfsilva/myiot-backend
java mongodb mqtt mvc spring-boot spring-security websocket
Last synced: 3 months ago
JSON representation
O projeto é uma plataforma na qual o usuário cria uma conta, se conecta e cadastra dispositivos que poderão enviar dados para um Broker MQTT e receber comandos do tipo analógico e digital. A API então será responsável por receber os dados do Broker e por salvar as informações no banco de dados, e também oferecer uma interface para envio de comandos para os dispositivos.
- Host: GitHub
- URL: https://github.com/dougfsilva/myiot-backend
- Owner: DougFSilva
- Created: 2022-09-22T13:03:30.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2023-01-13T13:44:33.000Z (over 3 years ago)
- Last Synced: 2025-02-28T21:07:33.992Z (over 1 year ago)
- Topics: java, mongodb, mqtt, mvc, spring-boot, spring-security, websocket
- Language: Java
- Homepage:
- Size: 2.06 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# MyIOT-backend
O projeto é uma plataforma para controle e medição de dispositivios IOT, onde o usuário logado pode cadastrar dispositivos privados do tipo analógico, digital ou dispositivo de medição. Para os dispositivos do tipo analógico ou discreto é possível enviar comandos e receber a atualização do estado ou valor em tempo real via websocket, persistindo-os no banco de dados. Para os dispositivos de medição os valores medidos são persistidos e enviados também via websocket para visualização em tempo real por meio de gráfico e tabela.
Na pasta frontend se encontra uma aplicação de frontend desenvolvida com Angular. Veja a seguir algumas imagens:
Exemplo de tela de um dispositivos de medição 
Exemplo de tela de cadastro de um dispositivo de medição 
Exemplo de tela de um dispositivo discreto 
Exemplo de tela de um dispositivo analógico 
Também foi criada uma biblioteca em C++ para facilitar a utilização com arduino, ESP8266 ou ESP32. Acesse [Biblioteca para arduino/ESP](https://github.com/DougFSilva/MyIOT-arduino-esp)
Repositório para o código do frontend em Angular. Acesse [MyIOT-frontend](https://github.com/DougFSilva/MyIOT-frontend)
# 🚀 Começando
Essas instruções permitiram que você instale e utilize a API em sua máquina desejada
## ⚙️ **Configurando e executando**
## 1. Configurar usuário e senha do Mosquitto dynamic security
Baixe a pasta completa do projeto, abra pasta mosquitto e o arquivo Dockerfile. Neste arquivo, configure como desejar as variáveis ADMIN_USERNAME e ADMIN_PASS.
## 2. Configurar as variáveis de ambiente
Agora, abra o arquivo docker-compose.yml na raiz do projeto e configure as seguintes variáveis de ambiente:
- **MONGO_INITDB_ROOT_USERNAME** - Usuário admin do mongo
- **MONGO_INITDB_ROOT_PASSWORD** - Senha do usuário admin do mongo
- **MONGODB_USERNAME** - Usuário admin do mongo
- **MONGODB_PASSWORD** - Senha do usuário admin do mongo
**Obs.:** As variáveis MONGO_INITDB_ROOT_USERNAME e MONGODB_USERNAME devem ser iguais, e as variáveis MONGO_INITDB_ROOT_PASSWORD e MONGODB_PASSWORD também devem ser iguais, pois se tratam do mesmo usuário e senha, porém em containers diferentes:
- **MONGODB_DATABASE** - Nome do database
- **USER_MASTER_PASSWORD** - Senha do usuário master do sistema
- **USER_MASTER_MQTTPASSWORD** - Senha do client gerado no broker mqtt para o usuário master do sistema
- **MQTT_SYSTEM_PASSWORD** - Senha do client mqtt para que o sistema acesse o broker mosquitto
- **MQTT_DYNSEC_USERNAME** - Usuário admin do dynamic security do broker mosquitto. Deve ser o mesmo configurado no Dockerfile do passo 1
- **MQTT_DYNSEC_PASSWORD** - Senha do usuário admin do dynamic security do broker mosquitto. Deve ser a mesma configurada no Dockerfile do passo 1
- **JWT_SECRET** - String secreta para geração do token JWT
## 3. Executar o Docker Compose
Com o terminal aberto na pasta raiz do projeto execute o Docker Compose.
```
docker compose up
```
Concluída toda a instalação a aplicação ficará disponível no endereço e porta configurados do docker-compose.
## 🔧 **Entendendo e utilizando**
## 1. Veja a documentação
Com a API em execução, acesse o endpoint **"/swagger-ui/index.html"** e acesse a documentação com todos os endpoits disponíveis e suas descrições.
## 2. Informações gerais
* Ao criar um usuário, o mesmo só poderá criar dispositivos caso tenha sido aprovado. A aprovação é realizada pelo usuário **Master** criado automaticamente ao iniciar a aplicação, ou por qualquer usuário de perfil **ADMIN**. Por padrão todo usuário criado possui um perfim **SILVER_USER**, e a alteração do perfil para **ADMIN** ou **GOLD_USER** somente pode seer realizada pelo usuário **Master** ou qualquer outro usuário de perfil **ADMIN**. Lembrando que as credenciais do usuário **Master** foram configuradas no item **2. Configurar as variáveis de ambiente**. Automaticamente ao ser criado e aprovado, será gerado uma senha para acesso ao Broker Mosquitto. Para verificar a senha o usuário deve fazer login no sistema e e acessar o endpoint **"/user"** com o verbo **GET**
* Cada usuário pode cadastrar uma certa quantidade de dispositivos, dependendo de seu perfil, sendo:
- **Dispositivo de controle analógico**: **ADMIN**(25), **GOLD_USER**(12), **SILVER_USER**(6)
- **Dispositivo de sinal discreto**: **ADMIN**(25), **GOLD_USER**(12), **SILVER_USER**(6)
- **Dispositivo de medição**: **ADMIN**(20), **GOLD_USER**(8), **SILVER_USER**(4)
* Ao cadastrar um dispositivo, será gerado automaticamente uma permissão no Broker Mosquitto para que o usuário acesse o tópico do dispositivo. Somente o usuário tem acesso a esse tópico. Os tópicos seguem o seguinte padrão:
- **iot/*<.tipo de dispositivo.>*/*<.id do dispositivo.>*** - Permite publicar e se inscrever, porém não persiste no banco de dados
- **iot/*<.tipo de dispositivo.>*/*<.id do dispositivo.>*/ persist** - Permite publicar e se inscrever e persiste no banco de dados
Onde o **tipo do dispositivo** pode ser:
- **AnalogOutputDevice** - Para dispositivo de comando analógico
- **DiscreteDevice** - Para dispositivos de sinais discretos
- **MeasuringDevice** - Para dispositivos de medição
E o **id do dispositivo** é número de identificação do dispositivo, que pode ser obtido nos endpoints **/analog-output-device/all**, **/discrete-device/all** e **/measuring-device/all**
Exemplo de tópico para um dispositivo de sinal discreto, com id 112d54s6aa8s95s48s:
**iot/DiscreteDevice/112d54s6aa8s95s48s**
**iot/DiscreteDevice/112d54s6aa8s95s48s/persist**
* Para acessar a aplicação via websocket é preciso fazer uma conexão SocketJs no endpoint **"/myiot-websocket/?token=*<.token JWT.>*"**, onde <.token JWT.> é o token JWT recebido ao autenticar. Então se inscrever no tópico referente ao dispositivo a ser acessado, da seguinte forma:
**/user/queue/message/*<.Id do dispositivo.>***
## 🛠️Construído com
* Spring boot
* Spring Security
* Json web token JWT
* MongoDb
* Websocket
* Docker
* Docker compose
* Eclipse Mosquitto
* OpenAPI
---
## ✒️ Autor
* Douglas Ferreira da Silva