Guía de instalación — Hanwha Zone Bridge¶
Instalación desde cero sobre un servidor Milestone XProtect limpio.
Todos los ejemplos de esta guía son salidas reales del servidor de laboratorio
SRV-MILESTONE (XProtect VMS 2026 R1, Windows Server 2022).
1. Qué hace y por qué existe¶
Las cámaras Hanwha reportan a Milestone un evento plano: "hubo intrusión en CAM-01". No dicen en qué zona. Esto lo confirma la configuración del propio driver, que tiene exactamente tres eventos cableados:
| Binding | Evento |
|---|---|
event:15\|0 |
IntrusionStart |
event:8\|1 |
Tripwire |
event:4\|2 |
Tampering |
El motivo es estructural: los 203 tipos de evento de driver de Milestone
declaran <Parameters/> vacío. La zona no tiene dónde viajar.
Hanwha sí expone la zona por SUNAPI. Este servicio la lee y la inyecta en Milestone como Analytics Events con el índice de zona en el nombre del tipo, de forma que se puedan armar reglas y alarmas distintas por zona.
Detalle completo en Por qué el driver no trae zona.
2. Requisitos¶
En el servidor de Milestone¶
| Requisito | Por qué | Verificación |
|---|---|---|
| Windows Server 2016+ | .NET Framework 4.7.2 de fábrica | automática |
| XProtect Management Server corriendo | inventario y credenciales | automática |
| XProtect Event Server corriendo | recibe los eventos | automática |
| Analytics Events habilitado | es el canal de inyección | automática |
| Puerto libre para el panel | por defecto 8099 | automática |
| Red hacia las cámaras | SUNAPI por HTTP | manual |
El instalador verifica todo lo marcado como automático y se detiene con un mensaje claro si algo falta.
No hace falta instalar el runtime de .NET. El paquete es autocontenido. Lo único que usa del sistema es .NET Framework 4.7.2, que viene con Windows Server 2016 y posteriores, y que necesita el sidecar porque el MIP SDK de Milestone sólo publica assemblies
net472.
Habilitar Analytics Events¶
En Management Client → Herramientas → Opciones → Eventos analíticos:
- ☑ Habilitado
- Puerto:
9090 - Seguridad → Eventos permitidos de: Todas las direcciones de red (o agregá la IP del servidor si preferís restringir)
Permisos de la cuenta de servicio¶
El servicio corre por defecto como NT AUTHORITY\NetworkService, que en una
instalación típica de XProtect ya es miembro del rol Administrators del VMS.
Se puede confirmar en Management Client → Seguridad → Roles → Administrators.
Necesita ese rol porque lee las contraseñas de las cámaras desde la configuración de Milestone — que es lo que evita tener que cargarlas a mano en 100+ equipos. Ver Credenciales del VMS.
Si en tu sistema NetworkService no está en el rol, tenés dos opciones:
# a) agregarla al rol (Management Client > Seguridad > Roles > Administrators)
# b) instalar con otra cuenta
.\Install-HanwhaZoneBridge.ps1 `
-CuentaDeServicio 'DOMINIO\svc-hzb' `
-PasswordDeServicio (Read-Host -AsSecureString "Password")
3. Armado del paquete¶
Sólo hace falta en la máquina que compila. Requiere el SDK de .NET 8; el servidor destino no.
==> Publicando el servicio (.NET 8, autocontenido win-x64)
==> Publicando el sidecar MipHelper (net472)
==> Sumando scripts y documentacion
==> Comprimiendo
Paquete listo: ...\dist\HanwhaZoneBridge-1.0.0.zip (153 MB)
Los 153 MB son casi todos el runtime de .NET embebido. Es el precio de no depender de nada en el servidor destino.
Si el servidor no tiene fuentes NuGet configuradas¶
En un Windows Server recién instalado, dotnet puede venir sin ninguna fuente
y la compilación falla con NU1100: Unable to resolve para todos los
paquetes, incluso los más comunes. No es un problema de red ni de framework:
dotnet nuget list source # "No sources found."
dotnet nuget add source "https://api.nuget.org/v3/index.json" -n nuget.org
4. Instalación¶
Copiá el zip al servidor de Milestone, descomprimilo y ejecutá como Administrador:
Expand-Archive HanwhaZoneBridge-1.0.0.zip -DestinationPath C:\temp\hzb
cd C:\temp\hzb
.\Install-HanwhaZoneBridge.ps1
Salida real de una instalación limpia:
Hanwha Zone Bridge
Discriminacion de zonas de analiticas Hanwha hacia Milestone XProtect
==> Verificando requisitos
OK Ejecutando como Administrador
OK .NET Framework OK (release 528449)
OK Paquete completo
==> Verificando Milestone XProtect
OK Management Server corriendo
OK Event Server corriendo
OK Analytics Events escuchando en 9090
==> Verificando el puerto 8099 para el panel
OK Puerto 8099 disponible
==> Instalando en C:\Program Files\HanwhaZoneBridge
OK Archivos copiados
==> Configurando
OK appsettings.json actualizado
OK Permisos otorgados a NT AUTHORITY\NetworkService
==> Creando el servicio de Windows
OK Servicio creado con cuenta NT AUTHORITY\NetworkService
==> Abriendo el puerto del panel
OK Regla de firewall creada para el puerto 8099
==> Arrancando el servicio
OK Servicio corriendo
... esperando el primer inventario
OK 1 camaras Hanwha detectadas
OK Analytics Event Types listos (0 creados, 20 existentes)
Instalacion completa
Panel http://192.0.2.200:8099
Carpeta C:\Program Files\HanwhaZoneBridge
Logs C:\Program Files\HanwhaZoneBridge\logs\
Servicio HanwhaZoneBridge (NT AUTHORITY\NetworkService)
Opciones¶
| Parámetro | Por defecto | Para qué |
|---|---|---|
-Puerto |
8099 |
Puerto del panel web |
-RutaDeInstalacion |
C:\Program Files\HanwhaZoneBridge |
Carpeta destino |
-CuentaDeServicio |
NT AUTHORITY\NetworkService |
Identidad del servicio |
-PasswordDeServicio |
— | SecureString, si la cuenta lo requiere |
-UriDelVms |
http://localhost |
Si el Management Server está en otro host |
-PuertoEventServer |
9090 |
Si cambiaste el puerto de Analytics Events |
-SinFirewall |
— | No crear la regla de firewall |
-Forzar |
— | Continuar aunque Analytics Events no escuche |
No uses el puerto 8080. En un servidor XProtect típico está reservado por
http.syspara el Mobile Server, y aunquenetstatno muestre nada escuchando, bindear ahí falla conSocketException 10013. El instalador lo detecta y aborta antes de dejar una instalación rota.
5. Qué deja instalado¶
C:\Program Files\HanwhaZoneBridge\
├── HanwhaZoneBridge.exe servicio principal (.NET 8, autocontenido)
├── appsettings.json configuración
├── mapeo-slots.json mapeo zona→slot (se crea solo)
├── wwwroot\ panel web
├── logs\ hzb-YYYYMMDD.log, rotativo, 14 días
└── MipHelper\
└── MipHelper.exe sidecar net472 para el MIP SDK
Además:
- Servicio de Windows
HanwhaZoneBridge, arranque automático, con reinicio ante caídas a los 10 s, 30 s y 60 s. - Regla de firewall Hanwha Zone Bridge - Panel para el puerto elegido.
- Hasta 20 Analytics Event Types en Milestone (
Hanwha Intrusion_1..5,Hanwha Line Crossing_1..5y sus variantesEnd).
⚠
mapeo-slots.jsones el archivo que no hay que perder¶Guarda qué zona física de cada cámara corresponde a cada slot lógico. Si se borra, los slots se reasignan y las definiciones de alarma ya armadas en Milestone pasan a apuntar a otra zona, sin dar ningún error.
El instalador lo respalda y lo restaura automáticamente al actualizar, y el desinstalador lo conserva salvo que pases
-BorrarTodo. Igual: incluilo en tus backups.
6. Verificación¶
Invoke-RestMethod http://localhost:8099/api/camaras | ForEach-Object {
"$($_.nombre) [$($_.estado)]"
$_.zonas | ForEach-Object { " slot $($_.slot) <- $($_.espacio) $($_.indiceEnCamara) $($_.tipoDeEvento)" }
}
CAM-01 [EnLinea]
slot 1 <- Area 1 Hanwha Intrusion_1
slot 2 <- Area 2 Hanwha Intrusion_2
slot 1 <- Linea 1 Hanwha Line Crossing_1
06:08:12 fin CAM-01 Hanwha Intrusion_1 End [CAM-01 / Zona 1]
06:08:11 INICIO CAM-01 Hanwha Intrusion_2 [CAM-01 / Zona 2]
06:08:11 INICIO CAM-01 Hanwha Intrusion_1 [CAM-01 / Zona 1]
06:08:11 fin CAM-01 Hanwha Intrusion_2 End [CAM-01 / Zona 2]
Y en el panel, http://<servidor>:8099:

