Haut

Documentation de l'API v1.2 d'un serveur CamTrace Nova15

Ce document décrit le fonctionnement de l'API HTTP disponible sur les serveurs CamTrace dont la version est supérieure ou égale à v15.2.0.

Mises à jour du document

Version Date Auteur Motif
1.2-01 08/01/2020 Romain RIGOT Draft 01
1.2-02 09/03/2020 Romain RIGOT Fonctionnalités 15.1 : update de groupes en mode cycles, correction des exemples de requêtes
1.2-03 02/12/2020 Romain RIGOT Ajout de champs manquant dans les requêtes groupes
1.2-04 08/12/2020 Romain RIGOT Fonctionnalités 15.2 : folders
1.2-05 26/07/2021 Romain RIGOT Fonctionnalités 15.2.1 : logs
1.2-06 04/10/2021 Romain RIGOT Fonctionnalités 15.2.1 : tasks

Service Vidéo RTSP et PUSH HTTP

Le service RTSP permet de visualiser les flux vidéos live des caméras déclarées sur le serveur CamTrace. Ce service est disponible pour les versions de CamTrace Nova14 à partir de la 14.1.0. Après l'abandon du support de la technologie ActiveX sur les postes Windows, le composant d'affichage CamTrace peut être remplacé par un composant d'affichage compatible avec le protocol RTSP (VLC est un choix à considérer). Vous pouvez également accéder aux flux des caméras du serveur Camtrace grace à la technique PUSH HTTP qui permet, par exemple, d'afficher la vidéo directement dans un navigateur web. Dans ce cas, les flux affichés sont recompressés en MJPEG par le serveur.

Accès aux flux vidéos en RTSP

L'accès à un flux vidéo se fait via une URL RTSP composée comme ceci:

rtsp://<serveur>:<port-rtsp>/<id-flux>

Les éléments composants cette URL sont :

Paramètre Description
serveur Nom DNS ou adresse IP du serveur CamTrace
port-rtsp Port du serveur RTSP de CamTrace tel que défini dans la configuration système (défaut : 8554)
id-flux Identifiant de flux vidéo

L'identifiant de flux vidéo est de la forme X.Y. Il est possible de le trouver par différentes méthodes.

Si le flux a un rôle affecté, l'identifiant s'obtient via la requête sur l'API HTTP : GET /api/v1.2/cameras dans la partie après le dernier "/" des champs hdStream, mdStream, ldStream ou alStream.

Sinon, la liste des identifiants de flux est disponible dans la page d'administration des caméras lorsque l'affichage des informations de flux est sélectionné ("Afficher/masquer les flux" - colonne id).

Exemple:

rtsp://192.168.1.100:8554/2.6

Authentification

Lors de l'accès au flux, le serveur demande une authentification par login et password correspondant à un utilisateur déclaré dans CamTrace et avec les droits d'accès au flux. Il est possible de renseigner directement ces information dans l'URL d'accès au flux RTSP en suivant la forme:

rtsp://<user>:<pass>@<serveur>:<port-rtsp>/<id-flux>

Accès aux flux vidéos en PUSH HTTP

L'accès à un flux vidéo se fait via la même URL que pour accéder aux flux vidéos Camtrace à la différence de protocole près (http à la place de ws):

http://<serveur>:<port-http>/<live_view_stream_path>

Les éléments composants cette URL sont :

Paramètre Description
serveur Nom DNS ou adresse IP du serveur CamTrace
port-http Port du serveur HTTP de CamTrace tel que défini dans la configuration système (défaut : 80 ou 443)
live_view_stream_path chemin d'accès aux flux live

Si le flux a un rôle affecté, le chemin d'accès au flux live s'obtient via la requête de l'API HTTP: GET /api/v1.2/cameras dans les champs hdStream, mdStream, ldStream ou alStream. Sinon, vous pouvez obtenir le chemin générique d'accès aux flux live via la requête : GET /api/v1.2/users/login dans la section services. Ensuite, vous pouvez retrouver l'identifiant du flux que vous voulez afficher dans La liste de la page d'administration des caméras (voir la section RTSP ci-dessus).

Exemple:

http://192.168.1.100/live/view/2.6

Authentification

Lors de l'accès au flux, le serveur demande une authentification par login et password correspondant à un utilisateur déclaré dans CamTrace et avec les droits d'accès au flux. Il est possible de renseigner directement ces information en paramètre de l'URL d'accès au flux PUSH HTTP en suivant la forme:

http://<serveur>:<port-http>/<live_view_stream_path>?user=<user>&pass=<password>

API HTTP REST

Le service HTTP est une API (Application Programming Interface) de type REST. Elle permet aux développeurs d'applications de connaître les caméras, groupes, écrans, etc présent sur un serveur CamTrace.

Structure

Toutes les requêtes se font via HTTP ou HTTPS en fonction de la configuration de votre serveur.

Toutes les requêtes commencent par /api/v1.2.

Toutes les données envoyées ou reçues sont formatées en JSON (JavaScript Object Notation).

Les dates sont renvoyées au format ISO-8601: YYYY-MM-DDTHH:MM:SSZ.

# Exemple de requête:
GET /api/v1.2/servers HTTP/1.1
Host: <votre-serveur>

# Réponse:
HTTP/1.1 200 OK
Date: Wed, 12 Mar 2014 16:12:37 GMT
Server: Apache/2.2.15 (FreeBSD) mod_ssl/2.2.15 OpenSSL/0.9.8n PHP/5.3.2 with Suhosin-Patch
X-Powered-By: PHP/5.3.2
Content-Length: 124
Content-Type: application/json

{"servers":[...]}

Méthodes HTTP

L'API CamTrace utilise les méthodes HTTP pour définir le type d'action des requêtes.

Méthode Description
HEAD Cette méthode permet de récupérer les entêtes HTTP sans la ressource.
GET Utilisé pour récupérer une ressource.
POST Utilisé pour ajouter une ressource
PUT Utilisé pour modifier une ressource.
DELETE Utilisé pour supprimer une ressource.

JSON-P

Vous pouvez envoyer le paramètre ?_callback= avec les requêtes GET pour obtenir le résultat englobé dans une fonction javascript. C'est pratique dans les navigateurs pour faire des requêtes cross-domain. Les données renvoyés sont les mêmes que pour les requêtes classiques.

$ curl http://demo.camtrace.com/api/v1.2/servers?_callback=pop
pop({
  "meta": {
    "status": 200
  },
  "data": {
    "servers": [...]
  }
});

Identification

Les requêtes nécessitant une identification renvoient un code HTTP 401 Unauthorized. Dans le cas où les droits de l'utilisateur ne sont pas assez élevés pour accéder à une ressource alors la réponse est 404 Not Found.

Si vous utilisez HTTPS alors la méthode HTTP Basic est suffisante. En revanche si votre serveur n'est pas configuré en HTTPS alors vous devez savoir que vos identifiants circuleront en clair entre le client et le serveur et donc toute personne ou machine interceptant la requête pourra voir les identifiants utilisés. L'utilisation de la méthode WSSE vous assure que personne ne sera capable de s'identifier à la place de l'utilisateur même si la requête est interceptée. Il est donc préférable d'utiliser cette méthode pour les serveurs n'utilisant pas HTTPS.

Méthode HTTP Basic

Les serveurs CamTrace supportent la méthode d'identification standard HTTP Basic (voir détails sur wikipedia). Ci-dessous, un exemple de requête avec identification:

GET /api/v1.2/cameras HTTP/1.1
Host: demo.camtrace.com
Authorization: Basic ZGVtbzpkZW1v

HTTP/1.1 200 OK
Date: Wed, 12 Mar 2014 18:40:36 GMT
Server: Apache/2.2.15 (FreeBSD) mod_ssl/2.2.15 OpenSSL/0.9.8n PHP/5.3.2 with Suhosin-Patch
X-Powered-By: PHP/5.3.2
Content-Length: 14
Content-Type: application/json

{"cameras":[]}

Méthode WSSE Username Token

À l'origine, l'algorithme WSSE Username Token fait parti des spécifications WS-Security de SOAP. Cette méthode est à privilégié car plus sécurisé que la méthode précédente. Pour s'identifier, il faut envoyer avec chaque requête les deux headers suivants:

Authorization: WSSE profile="UsernameToken"
X-WSSE: UsernameToken
  Username="<username>",
  PasswordDigest="base64(sha1(<nonce><created-at><md5-password>))",
  Nonce="<nonce>",
  Created="<created-at>"

<username> correspond au nom de l'utilisateur. <nonce> est une chaîne de caractères aléatoire générée pour chaque requête. <created-at> est la date au format ISO-8601 du moment de la requête. Enfin PasswordDigest contient les chaines <nonce>, <created-at> et le mot de passe de l'utilisateur, le tout encodé en sha1.

Ci-dessous, un exemple de calcul du mot de passe demo:

#!/usr/bin/env ruby
require 'base64'
require 'digest/sha1'

password = Digest::MD5.hexdigest('demo')
nonce = 'UHQJ5DN947AEAMPQN1H3G'
created_at = '2014-03-13T19:45:00Z'

puts Base64.encode64(Digest::SHA1.digest("#{nonce}#{created_at}#{password}"))
# => bc+AAFOSnebE96iEilMMquA7l8E=

La chaine bc+AAFOSnebE96iEilMMquA7l8E= est donc la valeur PasswordDigest à envoyer au serveur pour l'identification. Ce mot de passe est valide pendant 10 secondes et doit être recalculé à chaque requête.

Exemple d'une requête pour l'utilisateur demo et le mot de passe demo:

GET /api/v1.2/cameras HTTP/1.1
Host: demo.camtrace.com
Authorization: WSSE profile="UsernameToken"
X-WSSE: UsernameToken Username="demo", PasswordDigest="bc+AAFOSnebE96iEilMMquA7l8E=", Nonce="UHQJ5DN947AEAMPQN1H3G", Created="2014-03-13T19:45:00Z"

HTTP/1.1 200 OK
Date: Wed, 12 Mar 2014 18:40:36 GMT
Server: Apache/2.2.15 (FreeBSD) mod_ssl/2.2.15 OpenSSL/0.9.8n PHP/5.3.2 with Suhosin-Patch
X-Powered-By: PHP/5.3.2
Content-Length: 14
Content-Type: application/json

{"cameras":[]}

Utiliser l'URL plutôt que les entêtes HTTP

