Iniciando Git

This commit is contained in:
Pablinux
2025-11-19 10:45:15 -05:00
commit 099f3c2b3a

359
Readme.md Normal file
View File

@@ -0,0 +1,359 @@
# 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
<dependencies>
<!-- JNA para llamadas nativas -->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.13.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.13.0</version>
</dependency>
</dependencies>
```
## 📝 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ó