All Projects → douglaszuqueto → controle-de-acesso

douglaszuqueto / controle-de-acesso

Licence: other
Projeto CDA - "Controle de Acesso" utilizando Golang, VueJS, PostgreSQL e MQTT

Programming Languages

Vue
7211 projects
go
31211 projects - #10 most used programming language
javascript
184084 projects - #8 most used programming language
PLpgSQL
1095 projects
C++
36643 projects - #6 most used programming language
shell
77523 projects

Projects that are alternatives of or similar to controle-de-acesso

barnowl
Technology-agnostic middleware for RFID, RTLS and M2M, enabling location-aware physical spaces. We believe in an open Internet of Things.
Stars: ✭ 25 (-3.85%)
Mutual labels:  rfid
rdm6300
A simple library to interface with RDM6300 RFID reader.
Stars: ✭ 46 (+76.92%)
Mutual labels:  rfid
ChameleonMini
The ChameleonMini is a versatile contactless smartcard emulator compliant to NFC. The ChameleonMini was first developed by KAOS. This is NOT the official repo for KAOS's ChameleonMini. For further information see the Getting Started Page
Stars: ✭ 350 (+1246.15%)
Mutual labels:  rfid
Sonos RFID Controller
RFID controller for the Sonos music player
Stars: ✭ 17 (-34.62%)
Mutual labels:  rfid
WemosD1 HomeMatic RFID
RFID Reader integration for HomeMatic house automation
Stars: ✭ 18 (-30.77%)
Mutual labels:  rfid
Core-NFC-Example
An example project which demonstrate the usage of iOS 11 Core NFC framework.
Stars: ✭ 19 (-26.92%)
Mutual labels:  rfid
Fool
Simple Russian voice assistant based on Android Things and Raspberry Pi 3
Stars: ✭ 26 (+0%)
Mutual labels:  rfid
nfc-reader
A simple library that provides to use rfid card readers.
Stars: ✭ 87 (+234.62%)
Mutual labels:  rfid
pyrfidhid
Python library to control Chinese USB HID 125Khz RFID Reader/Writer
Stars: ✭ 104 (+300%)
Mutual labels:  rfid
mfrc522
A platform agnostic driver to interface the MFRC522 (RFID reader/writer)
Stars: ✭ 27 (+3.85%)
Mutual labels:  rfid
android-things-rc522
Android library to communicate with RFID Module RC522
Stars: ✭ 44 (+69.23%)
Mutual labels:  rfid
PN532-HSU
PN532 HSU (UART) library for Python
Stars: ✭ 29 (+11.54%)
Mutual labels:  rfid
RFID-cloner
Handy device for cloning RFID chips/cards.
Stars: ✭ 55 (+111.54%)
Mutual labels:  rfid
rfid-reader-http
PC/SC lite HTTP wrapper for reading from a remote card reader (RFID & NFC).
Stars: ✭ 27 (+3.85%)
Mutual labels:  rfid
chamgo-qt
QT based GUI for Chameleon-RevE-Rebooted & Chameleon RevG - written in Golang
Stars: ✭ 34 (+30.77%)
Mutual labels:  rfid
sportiduino
Electronic timing system for orienteering and similar outdoor sports events on Arduino
Stars: ✭ 56 (+115.38%)
Mutual labels:  rfid
advlib
Open source, protocol-agnostic library for decoding ambient wireless packets. We believe in an open Internet of Things.
Stars: ✭ 90 (+246.15%)
Mutual labels:  rfid
TonUINO
Alternative TonUINO Firmware
Stars: ✭ 112 (+330.77%)
Mutual labels:  rfid
esp-idf-rc522
C library for interfacing ESP32 with MFRC522 RFID card reader, packaged as ESP-IDF component
Stars: ✭ 60 (+130.77%)
Mutual labels:  rfid
Mifareclassictool
An Android NFC app for reading, writing, analyzing, etc. MIFARE Classic RFID tags.
Stars: ✭ 2,698 (+10276.92%)
Mutual labels:  rfid

Controle de Acesso

Toda documentação do projeto encontra-se em fase de desenvolvimento!

img

Índice

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 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.

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

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
└── systemd

7 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

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 X

Demais 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.md

26 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 upgrade

sudo 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:

# Configurations

allow_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

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:

CREATE EXTENSION "uuid-ossp"
    SCHEMA public
    VERSION "1.1";

Depois de ter criado a extensão, crie o schema sistema

CREATE SCHEMA sistema
    AUTHORIZATION postgres;

Feito esses passos, é hora de adicionar a real estrutura de nosso sistema, para isso abra este arquivo, 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

# 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

# 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

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.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].