# Reproductor de Video Hikvision DVR con SDK Nativo Aplicación Java para reproducir video en tiempo real desde DVRs/NVRs Hikvision utilizando el SDK oficial HCNetSDK. ## 📋 Requisitos Previos ### Software - **Java JDK 11** o superior - **Maven 3.6+** - **Sistema Operativo**: Linux 64-bit (Ubuntu/Debian recomendado) - **Hikvision SDK**: EN-HCNetSDKV6.1.9.4_build20220412_linux64.zip ### Hardware - DVR/NVR Hikvision conectado a la red - Acceso a las credenciales del dispositivo ## 🚀 Instalación ### Paso 1: Instalar Dependencias del Sistema ```bash # Ubuntu/Debian sudo apt-get update sudo apt-get install -y \ default-jdk \ maven \ libssl-dev \ libstdc++6 \ libx11-6 \ libxext6 \ libxrender1 \ libxtst6 \ libxi6 # Fedora/RHEL/CentOS sudo yum install -y \ java-11-openjdk-devel \ maven \ openssl-devel \ libstdc++ \ libX11 \ libXext \ libXrender \ libXtst \ libXi ``` ### Paso 2: Descomprimir el SDK de Hikvision ```bash unzip EN-HCNetSDKV6.1.9.4_build20220412_linux64.zip -d sdk_temp ``` ### Paso 3: Crear Carpeta de Librerías ```bash mkdir -p lib ``` ### Paso 4: Copiar Librerías Nativas ```bash # Copiar todas las librerías .so necesarias cp sdk_temp/lib/*.so lib/ # Verificar que se copiaron correctamente ls -la lib/ ``` Deberías ver archivos como: - `libhcnetsdk.so` - `libHCCore.so` - `libHCNetSDKCom.so` - `libPlayCtrl.so` - `libssl.so.1.1` - `libcrypto.so.1.1` - Otros archivos `.so` ### Paso 5: Compilar el Proyecto ```bash mvn clean install ``` ## ⚙️ Configuración ### Configurar Datos del DVR Edita el archivo `src/main/java/com/telcotronics/hikvision/player/HikvisionPlayer.java`: ```java // Variables de configuración private String dvrIP = "192.168.1.100"; // IP del DVR private int dvrPort = 8000; // Puerto del SDK (NO RTSP) private String username = "admin"; // Usuario del DVR private String password = "tu_password"; // Contraseña del DVR private int channel = 1; // Número de canal (1, 2, 3, etc.) ``` ### Verificar Configuración en el DVR 1. Accede a la interfaz web del DVR: `http://IP_DEL_DVR` 2. Ve a **Configuration → Network → Advanced Settings** 3. Verifica que **SDK Port** esté habilitado en el puerto **8000** 4. Anota el número de canal que deseas visualizar ## 🎮 Ejecución ### Método 1: Script de Ejecución (Recomendado) Crea un archivo `run.sh`: ```bash #!/bin/bash export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH mvn exec:java -Dexec.mainClass="com.telcotronics.hikvision.player.HikvisionPlayer" ``` Dale permisos y ejecuta: ```bash chmod +x run.sh ./run.sh ``` ### Método 2: Ejecutar con Maven Directamente ```bash export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH mvn exec:java -Dexec.mainClass="com.telcotronics.hikvision.player.HikvisionPlayer" ``` ### Método 3: Generar JAR Ejecutable ```bash mvn clean package export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH java -jar target/hikvision-player-1.0-SNAPSHOT.jar ``` ## 📖 Ejemplo de Uso Básico ### Código Mínimo para Integrar en tu Panel ```java // Inicializar SDK HCNetSDK sdk = HCNetSDK.INSTANCE; sdk.NET_DVR_Init(); // Conectar al DVR NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30(); NativeLong userID = sdk.NET_DVR_Login_V30("192.168.1.100", 8000, "admin", "password", deviceInfo); // Configurar preview NET_DVR_PREVIEWINFO previewInfo = new NET_DVR_PREVIEWINFO(); previewInfo.lChannel = new NativeLong(1); // Canal 1 previewInfo.hPlayWnd = Native.getComponentPointer(tuCanvas); // Tu Canvas Swing previewInfo.byProtoType = 0; // TCP // Iniciar reproducción NativeLong realHandle = sdk.NET_DVR_RealPlay_V40(userID, previewInfo, null, null); // Detener reproducción sdk.NET_DVR_StopRealPlay(realHandle); // Desconectar sdk.NET_DVR_Logout(userID); sdk.NET_DVR_Cleanup(); ``` ## 🐛 Solución de Problemas ### Error: "libhcnetsdk.so: cannot open shared object file" **Solución**: ```bash export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH # O agrega la ruta permanentemente echo 'export LD_LIBRARY_PATH=/ruta/completa/al/proyecto/lib:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc ``` ### Error: "UnsatisfiedLinkError: libssl.so.1.1" **Solución en Ubuntu 22.04+** (que usa OpenSSL 3): ```bash # Descargar OpenSSL 1.1 compatible wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb ``` O copia las librerías del SDK directamente: ```bash cp sdk_temp/lib/libssl.so.1.1 lib/ cp sdk_temp/lib/libcrypto.so.1.1 lib/ ``` ### Error: "Error al conectar al DVR. Código: 1" **Posibles causas**: - ✗ Usuario o contraseña incorrectos - ✗ DVR no accesible en la red - ✗ Puerto 8000 bloqueado por firewall **Solución**: ```bash # Verifica conectividad ping IP_DEL_DVR # Verifica que el puerto esté abierto telnet IP_DEL_DVR 8000 ``` ### Error: "Error al iniciar reproducción. Código: 7" **Causa**: Canal no disponible o número de canal incorrecto **Solución**: Verifica en la interfaz web del DVR qué canales están activos ### Error de Código 23 **Causa**: El DVR alcanzó el límite máximo de conexiones simultáneas **Solución**: Desconecta otras sesiones activas del DVR ### Video no se muestra (pantalla negra) **Soluciones**: 1. Verifica que el canal tenga una cámara conectada 2. Cambia el canal: `previewInfo.lChannel = new NativeLong(2);` 3. Intenta con substream: ```java previewInfo.lLinkMode = new NativeLong(1); // 0=Main, 1=Sub ``` ### Error: "Cannot find AWT libraries" **Solución**: ```bash # Ubuntu/Debian sudo apt-get install libxrender1 libxtst6 libxi6 # Si usas JDK sin cabecera gráfica, instala el completo sudo apt-get install default-jdk ``` ## 📊 Códigos de Error Comunes | Código | Descripción | Solución | |--------|-------------|----------| | 1 | Usuario/contraseña incorrectos | Verifica credenciales | | 3 | Tiempo de espera agotado | Verifica conectividad de red | | 7 | Canal no disponible | Verifica número de canal | | 23 | Máximo de conexiones alcanzado | Cierra otras sesiones | | 26 | Versión SDK incompatible | Actualiza el SDK | | 29 | El dispositivo está ocupado | Espera y reintenta | ## 📁 Estructura del Proyecto ``` . ├── EN-HCNetSDKV6.1.9.4_build20220412_linux64.zip # SDK descargado ├── lib/ # Librerías nativas .so │ ├── libhcnetsdk.so │ ├── libHCCore.so │ ├── libssl.so.1.1 │ ├── libcrypto.so.1.1 │ └── ... ├── pom.xml # Configuración Maven ├── run.sh # Script de ejecución ├── README.md # Este archivo └── src/ └── main/ └── java/ └── com/ └── telcotronics/ └── hikvision/ └── player/ └── [TU_PANEL_AQUI].java ``` ## 🔧 Configuración Avanzada ### Cambiar a Substream (menor calidad, menor ancho de banda) ```java previewInfo.lLinkMode = new NativeLong(1); // 0=Main stream, 1=Sub stream ``` ### Usar Protocolo UDP en lugar de TCP ```java previewInfo.byProtoType = 1; // 0=TCP, 1=UDP ``` ### Aumentar Buffer de Visualización ```java previewInfo.dwDisplayBufNum = new NativeLong(5); // 1-10 frames ``` ## 📦 Dependencias Maven Necesarias El `pom.xml` debe incluir: ```xml net.java.dev.jna jna 5.13.0 net.java.dev.jna jna-platform 5.13.0 ``` ## 📝 Notas Importantes 1. **Puerto SDK vs RTSP**: - SDK usa puerto **8000** (configurable en DVR) - RTSP usa puerto **554** 2. **Rendimiento**: El SDK nativo es más eficiente que RTSP para aplicaciones Java 3. **Compatibilidad**: Diseñado para DVRs/NVRs Hikvision con SDK v6.x 4. **Limitaciones**: - Solo Linux 64-bit - Máximo 16 conexiones simultáneas por DVR (depende del modelo) - Requiere OpenSSL 1.1.x 5. **Seguridad**: - Nunca incluyas credenciales en el código fuente - Usa archivos de configuración externos (.properties, .env) - Agrega archivos de configuración a `.gitignore` ## 📚 Recursos Adicionales - [Portal de Soporte Hikvision](https://www.hikvision.com/en/support/) - [Documentación HCNetSDK](https://www.hikvision.com/en/support/download/sdk/) - [JNA Documentation](https://github.com/java-native-access/jna) ## 🤝 Contribuciones Si encuentras errores o mejoras, reporta los issues o envía pull requests. ## 📄 Licencia Este proyecto utiliza el SDK de Hikvision que está sujeto a sus propios términos de licencia. --- **¿Necesitas ayuda?** Revisa la sección de [Solución de Problemas](#-solución-de-problemas) o verifica los logs de la aplicació