Parfois, il est nécessaire de passer les paramètres de l'identification dans l'URL plutôt que dans les entêtes HTTP. Ci-dessous, le détail des paramètres pour les méthodes HTTP Basic et WSSE Username Token.

Méthode HTTP Basic

GET /api/v1.2/cameras?_username=demo&_password=demo
Paramètres
Nom Description
_username Nom d'utilisateur.
_password Mot de passe de l'utilisateur.

Méthode WSSE Username Token

GET /api/v1.2/cameras?_username=demo&_password=bc%2BAAFOSnebE96iEilMMquA7l8E%3D&_nonce=UHQJ5DN947AEAMPQN1H3G&_created_at=2014-03-13T19:45:00Z
Paramètres
Nom Description
_username Nom d'utilisateur.
_password Voir Méthode WSSE Username Token.
_nonce Voir Méthode WSSE Username Token.
_created_at Voir Méthode WSSE Username Token.

Langue

Il est possible de choisir la langue utilisée par l'API. Pour cela, il faut utiliser l'entête HTTP Accept-Language. Les langues actuellement acceptées sont le français (fr), l'anglais (en), l'allemand (de), l'espagnol (es), l'italien (it) et le néerlandais (nl). L'anglais est utilisé par défaut.

Exemple d'une requête sans spécifier la langue:

$ curl -i -u pop:pop http://demo.camtrace.com/api/v1.2/cameras
HTTP/1.1 401 Unauthorized
Date: Wed, 13 Mar 2014 20:40:36 GMT
Server: Apache/2.2.15 (FreeBSD) mod_ssl/2.2.15 OpenSSL/0.9.8n PHP/5.3.2 with Suhosin-Patch
X-Powered-By: PHP/5.3.2
Content-Length: 29
Content-Type: application/json

{"error":"Invalid password!"}

La même requête en demandant une réponse en français:

$ curl -i -u pop:pop -H 'Accept-Language: fr' http://demo.camtrace.com/api/v1.2/cameras
HTTP/1.1 401 Unauthorized
Date: Wed, 13 Mar 2014 20:40:36 GMT
Server: Apache/2.2.15 (FreeBSD) mod_ssl/2.2.15 OpenSSL/0.9.8n PHP/5.3.2 with Suhosin-Patch
X-Powered-By: PHP/5.3.2
Content-Length: 35
Content-Type: application/json

{"error":"Mot de passe invalide !"}

Référence des fonctionnalités disponibles

Ouvrir le bandeau de l'interface web

Cette requête permet d'ouvrir le bandeau à partir d'un simple lien sans que l'utilisateur ait besoin d'entrer ses identifiants. Les identifiants doivent donc être passés dans les paramètres de la requête en utilisant la méthode décrite précédemment: Utiliser l'URL plutôt que les entêtes HTTP.

GET /api/v1.2/openheadband

Les serveurs

Liste des serveurs

La liste des serveurs permet d'obtenir les ports utilisés par le serveur local ainsi que les autres serveurs du cluster CamTrace. Le serveur dont l'id est 0 est le serveur local.

GET /ap1/v1.2/servers
Réponse
HTTP/1.1 200 OK
Content-Length: 126
Content-Type: application/json
{
  "servers": [
    {
      "id": 0,
      "name": "Local",
      "host": "demo.camtrace.com",
      "httpPort": 80,
      "livePort": 8000,
      "controlPort": 8001,
      "recordsPort": 8002
    }
  ]
}

Les caméras

Toutes les requêtes concernant les caméras doivent être effectuées avec un utilisateur et mot de passe. (voir la partie Identification).

Liste des caméras

GET /api/v1.2/cameras
Réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
  "cameras": [
    {
      "id": 2,
      "name": "Vivo8000",
      ...
    },
    {
      "id": 3,
      "name": "Axis214",
      ...
    }
  ]
}

Récupérer une caméra

GET /api/v1.2/cameras/:camera_id
Réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
  "id": 2,
  "name": "Vivo8000",
  "hdStream": "/live/view/2.1",
  "hdId": "1",
  "hdEncoding": "H264",
  "hdWidth": 352,
  "hdHeight": 288,
  "mdStream": null,
  "mdEncoding": null,
  "mdWidth": null,
  "mdHeight": null,
  "ldStream": null,
  "ldEncoding": null,
  "ldWidth": null,
  "ldHeight": null,
  "alStream": "/live/view/2.2",
  "alId": 2,
  "alEncoding": "H264",
  "alWidth": 352,
  "alHeight": 288,
  "rpStream": "/r?id=2",
  "rpId": 2,
  "rpEncoding": "H264",
  "rpWidth": 352,
  "rpHeight": 288,
  "displayCode": null,
  "isIgnored": false,
  "isRecording": false,
  "isRecordingAlarm": false,
  "isRecordingForced": false,
  "isRemote": false,
  "isReplayEnabled": false,
  "isUpsideDown": false,
  "model": "vivo7000",
  "playLiveAllowed": true,
  "playRecordsAllowed": true,
  "ptz": {
    "click": true,
    "areazoom": false,
    "zoomback": true,
    "continuous": true,
    "presets": [
      {
        "id": "Button",
        "name": "Button"
      },
      {
        "id": "Light",
        "name": "Light"
      },
      {
        "id": "Webcam",
        "name": "Webcam"
      }
    ],
    "tours": []
  },
  "ptzAllowed": false,
  "refUrl": null,
  "status": 2
}
Description des attributs de caméra
Nom Type Description
id entier Identifiant Camtrace de la caméra.
name texte Nom de la caméra sur le serveur.
hdStream texte Path du flux haute qualité.
hdId entier Id du flux HD
hdEncoding texte Format du flux haute qualité (MPEG4, H264 ou JPEG).
hdWidth entier Largeur du flux haute qualité.
hdHeight entier Hauteur du flux haute qualité.
mdStream texte Path du flux moyenne qualité.
mdId entier Id du flux MD
mdEncoding texte Format du flux moyenne qualité (MPEG4, H264 ou JPEG).
mdWidth entier Largeur du flux moyenne qualité.
mdHeight entier Hauteur du flux moyenne qualité.
ldStream texte Path du flux basse qualité.
ldId entier Id du flux LD
ldEncoding texte Format du flux basse qualité (MPEG4, H264 ou JPEG).
ldWidth entier Largeur du flux basse qualité.
ldHeight entier Hauteur du flux basse qualité.
alStream texte Path du flux d'alarme (le flux est actif en cas d'alarme).
alId entier Id du flux d'alarme
alEncoding texte Format du flux d'alarme (MPEG4, H264 ou JPEG).
alWidth entier Largeur du flux d'alarme.
alHeight entier Hauteur du flux d'alarme.
rpStream texte Path du flux de relecture de dernière alarme.
rpId entier Id du flux de relecture
rpEncoding texte Format du flux de relecture de dernière alarme (MPEG4, H264 ou JPEG).
rpWidth entier Largeur du flux de relecture de dernière alarme.
rpHeight entier Hauteur du flux de relecture de dernière alarme.
displayCode entier Code utilisé pour afficher la caméra dans un groupe.
isIgnored booléen True si la caméra est ignoré dans la configuration.
isRecording booléen True si la caméra est en enregistrement.
isRecordingAlarm booléen True si la caméra est en enregistrement d'alarme.
isRecordingForced booléen True si la caméra est en enregistrement forcé.
isRemote booléen True si la caméra est une caméra distante (connecté si au moins un client regarde le flux).
isReplayEnabled booléen True si le mode relecture de dernière alarme est activé ou pas.
isUpsideDown booléen True si l'orientation de l'image est inversé.
model texte Nom du modèle de la caméra.
playLiveAllowed booléen True si la lecture du direct est autorisé pour l'utilisateur courant.
playRecordsAllowed booléen True si la lecture des enregistrements est autorisé pour l'utilisateur courant.
ptz.click booléen True si le clique dans l'image est supporté par la caméra.
ptz.areazoom booléen True si le détourage est supporté par la caméra.
ptz.zoomback booléen True si le retour au zoom initial est supporté par la caméra.
ptz.continuous booléen True si les mouvements continues sont supportés par la caméra.
ptz.presets liste Liste des positions prédéfinies.
ptz.tours liste Liste des tours.
ptzAllowed booléen True si les actions PTZ sont autorisés pour l'utilisateur courant.
refUrl texte Path de l'image de référence si elle existe.
status entier Etat de la caméra: -2 pour ignoré par le serveur, -1 pour erreur, 0 pour service vidéo éteint, 1 pour caméra en lecture seule et 2 pour tout ok.

Récupérer l'image de référence d'une caméra

GET /api/v1.2/cameras/:camera_id/ref.jpg
Réponse

La réponse est une image jpeg. Si l'image de référence n'existe pas alors le serveur répond 404 Not Found sans contenu.

Déplacer une caméra PTZ

GET /api/v1.2/cameras/:camera_id/ptz
Commandes
Nom Paramètres associés Description
area x0, y0, x1, y1, w et h Permet d'effectuer un zoom sur une zone.
center x, y, w et h Permet de centrer la caméra sur un point.
cptm x, y, w et h Permet de déplacer la caméra en continu. Les paramètres x et y doivent être compris entre -100 et 100. Si x et y valent 0 alors le mouvement s'arrête.
czm q Permet de zoomer ou dézoomer en continu. Le paramètre q doit être compris entre -100 et 100. La valeur 0 permet d'arrêter le mouvement.
preset arg Permet de positionner la caméra sur un point prédéfini.
ptz arg Permet de déplacer la caméra dans une direction.
tour arg Permet de lancer un tour de garde prédéfini dans la caméra.
zoom q Permet de zoomer ou dézoomer. Le paramètre q doit être compris entre -10 et 10.
Paramètres
Nom Commandes associés Description
cmd La commande PTZ demandée.
x center et cptm Coordonnée x dans l'image.
y center et cptm Coordonnée y dans l'image.
x0 area Coordonnée x du point en haut à gauche.
y0 area Coordonnée y du point en haut à gauche.
x1 area Coordonnée x du point en bas à droite.
y1 area Coordonnée y du point en bas à droite.
w center, cptm et area Largeur de l'image. Cette dimension est utilisée pour situer les points (x,y ou x0,y0 ou x1,y1).
h center, cptm et area Hauteur de l'image. Cette dimension est utilisée pour situer les points (x,y ou x0,y0 ou x1,y1).
q zoom et czm Valeur du zoom à effectuer. Si q < 0 dézoom sinon zoom. Si q == 0 alors le zoom continu s'arrête.
arg ptz, preset et tour Pour la commande ptz, arg peut prendre les valeurs 'down', 'left', 'right', 'up', 'plus' et 'minus'. Pour les commandes preset et tour, arg correspond à l'id du preset ou du tour demandé.
Exemples
$ curl -u demo:demo 'http://demo.camtrace.com/api/v1.2/cameras/2/ptz?cmd=center&w=640h=480&x=200&y=400'
$ curl -u demo:demo 'http://demo.camtrace.com/api/v1.2/cameras/2/ptz?cmd=zoom&q=4'
$ curl -u demo:demo 'http://demo.camtrace.com/api/v1.2/cameras/2/ptz?cmd=preset&arg=Porte'

Les groupes

Toutes les requêtes concernant les groupes doivent être effectuées avec un utilisateur et mot de passe (voir la partie Identification). L'utilisateur doit avoir un profil avec le niveau spécifique Admin pour la création ou la suppression de groupes. Pour la consultation ou la modification, le profil utilisateur doit avoir le droit correspondant associé défini pour chaque groupe. Il faut également veiller à ce que l'utilisateur ait les droits de Visualisation sur les caméras insérées dans les cycles.

Liste des groupes

Seuls les groupes pour lesquels l'utilisateur à les droits de visualisation apparaissent dans la réponse (systématiquement tous pour le profil Admin).

GET /api/v1.2/groups
Réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
  "groups": [
    {
      "id": 1,
      "name": "Four",
      "rows": 2,
      "cols": 2,
      "fullScreen": false,
      "stayOnTop": false,
      "displayCode": null,
      "pushMode": false,
      "href": "/api/v1.2/groups/1"
    }
  ]
}

Voir la description des attributs des groupes pour plus d'informations.

Récupérer un groupe

GET /api/v1.2/groups/:group_id
Réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
  "id": 1,
  "name": "Four",
  "rows": 2,
  "cols": 2,
  "fullScreen": false,
  "stayOnTop": false,
  "displayCode": null,
  "pushMode": false,
  "layout": [
    [0,1],
    [2,3]
  ],
  "levels": [
    {
      "name": "Four 0",
      "duration": 10,
      "elements": [
        {
          "position": 0,
          "serverId": 0,
          "cameraId": 2,
          "quality": 1,
          "mode": "v",
          "type": "c",
          "url": null,
          "showMargin": true,
          "showMenu": true,
          "keepRatio": true,
          "alignment": 0
        }, {
          "position": 1,
          "serverId": 0,
          "cameraId": 1,
          "quality": 1,
          "mode": "v",
          "type": "c",
          "url": null,
          "showMargin": true,
          "showMenu": true,
          "keepRatio": true,
          "alignment": 0
        }, {
          "position": 2,
          "serverId": 0,
          "cameraId": 1,
          "quality": 1,
          "mode": "v",
          "type": "c",
          "url": null,
          "showMargin": true,
          "showMenu": true,
          "keepRatio": true,
          "alignment": 0
        }, {
          "position": 3,
          "serverId": 0,
          "cameraId": 2,
          "quality": 1,
          "mode": "v",
          "type": "c",
          "url": null,
          "showMargin": true,
          "showMenu": true,
          "keepRatio": true,
          "alignment": 0
        }
      ]
    }
  ]
}

Voir la description des attributs des groupes pour plus d'informations.

Création d'un groupe

Nécessite le profil Admin.

POST /api/v1.2/groups
Paramètres
Nom Description
group Contenu du groupe
Exemple de requête
POST /api/v1.2/groups
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
  "group" : {
    "name": "AllCamera",
    "rows": 3,
    "cols": 3,
    "fullScreen": false,
    "pushMode": false,
    "layout": [
        [
            0,
            0,
            1
        ],
        [
            0,
            0,
            2
        ],
        [
            3,
            4,
            5
        ]
    ],
    "levels": [
        {
            "name": "AllCamera 0",
            "duration": 10,
            "elements": [
                {
                    "position": 0,
                    "serverId": 0,
                    "cameraId": 15,
                    "streamId": 45,
                    "mode": "v",
                    "type": "c",
                    "url": null,
                    "showMargin": true,
                    "showMenu": true,
                    "keepRatio": true,
                    "alignment": 0
                },
                {
                    "position": 1,
                    "serverId": 0,
                    "cameraId": 10,
                    "streamId": 30,
                    "mode": "v",
                    "type": "c",
                    "url": null,
                    "showMargin": true,
                    "showMenu": true,
                    "keepRatio": true,
                    "alignment": 0
                },
                {
                    "position": 2,
                    "serverId": 0,
                    "cameraId": 9,
                    "quality": 1,
                    "mode": "v",
                    "type": "c",
                    "url": null,
                    "showMargin": true,
                    "showMenu": true,
                    "keepRatio": true,
                    "alignment": 0
                },
                {
                    "position": 3,
                    "serverId": 0,
                    "cameraId": 8,
                    "streamId": 24,
                    "mode": "v",
                    "type": "c",
                    "url": null,
                    "showMargin": true,
                    "showMenu": true,
                    "keepRatio": true,
                    "alignment": 0
                },
                {
                    "position": 4,
                    "serverId": 0,
                    "cameraId": 2,
                    "quality": 2,
                    "mode": "v",
                    "type": "c",
                    "url": null,
                    "showMargin": true,
                    "showMenu": true,
                    "keepRatio": true,
                    "alignment": 0
                },
                {
                    "position": 5,
                    "serverId": 0,
                    "cameraId": 4,
                    "streamId": 12,
                    "mode": "v",
                    "type": "c",
                    "url": null,
                    "showMargin": true,
                    "showMenu": true,
                    "keepRatio": true,
                    "alignment": 0
                }
            ]
        }
    ]
  }
}  

Voir la description des attributs des plans pour plus d'informations.

Exemple de réponse
HTTP/1.1 201 Created
Content-length: 180
Content-Type: application/json
Location: /api/v1.2/groups/2
{
    "group": {
        "id": 2,
        "name": "AllCamera",
        "rows": 3,
        "cols": 3,
        "fullScreen": false,
        "pushMode": false
    }
}

Le lien vers la ressource crée se trouve dans le header Location.

Modifier un groupe

Nécessite le profil Admin ou que le droit édition soit coché pour ce groupe dans le profil utilisateur. Il existe 2 niveaux de modification d'un groupe :

PUT /api/v1.2/goups/:group_id
Paramètres

Pour la modification profonde :

Nom Description
group Contenu du groupe. Le contenu précédent est intégralement remplacé par le nouveau contenu.

Pour la modification de cycle :

Nom Description
levels Definition du nouveau cycle
Exemple de requête de modification profonde
PUT /api/v1.2/groups/5
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
  "group" : {
    "name": "AllCameraBis",
    "pushMode": true,
    "layout": [
        [
            0,
            0,
            1
        ],
        [
            0,
            0,
            2
        ],
        [
            3,
            4,
            5
        ]
    ],
    "levels": [
        {
            "name": "AllCamera 0",
            "duration": 10,
            "elements": [
                {
                    "position": 0,
                    "serverId": 0,
                    "cameraId": 15,
                    "quality": 2,
                    "mode": "v",
                    "type": "c",
                    "url": null,
                    "showMargin": true,
                    "showMenu": true,
                    "keepRatio": true,
                    "alignment": 0
                },
                {
                    "position": 1,
                    "serverId": 0,
                    "cameraId": 10,
                    "streamId": 31,
                    "mode": "v",
                    "type": "c",
                    "url": null,
                    "showMargin": true,
                    "showMenu": true,
                    "keepRatio": true,
                    "alignment": 0
                },
                {
                    "position": 2,
                    "serverId": 0,
                    "cameraId": 9,
                    "streamId": 27,
                    "mode": "v",
                    "type": "c",
                    "url": null,
                    "showMargin": true,
                    "showMenu": true,
                    "keepRatio": true,
                    "alignment": 0
                },
                {
                    "position": 3,
                    "serverId": 0,
                    "cameraId": 8,
                    "quality": 3,
                    "mode": "v",
                    "type": "c",
                    "url": null,
                    "showMargin": true,
                    "showMenu": true,
                    "keepRatio": true,
                    "alignment": 0
                },
                {
                    "position": 4,
                    "serverId": 0,
                    "cameraId": 2,
                    "quality": 1,
                    "mode": "v",
                    "type": "c",
                    "url": null,
                    "showMargin": true,
                    "showMenu": true,
                    "keepRatio": true,
                    "alignment": 0
                },
                {
                    "position": 5,
                    "serverId": 0,
                    "cameraId": 4,
                    "quality": 1,
                    "streamId": 12,
                    "mode": "v",
                    "type": "c",
                    "url": null,
                    "showMargin": true,
                    "showMenu": true,
                    "keepRatio": true,
                    "alignment": 0
                }
            ]
        }
    ]
  }
}

Voir la description des attributs des groupes pour plus d'informations.

Exemple de requête de modification de cycle
PUT /api/v1.2/groups/5
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
  "levels": [
      {
          "name": "AllCamera 0",
          "duration": 10,
          "elements": [
              {
                  "position": 0,
                  "serverId": 0,
                  "cameraId": 15,
                  "streamId": 46,
              },
              {
                  "position": 1,
                  "serverId": 0,
                  "cameraId": 10,
                  "streamId": 30,
              },
              {
                  "position": 2,
                  "serverId": 0,
                  "cameraId": 9,
                  "streamId": 27,
              },
              {
                  "position": 3,
                  "serverId": 0,
                  "cameraId": 8,
                  "streamId": 26,
              },
              {
                  "position": 4,
                  "serverId": 0,
                  "cameraId": 2,
                  "streamId": 10,
              },
              {
                  "position": 5,
                  "serverId": 0,
                  "cameraId": 4,
                  "streamId": 12,
              }
          ]
      }
  ]
}
Exemple de réponse
HTTP/1.1 200 OK
Content-length: 180
Content-Type: application/json
Content-Location: /api/v1.2/groups/2
{
    "group": {
        "id": 2,
        "name": "AllCameraBis",
        "rows": 3,
        "cols": 3,
        "fullScreen": false,
        "stayOnTop": false,
        "displayCode": 201,
        "pushMode": true
    }
}

Le lien vers la ressource modifiée se trouve dans le header Content-Location.

Description des attributs et propriétés des groupes

Attributs d'un groupe
Nom Type Description Ajout Modification
id entier Identifiant Camtrace du groupe Non Non
name texte Nom du groupe Obligatoire Optionnel
pushMode booléen Si le groupe accepte le mode Push ou non, faux par défaut Optionnel Optionnel
rows entier Nombre de positions (avant éventuel merge) horizontales Obligatoire Optionnel
cols entier Nombre de positions (avant éventuel merge) verticales Obligatoire Optionnel
defaultLevelDuration entier Durée par défaut d'un niveau Optionnel Optionnel
displayCode entier Code vue du groupe Optionnel Optionnel
layout tableau Positionnement des cellules, tableau à 2 dimensions de respectivement de tailles cols et rows Obligatoire Optionnel
levels tableau Liste des niveaux constituant l'enchaînement des flux Obligatoire Optionnel
fullScreen booléen Sans objet Optionnel Optionnel
stayOnTop booléen Sans objet Optionnel Optionnel
comments texte Description ou commentaire concernant le groupe Optionnel Optionnel

Layout est un tableau de rows * cols positions. On assigne à chaque position un identifiant numérique entier correspondant à une cellule en commençant par 0. Une cellule peut occuper plusieurs positions dans le tableau afin de faire une fusion (aussi bien verticale qu'horizontale). Le nombre de cellules final est donc inférieur ou égal à cols * rows. Chaque position doit recevoir un identifiant de cellule.

Attributs des niveaux

Liste des différents attributs qui figurent dans la définition de chaque niveau (levels) du groupe.

Nom Type Description Obligatoire
name texte Identifiant du niveau Oui
duration entier Durée d'affichage du niveau avant le passage au niveau suivant Non
elements tableau Propriétés du niveau pour chaque cellule du groupe Oui *

* Attribut obligatoire mais éventuellement vide. Si une définition de cellule (identifiée par sa position) n'est pas présente dans le tableau, elle restera vide lors de l'affichage de ce niveau.

Propriétés des éléments de niveaux

Liste des différents attributs qui figurent dans la définition de chaque cellule d'un niveau (levels) du groupe.

Nom Type Description Présence (mod. profonde) Présence (mod. cycles)
position entier position de la cellule Obligatoire Obligatoire
serverId entier Id du server dans le cas d'un cluster Optionnelle Optionnelle
cameraId entier Identifiant Camtrace de la caméra en cas de type c Optionnelle Obligatoire
streamId entier Identifiant du flux correspondant à la caméra à utiliser Obligatoire * si mode v Obligatoire quality | entier | Qualité du flux (1 à 3) | Optionnelle

* Un des 2 champs au moins doit être présent. Si les deux sont présents, le champ quality sera pris préférentiellement. A terme et dans un soucis de cohérence, le champ streamId sera obligatoire.

Modifications temps réel d'un groupe

La modification en temps réel permet d'altérer, temporairement ou non, le comportement d'un groupe en cours de visualisation afin d'y afficher un flux de caméra. Nécessite le profil Admin ou que le droit édition soit coché pour ce groupe dans le profil utilisateur.

GET /api/v1.2/goups/:group_id/override
Paramètres
Nom Description Remarque
position Identifiant de la cellule surchargée Obligatoire
cameraId Identifiant de la Caméra à visionner Facultatif
streamId Identifiant du flux de la Caméra à visionner Obligatoire si cameraId est présent
duration Durée d'affichage en secondes avant retour à la normal du cycle pour cette cellule Facultatif

Si duration est absent, la surcharge est permanente pendant toute la durée de visualisation du groupe sans recharge de la configuration. Pour annuler une surcharge d'une cellule (par exemple dans le cas des surcharge à durée indéterminée), il faut appeler la méthode pour le groupe uniquement avec le paramètre position.

Exemple de requête
GET /api/v1.2/groups/2/override?position=0&cameraId=15&streamId=34&duration=20
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
HTTP/1.1 204 No Content
Content-Type: text/html

Les écrans passifs

Toutes les requêtes concernant les écrans passifs doivent être effectuées avec un utilisateur et mot de passe (voir la partie Identification).

Liste des écrans passifs

GET /api/v1.2/screens
Réponse
HTTP/1.1 200 OK
Content-Length: 161
Content-Type: application/json
{
  "screens": [
    {
      "id": 1,
      "num": 2,
      "name": "PassScreen1",
      "host": "10.5.0.38",
      "serverId": 0,
      "cameraId": 1,
      "groupId": null,
      "displayCode": null,
      "href": "/api/v1.2/screens/1"
    }
  ]
}

Récupérer un écran passif

GET /api/v1.2/screens/:screen_id
Réponse
HTTP/1.1 200 OK
Content-Length: 116
Content-Type: application/json
{
  "id": 1,
  "num": 2,
  "name": "PassScreen1",
  "host": "10.5.0.38",
  "serverId": 0,
  "cameraId": 1,
  "groupId": null,
  "displayCode": null
}

Modifier un écran passif

PUT /api/v1.2/screens/:screen_id
Paramètres
Nom Description
serverId L'id du serveur du cluster où trouver la caméra ou le groupe à afficher.
cameraId L'id de la caméra à afficher.
groupId L'id du groupe à afficher.
Requête
PUT /api/v1.2/screens/1
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
  "screen": {
    "serverId": 0,
    "groupId": 2
  }
}
Réponse
HTTP/1.1 200 OK
Content-Length: 116
Content-Type: application/json
{
  "id": 1,
  "num": 2,
  "name": "PassScreen1",
  "host": "10.5.0.38",
  "serverId": 0,
  "cameraId": null,
  "groupId": 2,
  "displayCode": null
}

Les commandes

Toutes les requêtes concernant les commandes doivent être effectuées avec un utilisateur et mot de passe (voir la partie Identification).

Liste des commandes

GET /api/v1.2/exturls
Réponse
HTTP/1.1 200 OK
Content-Length: 373
Content-Type: application/json
{
    "exturls": [
        {
            "id": 7,
            "name": "Allume_Etteind",
            "href": "/api/v1.2/exturls/7"
        },
        {
            "id": 2,
            "name": "Allume_ProjoIR_Prise1",
            "href": "/api/v1.2/exturls/2"
        },
        {
            "id": 3,
            "name": "Eteint_ProjoIR_Prise1",
            "href": "/api/v1.2/exturls/3"
        },
        {
            "id": 4,
            "name": "Allume_Halogène_Prise2",
            "href": "/api/v1.2/exturls/4"
        },
        {
            "id": 5,
            "name": "Eteint_Halogène_Prise2",
            "href": "/api/v1.2/exturls/5"
        }
    ]
}

Détails d'une commande

GET /api/v1.2/exturls/:exturls_id
Réponse
HTTP/1.1 200 OK
Content-Length: 198
Content-Type: application/json
{
    "exturls": {
        "id": 7,
        "name": "Allume_Eteint",
        "urls": [
            "http://10.2.50.100/tgi/control.tgi?l=p:admin:admin&port=u1uu",
            "delay=10",
            "http://10.2.50.100/tgi/control.tgi?l=p:admin:admin&port=u0uu"
        ]
    }
}

Déclencher une commande

GET /api/v1.2/exturls/:exturls_id/trigger
Réponse
HTTP/1.1 200 OK
Content-Length: 18
Content-Type: application/json
{"triggered": true}

Les alarmes

Toutes les requêtes concernant les alarmes doivent être effectuées avec un utilisateur et mot de passe (voir la partie Identification) excepté pour les vignettes.

Liste des alarmes

GET /api/v1.2/cameras[/:camera_id]alarms

Le paramètre camera_id est facultatif. Si il est présent la recherche se fera uniquement sur les alarmes de la caméras correspondante sinon toutes les caméras seront prisent en compte.

Réponse
HTTP/1.1 200 OK
Content-Length: 5106
Content-Type: application/json
Link: <//demo.camtrace.com/api/v1.2/cameras/alarms?limit=20&offset=20>; rel="next"
{
    "alarms": [
        {
            "id": 219739,
            "time": "2014-09-12T09:44:21Z",
            "recordTime": null,
            "cameraId": 21,
            "description": "MOTION Alarm",
            "snapshot": "/api/v1.2/cameras/alarms/219739.jpg",
            "thumbnail": "/api/v1.2/cameras/alarms/219739.jpg?w=50&h=50"
        },
        {
            "id": 219738,
            "time": "2014-09-12T09:44:12Z",
            "recordTime": "2014-09-12T09:44:07Z",
            "cameraId": 31,
            "description": "MOTION Alarm starts at 12/09/2014 at 11:44:07, with 5s pre-alarm",
            "snapshot": "/api/v1.2/cameras/alarms/219738.jpg",
            "thumbnail": "/api/v1.2/cameras/alarms/219738.jpg?w=50&h=50"
        },
        {
            "id": 219737,
            "time": "2014-09-12T09:44:11Z",
            "recordTime": null,
            "cameraId": 21,
            "description": "MOTION Alarm",
            "snapshot": "/api/v1.2/cameras/alarms/219737.jpg",
            "thumbnail": "/api/v1.2/cameras/alarms/219737.jpg?w=50&h=50"
        }
    ]
}
Paramètres
Nom Type Description
q texte Filtre à appliquer sur le champ description.
from texte Date GMT de début au format ISO-8601 (voir Wikipedia, ex: 2014-09-12T06:00:00Z).
to texte Date GMT de fin au format ISO-8601 (voir Wikipedia, ex: 2014-09-12T06:00:00Z).
limit entier Nombre de résultats demandés.
offset entier Position dans l'ensemble des résultats après application des filtres. Zero correspond aux alarmes les plus récentes.
Exemples
# Toutes les alarmes depuis 14h00 le 12 septembre 2014:
$ curl -u demo:demo 'http://demo.camtrace.com/api/v1.2/cameras/alarms?from=2014-09-12T14:00:00Z'

# Toutes les alarmes de la caméra d'id 2 le 12 septembre 2014:
$ curl -u demo:demo 'http://demo.camtrace.com/api/v1.2/cameras/2/alarms?from=2014-09-12T00:00:00Z&to=2014-09-12T23:59:59Z'

Déclencher une alarme

GET /api/v1.2/cameras/alarms/trigger?cameraId=:camera_id1[,:camera_id2,...,:camera_idN]

Le paramètre camera_id1 est obligatoire et indique l'identifiant de la caméra dont l'alarme est déclenchée. Les paramètres :camera_id2,...,:camera_idN sont optionnels et permettent de déclencher plusieurs alarmes simultanément.

Réponse
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/html

Acquitter une alarme

GET /api/v1.2/cameras/alarms/untrigger?cameraId=:camera_id1[,:camera_id2,...,:camera_idN]

Le paramètre camera_id1 est obligatoire et indique l'identifiant de la caméra dont l'alarme est acquittée. Les paramètres :camera_id2,...,:camera_idN sont optionnels et permettent d'acquitter plusieurs alarmes simultanément.

Réponse
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/html

Les Exports

Toutes les requêtes concernant les exports doivent être effectuées avec un utilisateur et mot de passe (voir la partie Identification). L'utilisateur doit avoir un profil avec le niveau spécifique Admin ou Protection. Dans ce dernier cas, il doit également avoir les droits de visualisation sur la caméra correspondant à l'export.

Liste des disques externes

GET /api/v1.2/exports/disks
Paramètres

Aucun

Exemple de requête
GET /api/v1.2/exports/disks
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
    "disks": [
        {
            "id": 1,
            "name": "newVol",
            "fstype": "ext4",
            "totalSpace": 32737501184,
            "freeSpace": 32737501184,
        }
    ]
}

Liste des exports

GET /api/v1.2/exports
Paramètres
Nom Description
CameraId Le ou les id de camera séparés par des , pour lesquelles trouver les exports (optionnel)
from Filtre sur une date de début de recherche au format ISO8601 (optionnel)
to Filtre sur une date de fin de recherche au format ISO8601 (optionnel)
Exemple de requête
GET /api/v1.2/exports?cameraId=1,2&from=2018-09-17T13:19:57Z&to=2018-09-18T00:00:00Z
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
    "exports": [
        {
            "id": 5,
            "cameraId": 1,
            "diskId": null,
            "from": "2018-09-17T13:24:25Z",
            "to": "2018-09-17T13:32:56Z",
            "type": "a",
            "comment": "",
            "downloadUrl": "/api/v1.2/exports/5/download",
            "size": 0,
            "p100": 100,
            "md5sum": null,
            "archived": false,
            "createdAt": "2018-09-17T13:36:37Z",
            "url": "/api/v1.2/exports/5"
        },
        {
            "id": 6,
            "cameraId": 1,
            "diskId": null,
            "from": "2018-09-17T13:19:57Z",
            "to": "2018-09-17T13:39:57Z",
            "type": "r",
            "comment": "",
            "downloadUrl": "/api/v1.2/exports/6/download",
            "size": 0,
            "p100": 100,
            "md5sum": null,
            "archived": false,
            "createdAt": "2018-09-17T13:40:10Z",
            "url": "/api/v1.2/exports/6"
        }
    ]
}
Description des attributs d'export
Nom Type Description
id entier Identifiant Camtrace de l'export
cameraId entier Identifiant Camtrace de la caméra
diskId entier Identifiant Camtrace du support externe sur lequel est stocké l'export. Si ce champ est null, l'export est stocké dans la répertoire monté par défaut sur le serveur)
from date Date ISO8021 de début de la séquence
to date Date ISO8021 de fin de la séquence
type char Identifiant du type d'export
comment texte Commentaire sur l'export
downloadUrl texte URL de téléchargement de l'export
size entier Taille de l'export en octets
p100 entier Pourcentage de creation de l'export (vaut 100 quand la création de l'export est terminée)
md5sum text Hash MD5 du fichier d'export
archived booleen Indique si l'export a été archivé ou non
createdAt texte Date ISO8021 de création de l'export
url texte URL de récupération des détails de l'export voir Détails d'un export

Détails d'un export

GET /api/v1.2/exports/:export_id
Paramètres

Aucun

Exemple de requête
GET /api/v1.2/exports/5
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
    "export": {
        "id": 5,
        "cameraId": 1,
        "diskId": null,
        "from": "2018-09-17T13:24:25Z",
        "to": "2018-09-17T13:32:56Z",
        "type": "a",
        "comment": "",
        "downloadUrl": "/api/v1.2/exports/5/download",
        "size": 0,
        "p100": 100,
        "md5sum": null,
        "archived": false,
        "createdAt": "2018-09-17T13:36:37Z",
        "url": "/api/v1.2/exports/5"
    }
}

Voir la description des attributs de l'export pour plus d'informations.

Création d'un export

POST /api/v1.2/exports
Paramètres
Nom Description
CameraId L'id de camera pour laquelle l'export est créé
from Date de début de la séquence au format ISO8601
to Date de fin de la séquence au format ISO8601
type Type d'export (optionnel) : vaut "a" (alarme) ou "r" (régulier), "r" est la valeur par défaut
diskId id Camtrace de support (disk) externe sur lequel créer l'export (optionnel)
comment un texte de commentaire concernant l'export (optionnel)
Exemple de requête
POST /api/v1.2/exports
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
  "export": {
    "cameraId": 1,
    "from": "2018-09-17T13:24:25Z"
    "to": "2018-09-17T13:26:00Z"
  }
}
Exemple de réponse
HTTP/1.1 201 CREATED
Content-Type: application/json
{
    "export": {
        "id": 8,
        "cameraId": 1,
        "diskId": null,
        "from": "2018-09-17T13:24:25Z",
        "to": "2018-09-17T13:26:00Z",
        "type": "r",
        "comment": "",
        "downloadUrl": "/api/v1.2/exports/8/download",
        "size": 0,
        "p100": 0,
        "md5sum": null,
        "archived": false,
        "createdAt": "2018-09-17T13:36:37Z",
        "url": "/api/v1.2/exports/8"
    }
}

Voir la description des attributs de l'export pour plus d'informations.

Téléchargement d'un export

GET /api/v1.2/exports/:export_id/download
Paramètres

Aucun

Exemple de requête
GET /api/v1.2/exports/8/download
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
HTTP/1.1 200 OK
Content-Type: application/zip

Hash MD5 d'un fichier d'export

Cet appel permet de calculer le hash MD5 du fichier export sur le disque

GET /api/v1.2/exports/:export_id/md5sum
Paramètres

Aucun

Exemple de requête
GET /api/v1.2/exports/8/md5sum
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e"
}

Suppression d'un export

DELETE /api/v1.2/exports/:export_id
Paramètres

Aucun

Exemple de requête
DELETE /api/v1.2/exports/8
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
HTTP/1.1 204 NO CONTENT
Content-Type: text/html

Modification d'un export

Cet appel permet d'archiver l'export et supprime le fichier export sur le disque concerné.

PUT /api/v1.2/exports/:export_id
Paramètres
Nom Description
archived ce champ doit prendre un équivalent de "true" pour archiver l'export
Exemple de requête
PUT /api/v1.2/exports/9
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
  "export": {
    "archived": 1,
  }
}
Exemple de réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
    "export": {
        "id": 9,
        "cameraId": 1,
        "diskId": null,
        "from": "2018-09-17T13:24:25Z",
        "to": "2018-09-17T13:32:56Z",
        "type": "a",
        "comment": "",
        "downloadUrl": "/api/v1.2/exports/9/download",
        "size": 0,
        "p100": 100,
        "md5sum": null,
        "archived": true,
        "createdAt": "2018-09-17T13:36:37Z",
        "url": "/api/v1.2/exports/9"
    }
}

Voir la description des attributs de l'export pour plus d'informations.

Les séquences protégées

Toutes les requêtes concernant les séquences protégées doivent être effectuées avec un utilisateur et mot de passe (voir la partie Identification). L'utilisateur doit avoir les droits de visualisation sur la caméra correspondant à la séquence à protéger.

Protéger une séquence

L'utilisateur doit avoir un profil avec le niveau spécifique Admin ou Protection.

POST /api/v1.2/precords
Paramètres
Nom Description
CameraId L'id de camera pour laquelle la séquence doit être protégée
from Date de début de la séquence au format ISO8601
to Date de fin de la séquence au format ISO8601
type Type d'enregistrement (optionnel) : vaut "a" (alarme) ou "r" (régulier), "r" est la valeur par défaut
comment commentaire associé à la séquence protégée (optionnel)
Exemple de requête
POST /api/v1.2/precords
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
  "precord": {
    "cameraId": 1,
    "from": "2018-09-17T13:24:25Z",
    "to": "2018-09-17T13:26:00Z",
    "comment": "Test de séquence protégée"
  }
}
Exemple de réponse
HTTP/1.1 201 CREATED
Content-Type: application/json
{
    "precord": {
            "cameraId": 1,
            "from": "2018-09-17T13:24:25Z",
            "to": "2018-09-17T13:26:00Z",
            "type": "r"
        }
}

Les Plans

Toutes les requêtes concernant les plans doivent être effectuées avec un utilisateur et mot de passe (voir la partie Identification). L'utilisateur doit avoir un profil avec le niveau spécifique Admin pour la création ou la suppression de plans. Pour la consultation ou la modification, le profil utilisateur doit avoir le droit correspondant associé défini pour chaque plan. Les éléments (caméras et presets ptz associés, groupes, commandes, écrans passifs ou plans) pour lesquels l'utilisateur n'a pas les droits de visualisation n'apparaîtront pas sur le plan, même si l'utilisateur a le droit de visualisation sur le plan en question. Pour que ce service soit disponible, le serveur Camtrace doit disposer d'une licence permettant l'utilisation des plans.

Liste des plans

Seuls les plans pour lesquels l'utilisateur à les droits de visualisation apparaissent dans la réponse (systématiquement tous pour le profil Admin)

GET /api/v1.2/maps
Réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
  "maps": [
        {
            "uuid": "edeb519a-9e02-4766-84bc-13dea79b61c8",
            "name": "Parking",
            "version": 4,
            "detailUrl": "/api/v1.2/maps/edeb519a-9e02-4766-84bc-13dea79b61c8"
        },
        {
            "uuid": "5f20a627-c915-42be-895e-865101763dc0",
            "name": "Entrée",
            "version": 9,
            "detailUrl": "/api/v1.2/maps/5f20a627-c915-42be-895e-865101763dc0"
        }
    ]
}

Récupérer un plan

Nécessite le profil Admin ou que le droit visualisation soit coché pour ce plan dans le profil utilisateur.

GET /api/v1.2/maps/:uuid
Réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
  "map" : {
        "uuid": "edeb519a-9e02-4766-84bc-13dea79b61c8",
        "name": "Parking",
        "version": 4,
        "scale": 1,
        "items": [
          {
                "posX": 336,
                "posY": 279,
                "type": "camera",
                "width": 40,
                "height": 40,
                "zIndex": 1,
                "properties": {
                    "id": "15",
                    "node": "0",
                    "angle": 15.489200556287,
                    "range": 327.07491496598,
                    "direction": 17.018305445794
                }  
          },
          {
            "posX": 1310,
                "posY": 519,
                "type": "map",
                "width": 40,
                "height": 40,
                "zIndex": 1,
                "properties": {
                    "id": "5f20a627-c915-42be-895e-865101763dc0"
                }
          }
        ],
        "backgrounds": [
                {
                  "posX": 622,
                  "posY": 154,
                  "image": "<binary data>",
                  "width": 1175,
                  "height": 744,
                  "zIndex": 0
                }
        ]
  }
}

Voir la description des attributs des plans pour plus d'informations.

Récupérer les éléments d'un plan

Nécessite le profil Admin ou que le droit visualisation soit coché pour ce plan dans le profil utilisateur. Seuls les éléments (caméras et presets ptz associés, groupes, commandes, écrans passifs ou plans) pour lequel l'utilisateur à le droit visualisation seront renvoyés.

GET /api/v1.2/maps/:uuid/items
Réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
    "items": [
      {
            "posX": 336,
            "posY": 279,
            "type": "camera",
            "width": 40,
            "height": 40,
            "zIndex": 1,
            "properties": {
                "id": "15",
                "node": "0",
                "angle": 15.489200556287,
                "range": 327.07491496598,
                "direction": 17.018305445794
            }  
      },
      {
        "posX": 1310,
            "posY": 519,
            "type": "map",
            "width": 40,
            "height": 40,
            "zIndex": 1,
            "properties": {
                "id": "5f20a627-c915-42be-895e-865101763dc0"
            }
      }
    ]
}

Voir la description des attributs des plans pour plus d'informations.

Création d'un plan

Nécessite le profil Admin.

POST /api/v1.2/maps
Paramètres
Nom Description
map Contenu du plan
Exemple de requête
POST /api/v1.2/maps
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
  "map" : {
        "name": "Batiment 2",
        "items": [
          {
                "posX": 332,
                "posY": 271,
                "type": "camera",
                "width": 40,
                "height": 40,
                "zIndex": 1,
                "properties": {
                    "id": "5",
                    "node": "0",
                    "angle": 16.49,
                    "range": 288.1,
                    "direction": 32
                }  
          },
          {
            "posX": 1310,
                "posY": 519,
                "type": "command",
                "width": 40,
                "height": 40,
                "zIndex": 1,
                "properties": {
                    "id": "1"
                }
          }
        ],
        "backgrounds": [
                {
                  "posX": 20,
                  "posY": 19,
                  "image": "<binary data>",
                  "width": 1280,
                  "height": 770,
                  "zIndex": 0
                }
        ]
  }

Voir la description des attributs des plans pour plus d'informations.

Exemple de réponse
HTTP/1.1 201 CREATED
Content-Type: application/json
{
    "map": {
        "uuid": "6d20a627-d916-41be-835a-865101763ef5",
        "version": 1,
        "name": "Batiment 2",
        "detailUrl": "/api/v1.2/maps/6d20a627-d916-41be-835a-865101763ef5"
    }
}

Modifier un plan

Nécessite le profil Admin ou que le droit édition soit coché pour ce plan dans le profil utilisateur.

PUT /api/v1.2/maps/:uuid
Paramètres
Nom Description
map Contenu du plan. Le contenu précédent est intégralement remplacé par le nouveau contenu.
Exemple de requête
PUT /api/v1.2/maps/6d20a627-d916-41be-835a-865101763ef5
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
  "map" : {
        "name": "Batiment 2",
        "scale": 1.2,
        "items": [
          {
                "posX": 332,
                "posY": 271,
                "type": "camera",
                "width": 40,
                "height": 40,
                "zIndex": 1,
                "properties": {
                    "id": "5",
                    "node": "0",
                    "angle": 16.49,
                    "range": 288.1,
                    "direction": 32
                }  
          },
          {
                "posX": 888,
                "posY": 412,
                "type": "camera",
                "width": 40,
                "height": 40,
                "zIndex": 1,
                "properties": {
                    "id": "6",
                    "node": "0",
                    "angle": 16.49,
                    "range": 288.1,
                    "direction": 256
                }  
          },
          {
            "posX": 1310,
                "posY": 519,
                "type": "command",
                "width": 60,
                "height": 60,
                "zIndex": 1,
                "properties": {
                    "id": "1"
                }
          }
        ],
        "backgrounds": [
                {
                  "posX": 20,
                  "posY": 19,
                  "image": "<binary data>",
                  "width": 1280,
                  "height": 770,
                  "zIndex": 0
                }
        ]
  }

Voir la description des attributs des plans pour plus d'informations.

Exemple de réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
    "map": {
        "uuid": "6d20a627-d916-41be-835a-865101763ef5",
        "version": 2,
        "name": "Batiment 2",
        "detailUrl": "/api/v1.2/maps/6d20a627-d916-41be-835a-865101763ef5"
    }
}

Suppression d'un plan

DELETE /api/v1.2/maps/:uuid
Paramètres

Aucun

Exemple de requête
DELETE /api/v1.2/maps/6d20a627-d916-41be-835a-865101763ef5
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
HTTP/1.1 204 NO CONTENT
Content-Type: text/html

Description des attributs et propriétés des plans

Attributs d'un plan
Nom Type Description Ajout Modification
uuid uuid Identifiant Camtrace du plan Non Non
name texte Identifiant Camtrace de la caméra Obligatoire Obligatoire
scale décimal Facteur de zoom global pour tous les éléments du plan Optionnel Optionnel
version entier Numéro de version autoincrémental Non Non
items tableau Liste des éléments composant le plan Obligatoire * Optionnel
backgrounds tableau Liste des images constituant le fond du plan Obligatoire * Optionnel

* Attribut obligatoire mais éventuellement vide.

Types d'éléments

Ce sont les différents éléments susceptibles d'être contenus dans le tableau items d'un plan

Nom Description Propriétés
camera Représente une caméra déclarée sur le serveur Camtrace (ou hiérarchique) id, node, angle, range, direction, items
group Représente un groupe déclaré sur le serveur Camtrace id
command Représente une commande déclarée sur le serveur Camtrace id, node
map Représente un plan déclaré sur le serveur Camtrace id
screen Représente un écran passif déclaré sur le serveur Camtrace id
Types d'éléments caméra

Ce sont les différents éléments susceptibles d'être contenus dans le tableau items d'une caméra.

Nom Description Propriétés
preset Représente un preset ptz d'une caméra donnée id, node
Attributs des éléments

Liste des différents attributs associés aux éléments (items) d'un plan ou d'une caméra.

Nom Type Description Obligatoire
type texte Type d'élément Oui
posX entier Abscisse absolue (point haut gauche) de l'élément dans le plan en pixels Oui
posY entier Ordonnée absolue (point haut gauche) de l'élément dans le plan en pixels Oui
width entier Largeur de l'élément en pixels Oui
height entier Hauteur de l'élément en pixels Oui
zIndex décimal Profondeur relative de l'élément Oui
Attributs des fonds de plans

Liste des différents attributs associés aux fonds (backgrounds) d'un plan.

Nom Type Description Obligatoire
posX entier Abscisse absolue (point haut gauche) de l'élément dans le plan en pixels Oui
posY entier Ordonnée absolue (point haut gauche) de l'élément dans le plan en pixels Oui
width entier Largeur de l'élément en pixels Oui
height entier Hauteur de l'élément en pixels Oui
zIndex décimal Profondeur relative de l'élément Oui
image binaire image, propriété de fond de plan Oui
Attributs du champ Propriétés d'un élément

Liste des attributs possibles pour le champ propriétés (properties) des éléments (items) d'un plan ou d'une caméra.

Nom Type Description Obligatoire
id entier ou uuid Oui
node entier serveur sur lequel est situé l'élément Oui
angle décimal angle du faisceau de la caméra en degrés Oui
range décimal profondeur du faisceau de la caméra en pixels Oui
direction décimal direction de la caméra en degrés Oui
items tableau sous-éléments de l'élément Non

Les Sélections

Toutes les requêtes concernant les sélections doivent être effectuées avec un utilisateur et mot de passe (voir la partie Identification). L'utilisateur doit avoir un profil avec le niveau spécifique Admin pour la création, la modification ou la suppression de sélections. Tous les utilisateurs peuvent voir une sélection mais les éléments (caméras et presets ptz associés, groupes, commandes, écrans passifs ou plans) pour lesquels l'utilisateur n'a pas les droits de visualisation n'apparaîtront pas lors de la visualisation de la sélection.

Liste des sélections

GET /api/v1.2/folders
Paramètres
Nom Description
details Booléen permettant de recevoir directement tous les éléments des sélections quand sa valeur est à vrai (Optionnel, faux par défaut)
Réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
  "folders": [
        {
            "uuid": "edeb519a-9e02-4766-84bc-13dea79b61c8",
            "name": "Sélection 1",
            "detailUrl": "/api/v1.2/folders/edeb519a-9e02-4766-84bc-13dea79b61c8"
        },
        {
            "uuid": "5f20a627-c915-42be-895e-865101763dc0",
            "name": "Sélection 2",
            "detailUrl": "/api/v1.2/folders/5f20a627-c915-42be-895e-865101763dc0"
        }
    ]
}

Récupérer une sélection

GET /api/v1.2/folders/:uuid
Réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
    "folder" : {
        "uuid": "edeb519a-9e02-4766-84bc-13dea79b61c8",
        "name": "Sélection 1",
        "regex": {
            "id": 1,
            "name": "critères 1",
            "params": {
                "value": "([-]*)-([^-]*)-([^-]*)-([^_]*)_([^_]*)_([^ ]*) ([^_]*)",
                "group": [6,7]
            }
        },
        "items": [
            {
                "serverId": 0,
                "type": "map",
                "uuid": "cc34693f-1e02-336f-34ac-3367d67c31fd",
                "weight": -25
            },
            {
                "type": "folder",
                "name": "folder1",
                "weight": -12,
                "items": [
                    {
                        "serverId": 0,
                        "type": "camera",
                        "id": 1,
                        "weight": 0
                    },
                    {
                        "serverId": 0,
                        "type": "map",
                        "uuid": "ab34693c-9e02-556f-34aa-3467d67c88ec",
                        "weight": 0
                    }
                ]
            },
            {
                "name": "folder2",
                "type": "folder",
                "weight": 3,
                "items": [
                    {
                        "serverId": 0,
                        "type": "camera",
                        "id": 1,
                        "weight": 1
                    },
                    {
                        "serverId": 0,
                        "type": "group",
                        "id": 1,
                        "weight": 2
                    },
                    {
                      "type": "folder",
                      "name": "folder21",
                      "weight": 3,
                      "items": [
                      ]  
                    }
                ]
            }
        ]
    }
}

Voir la description des attributs des sélections pour plus d'informations.

Création d'une sélection

Nécessite le profil Admin.

POST /api/v1.2/folders
Paramètres
Nom Description
folder Contenu d'une sélection
Exemple de requête
POST /api/v1.2/folders
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
  "folder" : {
        "name": "Sélection 3",
        "regexId": 1,
        "items": [
            {
                "type": "map",
                "uuid": "cc34693f-1e02-336f-34ac-3367d67c31fd"
            },
            {
                "type": "folder",
                "name": "folder1",
                "weight": -50,
                "items": [
                    {
                        "serverId": 1,
                        "type": "camera",
                        "id": 1
                    },
                    {
                        "type": "map",
                        "uuid": "ab34693c-9e02-556f-34aa-3467d67c88ec",
                        "weight": 10
                    },
                    {
                        "type": "group",
                        "id": 2
                    }
                ]
            }
        ]
    }
}

Voir la description des attributs des sélections pour plus d'informations.

Exemple de réponse
HTTP/1.1 201 CREATED
Content-Type: application/json
{
    "folder": {
        "uuid": "8b6aa627-e455-aabf-4573-865101745dfc",
        "name": "Sélection 3",
        "detailUrl": "/api/v1.2/folders/8b6aa627-e455-aabf-4573-865101745dfc"
    }
}

Modifier une sélection

Nécessite le profil Admin.

PUT /api/v1.2/folders/:uuid
Paramètres
Nom Description
folder Contenu de le sélection. Le contenu du champ items précédent est intégralement remplacé par le nouveau contenu.
Exemple de requête
PUT /api/v1.2/folders/8b6aa627-e455-aabf-4573-865101745dfc
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
  "folder" : {
        "regexId": 2,
        "items": [
            {
                "type": "map",
                "uuid": "cc34693f-1e02-336f-34ac-3367d67c31fd"
            },
            {
                "type": "folder",
                "name": "folder1",
                "weight": -50,
                "items": [
                    {
                        "serverId": 1,
                        "type": "camera",
                        "id": 1
                    },
                    {
                        "type": "map",
                        "uuid": "ab34693c-9e02-556f-34aa-3467d67c88ec",
                        "weight": 10
                    },
                    {
                        "type": "group",
                        "id": 2
                    }
                ]
            },
            {
                "type": "folder",
                "name": "folder2",
                "weight": -60,
                "items": [
                ]
            }
        ]
    }
}

Voir la description des attributs des sélections pour plus d'informations.

Exemple de réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
    "folder": {
        "uuid": "8b6aa627-e455-aabf-4573-865101745dfc",
        "name": "Sélection 3",
        "detailUrl": "/api/v1.2/folders/8b6aa627-e455-aabf-4573-865101745dfc"
    }
}

Modifier l'ordre de plusieurs sélections

Nécessite le profil Admin.

PATCH /api/v1.2/folders
Paramètres
Nom Description
folders Tableau de couplesuuid / weight à modifier.
Exemple de requête
PATCH /api/v1.2/folders
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
  "folders" : [
        {
            "uuid": "d8590675-ade4-4fa2-9b8f-b9a64ead479d",
            "weight": 12
        },
        {
            "uuid": "add3e16f-bf23-438e-ac0b-b216277918e7",
            "weight": -3
        }
    ]
}
Exemple de réponse
HTTP/1.1 204 NO CONTENT
Content-Type: application/json

Suppression d'une sélection

Nécessite le profil Admin.

DELETE /api/v1.2/folders/:uuid
Paramètres

Aucun

Exemple de requête
DELETE /api/v1.2/folders/8b6aa627-e455-aabf-4573-865101745dfc
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
HTTP/1.1 204 NO CONTENT
Content-Type: text/html

Description des attributs et propriétés des sélections

Attributs d'une sélection
Nom Type Description Ajout Modification
uuid uuid Identifiant Camtrace de la sélection Non Non
name texte Nom de la sélection Obligatoire Optionnel
regexId entier Id de du critère de tri associée Optionnel Optionnel
regex objet Paramètres du critère de tri associée Non Non
items tableau Liste des éléments composant le plan Obligatoire * Optionnel

* Attribut obligatoire mais éventuellement vide.

Types d'éléments

Ce sont les différents types d'éléments contenus dans le tableau items de la sélection

Nom Description
folder Représente une sous sélection de la sélection, les sous sélections peuvent s'imbriquer en plusieurs niveaux
camera Représente une caméra déclarée sur le serveur Camtrace (ou hiérarchique)
group Représente un groupe déclaré sur le serveur Camtrace
map Représente un plan déclaré sur le serveur Camtrace
screen Représente un écran passif déclaré sur le serveur Camtrace
device Représente un connecteur metadata
Attributs des éléments

Liste des différents attributs associés aux éléments (items) d'une sélection

Nom Type Description Type Présence
type texte Type d'élément Tous Obligatoire
serverId entier Id du serveur ou se trouve l'élément camera, group, map, screen, device Optionnel
name texte Nom de l'élément folder Obligatoire
id entier Identifiant de l'élément camera, group, screen Obligatoire
uuid uuid Identifiant unique de l'élément map, device Obligatoire
weight entier Poids relatif de l'élément Tous Optionnel
items tableau Liste des éléments contenus dans l'élément folder Obligatoire *

* Attribut obligatoire mais éventuellement vide.

Les critères de tris du serveur

Toutes les requêtes concernant les critères de tris doivent être effectuées avec un utilisateur et mot de passe (voir la partie Identification). L'utilisateur doit avoir un profil avec le niveau spécifique Admin pour la création, la modification ou la suppression des critères de tris.

Liste des crières de tris

GET /api/v1.2/regex
Paramètres

Aucun

Réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
  "regex": [
        {
            "id": 1,
            "name": "Critères 1",
            "default": false,
            "params": {
                "value": "([-]*)-([^-]*)-([^-]*)-([^_]*)_([^_]*)_([^ ]*) ([^_]*)",
                "group": [6,7]
            }
        },
        {
            "id": 2,
            "name": "Critères 2",
            "default": true,
            "params": {
                "value": "([-]*)-([^-]*)-([^-]*)-([^_]*)_([^_]*)_([^ ]*) ([^_]*)",
                "group": [2,1]
            }
        }
    ]
}

Voir la description des attributs des critères de tris pour plus d'informations.

Création d'un critère de tri

Nécessite le profil Admin.

POST /api/v1.2/regex
Paramètres
Nom Description
regex Définition du critère de tri
Exemple de requête
POST /api/v1.2/regex
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
  "regex" : {
        "name": "Critères 3",
        "params": {
            "value": "([-]*)-([^-]*)-([^-]*)-([^_]*)_([^_]*)_([^ ]*) ([^_]*)",
            "group": [3,4]
        }
    }
}

Voir la description des attributs des critères de tris pour plus d'informations.

Exemple de réponse
HTTP/1.1 201 CREATED
Content-Type: application/json
{
    "regex": {
        "id": 3,
        "name": "Critères 3",
        "default": false,
        "params": {
            "value": "([-]*)-([^-]*)-([^-]*)-([^_]*)_([^_]*)_([^ ]*) ([^_]*)",
            "group": [3,4]
        }
    }
}

Modifier un critère de tri

Nécessite le profil Admin.

PUT /api/v1.2/regex/:id
Paramètres
Nom Description
regex Définition du critère de tri. Le contenu du champ params précédent est intégralement remplacé par le nouveau.
Exemple de requête
PUT /api/v1.2/regex/3
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
  "regex" : {
        "params": {
            "value": "([-]*)-([^-]*)-([^-]*)-([^_]*)_([^_]*)_([^ ]*) ([^_]*)",
            "group": [3,5]
        }
    }
}

Voir la description des attributs des critères de tris pour plus d'informations.

Exemple de réponse
HTTP/1.1 200 OK
Content-Type: application/json
{
    "regex": {
        "id": 3,
        "name": "Critères 3",
        "default": false,
        "params": {
            "value": "([-]*)-([^-]*)-([^-]*)-([^_]*)_([^_]*)_([^ ]*) ([^_]*)",
            "group": [3,5]
        }
    }
}

Suppression d'un critère de tri

Nécessite le profil Admin.

DELETE /api/v1.2/regex/:id
Paramètres

Aucun

Exemple de requête
DELETE /api/v1.2/regex/3
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
HTTP/1.1 204 NO CONTENT
Content-Type: text/html

Description des attributs et propriétés des critères de tris

Propriétés d'une sélection
Nom Type Description Ajout Modification
id entier Identifiant du critère de recherche Non Non
name texte Nom du critère de recherhce Obligatoire Optionnel
default booléen tri par défaut du serveur (unique) Optionnel (false par défaut) Optionnel
params objet Liste des paramètres du tri Obligatoire Optionnel
Attributs des éléments

Liste des différents attributs constituant les éléments (items) des tris.

Nom Type Description Présence
value texte Expression régulière constituée d'un ou plusieurs groupes définissant les critères de tris Obligatoire
group tableau liste ordonnée des index des différents groupes de value à prendre en compte pour la recherche Obligatoire

Monitoring

Toutes les requêtes concernant le monitoring doivent être effectuées avec un utilisateur et mot de passe (voir la partie Identification). L'utilisateur doit avoir un profil avec le niveau spécifique Admin ou Monitor.

Informations de license

Renvoie les informations concernant le license actuellement en cours pour le serveur.

GET /api/v1.2/license
Paramètres

Aucun

Exemple de requête
GET /api/v1.2/license
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
{
    "license": {
        "active_modules": [
            "interface_cluster",
            "local_video_relay",
            "maps",
            "messages",
            "metadata",
            "record",
            "scenarios",
            "tags",
            "video_relay"
        ],
        "build": 20210531,
        "current_metadata_sources": 1,
        "current_video_sources": 9,
        "hardware_id": "B6CE4BD4",
        "license_creation_date": "20210210",
        "license_valid": true,
        "licensed_to": "CAMTRACE TEST",
        "max_metadata_sources": 30,
        "max_screens": 30,
        "max_space_usage": 100,
        "max_video_sources": 30,
        "postal_code": "92100",
        "serial_number": "1117",
        "upgrade_expiration_date": "20220225",
        "uuid": "aa0cd092-555f-4b83-8f73-386dbc6eebb7",
        "version": "8.15.2.0"
    }
}

Mise à jour de la license

Nécessite le profil Admin.

POST /api/v1.2/license

Paramètres

Nom Description
license Le contenu du fichier license
Exemple de requête
POST /api/v1.2/license
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
  "license" : "contenu_du_fichier_license"
}
Exemple de réponse
HTTP/1.1 201 CREATED
Content-Type: application/json

Informations système

Renvoie les informations matérielles (hardware) du serveur.

GET /api/v1.2/sysinfo
Paramètres

Aucun

Exemple de requête
GET /api/v1.2/sysinfo
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
{
    "CPU": [
        "Intel(R) Pentium(R) Gold G5400 CPU @ 3.70GHz"
    ],
    "Memory": [
        "3,9G"
    ],
    "Network": [
        "I211 Gigabit Network Connection (enp1s0)",
        "I211 Gigabit Network Connection (enp2s0)"
    ],
    "Controller": [
        "Cannon Lake PCH SATA AHCI Controller"
    ],
    "Disk": [
        "WDC WD20EFRX-68EUZN0 (sda)",
        "FORESEE 128GB SSD (sdb)"
    ],
    "Partition": [
        "1863GiB WDC WD20EFRX-68E (/dev/sda)",
        "93MiB Windows FAT volume (/dev/sdb1)",
        "477MiB EXT4 volume (/dev/sdb2)",
        "14GiB EXT4 volume (/dev/sdb3)",
        "14GiB EXT4 volume (/dev/sdb4)",
        "14GiB EXT4 volume (/dev/sdb5)",
        "3814MiB Linux swap volume (/dev/sdb6)",
        "70GiB EXT4 volume (/dev/sdb7)"
    ]
}

État de santé du serveur

L'état de santé du serveur est constitué de 3 sections différentes: recorder qui surveille le service vidéo et la base de données, cameras qui surveille l'état des caméras et de l'enregistrement vidéo sur le disque et hardware qui surveille l'état du matériel serveur.

GET /ap1/v1.2/health
Paramètres

Aucun

Exemple de réponse
HTTP/1.1 200 OK
Content-Length: 126
Content-Type: application/json
{
  "health":
      {
          "recorder": false,
          "cameras": false,
          "hardware": true,
          "errorDetails":
              {
                  "recorder": [
                      "Video service is inactive"
                  ],
                  "cameras": [
                      {
                        "id": 1,
                        "name": "Caméra 1",
                        "streamName": "Flux HD",
                        "error": "Pas d'images"
                      }
                  ]
              }
      }
}
Attributs de la réponse
Nom Type Description
recorder booléen état de service video (scamd) et de la base de données
cameras booléen état des caméras et de l'enregistrement sur disque
hardware booléen État matériel du serveur et notamment le rapport SMART
errorDetails tableau Détail des erreurs éventuelles par section (recorder, cameras, hardware)

Journaux

Toutes les requêtes concernant la consulation de journeaux doivent être effectuées avec un utilisateur et mot de passe (voir la partie Identification). L'utilisateur doit avoir le profil spécifique Admin.

Journal des actions utilisateur

Nécessite le profil Admin.

GET /api/v1.2/users/actions
GET /api/v1.2/users/:id/actions
Paramètres
Nom Type Description
from texte Date GMT de début au format ISO-8601 (voir Wikipedia, ex: 2014-09-12T06:00:00Z).
to texte Date GMT de fin au format ISO-8601 (voir Wikipedia, ex: 2014-09-12T06:00:00Z).
limit entier Nombre de résultats demandés.
offset entier Position dans l'ensemble des résultats après application des filtres. Zero correspond aux alarmes les plus récentes.
Exemple de requête
POST /api/v1.2/users/1/actions?from=2021-07-17T09:38:53Z&to=2021-07-17T10:43:53Z
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
{
    "actions": [
        {
            "id": 927,
            "userId": 1,
            "userName": "admin",
            "dateTime": "2021-07-17T10:43:53Z",
            "ipAddress": "102.156.162.9",
            "action": "LogUserLogin",
            "description": "Identification de l'utilisateur."
        },
        {
            "id": 926,
            "userId": 1,
            "userName": "admin",
            "dateTime": "2021-07-17T10:02:06Z",
            "ipAddress": "102.156.162.9",
            "action": "LogUserLogin",
            "description": "Identification de l'utilisateur."
        },
        {
            "id": 925,
            "userId": 1,
            "userName": "admin",
            "dateTime": "2021-07-17T10:01:21Z",
            "ipAddress": "102.156.162.9",
            "action": "LogUserLogin",
            "description": "Identification de l'utilisateur."
        },
        {
            "id": 924,
            "userId": 1,
            "userName": "admin",
            "dateTime": "2021-07-17T09:39:24Z",
            "ipAddress": "102.156.162.9",
            "action": "LogUserLogin",
            "description": "Identification de l'utilisateur."
        }
    ],
    "paging": {
        "total": 4,
        "offset": 4,
        "limit": 0
    }
}

Journal des connexions caméras

Nécessite le profil Admin.

GET /api/v1.2/cameras/connections
GET /api/v1.2/cameras/:id/connections
Paramètres
Nom Type Description
id_cams liste Liste d'identifiants de caméras séparées par des virgules
connected booléen Etat de la caméra : connectée (vrai) ou déconnectée (faux)
from texte Date GMT de début au format ISO-8601 (voir Wikipedia, ex: 2014-09-12T06:00:00Z).
to texte Date GMT de fin au format ISO-8601 (voir Wikipedia, ex: 2014-09-12T06:00:00Z).
limit entier Nombre de résultats demandés.
offset entier Position dans l'ensemble des résultats après application des filtres. Zero correspond aux alarmes les plus récentes.
Exemple de requête
POST /api/v1.2/cameras/2/connections?limit=4
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
{
    "connections": [
        {
            "id": 207,
            "cameraId": 2,
            "cameraName": "CCDM8EF01_24",
            "streamId": 4,
            "streamName": "MsMediaProfile1",
            "dateTime": "2021-07-13T09:41:08Z",
            "connected": true
        },
        {
            "id": 208,
            "cameraId": 2,
            "cameraName": "CCDM8EF01_24",
            "streamId": 6,
            "streamName": "MsMediaProfile3",
            "dateTime": "2021-07-13T09:41:08Z",
            "connected": true
        },
        {
            "id": 209,
            "cameraId": 2,
            "cameraName": "CCDM8EF01_24",
            "streamId": 5,
            "streamName": "MsMediaProfile2",
            "dateTime": "2021-07-13T09:41:08Z",
            "connected": true
        },
        {
            "id": 194,
            "cameraId": 2,
            "cameraName": "CCDM8EF01_24",
            "streamId": 4,
            "streamName": "MsMediaProfile1",
            "dateTime": "2021-07-12T16:10:08Z",
            "connected": true
        }
    ],
    "paging": {
        "total": 41,
        "offset": 4,
        "limit": 4
    }
}

Journal système

Nécessite le profil Admin.

GET /api/v1.2/system/logs
Paramètres
Nom Type Description
all booléen Renvoyer également les logs d'information.
search text Recherche search dans les logs.
negative booléen search ne doit pas être présent dans les logs.
noCase booléen Ne pas tenir compte de la casse pour search.
regex booléen searchest une expréssion régulière.
Exemple de requête
POST /api/v1.2/system/logs?limit=4
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
{
    "systemLogs": [
        {
            "dateTime": "2021-07-26T17:47:30+02:00",
            "name": "Connect@Connection.cpp",
            "type": "WARNING",
            "event": "connect() to 8383838:4000: Invalid argument [22]"
        },
        {
            "dateTime": "2021-07-26T17:47:12+02:00",
            "name": "SetStatus@SourceStream.cpp",
            "type": null,
            "event": "[4.11] stream status : connected and received frames"
        },
        {
            "dateTime": "2021-07-26T17:47:11+02:00",
            "name": "CheckTimeout@SourceStream.cpp",
            "type": null,
            "event": "[4.11] WARNING: no frame received for 10 seconds"
        },
        ...
    ],
    "paging": {
        "total": 2102,
        "offset": 20,
        "limit": 20
    }
}

Tâches

Toutes les requêtes concernant les tâches doivent être effectuées avec un utilisateur et mot de passe (voir la partie Identification). L'utilisateur doit avoir le profil spécifique Admin.

Liste des tâches

La liste des tâches permet de connaitres quelles sont les tâches serveur qui sont en cours d'exécution, ont été effectuées ou sont en attente.

GET /ap1/v1.2/tasks
Paramètres
Nom Description Remarque
type Type de tâche Facultatif. Vvaleurs possibles : 'concat', 'postindex', 'purgecam', 'repaircam','sum','kill'
status Statut de la tâche Facultatif. Valeurs possibles : 'new', 'running', 'aborted', 'killed', 'done'
Exemple de requête
GET /api/v1.2/tasks?type=concat
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
HTTP/1.1 200 OK
Content-Length: 2423
Content-Type: application/json
{
    "tasks": [
        {
            "id": 26,
            "type": "concat",
            "status": "done",
            "updated": "2021-10-01T14:18:15Z",
            "progress": "100%",
            "userId": 1,
            "userName": "Admin"
        },
        {
            "id": 25,
            "type": "concat",
            "status": "done",
            "updated": "2021-09-29T16:36:35Z",
            "progress": "100%",
            "userId": 12,
            "userName": "norbert_t"
        },
        {
            "id": 24,
            "type": "concat",
            "status": "done",
            "updated": "2021-09-29T16:36:27Z",
            "progress": "100%",
            "userId": 1,
            "userName": "Admin"
        },
        ...

Récupérer une tâche

La récupération d'une tâche permet d'obtenir ses informations en fournissant l'identifiant de la tâche.

GET /api/v1.2/tasks/:id
Exemple de requête
GET /api/v1.2/tasks/26
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
Exemple de réponse
HTTP/1.1 200 OK
Content-Length: 2423
Content-Type: application/json
{
    
    "id": 26,
    "type": "concat",
    "status": "done",
    "updated": "2021-10-01T14:18:15Z",
    "progress": "100%",
    "userId": 1,
    "userName": "Admin"
}
Camtrace SAS - Tous droits réservés