Esta sección está hecha para desarrolladores o integradores que deseen integrarse con la aplicación única de Camlytics.

La API REST permite manejar eventos analíticos como detección de movimiento, obstrucción de cámara, etc. de una manera personalizada. Por ejemplo, es posible que desee almacenar eventos en una base de datos remota, enviarlos a un servicio web o iniciar una aplicación externa.
La API también le permite recibir la lista de canales únicos de Camlytics con detalles completos - URI de transmisión, nombre, etc. Esto puede ser útil si planea usar su propio reproductor para ver cámaras de forma remota (a través de un dispositivo móvil).


1

Cómo usar la API REST

Camlytics Single proporciona una forma muy simple y universal de controlar todos los eventos de la cámara y recuperar datos de los canales. Para integrarse con la aplicación a través de la API REST, complete los siguientes pasos:

  • Inicie la aplicación y asegúrese de tener la última versión (versión mínima compatible es 1.2.1)
  • Asegúrese de que la API REST esté habilitada en la configuración (debería estar habilitada por defecto)
  • Para verificar que la API REST está funcionando, agregue un canal, genere cualquier evento (aparición de objeto, etc.) y vaya a http://localhost:48462/v1/json/events?limit=10&order=DESC&timeout=5. Si no hay eventos disponibles, se devolverá un array JSON vacío.
    En caso de que algo salga mal, consulte los registros que se encuentran en %APPDATA%\Camlytics\Logs\.
  • Para obtener documentación detallada, consulte referencia de la API REST autogenerada

El punto de conexión /events es en tiempo real, recibirá nuevos eventos en el mismo momento en que aparecen en el canal de video.

Para obtener soporte adicional, contáctenos en info@camlytics.com


2

Ejemplo de API REST

Vea el ejemplo de implementación en JavaScript que demuestra cómo integrarse con la API REST de Camlytics Single y recibir eventos en tiempo real.

Tenga en cuenta que puede utilizar el lenguaje de programación y el marco que prefiera. El código de cliente necesario se puede generar a partir del archivo de definición de Swagger en Swagger que cumple con las especificaciones de Swagger. Por favor, lea más sobre Swagger aquí.
Generación de código en línea disponible en SwaggerHub.


3

Webhooks

Si no desea escribir ningún código para personalizar las acciones de eventos localmente, puede configurar la URL del webhook para cada uno de los tipos de eventos. Todos los webhooks se activan mediante una solicitud POST cada vez que se crea el evento o de forma horaria/diaria. El tiempo de espera de la solicitud es de 5 segundos.

webhook de cámara de video

Hay 3 tipos de webhooks:

  • Webhook de evento inmediato: se activa en el momento del evento
  • Webhook de agregación horaria: se activa cada hora a las xx:00
  • Webhook de agregación diaria: se activa todos los días a las 00:00

Los webhooks horarios/agregados contienen sumas de las ocurrencias de eventos agrupadas por cada regla (zona, línea) o por cada tipo de evento (Zona unida, etc.).
Vea el ejemplo del cuerpo de la solicitud del webhook de evento inmediato (JSON):

Vea el ejemplo del cuerpo de la solicitud del webhook de agregación (JSON):

{  
   "channel_id":"ddbbe807-8560-4bc7-b04b-4b3b04c69339",
   "channel_name":"Integrated Camera",
   "event_name":"Line crossed",
   "event_origin":"Pedestrian",
   "event_time":"2019-05-20T18:02:51.2984871+03:00",
   "event_type":"TripwireCrossed",
   "object_id":9,
   "rule_id":"471fa55d-967b-46a7-b77f-5b9ce6af82ee",
   "rule_name":"Line 1"
}
{  
   "channel_id":"ddbbe807-8560-4bc7-b04b-4b3b04c69339",
   "channel_name":"Integrated Camera",
   "event_type_aggregate":[  
      {  
         "event_count":5,
         "event_name":"Line crossed",
         "event_type":"TripwireCrossed"
      },
      {  
         "event_count":0,
         "event_name":"Zone joined",
         "event_type":"RegionJoin"
      },
      {  
         "event_count":0,
         "event_name":"Zone left",
         "event_type":"RegionLeave"
      },
      {  
         "event_count":3,
         "event_name":"Motion started",
         "event_type":"MotionInRegionOn"
      },
      {  
         "event_count":2,
         "event_name":"Motion finished",
         "event_type":"MotionInRegionOff"
      },
      {  
         "event_count":0,
         "event_name":"Object dwell",
         "event_type":"Loitering"
      },
      {  
         "event_count":0,
         "event_name":"Crowd appear",
         "event_type":"CrowdOn"
      },
      {  
         "event_count":0,
         "event_name":"Crowd disappear",
         "event_type":"CrowdOff"
      },
	  {  
         "event_count":0,
         "event_name":"Tailgating",
         "event_type":"Tailgating"
      },
      {  
         "event_count":0,
         "event_name":"Abandoned item",
         "event_type":"AbandonedObject"
      },
      {  
         "event_count":5,
         "event_name":"Object appear",
         "event_type":"ObjectAppear"
      },
      {  
         "event_count":4,
         "event_name":"Object disappear",
         "event_type":"ObjectDisappear"
      },
      {  
         "event_count":1,
         "event_name":"Camera obstructed",
         "event_type":"Sabotage"
      },
      {  
         "event_count":0,
         "event_name":"Camera disconnected",
         "event_type":"CameraDisconnected"
      }
   ],
   "rule_id_aggregate":[  
      {  
         "event_count":5,
         "rule_id":"ab68d96d-b1a6-4b94-8092-3ece52cf707d",
         "rule_name":"Motion detection"
      },
      {  
         "event_count":1,
         "rule_id":"471fa55d-967b-46a7-b77f-5b9ce6af82ee",
         "rule_name":"Line 1"
      },
      {  
         "event_count":2,
         "rule_id":"689351ab-239c-420f-b22e-cfc27fce6806",
         "rule_name":"Line 2"
      },
      {  
         "event_count":2,
         "rule_id":"0e5f132d-3a81-4e16-993c-6a8d4a47e5e1",
         "rule_name":"Line 3"
      }
   ],
   "since_time":"2019-05-20T17:00:00.4024906+03:00",
   "until_time":"2019-05-20T18:00:00.4024906+03:00"
}

