Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/douglaszuqueto/controle-de-acesso
Projeto CDA - "Controle de Acesso" utilizando Golang, VueJS, PostgreSQL e MQTT
https://github.com/douglaszuqueto/controle-de-acesso
esp8266 golang http mqtt postgresql rfid websockets
Last synced: about 1 month ago
JSON representation
Projeto CDA - "Controle de Acesso" utilizando Golang, VueJS, PostgreSQL e MQTT
- Host: GitHub
- URL: https://github.com/douglaszuqueto/controle-de-acesso
- Owner: douglaszuqueto
- Created: 2018-03-19T14:19:11.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2022-12-09T13:33:56.000Z (about 2 years ago)
- Last Synced: 2024-06-21T19:08:46.142Z (6 months ago)
- Topics: esp8266, golang, http, mqtt, postgresql, rfid, websockets
- Language: Vue
- Homepage: https://github.com/douglaszuqueto/controle-de-acesso
- Size: 4.06 MB
- Stars: 27
- Watchers: 7
- Forks: 5
- Open Issues: 22
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Controle de Acesso
**Toda documentação do projeto encontra-se em fase de desenvolvimento!**
![img](https://raw.githubusercontent.com/douglaszuqueto/controle-de-acesso/master/.github/images/print-dashboard.png)
## Índice
- [Introdução](#introdução)
- [Objetivo](#objetivo)
- [Materiais](#materiais)
- [Tecnologias](#tecnologias)
- [Arquitetura](#arquitetura)
- [Organização](#organização)
- [Fluxo](#fluxo)
- [Rodando o projeto](#rodando-o-projeto)
- [Resultados](#resultados)
- [Referências](#referências)## Introdução
Depois de completar quase 1 ano que lancei o primeiro 'projeto' de envolvendo controle de acesso, eis que foi desenvolvido uma versão mais completa.
Para quem ainda não conhece, o projeto [Controle de acesso utilizando NodeMCU, RFID, MQTT e Banco de Dados MySQL](https://github.com/douglaszuqueto/esp8266-rfid-banco-de-dados) foi desenvolvido em Julho de 2017, onde tinha como objetivo desenvolver um projeto simples e direto ao ponto para sanar muitas dúvidas que membros da comunidade tinham, principalmente no que tange integração, arquitetura e comunicação com banco de dados. Portanto, para quem ainda não viu, eu recomendo dar uma olhada no projeto antigo para já ter um embasamento do que se trata - [link](https://github.com/douglaszuqueto/esp8266-rfid-banco-de-dados).
Como o objetivo era desenvolver um projeto mais completo, e como também, eu sempre estou em busca de testar e validar novas tecnologias, neste projeto não foi diferente - Utilizei **Go(golang)** como linguagem de programação para o *Back-end* e **VueJS** como biblioteca para construção do *Front-end*. No embarcado fiquei com as mesmas tecnologias pois é a que mais domino no momento.
## Objetivo
Desenvolver tal projeto que seja de fácil implementação - tanto no que tange **Embarcado** como também **Arquitetura** e **Software** e também oferecer uma boa experiência através de networking e troca de ideias - sendo os 2 últimos itens mencionados, os fatores que mais levo em consideração no desenvolvimento de algum projeto :)
## Materiais
Abaixo segue uma seção resumida dos materiais principais que foram utilizadas no decorrer do desenvolvimento do projeto.
* Embarcado
* NodeMCU
* Rfid Mfrc522 Mifare
* Servidor
* Raspberry Pi 3
* Raspberry Pi Zero W
* Servidor em Nuvem**Observação:** No que tange servidor, apenas um item citado acima basta! Detalharei com mais calma em outro tópico.
## Tecnologias
* Firmware
* [PubSubClient](https://github.com/knolleary/pubsubclient)
* [MFRC522](https://github.com/miguelbalboa/rfid/)
* Back-end - Go
* [pq - A pure Go postgres driver for Go's database/sql package](https://github.com/lib/pq)
* [gorilla/handlers](https://github.com/gorilla/handlers)
* [gorilla/mux](https://github.com/gorilla/mux)
* [Eclipse Paho MQTT Go client](https://github.com/eclipse/paho.mqtt.golang)
* [jwt-go](https://github.com/dgrijalva/jwt-go)
* [statik](https://github.com/rakyll/statik)
* Front-end - VueJS
* [VueJS](https://github.com/vuejs/vue)
* [Vue Router](https://github.com/vuejs/vue-router)
* [Bootstrap 4](https://github.com/twbs/bootstrap)
* [Axios](https://github.com/axios/axios)
* [MQTT.js](https://github.com/mqttjs/MQTT.js)
* [Font-Awesome](https://github.com/FortAwesome/Font-Awesome)
* [Sweet Alert 2](https://github.com/sweetalert2/sweetalert2)## Arquitetura
inserir diagrama geral aqui
## Organização
**Level 1**
```
~/projetos/controle-de-acesso on master ⌚ 14:43:36
$ tree -L 1
.
├── app
├── bin
├── cli
├── database
├── firmware
├── front
├── README.md
└── systemd7 directories, 1 file
```Num primeiro momento, o projeto é formado por **7 pastas** - podendo crescer futuramente.
**Observação:** Detalhes mais 'aprofundados' de cada pasta será abordado em um **README** dentro do sua respectiva pasta.
### 1 - app
Conterá todo back-end da aplicação, ou seja, tudo que é necessário para realizar o build da aplicação e 'colocar em produção'. Possui 3 scripts(em bash mesmo) para colocar todo o projeto rodar em 3 ambientes: **Docker**, **Local** e na **Raspberry Pi**.
### 2 - bin
Pasta responsável por armazenar os binários(aplicação compilada) para arquitetura **Linux 64** e **ARM(raspberry)**
### 3 - cli
Binário que será desenvolvido para manipular todos *endpoints* da aplicação através da linha de comando.
**Ex:**
* 1º Criar uma tag
* 2º Associar a um usuário
* 3º Associar a um device**Observação: Em desenvolvimento**
### 4 - database
O banco de dados utilizado foi o **PostgreSQL** - um banco que fazia algum tempo que queria validar em 1 projeto :)
Confira abaixo a estrutura do projeto CDA.
![img](https://raw.githubusercontent.com/douglaszuqueto/controle-de-acesso/master/database/estrutura.png)
Em resumo, o projeto se dá pela seguinte forma:
* administradores para acessar o painel
* usuários que por sua vez podem possuir diversas tags
* devices - podem ser catracas, portas de acesso dentre outros cenários
* tais tags são associadas a devices, assim liberando ou proibindo o acesso daquela tag específica e que pertence a um usuario XDemais informações serão descritas na respectiva pasta *database*
### 5 - firmware
A pasta firmware contem 2 subpastas, são elas: **cda** e **reader**.
O firmware **cda** é o principal. Ele que rodará no seu hardware principal - catracas, portas de acesso e etc.
Já o firmware **reader** é como se fosse um *Plus*, você poderá ter um hardware adicional no balcão - por exemplo, para realizar o cadastro de tags. Então este firmware em conjunto com um nodemcu e um leitor rfid irá preencher automaticamente o **uuid** quando a tag for lida na tela de cadastro da Dashboard.
### 6 - front
### 7 - systemd
O **systemd** será utilizado quando seu sistema operacional tiver suporte e você queira que, ao ligar/reiniciar seu servidor o back-end seja iniciado automaticamente, ou, em caso de falhas, o mesmo seja reiniciado.
**Lista de diretórios mais detalhada**
```
~/projetos/controle-de-acesso on master! ⌚ 14:44:44
$ tree -L 2
.
├── app
│ ├── app
│ ├── bin
│ ├── config
│ ├── deploy-docker.sh
│ ├── deploy-local.sh
│ ├── deploy-rpi.sh
│ ├── Dockerfile
│ ├── handlers
│ ├── main.go
│ ├── models
│ ├── mqtt
│ ├── pkg
│ ├── public
│ ├── README.md
│ ├── routes.go
│ ├── services
│ ├── src
│ ├── statik
│ └── utils
├── bin
│ ├── app
│ └── README.md
├── cli
│ └── README.md
├── database
│ ├── controle-de-acesso.mwb
│ ├── controle-de-acesso.mwb.bak
│ ├── estrutura.png
│ ├── README.md
│ └── sistema.sql
├── firmware
│ ├── cda
│ └── reader
├── front
│ ├── build
│ ├── config
│ ├── dist
│ ├── Dockerfile
│ ├── index.html
│ ├── node_modules
│ ├── package.json
│ ├── README.md
│ ├── src
│ ├── static
│ └── yarn.lock
├── README.md
└── systemd
├── cda
├── cda.service
└── README.md26 directories, 25 files
```## Fluxo
**inserir diagramas aqui**
## Rodando o projeto
Neste tópico, tudo que abordar Sistema Operacional, estarei me baseando em **Debian/Ubuntu**, mesmo tendo como distro principal o Fedora. Tudo isso pois como o foco de servidor é na Raspberry Pi, sabemos que ela é baseada no Debian, então facilita tudo :).
Mas se você quer rodar numa distro diferente, não tem problemas, o que mais muda mesmo é o **gerenciador de pacotes**, de resto é tranquilo.
Saliento também, que terá 2 ambientes, ou seja, tem um ambiente no qual o build é gerado por você e o cenário no qual você pode aproveitar os binários que estarão na **pasta bin**.
### Preparando o ambiente
Para começar, tenha seu ambiente atualizado :)
```
sudo apt-get update
sudo apt-get upgradesudo apt-get install vim git wget
```### Broker MQTT - Mosquitto
```
sudo apt-get install mosquitto
```No diretório **/etc/mosquitto/conf.d** crie o arquivo *cda.conf*
```
sudo vim /etc/mosquitto/conf.d/cda.conf
```Adicione o seguinte conteudo dentro do arquivo em um editor de sua preferência:
```
# Configurationsallow_anonymous true
log_type error
log_type warning
log_type notice
log_type information
log_type debug# MQTT
listener 1883
# MQTT Websockets
listener 8083
protocol websockets
```Caso você queira utilizar portas diferentes fique a vontade para mudar. Porém certifique-se que elas não estarão sendo utilizadas por outro serviço.
Para atualizar as configurações do mosquitto você precisa dar um restart no daemon do systemd e em seguida reiniciar o serviço do mosquitto.
```
sudo systemd daemon-reload
sudo systemd restart mosquitto
```### Banco de dados - PostgreSQL
Para realizar a instalação, certifique-se que esteja tudo certo com o pacote. Para isso realize uma busca pelo mesmo.
```
sudo apt-cache search postgresql-9.6
```Sua saída deverá ter um pacote exatamente com o nome pesquisado acima, e também aparecerá outros plugins. Para instalar o banco de dados, basta executar o comando abaixo:
```
sudo apt-get install postgresql-9.6
```#### Configurações adicionais
##### Liberando acesso para a rede
No arquivo **/etc/postgresql/9.6/main/postgresql.conf**, procure pela linha que contenha esta nomenclatura: **listen_addresses**. Independente do conteúdo, troque pela seguinte configuração:```
listen_addresses = '*'
```##### Setando timezone
No mesmo arquivo anterior, busque por **timezone**, e troque seu conteúdo por:```
timezone = 'America/Sao_Paulo'
```**Obeservação:** Caso seja de uma timezone diferente, não esqueça de mudar.
##### Adicionando regra de autenticação criptografada
No final do arquivo **/etc/postgresql/9.6/main/pg_hba.conf** adicione a seguinte linha:
```
host all all 192.168.0.1/24 md5
```**Observação:** Não esqueça de mudar sua rede caso a mesma esteja em uma faixa diferente. No meu caso, está na rede 0: 192.168.**0**.1/24
##### Setando senha do usuário default - postgres
```
# 1º passo
sudo -u postgres psql# 2º passo
ALTER USER postgres PASSWORD = 'root'# 3º passo
\q# 4º passo
sudo systemctl restart postgresql```
##### Criando e 'instalando' a estrutura do banco
Para começar crie um banco de dados chamado **controle-de-acesso**
```sql
CREATE DATABASE "controle-de-acesso"
WITH
OWNER = postgres
ENCODING = 'UTF8'
LC_COLLATE = 'en_GB.UTF-8'
LC_CTYPE = 'en_GB.UTF-8'
TABLESPACE = pg_default
CONNECTION LIMIT = -1;
```Logo em seguida, crie a extensão necessária para geração das chaves primárias das nossas tabelas:
```sql
CREATE EXTENSION "uuid-ossp"
SCHEMA public
VERSION "1.1";
```Depois de ter criado a extensão, crie o schema **sistema**
```sql
CREATE SCHEMA sistema
AUTHORIZATION postgres;
```Feito esses passos, é hora de adicionar a real estrutura de nosso sistema, para isso abra [este arquivo](https://raw.githubusercontent.com/douglaszuqueto/controle-de-acesso/master/database/sistema.sql), copie e execute o script.
**Observação:** Não adicionei aqui o script, pois tem algumas linhas e iria acabar poluindo a documentação.
Está pronto, a estrutura necessária para rodar o sistema está completa. Em resumo os passos foram os seguintes:
* 1º Criar o banco de dados: **controle-de-acesso**
* 2º Adicionar a extensão: **uuid-ossp**
* 3º Criar o schema: **sistema**
* 4º Adicionar a estrutura do banco### Realizando build do projeto
**falar das dependências de desenvolvimento/build**
Como mencionado anteriormente, temos um script para automatizar o processo de build. Será mencionado dois cenário - build local e remoto. Portanto, veja o scripts comentados abaixo:
#### Local
```bash
# Define o GOPATH
export GOPATH=$(pwd)# Realiza o build do front-end da aplicação
yarn --cwd ../front run build# Depois de efetuar o build, os arquivos de produção são copiados para a pasta interna do back-end
rm -rf ./public
mkdir public
cp -r ../front/dist/* ./public/# Após copiar os arquivos do front-end, é utilizado a ferramenta statik para 'compilar' os assets da aplicação para que depois seja embarcado no back-end
./bin/statik -f# Gera o binário da nossa aplicação
go build -o app# A fim de manter sempre um binário no Github, o binário gerado é copiado para a pasta bin
cp app ../bin```
#### Remoto
```bash
# Define o GOPATH
export GOPATH=$(pwd)# Realiza o build do front-end da aplicação
# Como é um caso remoto, temos que definir através de variáveis de ambiente, qual sera o IP do back-end como também o IP do Broker MQTT
CDA_API_HOST="192.168.0.100:3000" CDA_MQTT_HOST="192.168.0.100:8083" yarn --cwd ../front run build# Depois de efetuar o build, os arquivos de produção são copiados para a pasta interna do back-end
rm -rf ./public
mkdir public
cp -r ../front/dist/* ./public/# Após copiar os arquivos do front-end, é utilizado a ferramenta statik para 'compilar' os assets da aplicação para que depois seja embarcado no back-end
./bin/statik -f# Gera o binário da nossa aplicação
GOARCH=arm go build -o rpi-app# A fim de manter sempre um binário no Github, o binário gerado é copiado para a pasta bin
cp rpi-app ../bin# Efetua a cópia do binário para um host remoto, em nosso caso, é para a raspberry
scp rpi-app [email protected]:/home/pi/tmp/```
### Colocando rodar pela 1º vez
#### Local
#### Remoto
### Configurando para iniciar com o Sistema Operacional
## Resultados
## Referências
- [Controle de acesso utilizando NodeMCU, RFID, MQTT e Banco de Dados MySQL](https://github.com/douglaszuqueto/esp8266-rfid-banco-de-dados)
# Gostou do projeto?
Se você curtiu o projeto e quer trocar uma ideia, foi criado um grupo no **Telegram** para debate! - [clique aqui para participar](https://t.me/joinchat/BPOe2hAc3mNcw_y7f0qipg).