Zoneminder: Substituindo o Unifi NVR

Dessa vez vou escrever sobre como realizei a substituição de um Unifi NVR por uma solução opensource baseada em Debian e Zoneminder.

O Zoneminder é um software de vigilância digital que implementa todas as funções de um NVR convencional e que possui suporte a uma grande variedade de câmeras, sendo esse, o principal fator que me motivou a usá-lo no lugar do hardware da Ubiquiti. O site do Zoneminder pode ser acessado através desse link https://zoneminder.com/ .

O meu cenário inicial era composto por sete câmeras Unifi Video configuradas no NVR e também por uma câmera Axis PTZ m5014 funcionando de forma standalone.

A instalação do Zoneminder foi feita através do repositório com os seguintes passos:

1 – Adicionei o repositório;

echo 'deb http://www.deb-multimedia.org stretch main non-free' >> /etc/apt/sources.list 

apt-get update

wget http://www.deb-multimedia.org/pool/main/d/deb-multimedia-keyring/deb-multimedia-keyring_2016.8.1_all.deb

dpkg -i deb-multimedia-keyring_2016.8.1_all.deb

apt-get update

2 – Instalei os pacotes;

apt-get install php7.0 mysql-server php7.0-mysql php7.0-gd apache2 zoneminder vlc-plugin-base 

3 – Habilitei a configuração do Zoneminder no Apache;

a2enmod cgi 

a2enmod rewrite

a2enconf zoneminder

4 – Ajustei as permissões;

chmod 740 /etc/zm/zm.conf 

chown root:www-data /etc/zm/zm.conf

chown -R www-data:www-data /usr/share/zoneminder/

5 – Ajustei o timezone do PHP;

sed -i "s/;date.timezone =/date.timezone = $(sed 's/\//\\\//' /etc/timezone)/g" /etc/php/7.0/apache2/php.ini

6 – Habilitei e iniciei o serviço do Zoneminder;

systemctl restart apache2 

systemctl enable zoneminder.service

systemctl start zoneminder.service

Depois disso, com a instalação realizada, o Zoneminder ficou disponível no endereço http://ip_do_servidor/zm/ .

Por padrão, o Zoneminder abre com um layout bem simples e sem nenhuma forma de autenticação.

Para melhorar essa configuração, acessei o link options no lado direito superior da tela e, na janela que foi aberta, alterei a opção ZM_CSS para flat na aba display.

A interface flat do Zoneminder.

Já para adicionar a autenticação, cliquei no link options novamente e marquei a opção OPT_USE_AUTH na aba System. A autenticação padrão foi feita com usuário admin e senha admin.

Tela de login do Zoneminder.

E por último, ainda na aba System, ativei a opção OPT_USE_API para ativar o acesso as APIs do Zoneminder.

Para configurar as câmeras Unfi no Zoneminder foi necessário acessar a interface WEB delas e trocar o modo de operação para Standalone.

Câmera Ubiquity em modo Standalone.

Com essa mudança, a câmera ‘entendeu’ que iria trabalhar sozinha, sem um Unifi NVR, e habilitou algumas opções na sua interface…

Entre as novas opções, ficou disponível a URL do stream RTSP da câmera. Foi através dessa URL que a câmera foi configurada no Zoneminder.

No Zoneminder as câmeras são definidas como monitores e podem ser adicionadas com o botão ‘Add New Monitor’ presente na tela inicial.

Tela de configuração da câmera no Zoneminder.

Como a configuração de câmeras no Zoneminder é bem ampla, vou descrever apenas as opções que eu utilizei, outras possibilidades podem ser conferidas nesse link https://zoneminder.readthedocs.io/en/stable/userguide/definemonitor.html .

Para configurar as câmeras Ubiquiti fiz o seguinte:

1 – Na aba General, alterei o Source Type para Ffmpeg e Function para Modect ;

