Accueil > Linux > Caméra IP commandée en POST

Caméra IP commandée en POST

La plupart des caméras IP se commandent grâce à des requêtes GET. Mais il y a des rebelles qui n’acceptent que les requêtes POST… Et tout les logiciels de pilotage de caméra IP ne gèrent pas GET et POST.

Pour remédier à cela, trois solutions :

  1. Changer de caméras IP : Mauvaise idée… Ca coûte des sous !
  2. Changer de logiciel de pilotage : Re mauvaise idée, j’aime bien celui que j’utilise. Et ça coûte aussi des sous…
  3. Passer par un intermédiaire qui va convertir les GET du logiciel en POST pour la caméra : Voila une solution qui ne coûte pas chère !

L’intermédiaire  en question est un hébergeur qui supportera l’exécution de fichier php (Free, OVH, un serveur perso chez soi, …).

Préparation

Créer le fichier cameraip.php :

<?php
//
// Exemple :
// Pour le flux video : /cameraip.php&/MJPEG.CGI&123.123.123.123:1234
// Pour le controle   : /cameraip.php&/PANTILTCONTROL.CGI&123.123.123.123:1234&PanTiltPresetPositionMove=3
//
// En clair :
//
// 	/cameraip.php & /chemin & ipcamera:port & Parametre=valeur
//
// Il peut y avoir plusieurs paramètre mais doivent être séparés par un &
//

	$a = explode( '&', $_SERVER['QUERY_STRING'], 3 );
	if ( count( $a ) < 2 ) die;

	$path = $a[0];

	$h = explode( ':', $a[1] );

	$host = $h[0];
	$port = isset( $h[1] ) ? $h[1] : 80;

	if ( count( $a ) == 2 ) // Si pas de paramètres : redirection simple
	{
		header( "Location: http://$host:$port$path" );
	}
	else // Sinon convertion du GET en POST...
	{
		$params = $a[2];
		$length = strlen( $params );

		echo "<pre>";
		echo "$host:$port$path -> $params\n";

		if ( $fd = fsockopen( $host, $port, $errno, $errmsg ) )
		{
			echo "Connecté à $host:$port\n";

			$data = "POST $path HTTP/1.1\r\n".
				"TE: deflate,gzip;q=0.3\r\n".
				"Connection: TE, close\r\n".
				"Host: $host\r\n".
				"User-Agent: libwww-perl/5.834\r\n".
				"Content-length: $length\r\n".
				"Content-Type: application/x-www-form-urlencoded\r\n".
				"\r\n".
				"$params";

			fputs( $fd, $data );

			$ret = '';
			while( !feof( $fd ) ) $ret .= fgets( $fd, 4096 );
			fclose( $fd );
			echo $ret;
		}
		else
		{
			echo "Connection impossible à $host:$port\n$errno : $errmsg";
		}
		echo "</pre>";
	}
?>

Placez ce fichier sur votre site web.

L’idée est simple, cameraip.php prends trois paramètres :

  1. Le chemin et fichier qui permet, soit de récupérer le flux vidéo (Ex : /MJPEG.CGI), soit de commander la caméra (Ex: /PANTILTCONTROL.CGI).
  2. L’adresse et le port de la caméra (cameraip.php ne la connait pas).
  3. Optionnel, les paramètres de contrôles (Mouvement, zoom, etc).

Utilisation

Prenons un exemple

  • Votre site web est à l’adresse www.hebergeur.fr/monsite.
  • Vous stockez cameraip.php à la racine de votre site.
  • Vos caméras ip sont à l’adresse : chezmoi.dyndns.org avec comme port le 9001 pour la première, 9002 pour la deuxième… (Vous avez évidement fait les redirections de port adéquats).
  • Le flux vidéo de vos caméras s’obtient par /MJPEG.CGI.
  • Le pilotage de vos caméras se fait par l’intermédiaire de /PANTILTCONTROL.CGI suivi des diverses commandes.

Dans votre logiciel favori

  • Adresse de la caméra IP :
www.hebergeur.fr
  • Flux vidéo caméra 1 :
/monsite/cameraip.php?/MJPEG.CGI&chezmoi.dyndns.org:9001
  • Commande 1 caméra 1 :
/monsite/cameraip.php?/PANTILTCONTROL.CGI&chezmoi.dyndns.org:9001&Commande=1

Commande=1 n’est qu’un exemple, adaptez en fonction de vos caméras.

Conclusion