7. Problemas frecuentes¶
VMO61008: You do not have sufficient permissions¶
La cuenta del servicio no es administradora del VMS. Agregá
NT AUTHORITY\NETWORK SERVICE al rol Administrators en Management Client, o
reinstalá con -CuentaDeServicio.
Correr como
LocalSystemno alcanza: el VMS lo ve como la cuenta de máquina y la rechaza.
0 camaras Hanwha detectadas¶
- ¿Hay hardware Hanwha habilitado en el Recording Server?
- El filtro de marca busca
hanwha,wisenetosamsungen el modelo o el nombre del hardware. Si tus cámaras se llaman distinto, ajustáMipHelper.PatronesDeModeloenappsettings.json. - Si el log dice "sin credencial legible", la cuenta de servicio no tiene permiso para leer contraseñas de hardware.
El servicio arranca y se cae¶
Mirá logs\hzb-*.log. La causa más común es el puerto del panel ocupado o
reservado por http.sys.
Los eventos salen pero no aparecen en Milestone¶
En la bitácora del panel van a figurar como << RECHAZADO. Las dos causas:
| Respuesta del Event Server | Significado |
|---|---|
Warning: Event message not known |
El Analytics Event Type no existe. Reiniciá el servicio para que los vuelva a crear. |
Warning: Device not known |
La cámara ya no existe en Milestone, o cambió de ID. |
La cámara aparece Fallida¶
Probá la conectividad desde el servidor:
No uses
curl.exepara probar la cámara. El curl 7.79.1 que trae Windows Server 2022 no completa el handshake Digest contra estas cámaras: recibe el 401, reutiliza la conexión y nunca manda la segunda request, terminando enexit=67con salida vacía. Parece un problema de credenciales y no lo es. Usá PowerShell:Add-Type -AssemblyName System.Net.Http $cc = New-Object System.Net.CredentialCache $cc.Add([Uri]"http://192.0.2.10/", "Digest", (New-Object System.Net.NetworkCredential("admin","LA_CLAVE"))) $h = New-Object System.Net.Http.HttpClientHandler; $h.Credentials = $cc $c = New-Object System.Net.Http.HttpClient($h) $c.GetStringAsync("http://192.0.2.10/stw-cgi/system.cgi?msubmenu=deviceinfo&action=view").Result
8. Actualización¶
Ejecutá el instalador de la versión nueva. Detecta la instalación anterior,
respalda mapeo-slots.json, actualiza los binarios y lo restaura.
! El servicio ya existe: se detiene y se actualiza
OK Mapeo de slots existente respaldado
...
OK Mapeo de slots restaurado
9. Desinstalación¶
Saca el servicio, la regla de firewall y los archivos, conservando
mapeo-slots.json.
| Parámetro | Efecto |
|---|---|
-BorrarTodo |
Borra también el mapeo de slots |
-LimpiarMilestone |
Borra los Analytics Event Types y las alarmas Hanwha * |
Por defecto no toca la configuración en Milestone, porque las reglas que armaste a mano pueden depender de ella.