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)

  1. Pas encore de trackbacks