En attendant que les caméras et les logiciels parlent tous la même langue, cette solution permet de patienter…

  1. benoit
    11/10/2010 à 16:56 | #1

    Bonjour,

    J’ai une webcam Dling DCS-3411, connectée à un routeur. Je n’arrive pas à afficher sur une page web (html, ou php) le flux de ma webcam. Donc j’essaye d’utiliser votre code cameraip.php.
    Donc j’installe sur mon ftp le fichier cameraip.php
    Je lance dans le navigateur :
    « http://monsite.fr/webcam/cameraip.php?/MJPEG.CGI&217.128.11.202:554″
    il n’affiche rien.

    Je pense qu’il manque plusieurs informations. Entr’autres, où va-t-il trouver le fichier mjpeg.cgi.
    Comment puis-je afficher le flux de ma webcam, sans installer un serveur entre cette dernière et le routeur ?
    Merci pour votre aide ou guide de recherche
    Cdt
    Benoit

  2. 13/10/2010 à 15:08 | #2

    Bonjour,
    En fait, toute caméra IP embarque un serveur web. Et donc, sur le réseau local, en tapant dans votre navigateur l’adresse de la caméra suivi de VIDEO.CGI ou MJPEG.CGI, on obtient un flux continu de données correspondant à ce que voit la caméra (le fichier n’existe pas vraiment). C’est un peu une norme en quelque sorte.
    Si vous voulez voir ce flux de l’extérieur de chez vous (derrière un routeur ou une box), il faut simplement faire une redirection de port, rien de plus.
    Mon fichier php ne sert qu’a envoyer des commandes de pilotage pour la caméra. Il reçoit des commandes passés en GET pour le convertir en POST. J’ai écrit ce fichier parce que j’utilise un logiciel qui ne sait envoyer que des commandes GET alors que ma caméra ne supporte que les POST. Mais la grande majorité des caméras fonctionne en GET.
    Voila ;o)

  3. Thierry
    25/03/2013 à 20:26 | #3

    Bonjour,

    Je suis très interesé par ce script, mais je n'arrive pas à obtenir d'image !

    Comme vous je souhaite utiliser EyeSeeU avec une caméra TrendNet TV-IP400W.

    J'ai créé le fichier cameraip.php, il est bien placé à la racine de mon site.

    Dans votre descriptif vous indiquez: Votre site web est à l’adresse http://www.hebergeur.fr/monsite.

    Je me demande si mon probleme ne vient pas de là !

    On va dire que mon site s'appele http://www.toto.fr hebergé chez ovh, que dois-je indiquer dans le logiciel sur l'iPhone dans la rubrique "Adresse de la caméra ip" ainsi que dans "Flux vidéo caméra 1" à la place de "monsite" ?

    Je vous remercie par avance pour vos éclaicicements.

    Cordialement.

  4. 26/03/2013 à 11:27 | #4

    Bonjour,

    Petit récap :

    http://www.hebergeur.fr : site ou se trouve cameraip.php
    /monsite/cameraip.php : chemin complet de cameraip.php (peut être simplement /cameraip.php)
    chezmoi.dyndns.org : adresse de la box (ou routeur) derrière laquelle se trouve les caméras (prévoir les redirections de ports.

    http://www.hebergeur.fr et chezmoi.dyndns.org peuvent être les mêmes mais dans mon cas, je n'ai pas de serveur Apache sur le même site que les caméras.

    Il n'est pas obligatoire d'utiliser cameraip.php pour visualiser le flux vidéo. C'est seulement dans le cas où on souhaite controler la caméra.

    Pour EyeSeeU avec une caméra TrendNet TV-IP400W :

    Adresse : chezmoi.dyndns.org:9001
    Flux video : /cgi/mjpg.cgi

    Avec le login et mot de passe adéquat.

    J'espère avoir était plus clair :)

  5. Thierry
    02/04/2013 à 09:20 | #5

    Bonjour et merci pour vos explications.

    Avec la version gratuite de EyeSeeU et en partant d'un paramétrage "Image", je suis enfin arrivé à obtenir la visibilité de la caméra avec "monsite/cameraip.php?/MJPEG.CGI&chezmoi.dyndns.org:9001" dans l'onglet "Address" de l'appli.

    Par contre en ce qui concerne la mobilité de la caméra je n'y arrive toujours pas ! Je pense que cela vient de "Commande1". Par quoi faut-il remplacer "Commande 1" de votre exemple ? Je suppose que cela doit être lié à ce qui est paramétré dans la caméra ?

    Dans l'onglet "Preset Position" de la caméra (TrendNet TV-IP400W) il y a des chiffres de 0 à 24 ainsi que la possibilité de donner un nom, Par exemple 0 Home, 1 Gauche, etc… Concrètement, par quoi dois-je remplacer les xxx à la fin de la ligne de commande "monsite/cameraip.php?/PANTILTCONTROL.CGI&chezmoi.dyndns.org:9001&xxx"

    Merci par avance pour vos précieuses explications.

  6. 05/04/2013 à 21:26 | #6

    Bonsoir,

    Pour info, les commandes à passer sont spécifiques à chaque marque. En ce qui concerne la IP400W, j’ai trouvé cette page qui décrit toutes les commandes : https://code.google.com/p/ip400w-http/wiki/IP400Wpantilt
    Une des commandes qui peut vous intéresser est PanTiltPresetPositionMove=X où X est le numéro de la position enregistrée.

    Bonne lecture et bon week-end.

  1. Pas encore de trackbacks