Acesso a câmera IP via Python no Linux

Uma câmera de protocolo de Internet (câmera IP) é um tipo de câmera de vídeo digital que recebe dados de controle e envia dados de imagem por meio de uma rede IP. Elas são comumente usados ​​para vigilância, mas ao contrário das câmeras analógicas de circuito fechado de televisão (CCTV), elas não requerem nenhum dispositivo de gravação local, apenas uma rede local.

Câmera IP Yoosee. Fonte: divulgação
Câmera IP Yoosee. Fonte: divulgação

Para ter acesso à câmera, deve-se conectá-la no mesmo roteador que o computador (wireless ou cabo). No computador, acessar o site do roteador (geralmente 192.168.0.1 ou 192.168.1.1), entrar com login e senha e buscar o IP pelo nome do dispositivo ou MAC address (identificador único atribuído a uma interface de rede do endereço de controle de acesso ao dispositivo). A visualização das imagens (ou até áudio) pode ser através de software proprietário ou genérico, como o VLC. A comunicação ocorre via protocolo RTSP (Real Time Streaming Protocol).

Transmissão no VLC modo gráfico

Você pode utilizar o protocolo RTSP no modo gráfico do VLC através do “Fluxo de Rede”. Para isso, entre no menu “Mídia – Abrir Fluxo de Rede” (ou CTRL+N) e digite o comando na caixa de texto: rtsp://192.168.1.254/ovnfi (exemplo de número de IP, coloque o seu respectivo). Ao clicar em “Reproduzir”, a transmissão em tempo real da câmera instalada em sua rede local deve estar ocorrendo. Para facilitar o acesso das próximas vezes, salve a transmissão como uma playlist, o que vai gerar um arquivo (camera_rtsp.xspf, por exemplo). Basta executá-lo para abrir a câmera. Um atalho/lançador pode ser criado para esse arquivo no menu inicial ou barra de tarefas e executar a transmissão da câmera com apenas um clique.

Automatização com python

Existem comandos em linha no Linux que podem executar essa funções, com bibliotecas e métodos implementados em Python. O script desse post pesquisa o endereço IP da câmera e lança o programa VLC para transmissão desse endereço – usando cvlc em vez de vlc na linha de comando, o programa inicia sem a interface gráfica. Para isso, você deve entrar com as seguintes variáveis personalizadas para o seu caso:

  • router_user – usuário do painel de controle do roteador
  • router_password – senha do roteador
  • login_url – URL do roteador, usada no navegador (por exemplo, ‘http://192.168.1.1/login.cgi’)
  • data_url – página do painel de controle com os clientes conectados ao roteador (por exemplo, ‘http://192.168.1.1/status_lanclients.cgi?submitValue=Refresh&refreshStatus=0’)
  • cam_macAddress – endereço MAC do dispositivo (veja pelo painel ou pelo equipamento)
  • WiFi_password – senha para o dispositivo se conectar ao roteador

Com essas informações, haverá a tentativa de abrir uma sessão com o roteador, onde poderão ser exibidas mensagens de erro conforme o caso. Com a sessão aberta, a página de status será aberta e o IP do dispositivo será coletado através do MAC address.

De posse do IP, será executado o comando em bash ou shell para abrir o VLC usando a senha do WiFi e o endereço IP, através do protocolo RTSP: “vlc rtsp://admin:”+WiFi_password+”@”+ipAddress+”/onvif1”. O ONVIF é um protocolo aberto da indústria, utilizado com o objetivo de facilitar o desenvolvimento e o uso de um padrão aberto global para a interface de produtos de segurança físicos baseados em IP. Confira se a sua câmera trabalha com ele.

#!/usr/bin/env python3

# Pesquisa o endereço IP da câmera e lança o programa VLC
import os
import requests
from requests.exceptions import Timeout, ConnectionError, ConnectTimeout
import sys
import shutil
import subprocess
import shlex
   
def run_command(command, **kwargs):
    bash = kwargs.get('bash',  False)
    shell = kwargs.get('shell',  False)

    # execução de comandos direto no shell
    if bash or shell:
       cprocess = subprocess.run(command, shell=True, encoding='utf-8', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    else: 
       cprocess = subprocess.run(shlex.split(command), encoding= 'utf-8',  stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    return cprocess

def main():

    router_user = 'ENTER_YOUR_DATA_HERE'
    router_password = 'ENTER_YOUR_DATA_HERE'
    login_url = 'ENTER_YOUR_DATA_HERE'
    data_url = 'ENTER_YOUR_DATA_HERE'
    cam_macAddress = 'ENTER_YOUR_DATA_HERE'
    WiFi_password = 'ENTER_YOUR_DATA_HERE'
    
    # Abre sessão com o roteador
    payload = {'isSubmit':'1','username': router_user,'password': router_password}
    s = requests.Session()
    try:
        resp = s.post(login_url, data=payload,  timeout=10)
    except Timeout:
        print("*** Roteador não responde. Timeout ***")
        exit()
    except ConnectionError:
        print("*** Erro na conexão. Provável queda na internet ***")
        exit()
    except ConnectTimeout:
        print( "**** Timeout da conexão ***" )
        exit()
    if not resp.ok:
        print("*** Problemas não identificados na conexão ***")
        exit()

    resp = s.get(data_url)
    lines = resp.text.split()

    for i, line in enumerate(lines):

        if line == "vIpAddress[vIpAddress.length]":
           ipAddress = lines[i+2].replace(";", "")
           ipAddress = ipAddress.replace("'", "")

        if line == "vMacAddress[vMacAddress.length]":
            macAddress = lines[i+2].replace(";","")
            macAddress = macAddress.replace("'", "")
            if macAddress == cam_macAddress:
                break

    print(ipAddress)
    cmd = "cvlc rtsp://admin:"+WiFi_password+"@"+ipAddress+"/onvif1"
    #print(cmd)
    run_command(cmd)
    exit()

main()

Chame o script em seu terminal como “python cameraIP.py”, por exemplo.

Criar atalho

Note que boa parte do script busca o número de IP do dispositivo pelo MAC address, então se for um IP fixo, pode comentar muita coisa. O principal é a execução do comando contendo o programa e o protocolo: a linha com “cvlc” e “rtsp”. Se quiser criar um atalho/lançador para esse comando, você pode usar o botão direito ou criar um arquivo “cam.desktop” (por exemplo) com o seguinte conteúdo:

#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon=/usr/share/icons/cab_view.png
Icon[pt_BR]=mate-eyes-applet
Name[pt_BR]=cam
Categories=AudioVideo
Exec=cvlc --play-and-exit rtsp://admin:WiFi_password@ipAddress/onvif1
Name=cam

A variável “Icon” é o caminho completo para o ícone (sugestão) e está personalizado para a interface mate em pt_BR – “Categories” indica o nome da categoria do menu em que deve aparecer. Não esqueça de substituir o usuário, senha de wi-fi e número de IP. O último termo do comando “Exec”, com o protocolo, pode ser usado como um fluxo diretamente na interface do VLC (desktop ou android). Para figurar entre os itens do menu principal, copie o arquivo como sudo para “/usr/share/applications/”.

Além do VLC, é possível usar o visualizador do FFMpeg, o FFplay. Para isso, o comando altera para: ffplay rtsp://admin:WiFi_password@ipAddress/onvif1

Leave a Reply

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

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.