2 – Na aba Source, alterei o Source Path para ‘rtsp://usuario_camera:senha_camera@ip_camera:554/s0’, o Capture Width para 1280 e Capture Height para 720 ;

Salvei e câmera já ficou disponível na tela inicial do Zoneminder.

Para configurar a câmera Axis, primeiro foi necessário ativar a flag OPT_CONTROL nas opções do Zoneminder dentro da aba System . Essa configuração habilita o controle PTZ do Zoneminder.

Feito isso, a configuração da câmera Axis foi feita de forma semelhante a das câmeras Ubiquiti…Porém, o Source Type ficou como remote e, na aba Source, os campos Remote Host Name e Remote Host Path ficaram com os valores ‘usuario:senha@ip_camera’ e ‘/axis-cgi/mjpg/video.cgi’ .

Além disso, na aba Control, foi feita a configuração do PTZ.

No campo Control type foi usado a opção Axis API v2, no campo Control Device foi usado o valor axis-cgi/com/ptz.cgi e no campo Control Address foi usado o valor ‘usuario:password@ip_caminho .’

Uma observação é que, a principio, o controle PTZ dessa câmera não funcionou… Eu não sei se foi algo especifico desse modelo, ou se é algum bug na Axis API, mas o controle PTZ inicialmente não movimentava a câmera… Analisando as requisições que o Zoneminder fazia na API da câmera, notei que um cookie que a câmera usa na sua interface WEB não estava sendo enviado pelo Zoneminder.

Para corrigir isso, fiz uma alteração no código responsável por conversar com a API da câmera… Faça essa alteração apenas se for usar esse modelo.

Fiz um backup do arquivo original:

cp /usr/share/perl5/ZoneMinder/Control/AxisV2.pm ~

Dentro do arquivo /usr/share/perl5/ZoneMinder/Control/AxisV2.pm alterei o conteúdo da sub open para o seguinte:

sub open 
{
my $self = shift;

$self->loadMonitor();

use LWP::UserAgent;
use HTTP::Cookies;

$self->{ua} = LWP::UserAgent->new;

my $cookie_jar = HTTP::Cookies->new();

$self->{ua}->agent( "ZoneMinder Control Agent/".ZoneMinder::Base::ZM_VERSION );

$self->{ua}->cookie_jar( $cookie_jar );

$self->{state} = 'open';
}
Código da Axis API alterado.

Depois de realizar essa alteração, precisei reiniciar o sistema e o controle PTZ começou a funcionar.

Quando o Zoneminder têm mais de uma câmera configurada, os links cycle, montage e montage review ficam disponíveis na parte de cima da tela.

Através desses links é possível configurar uma tela de vigilância com várias câmeras para ser exibida em uma televisão.

No meu caso, eu queria usar um layout de tela com seis câmeras, com cinco delas sendo apresentadas com o mesmo tamanho e uma com um tamanho maior.

Além disso, minha ideia era rotacionar as câmeras de forma automática para que todas elas fossem exibidas no tamanho maior…

Exemplo do layout.

Infelizmente, eu não consegui montar esse layout com as opções do sistema( confesso que eu não me entendi com a ferramenta de montagem ).

Por isso, usei a API do Zoneminder para criar uma pequena aplicação para suprir essa necessidade…

Para quem tiver interesse, o código dessa aplicação está disponível no GitHub nesse link https://github.com/p4ulodi4s/painel-cftv .

Para fazer a instalação é necessário ter o composer, node/npm eo gulp instalados no servidor.

O composer e node/npm estão disponíveis nesses links : https://getcomposer.org/ e https://nodejs.org/

O gulp pode ser instalado com o npm com o comando:

 npm install -g gulp

Os passos para instalação são os seguintes:

1 – Baixar e descompactar o repositório ;

wget https://github.com/p4ulodi4s/painel-cftv/archive/master.zip

unzip master.zip

2 – Mover para a pasta do servidor WEB ;

mv painel-cftv-master/ /var/www/html/painel

3 – Instalar as dependências e rodar o gulp ;