4

Ejemplo de webhooks

Un muy buen ejemplo de utilizar webhooks es usar Google Sheets como almacenamiento en la nube para sus eventos de Camlytics Single: puede utilizarlos para recopilar datos de múltiples ubicaciones, construir gráficos personalizados, etc.

Para automatizar el envío de datos a su Google Sheet, complete los encabezados de las columnas con los nombres de los campos de la solicitud POST (channel_id, channel_name, event_name, etc.) y haga clic en Herramientas > Editor de scripts. Será redirigido a una página de Google Script. Copie y pegue el script de ejemplo a continuación en el editor de scripts.

Puede obtener más información sobre cómo configurar el script aquí.

    function doPost(request){
      return handleResponse(request);
    }
    	
    // How to use
    //  1. Enter sheet name where data is to be written below
            var SHEET_NAME = "Sheet1";
            
    //  2. Run > setup
    //
    //  3. Publish > Deploy as web app 
    //    - enter Project Version name and click 'Save New Version' 
    //    - set security level and enable service (most likely execute as 'me' and access 'anyone, even anonymously) 
    //
    //  4. Copy the 'Current web app URL' and post this in your Camlytics Single webhook URL
    //
    //  5. Insert column names on your destination sheet matching the parameter names of the data you are passing in (exactly matching case)
    	
    var SCRIPT_PROP = PropertiesService.getScriptProperties();
    	
    function handleResponse(request) {
      var lock = LockService.getPublicLock();
      lock.waitLock(1000);
      
      try {
        var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
        var sheet = doc.getSheetByName(SHEET_NAME);
        
        var headRow = 1;
        
        var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
        var nextRow = sheet.getLastRow() + 1;
        var row = []; 
        var postData = JSON.parse(request.postData.getDataAsString());
        
        for (i in headers){
            row.push(postData[headers[i]]);
        }
        sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
        
        return ContentService
              .createTextOutput(JSON.stringify({"result":"success", "row": nextRow}))
              .setMimeType(ContentService.MimeType.JSON);
      } catch(e){
        return ContentService
        .createTextOutput(JSON.stringify({"result":"error", "error": e }))
              .setMimeType(ContentService.MimeType.JSON);
      } finally {
        lock.releaseLock();
      }
    }
    	
    function setup() {
        var doc = SpreadsheetApp.getActiveSpreadsheet();
        SCRIPT_PROP.setProperty("key", doc.getId());
    }	

Al final, recibirá la URL del script de producción que insertará en la configuración de webhooks de eventos de Camlytics Single de manera similar: https://script.google.com/macros/s/aKfycbwRo7V-DNXQSCjplDs-j43Y7evXioFNvy_bQs-NNnofPJ41bA52c67/exec

Ejemplo de salida en la hoja de cálculo de Google que recibirá:

hoja de cálculo de camlytics google

Si desea obtener el recuento agregado de eventos (por ejemplo, cuántas personas cruzaron la Línea 1 en la última hora o en el último día), el siguiente código insertará una nueva hoja en cada llamada (cada hora o cada día).

    function doPost(request){
      return handleResponse(request);
    }
    	
    // How to use
           
    //  1. Run > setup
    //
    //  2. Publish > Deploy as web app 
    //    - enter Project Version name and click 'Save New Version' 
    //    - set security level and enable service (most likely execute as 'me' and access 'anyone, even anonymously) 
    //
    //  3. Copy the 'Current web app URL' and post this in your Camlytics Single webhook URL
    	
    var SHEET_NAME = (new Date()).toLocaleDateString() + ' ' + (new Date()).toLocaleTimeString();
    SpreadsheetApp.getActiveSpreadsheet().insertSheet(SHEET_NAME);
    var SCRIPT_PROP = PropertiesService.getScriptProperties();
    	
    function handleResponse(request) {
      var lock = LockService.getPublicLock();
      lock.waitLock(1000);
      
      try {
        var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
        var sheet = doc.getSheetByName(SHEET_NAME);
        
        var headRow = 1;
        
        var headers = ["rule_name", "event_count"];
        var nextRow = sheet.getLastRow() + 1;
        var row = ["Source name", "Event count"]; 
        sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
        var nextRow = sheet.getLastRow() + 1;
        row = [];
        
        var postData = JSON.parse(request.postData.getDataAsString());
        
        for (j in postData["rule_id_aggregate"]){
          for (i in headers){
            row.push(postData["rule_id_aggregate"][j][headers[i]]);
          }
          sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
          var nextRow = sheet.getLastRow() + 1;
          row = [];
        }
        
        return ContentService
              .createTextOutput(JSON.stringify({"result":"success", "row": nextRow}))
              .setMimeType(ContentService.MimeType.JSON);
      } catch(e){
        return ContentService
        .createTextOutput(JSON.stringify({"result":"error", "error": e }))
              .setMimeType(ContentService.MimeType.JSON);
      } finally {
        lock.releaseLock();
      }
    }
    	
    function setup() {
        var doc = SpreadsheetApp.getActiveSpreadsheet();
        SCRIPT_PROP.setProperty("key", doc.getId());
    }

Ejemplo de salida en la hoja de cálculo de Google que recibirá cuando se activan los eventos:

hojas de cálculo de camlytics google