Ce document décrit le fonctionnement de l’API HTTP disponible sur les serveurs CamTrace dont la version est supérieure ou égale à v16.0.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 (mosaïques) en mode cycles, correction des exemples de requêtes |
1.2-03 | 17/06/2020 | Romain RIGOT | Ajout des tranches, correction des exemples de requêtes |
1.2-04 | 02/12/2020 | Romain RIGOT | Ajout de champs manquant dans les requêtes groupes (mosaïques) |
1.2-05 | 08/12/2020 | Romain RIGOT | Fonctionnalités 15.2 : folders |
1.2-06 | 15/04/2021 | Romain RIGOT | Services RTSP et Push HTTP |
1.2-07 | 26/07/2021 | Romain RIGOT | Fonctionnalités 15.2.1 : logs |
1.2-08 | 04/10/2021 | Romain RIGOT | Fonctionnalités 15.2.1 : tasks |
1.2-09 | 19/07/2022 | Romain RIGOT | Fonctionnalités 16.0 : URLs RTSP et informations sur les flux |
1.2-10 | 27/07/2022 | Romain RIGOT | Fonctionnalités 16.0 : Evènements de métadonnées |
1.2-11 | 28/09/2022 | Romain RIGOT | Fonctionnalités 16.0 : Déclenchement et activation de scénarios |
1.2-12 | 12/10/2022 | Romain RIGOT | Service mosaïques Push HTTP, fonctionnalités : mains courantes |
1.2-13 | 22/12/2022 | Romain RIGOT | Compléments sur fonctionnalité déclenchement et acquittement d’alarmes |
1.2-14 | 10/07/2023 | Romain RIGOT | Fonctionnalités 16.2 : informations sur les fonctionnalités caméras |
1.2-15 | 31/07/2023 | Romain RIGOT | Fonctionnalités 16.2 : informations réseau de la caméra |
1.2-16 | 05/09/2023 | Romain RIGOT | Uniformisation du wording : les groupes deviennent mosaïques |
1.2-17 | 14/02/2024 | Romain RIGOT | Complément sur les évènements de métadonnées (recherche) |
1.2-18 | 27/04/2024 | Romain RIGOT | Amélioration de la description des méthodes d’authentification |
1.2-19 | 14/05/2024 | Romain RIGOT | Nouvelle Fonctionnalité pour CT-Server 9.16.2.1 : Sauvegarde et restoration de configuration |
1.2-20 | 28/05/2024 | Romain RIGOT | Complément sur la récupération des alarmes |
1.2-21 | 09/12/2024 | Romain RIGOT | Nouvelle Fonctionnalité pour CT-Server 9.16.2.1 : Ajout du paramètre argName aux commandes ptz |
1.2-22 | 03/02/2025 | Romain RIGOT | Correction des noms de paramètres |
Le service RTSP permet de visualiser les flux vidéos live et replay de dernière alarme des caméras déclarées sur le serveur CamTrace. Ce service est disponible pour les versions de CamTrace Nova 14 à partir de la 14.1.0 pour le live et CamTrace Sirion 16 à partir de la 16.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.
L’accès à un flux vidéo, respectivement :
Flux à diffusion retardée
),Mémoriser les alarmes pour rejouer
),se fait via une URL RTSP composée comme ceci:
<serveur>:<port-rtsp>/live/view/<id-flux>
rtsp://<serveur>:<port-rtsp>/live/delayed/<id-flux>
rtsp://<serveur>:<port-rtsp>/live/alarm/<id-flux>
rtsp://<serveur>:<port-rtsp>/replay/view/<id-flux> rtsp://
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.
L’identifiant du flux s’obtient via la requête sur l’API HTTP :
GET /api/v1.2/cameras
qui contient un tableau avec la liste
des caméras. Chaque élément du tableau contient l’ID caméra dans le
champ id
ainsi qu’un tableau streams contenant lui même
l’ID de chaque flux dans le champ id
. (voir la partie Récupération d’une caméra)
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 d’accès à un flux live RTSP:
rtsp://192.168.1.100:8554/live/view/2.6
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. L’authentification Digest est supportée de préférence. Il est également possible de renseigner directement ces information dans l’URL d’accès au flux RTSP en suivant la forme :
<user>:<pass>@<serveur>:<port-rtsp>/<id-flux> rtsp://
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):
<serveur>:<port-http>/<live_view_stream_path> http://
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
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:
<serveur>:<port-http>/<live_view_stream_path>?user=<user>&pass=<password> http://
Il est possible de créer une mosaïque, compressée en MJPEG, constituée d’un flux de caméras différentes (voir plusieurs fois la même). Cette mosaïque est accessible en PUSH HTTP.
<serveur>:<port-http>/m?ids=id_cam1,id_cam2,...&compr=tx_compr http://
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) |
ids | Liste des identifiants de caméras devant constituer la mosaïque. |
compr (optionnel) | Une valeur comprise entre 1 et 99 pour indiquer le niveau de compression des images jpeg constituant le flux envoyé. Plus la valeur est élevée, plus les images seront compressées. |
L’identifiant (id) des caméras s’obtient via la requête de l’API
HTTP: GET /api/v1.2/cameras
. 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/m?ids=3,1,2&compr=20
L’authentification fonctionne de la même manière que pour la visualisation d’un flux en PUSH HTTP (voir ci dessus).
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, mosaïques, écrans, etc présent sur un serveur CamTrace.
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<votre-serveur>
Host:
# 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":[...]}
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. |
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": [...]
}
});
Les requêtes nécessitant une authentification 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 403 Forbidden
ou
404 Not Found
dans certains cas.
Si vous utilisez HTTPS alors la méthode HTTP Basic peut être 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. De plus, le mot de passe utilisateur est stocké de manière sécurisée dans la base de données. Il est donc conseillé dans tous les cas d’utiliser préférentiellement le méthode d’authentification WSSE.
Le liste des méthodes d’authentification disponibles pour un utilisateur donné est accessible via une requête (non authentifiée) sur l’API HTTP REST du CT-Server. Voir la Liste des méthodes d’authentifications.
Les CT-Server implémentent la méthode d’authentification standard HTTP Basic (voir détails sur wikipedia). Cette méthode pourra néanmoins être ammenée à ne plus être supportée par défaut. Ci-dessous, un exemple de requête avec authentification Basic :
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":[]}
À l’origine, l’algorithme WSSE Username Token fait parti des spécifications WS-Security de SOAP. Cette méthode est à privilégier car plus sécurisée que la méthode HTTP Basic. Pour s’authentifier, 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><hashed-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 <hashed-password>
, le tout
encodé en sha1.
Lorsque la méthode d’authentification n’est
pas accompagnée d’un paramètre salt
, le
PasswordDigest
doit être calculé avec
<hashed-password>
généré par la fonction MD5.
Lorsque la méthode d’authentification est
accompagnée du paramètre salt
, le
PasswordDigest
doit être calculé avec
<hashed-password>
généré par la fonction Bcryt.
Cette méthode est à privilégier si elle est
disponible.
Ci-dessous, un exemple de calcul du mot de passe demo et un hashage avec BCrypt:
let salt = "$2y$10$ECHujA0Fstk2yBkVmuwV4O" // Récupéré via GET /api/v1.2/users/demo/auth
let password = bcrypt.hash('demo', salt)
let nonce = "LquMOTwiov5/LoKzy3Ru0bpTWvM=" // Doit être "unique" à chaque authentification
let created = '2024-03-13T19:45:00Z' // Date ISO 8601 au moment de la requête
let passwordDigest = b64_sha1(nonce + created + password);
// => E/sIi5aIbon0zkqly7JwnmoqVjE=
La chaine E/sIi5aIbon0zkqly7JwnmoqVjE= est donc la valeur
PasswordDigest
à envoyer au serveur pour
l’authentification. Ce mot de passe est valide pendant 10 secondes et
doit être recalculé à chaque requête.
Vous devez veiller à ce que l’heure du client soit synchronisée avec l’heure du serveur. Dans le cas contraire, si il y a plus de 10 secondes de décallage entre la date ISO envoyée en paramètre et l’heure du serveur, l’authentification sera refusée.
Vous pouvez récupérer le timestamp et la timezone du serveur via une requête (non authentifiée) sur l’API HTTP REST du CT-Server. Voir Date et heure du serveur
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="E/sIi5aIbon0zkqly7JwnmoqVjE=", Nonce="LquMOTwiov5/LoKzy3Ru0bpTWvM=", Created="2024-03-13T19:45:00Z"
HTTP/1.1 200 OK
Date: Wed, 13 Mar 2024 19:44:01 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":[]}
Parfois, il est nécessaire de passer les paramètres de l’authentification 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.
GET /api/v1.2/cameras?_username=demo&_password=demo
Nom | Description |
---|---|
_username | Nom d’utilisateur. |
_password | Mot de passe de l’utilisateur. |
GET /api/v1.2/cameras?_username=demo&_password=bc%2BAAFOSnebE96iEilMMquA7l8E%3D&_nonce=UHQJ5DN947AEAMPQN1H3G&_created_at=2014-03-13T19:45:00Z
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. |
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 !"}
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
La liste des méthodes d’authentifications permet de savoir quels sont les types d’authentifications autorisés pour un utilisateur donné ainsi que les paramètres associés le cas échéant. Cette requete est accessible sans authentification.
GET /ap1/v1.2/users/:name/auth
GET /ap1/v1.2/users/admin/auth Content-Type: application/json
HTTP/1.1 200 OK
Content-Length: 211
Content-Type: application/json
{
"auth": [
{
"type": "wsse",
"salt": "$2y$10$1Ym5LlN4Sc3VANyZFSp/Eu"
},
{
"type": "wsse"
},
{
"type": "basic"
}
]
}
Nom | Type | Description |
---|---|---|
type | liste | Type d’authentification (basic ou wsse) |
salt | string | “sel” à utiliser pour la méthode de hachage bcrypt |
Cette information peut notemment être utile dans le cas de l’utilisation d’une authentification WSSE.
GET /api/v1.2/getservertime
HTTP/1.1 200 OK
Content-Length: 88
Content-Type: application/json
{
"serverTime": {
"timestamp": 1711475612,
"timezone": "Europe/Berlin"
}
}
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 /api/v1.2/servers
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
}
]
}
Toutes les requêtes concernant les caméras doivent être effectuées avec un utilisateur et mot de passe. (voir la partie Authentification).
GET /api/v1.2/cameras
HTTP/1.1 200 OK
Content-Type: application/json
{
"cameras": [
{
"id": 2,
"name": "Vivo8000",
...
},
{
"id": 3,
"name": "Axis214",
...
}
]
}
GET /api/v1.2/cameras/:camera_id
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,
"streams": [
{
"id": 1,
"name": "MsMediaProfile1",
"encoding": "H264",
"width": 1920,
"height": 1080,
"connected": true,
"roles": [
"detect",
"rrecord",
"index",
"arecord",
"mosaic"
],
"quality": 3,
"ignored": false,
"onDemand": false
},
{
"id": 2,
"name": "MsMediaProfile3",
"encoding": "H264",
"width": 640,
"height": 480,
"connected": true,
"roles": [],
"quality": 2,
"ignored": false,
"onDemand": false
}
],
"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,
"deviceInfo": {
"host": "192.168.0.107",
"port": 80,
"https": false,
"login": "admin",
"password": "admin123"
},
}
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 une mosaïque. |
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. |
streams | tableau | Informations sur les flux de la caméra |
ptz | tableau | Description des fonctionnalités PTZ de la caméra |
deviceId | uuid | Identifiant du connecteur ONVIF / VAPI ou ISAPI éventuellement associé à la caméra |
isIndexingRegul | booléen | True si la caméra est en indexation sur le flux d’enregistrement régulier |
deviceInfo | objet | Informations (host, port, protocole, login, password) de la caméra telle qu’elle a été ajoutée dans le serveur Camtrace |
GET /api/v1.2/cameras/:camera_id/ref.jpg
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.
GET /api/v1.2/cameras/:camera_id/ptz
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. |
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é. |
argName | preset | Correspond au nom du preset demandé plutôt que d’utiliser son id |
$ 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'
Toutes les requêtes concernant les mosaïques (anciennement groupes)
doivent être effectuées avec un utilisateur et mot de passe (voir la
partie Authentification). Pour la
consultation, le profil utilisateur doit avoir le droit correspondant
associé défini pour chaque mosaïque. Il faut également veiller à ce que
l’utilisateur ait les droits de Visualisation
sur les
caméras insérées dans les cycles.
GET /api/v1/groups
HTTP/1.1 200 OK
Content-Type: application/json
{
"groups": [
{
"id": 1,
"name": "FourByFour",
"rows": 2,
"cols": 2,
"pushMode": false,
"fullScreen": false,
"stayOnTop": false,
"displayCode": null,
"layout": [
[0,1],
[2,3]
],
"levels": [
{
"name": "FourByFour 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
}
]
}
],
"href": "/api/v1/groups/1"
}
]
}
GET /api/v1/groups/:group_id
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"name": "FourByFour",
"rows": 2,
"cols": 2,
"pushMode": false,
"fullScreen": false,
"stayOnTop": false,
"displayCode": null,
"layout": [
[0,1],
[2,3]
],
"levels": [
{
"name": "FourByFour 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 mosaïques pour plus d’informations.
Nécessite le profil Admin
.
POST /api/v1.2/groups
Nom | Description |
---|---|
group | Contenu de la mosaïque |
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 mosaïques pour plus d’informations.
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
.
Nécessite le profil Admin
ou que le droit
édition
soit coché pour cette mosaïque dans le profil
utilisateur. Il existe 2 niveaux de modification d’une mosaïque :
PUT /api/v1.2/goups/:group_id
Pour la modification profonde :
Nom | Description |
---|---|
group | Contenu de la mosaïque. 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 |
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 mosaïques pour plus d’informations.
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,
}
]
}
]
}
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
.
Nom | Type | Description | Ajout | Modification | |
---|---|---|---|---|---|
id | entier | Identifiant Camtrace de la mosaïque | Non | Non | |
name | texte | Nom de la mosaïque | Obligatoire | Optionnel | |
pushMode | booléen | Si la mosaïque 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 de la mosaïque | 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 la mosaïque | 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.
Liste des différents attributs qui figurent dans la définition de
chaque niveau (levels
) de la mosaïque.
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 de la mosaïque | 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.
Liste des différents attributs qui figurent dans la définition de
chaque cellule d’un niveau (levels
) de la mosaïque.
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 * | Optionnelle * |
type | caractère | type d’élément dans la cellule c pour
caméra,i pour image,w pour webbrowser |
Optionnelle, c par défaut |
Non |
mode | caractère | Mode dépendant du type d’élément v pour vidéo,
a pour alarme |
Optionnelle, v par défaut |
Non |
url | texte | url selon le type d’élément | Si type = w ou i |
Non |
showMargin | booléen | Sans objet | Optionnelle | Non |
showMenu | booléen | Affichage du menu de cellule du client Camtrace | Optionnelle | Non |
keepRatio | booléen | Affichage de l’image sans déformation (sinon pleine cellule éventuellement déformée) | Optionnelle | Non |
alignment | entier | Sans objet | Optionnelle | Non |
*
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.
La modification en temps réel permet d’altérer, temporairement ou
non, le comportement d’une mosaïque 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 cette mosaïque dans le
profil utilisateur.
GET /api/v1.2/goups/:group_id/override
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 de la mosaïque 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 la mosaïque uniquement avec le paramètre
position
.
GET /api/v1.2/groups/2/override?position=0&cameraId=15&streamId=34&duration=20
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
HTTP/1.1 204 No Content
Content-Type: text/html
Toutes les requêtes concernant les écrans passifs doivent être effectuées avec un utilisateur et mot de passe (voir la partie Authentification).
GET /api/v1.2/screens
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"
}
]
}
GET /api/v1.2/screens/:screen_id
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
}
PUT /api/v1.2/screens/:screen_id
Nom | Description |
---|---|
serverId | L’id du serveur du cluster où trouver la caméra ou la mosaïque à afficher. |
cameraId | L’id de la caméra à afficher. |
groupId | L’id de la mosaïque à afficher. |
PUT /api/v1.2/screens/1
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
{
"screen": {
"serverId": 0,
"groupId": 2
}
}
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
}
Toutes les requêtes concernant les commandes doivent être effectuées avec un utilisateur et mot de passe (voir la partie Authentification).
GET /api/v1.2/exturls
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"
}
]
}
GET /api/v1.2/exturls/:exturls_id
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"
]
}
}
GET /api/v1.2/exturls/:exturls_id/trigger
HTTP/1.1 200 OK
Content-Length: 18
Content-Type: application/json
{"triggered": true}
Toutes les requêtes concernant les alarmes doivent être effectuées avec un utilisateur et mot de passe (voir la partie Authentification) excepté pour les vignettes.
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. Voir
les Types d’évènements reconnus pour plus
d’informations sur les types d’alarmes possibles.
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": "Détection de mouvement : Alarme commence à 2024-05-28T14:50:31Z, pré-alarme de 4s",
"type": "analytics.motion",
"label": "Détection de mouvement",
"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": "Détection de mouvement : Alarm starts at 12/09/2014 at 11:44:07, with 5s pre-alarm",
"type": "analytics.motion",
"label": "Détection de mouvement",
"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": "Détection de mouvement",
"type": "analytics.motion",
"label": "Détection de mouvement",
"snapshot": "/api/v1.2/cameras/alarms/219737.jpg",
"thumbnail": "/api/v1.2/cameras/alarms/219737.jpg?w=50&h=50"
}
]
}
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. |
# 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'
Il est possible de déclencher un état d’alarme sur une ou plusieurs caméras en même temps.
GET /api/v1.2/cameras/alarms/trigger
Nom | Type | Description |
---|---|---|
cameraId | entier ou liste d’entiers | Identifiant de la ou des caméras (séparés par une , )
pour lesquelles déclencher l’alarme (obligatoire) |
type | texte | Type personnalisé de l’alarme (optionnel) |
GET /api/v1.2/cameras/alarms/trigger?cameraId=1,3&type=porte1
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/html
Il est possible d’acquitter un état d’alarme sur une ou plusieurs caméras en même temps.
GET /api/v1.2/cameras/alarms/untrigger
Nom | Type | Description |
---|---|---|
cameraId | entier ou liste d’entiers | Identifiant de la ou des caméras (séparés par une , )
pour lesquelles acquitter l’alarme (obligatoire) |
GET /api/v1.2/cameras/alarms/untrigger?cameraId=1,3
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/html
Toutes les requêtes concernant les exports doivent être effectuées
avec un utilisateur et mot de passe (voir la partie Authentification). 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.
GET /api/v1.2/exports/disks
Aucun
GET /api/v1.2/exports/disks
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
HTTP/1.1 200 OK
Content-Type: application/json
{
"disks": [
{
"id": 1,
"name": "newVol",
"fstype": "ext4",
"totalSpace": 32737501184,
"freeSpace": 32737501184,
}
]
}
GET /api/v1.2/exports
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) |
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
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"
}
]
}
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 |
GET /api/v1.2/exports/:export_id
Aucun
GET /api/v1.2/exports/5
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
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.
POST /api/v1.2/exports
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) |
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"
}
}
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.
GET /api/v1.2/exports/:export_id/download
Aucun
GET /api/v1.2/exports/8/download
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
HTTP/1.1 200 OK
Content-Type: application/zip
Cet appel permet de calculer le hash MD5 du fichier export sur le disque
GET /api/v1.2/exports/:export_id/md5sum
Aucun
GET /api/v1.2/exports/8/md5sum
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
HTTP/1.1 200 OK
Content-Type: application/json
{
"md5sum": "d41d8cd98f00b204e9800998ecf8427e"
}
DELETE /api/v1.2/exports/:export_id
Aucun
DELETE /api/v1.2/exports/8
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
HTTP/1.1 204 NO CONTENT
Content-Type: text/html
Cet appel permet d’archiver l’export et supprime le fichier export sur le disque concerné.
PUT /api/v1.2/exports/:export_id
Nom | Description |
---|---|
archived | ce champ doit prendre un équivalent de “true” pour archiver l’export |
PUT /api/v1.2/exports/9
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
{
"export": {
"archived": 1,
}
}
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.
La création des fichiers d’exports est une opération qui peut prendre un certain temp et peut éventuellement échouer. Cet appel permet de faire une nouvelle tentative de création de l’export le cas échéant.
PATCH /api/v1.2/exports/:export_id
PATCH /api/v1.2/exports/9
Authorization: Basic YWRtaW46Y2FtdHJhY2U=
Content-Type: application/json
HTTP/1.1 200 OK
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/9/download",
"size": 0,
"p100": 0,
"md5sum": null,
"archived": false,
"createdAt": "2018-09-17T13:36:37Z",
"url": "/api/v1.2/exports/9"
}
}
Voir la description des attributs de l’export pour plus d’informations.
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 Authentification). L’utilisateur doit avoir les droits de visualisation sur la caméra correspondant à la séquence à protéger.
L’utilisateur doit avoir un profil avec le niveau spécifique
Admin
ou Protection
.
POST /api/v1.2/precords
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) |
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"
}
}
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"
}
}
Toutes les requêtes concernant les mains courantes doivent être
effectuées avec un utilisateur et mot de passe (voir la partie Authentification). L’utilisateur doit avoir
un profil avec le niveau spécifique consult
.
Seules les mains courantes de caméras dont l’utilisateur a le droit de visualisation seront retournées.
GET /api/v1.2/snapshots
Nom | Description |
---|---|
cameraId | Le ou les id de camera séparés par des "," pour
lesquelles trouver les mains courantes (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) |
userId | L’id de l’utilisateur qui a effectué la main courante (optionnel) |
comment | Tout ou une partie du commentaire de la main courante (optionnel) |
limit | Nombre de résultats demandés. (optionnel) |
offset | Position dans l’ensemble des résultats après application des filtres. Zero correspond aux mains courantes les plus récentes. (optionnel) |
GET /api/v1.2/snapshots?cameraId=1,2&from=2022-10-09T18:00:00Z&to=2022-10-10T12:30:00Z
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
{
"snapshots": [
{
"id": 19,
"time": "2022-10-09T19:47:10Z",
"userId": 1,
"ip": "197.26.193.27",
"cameraId": 1,
"comment": "Un test",
"updatable": false,
"imageUrl": "/api/v1.2/snapshots/19.jpg",
"reportUrl": "/api/v1.2/snapshots/19.pdf"
},
{
"id": 20,
"time": "2022-10-10T08:14:10Z",
"userId": 1,
"ip": "197.26.193.27",
"cameraId": 1,
"comment": null,
"updatable": true,
"imageUrl": "/api/v1.2/snapshots/20.jpg",
"reportUrl": "/api/v1.2/snapshots/20.pdf"
}
], "paging": {
"first": "/api/v1.2/snapshots?limit=20",
"count": 1,
"current": 0,
"last": "/api/v1.2/snapshots?limit=20&offset=0"
}
}
GET /api/v1.2/snapshots/:snapshot_id
Aucun
GET /api/v1.2/snapshots/19
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 19,
"time": "2022-10-09T19:47:10Z",
"userId": 1,
"ip": "197.26.193.27",
"cameraId": 1,
"comment": null,
"updatable": true,
"imageUrl": "/api/v1.2/snapshots/19.jpg",
"reportUrl": "/api/v1.2/snapshots/19.pdf"
}
L’utilisateur doit avoir le droit de visualisation sur la caméra concernée.
POST /api/v1.2/snapshots
Nom | Description |
---|---|
cameraId | L’id de camera sur laquelle prendre la capture du flux vidéo |
time | Date et heure de la main courante au format ISO8601 (optionnel). Si non spécifié, la date sera fixée à l’instant de la requête. |
comment | commentaire associé à la main courante (optionnel) |
POST /api/v1.2/snapshots
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
{
"snapshot": {
"cameraId": 1,
"time": "2022-10-10T13:24:25Z"
}
}
HTTP/1.1 201 CREATED
Content-Type: application/json
{
"snapshot": {
"id": 21,
"time": "2022-10-10T13:24:25Z",
"userId": 1,
"ip": "192.168.0.140",
"cameraId": 17,
"comment": null,
"updatable": true,
"imageUrl": "/api/v1.2/snapshots/21.jpg",
"reportUrl": "/api/v1.2/snapshots/21.pdf"
}
}
L’utilisateur doit avoir le droit de visualisation sur la caméra concernée. Seuls les snapshots n’ayant pas encore de commentaire associé peuvent être mis à jour.
PUT /api/v1.2/snapshots/:snapshot_id
Nom | Description |
---|---|
comment | commentaire associé à la main courante |
PUT /api/v1.2/snapshots/21
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
{
"snapshot": {
"comment": "Test de main courante"
}
}
HTTP/1.1 200 OK
Content-Type: application/json
{
"snapshot": {
"id": 21,
"time": "2022-10-10T13:24:25Z",
"userId": 1,
"ip": "192.168.0.140",
"cameraId": 17,
"comment": "Test de main courante",
"updatable": false,
"imageUrl": "/api/v1.2/snapshots/21.jpg",
"reportUrl": "/api/v1.2/snapshots/21.pdf"
}
}
L’utilisateur doit avoir le droit de visualisation sur la caméra concernée.
GET /api/v1.2/snapshots/:snapshot_id.jpg
Nom | Description |
---|---|
width | Largeur en pixels de l’image (optionnel) |
height | Hauteur en pixels de l’image (optionnel) |
GET /api/v1.2/snapshots/21.pdf
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
La réponse est une image au format JPEG.
L’utilisateur doit avoir le droit de visualisation sur la caméra concernée.
GET /api/v1.2/snapshots/:snapshot_id.pdf
Aucun
GET /api/v1.2/snapshots/21.pdf
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
La réponse est un document au format PDF.
Toutes les requêtes concernant les scénarios doivent être effectuées
avec un utilisateur et mot de passe (voir la partie Authentification). L’utilisateur doit avoir
un profil avec le niveau spécifique Admin
.
GET /api/v1.2/scenarios
Aucun
GET /api/v1.2/scenarios
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
HTTP/1.1 200 OK
Content-Type: application/json
{
"scenarios": [
{
"scenarioId": 1,
"name": "Scenar 1",
"ignored": false
},
{
"scenarioId": 2,
"name": "Scenar 2",
"ignored": true,
}
]
}
Nom | Type | Description |
---|---|---|
scenarioId | entier | Identifiant Camtrace du scénario |
name | texte | Nom du scénario |
ignored | booléen | Indique si le scénario est ignoré ou non |
GET /api/v1.2/scenarios/:id/trigger
Aucun
GET /api/v1.2/scenarios/1/trigger
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
HTTP/1.1 200 OK
Content-Type: application/json
{
"triggered": true
}
PUT /api/v1.2/scenarios/:id
Nom | Description |
---|---|
ignored | Booleen qui prend la valeur true pour ingnorer le
scenario et false pour le rendre à nouveau actif. |
PUT /api/v1.2/scenarios/1
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
{
"scenario": {
"ignored": true
}
}
HTTP/1.1 200 OK
Content-Type: application/json
{
"scenario": {
"scenarioId": 1,
"name": "Scénario test",
"ignored": "true"
}
}
Les enregistrements des caméras vidéos gérées par le serveur Camtrace sont stockés sous forme de tranches au format mkv d’une durée limitée (généralement 10mn maximum). L’API sur les tranches permets de lister les tranches et de les télécharger individuellement. L’utilisateur doit avoir les droits de visualisation sur la caméra correspondant au tranches à visualiser et télécharger.
GET /api/v1.2/slices
Nom | Description |
---|---|
cameraId | Le ou les id de camera séparés par des , pour
lesquelles trouver les tranches (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) |
type | Type d’enregistrement alarme (a) ou régulier (r) |
isProtected | Filtre sur les enregistrements protégés ou non protégés (booléen optionnel) |
GET /api/v1.2/slices?cameraId=1,2&from=2020-06-16T16:25:00Z&to=2020-06-16T16:35:00Z
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
{
"slices": [
{
"cameraId": 1,
"cameraName": "demo2_Tube_CamTrace_CCTN5EW01",
"start": "2020-06-16T16:26:36.903Z",
"stop": "2020-06-16T16:29:46.729Z",
"type": "a",
"downloadUrl": "/api/v1.2/slices/1/2020-06-16T16%3A26%3A36.903Z/a/download",
"size": 144030,
"protected": false
},
{
"cameraId": 1,
"cameraName": "demo2_Tube_CamTrace_CCTN5EW01",
"start": "2020-06-16T16:29:51.458Z",
"stop": "2020-06-16T16:30:10.828Z",
"type": "a",
"downloadUrl": "/api/v1.2/slices/1/2020-06-16T16%3A29%3A51.458Z/a/download",
"size": 15364,
"protected": false
}
]
}
GET /api/v1.2/slices/:cameraId/:start/:type/download
Aucun
GET /api/v1.2/slices/1/2020-06-16T16%3A29%3A51.458Z/a/download
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
HTTP/1.1 200 OK
Content-Type: video/x-matroska
Toutes les requêtes concernant les plans doivent être effectuées avec
un utilisateur et mot de passe (voir la partie Authentification). 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, mosaïques,
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.
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
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"
}
]
}
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
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.
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,
mosaïques, commandes, écrans passifs ou plans) pour lequel l’utilisateur
à le droit visualisation
seront renvoyés.
GET /api/v1.2/maps/:uuid/items
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.
Nécessite le profil Admin
.
POST /api/v1.2/maps
Nom | Description |
---|---|
map | Contenu du plan |
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.
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"
}
}
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
Nom | Description |
---|---|
map | Contenu du plan. Le contenu précédent est intégralement remplacé par le nouveau contenu. |
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.
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"
}
}
DELETE /api/v1.2/maps/:uuid
Aucun
DELETE /api/v1.2/maps/6d20a627-d916-41be-835a-865101763ef5
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
HTTP/1.1 204 NO CONTENT
Content-Type: text/html
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.
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 une mosaïque déclarée 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 |
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 |
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 |
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 |
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 |
Toutes les requêtes concernant les sélections doivent être effectuées
avec un utilisateur et mot de passe (voir la partie Authentification). 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, mosaïques, 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.
GET /api/v1.2/folders
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) |
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"
}
]
}
GET /api/v1.2/folders/:uuid
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.
Nécessite le profil Admin
.
POST /api/v1.2/folders
Nom | Description |
---|---|
folder | Contenu d’une sélection |
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.
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"
}
}
Nécessite le profil Admin
.
PUT /api/v1.2/folders/:uuid
Nom | Description |
---|---|
folder | Contenu de le sélection. Le contenu du champ items
précédent est intégralement remplacé par le nouveau contenu. |
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.
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"
}
}
Nécessite le profil Admin
.
PATCH /api/v1.2/folders
Nom | Description |
---|---|
folders | Tableau de couplesuuid / weight à
modifier. |
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
}
]
}
HTTP/1.1 204 NO CONTENT
Content-Type: application/json
Nécessite le profil Admin
.
DELETE /api/v1.2/folders/:uuid
Aucun
DELETE /api/v1.2/folders/8b6aa627-e455-aabf-4573-865101745dfc
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
HTTP/1.1 204 NO CONTENT
Content-Type: text/html
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.
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 une mosaïque déclarée 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 |
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.
Toutes les requêtes concernant les critères de tris doivent être
effectuées avec un utilisateur et mot de passe (voir la partie Authentification). 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.
GET /api/v1.2/regex
Aucun
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.
Nécessite le profil Admin
.
POST /api/v1.2/regex
Nom | Description |
---|---|
regex | Définition du critère de tri |
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.
HTTP/1.1 201 CREATED
Content-Type: application/json
{
"regex": {
"id": 3,
"name": "Critères 3",
"default": false,
"params": {
"value": "([-]*)-([^-]*)-([^-]*)-([^_]*)_([^_]*)_([^ ]*) ([^_]*)",
"group": [3,4]
}
}
}
Nécessite le profil Admin
.
PUT /api/v1.2/regex/:id
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. |
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.
HTTP/1.1 200 OK
Content-Type: application/json
{
"regex": {
"id": 3,
"name": "Critères 3",
"default": false,
"params": {
"value": "([-]*)-([^-]*)-([^-]*)-([^_]*)_([^_]*)_([^ ]*) ([^_]*)",
"group": [3,5]
}
}
}
Nécessite le profil Admin
.
DELETE /api/v1.2/regex/:id
Aucun
DELETE /api/v1.2/regex/3
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
HTTP/1.1 204 NO CONTENT
Content-Type: text/html
Nom | Type | Description | Ajout | Modification |
---|---|---|---|---|
id | entier | Identifiant du critère de recherche | Non | Non |
name | texte | Nom du critère de recherche | 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 |
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 |
Toutes les requêtes concernant les évènements métadonnées doivent être effectuées avec un utilisateur et mot de passe (voir la partie Authentification).
L’insertion d’un évènement métadonnée pour un connecteur de type
Connecteur API
déclaré sur le serveur CamTrace nécéssite le
droit de profil Insertion de métadonnées
pour le connecteur
correspondant. Seuls les évènements “reconnus” par le serveur CamTrace
peuvent être créés.
POST /api/v1.2/devices/:uuid/events
Nom | Description |
---|---|
event | Caractéristiques de l’évènement |
POST /api/v1.2/devices/3000efd7-62b3-4a6e-ac05-a76f0d831a56/events
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
{
"event" : {
"eventId": "53163f64-0994-4c10-b1ad-44d3c6ff1334",
"type": "accesscontrol.idpointactivity",
"description": {"params": {"idPointName": "pt1"}},
"timestamp": "2022-07-25T16:26:36.903Z"
}
}
Voir la description des attributs d’un évènement métadonnées pour plus d’informations.
HTTP/1.1 201 CREATED
Content-Type: application/json
{
"event": {
"eventId": "53163f64-0994-4c10-b1ad-44d3c6ff1334",
"type": "accesscontrol.idpointactivity",
"timestamp": "2022-07-25T16:26:36.903Z"
}
}
Nom | Type | Description |
---|---|---|
eventId | UUID v4 | Identifiant unique de l’évènement dont la génération est à la charge du client (UUID de type v4 uniquement accepté) |
type | texte | Type de l’évènement |
description | json | paramètres spécifiques relatifs à l’évènement |
timestamp | date | Date GMT de l’évènement au format ISO-8601 |
Type | Paramètres acceptés (attribut params de la
description de lévènement) |
---|---|
accesscontrol.idpointactivity | idPointName |
accesscontrol.idpointrequest | idPointName |
accesscontrol.doormode | |
accesscontrol.doorphysicalstate | |
accesscontrol.dooralarm | |
accesscontrol.accessgranted | userName, doorName |
accesscontrol.accessdenied | userName, doorName |
accesscontrol.accessunknown | |
accesscontrol.accesstaken | userName, doorName |
accesscontrol.accessnottaken | userName, doorName |
analytics.motion | source, window, state |
analytics.presence | state |
analytics.stationary | |
analytics.linecross | objectId |
analytics.multiplelinecross | |
analytics.scenechange | state |
analytics.intrusion | window, state |
analytics.missing | |
analytics.face | state |
analytics.counting | |
analytics.crowd | window, state |
analytics.running | window, state |
analytics.videoloss | state |
analytics.videodefocus | state |
device.casingopen | |
device.tamper | state |
device.networkattack | |
device.networkconflict | state |
device.recordingsavailable | |
device.sdcardmounted | state |
device.sdcarderror | state |
lpr.vehicle | plate |
lpr.whitelist | plate |
lpr.blacklist | plate |
io.input | id, state |
detect.sound | state |
detect.temperature | state |
detect.fire | state |
misc.unknown | |
misc.illegalaccess | |
misc.autotracking | state |
misc.quarantine
Paramètre | Type |
---|---|
idPointName | texte |
userName | texte |
doorName | texte |
source | texte |
window | entier |
state | booléen |
La recherche d’évènements de métadonnées nécéssite le droit de profil
Consultation de métadonnées
pour le connecteur
correspondant. Chaque connecteur possède ses propres critères de
recherche qu’il convient de récupérer préalablement. Voir la partie récupération des critères de recherche
d’un connecteur de métadonnées pour plus d’informations.
POST /api/v1.2/devices/:uuid/proxy/events/search
Nom | Description |
---|---|
criteria | Tableau de critères de recherche sur les évènements |
Voir la description d’un critère de recherche pour plus d’informations.
POST /api/v1.2/devices/3000efd7-62b3-4a6e-ac05-a76f0d831a56/proxy/events/search
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
{
"criteria" : [
{
"name": "type",
"value": "analytics.motion"
},
{
"name": "analytics.source",
"value": "internal",
"comparator": "!="
}
]
}
HTTP/1.1 200 OK
Content-Type: application/json
{
"events": [
{
"id": "b73319ac-2a47-496e-8472-0b40e98c4d0e",
"sourceId": "dcf9a40e-fbaf-4f3e-accd-165f7c32b817",
"timestamp": "2024-02-14T12:17:25.669458Z",
"type": "analytics.motion",
"description": {
"params": {
"cameraId": "7",
"cameraName": "DVR_30_1"
},
"onvifParams": {
"topic": "VMD",
"sourceParams": {
"Source": "1"
}
}
},
"label": "Motion detection from ? in window ? state ?"
},
{
"id": "cfd4fe8b-4069-4562-acc9-d28cf2453a35",
"sourceId": "dcf9a40e-fbaf-4f3e-accd-165f7c32b817",
"timestamp": "2024-02-14T12:17:26.779275Z",
"type": "analytics.motion",
"description": {
"params": {
"cameraId": "7",
"cameraName": "DVR_30_1"
},
"onvifParams": {
"topic": "VMD",
"sourceParams": {
"Source": "1"
}
}
},
"label": "Motion detection from ? in window ? state ?"
}
]
}
La récupération des critères de recherche d’évènements de métadonnées
nécéssite le droit de profil Consultation de métadonnées
pour le connecteur correspondant.
GET /api/v1.2/devices/:uuid/proxy/events/search/criteria
Aucun
HTTP/1.1 200 OK
Content-Type: application/json
{
"criteria": [
{
"name": "cameraName",
"description": "Camera (text)",
"format": "string"
},
{
"name": "type",
"description": "Event type",
"format": "enum",
"values": [
"analytics.stationary",
"analytics.counting",
"analytics.crowd",
"analytics.face",
"analytics.intrusion",
"analytics.linecross",
"analytics.missing",
"analytics.motion",
"analytics.multiplelinecross",
"analytics.presence",
"analytics.running",
"analytics.scenechange",
"analytics.videodefocus",
"analytics.videoloss"
],
"texts": [
"Abandoned object",
"Counting",
"Crowd",
"Face",
"Intrusion",
"Line cross",
"Missing",
"Motion detection",
"Multiple line cross",
"Presence",
"Running",
"Scene change",
"Video focus loss",
"Video loss"
]
},
{
"name": "analytics.source",
"description": "Source",
"format": "enum",
"values": [
"camera",
"internal"
],
"texts": [
"Camera",
"Internal"
]
}
]
}
Chaque critère du tableau criteria
d’une recherche
d’évènements de métadonnées doit être défini comme indiqué
ci-dessous.
Nom | type | Description | Obligatoire |
---|---|---|---|
name | string | Nom du critère tel que renoyé par la requête de récupération des critères de recherche | Oui |
value | mixte | Valeur du critère du type attendu | Oui |
comparator | string | Comparateur à utiliser. Voir le tableau ci-dessous pour les valeurs possibles. | Non (par défaut “=”). |
Les valeurs possibles pour comparator
sont différentes
selon le type de critère.
Type | Valeurs possibles |
---|---|
string | = , != , like ,
ilike |
interger | < , > , <= ,
>= , = , != |
datetime | < , > , <= ,
>= |
boolean | = , != |
enum | = , != |
Toutes les requêtes concernant le monitoring doivent être effectuées
avec un utilisateur et mot de passe (voir la partie Authentification). L’utilisateur doit avoir
un profil avec le niveau spécifique Admin
ou
Monitor
.
Renvoie les informations concernant le license actuellement en cours pour le serveur.
GET /api/v1.2/license
Aucun
GET /api/v1.2/license
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
{
"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"
}
}
Nécessite le profil Admin
.
POST /api/v1.2/license
Nom | Description |
---|---|
license | Le contenu du fichier license |
POST /api/v1.2/license
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
{
"license" : "contenu_du_fichier_license"
}
HTTP/1.1 201 CREATED
Content-Type: application/json
Renvoie les informations matérielles (hardware) du serveur.
GET /api/v1.2/sysinfo
Aucun
GET /api/v1.2/sysinfo
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
{
"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)"
]
}
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
Aucun
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"
}
]
}
}
}
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) |
Toutes les requêtes concernant la sauvegarde et la restoration de
configuration du CT-Server doivent être effectuées avec un utilisateur
et mot de passe (voir la partie Authentification). L’utilisateur doit avoir
un profil avec le niveau spécifique Admin
.
POST /api/v1.2/config/save
Nom | Description |
---|---|
config | Options de configuration |
POST /api/v1.2/config/save
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
{
"config" : {
"medias": true,
"events": false,
"logs": true
}
}
La réponse est un ficher au format ZIP
Voir la description des attributs des options de configuration pour plus d’informations.
POST /api/v1.2/config/restore
Nom | Description |
---|---|
file | Configuration du CT-Serveur (fichier TGZ) |
config | Options de configuration (JSON au format texte) |
POST /api/v1.2/config/restore
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: multipart/form-data
camtrace_9.16.2.1_20240507-113218.zip
{
"config" : {
"database" : {"logs": true},
"network": false,
"files": false
}
}
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: application/json
{
"restoreConfig": {
"procName": "loadconfigIDtIhz"
}
}
Voir la description des attributs des options de configuration pour plus d’informations.
Nom | Type | Description | Sauvegarde | Restoration |
---|---|---|---|---|
database | tableau | options de restoration de la base de données. Si le paramètre est présent, même vide, la base de donnée sera restorée | Non | Optionnel |
medias | booléen | importer / exporter les médias (enregistrements, images, exports, index) | Optionnel | Optionnel |
events | booléen | importer / exporter les évenements (métadonnées) | Optionnel | Optionnel |
logs | booléen | importer / exporter les journaux (alarmes, actions, connexions, notes) | Optionnel | Optionnel |
network | booléen | importer la configuration réseau (adresses IP, passerelle, DNS…) | Non | Optionnel |
services | booléen | importer les services (configurations des ports, accès distant, interface graphique…) | Non | Optionnel |
licenseKey | booléen | importer la clé de licence | Non | Optionnel |
files | booléen | importer les fichiers personnalisés (maps, sons…) | Non | Optionnel |
L’absense d’une option dans la requete équivaut à ne pas importer /
exporter l’élément concerné (booléen à faux). Les options
medias
, events
et logs
doivent
être dans le tableau database
dans le cas d’une importation
de configuration.
Cette requete permet de vérifier le statut de l’import de la configuration. Le serveur web peut néanmoins être inaccessible pendant le processus et la requete échouera. Il faut donc la relancer jusqu’à ce que les services soint à nouveau opérationnels.
GET /api/v1.2/config/restore/status
Nom | Type | Description |
---|---|---|
procName | String | Nom du processus de restoration retourné par le requete POST de restoration (obligatoire) |
GET /api/v1.2/cameras/alarms/trigger?procName=loadconfigIDtIhz
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
HTTP/1.1 200 OK
Content-Length: 0
Content-Type: application/json
{
"restoreConfig": {
"status": "done",
"success": true,
"message": []
}
}
Toutes les requêtes concernant la consulation de journeaux doivent
être effectuées avec un utilisateur et mot de passe (voir la partie Authentification). L’utilisateur doit avoir
le profil spécifique Admin
.
Nécessite le profil Admin
.
GET /api/v1.2/users/actions
GET /api/v1.2/users/:id/actions
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. |
GET /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
{
"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
}
}
Nécessite le profil Admin
.
GET /api/v1.2/cameras/connections
GET /api/v1.2/cameras/:id/connections
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. |
POST /api/v1.2/cameras/2/connections?limit=4
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
{
"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
}
}
Nécessite le profil Admin
.
GET /api/v1.2/system/logs
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 | search est une expréssion régulière. |
POST /api/v1.2/system/logs?limit=4
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
{
"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
}
}
Toutes les requêtes concernant les tâches doivent être effectuées
avec un utilisateur et mot de passe (voir la partie Authentification). L’utilisateur doit avoir
le profil spécifique Admin
.
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
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’ |
GET /api/v1.2/tasks?type=concat
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
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"
},
...
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
GET /api/v1.2/tasks/26
Authorization: Basic YWRtaW46Y2FtdHJhY2U= Content-Type: application/json
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"
}