cd /var/www/html/painel

composer install

npm install

gulp

Feito isso, basta acessar o endereço do servidor com o navegador e na tela inicial configurar os dados de autenticação e as câmeras( os ids ) que serão exibidas.

Além da interface web do Zoneminder, também existe o zmNinja, um aplicativo para dispositivos moveis disponível para plataforma Android e IOS.

O zmNinja pode ser baixado através das lojas dos fabricantes nesses links:

https://itunes.apple.com/us/app/zmninja-pro/id1067914954?mt=8

https://play.google.com/store/apps/details?id=com.pliablepixels.zmninja_pro&hl=pt_BR

O desenvolvedor do zmNinja também disponibilizou o código fonte do projeto nesse link: https://github.com/pliablepixels/zmNinja

Apesar do baixo custo do zmNinja nas lojas, como o fonte está disponível, achei melhor fazer o download do código e compilar para a plataforma Android.

Para isso, eu segui os passos do tutorial disponibilizado pelo desenvolvedor nesse link https://zmninja.readthedocs.io/en/latest/guides/source.html .

Para complementar, seguem os passos que realizei para montar e configurar o ambiente para compilação do zmNinja no meu desktop Ubuntu 16.04:

1- Baixei o JDK da Oracle no link https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html e instalei o arquivo .deb ;

sudo dpkg -i jdk-12.0.1_linux-x64_bin.deb

2 – Baixei o Android Studio no link https://developer.android.com/studio e instalei o arquivo tar.gz ;

sudo tar -xzvf android-studio-ide-183.5452501-linux.tar.gz -C /opt/ 
sudo /opt/android-studio/bin/studio.sh

3 – Na interface do Android Studio, foi necessário acessar o caminho File > Settings > Appearance & Behavior > System Settings > Android SDK > SDK Platforms e instalar a versão do Android correspondente ao dispotivo onde zmNinja seria instalado ;

4 – Configurei as variáveis de sistema ;

echo "export JAVA_HOME=/usr/local/jdk1.8.0_111/" >>  /home/paulo/.profile 

echo "export ANDROID_HOME=/home/paulo/Android/Sdk/" >> /home/paulo/.profile

source /home/paulo/.profile

Obs. Troque paulo pelo nome do seu usuário : )

5 – Instalei o cordova, ionic e gulp ;

sudo apt-get update 

sudo apt-get install npm

sudo npm install -g cordova

sudo npm install -g ionic

sudo npm install -g gulp

Eu precisei fazer o ajuste de versão mencionado pelo desenvolvedor e explicado nesse link https://iphonedevlog.wordpress.com/2014/06/25/updating-and-reverting-to-different-cordova-phonegap-versions/

6 – Realizei a instalação do cordova com a versão necessária ;

npm install -g cordova@3.4.1-0.1.0

7 – Instalei o git e fiz o clone do projeto do zmNinja ;

sudo apt-get install git 

git clone https://github.com/pliablepixels/zmNinja.git

8 – Na pasta do projeto instalei as dependências ;

npm install @ionic/v1-toolkit --save-dev 

npm install node-sass

npm install async

npm install jshint

npm install ionic cordova platform add android

cordova prepare

Quando o ambiente de compilação ficou pronto usei o seguinte comando para criar( compilar ) o .apk:

./build_android.sh --debug 

Ao final do processo, o arquivo .apk estava disponível em debug_files/android-debug.apk .

Para realizar a instalação do .apk no Android, foi necessário ativar a instalação de fontes desconhecidas no dispositivo e enviar o arquivo para o Android.

Seguem alguns prints com os passos que fiz no meu Android 7.1.1:

Eu coloquei o arquivo .apk do zmNinja em um servidor WEB e fiz o download pelo chrome.

Com o aplicativo instalado, a configuração foi simples, marquei a flag ‘use a autenticação ZM’, cadastrei os dados de autenticação e a URL do Zoneminder:

Configuração do zmNinja.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *