Site : tvaira.free.fr
POCO (pocoproject.org) est un ensemble de bibliothèques open source C ++ pour la construction d’applications liées au réseau et Internet qui fonctionnent pour des stations, serveurs, mobiles et systèmes embarqués.
La documentation de POCO (cf. POCO C++ Libraries).
L’utilisation des bibliothèques POCO doit permettre d’émettre des requêtes HTTP vers les CGI de la caméra Wanscam afin de commander son orientation PTZ.
Remarque : les unités PTZ (Pan Tilt Zoom) sont utilisées pour la mise au point des caméras de surveillance et de visioconférence sur un objet. Pan est la rotation de la caméra autour de l’axe Z, Tilt est l’inclinaison de la caméra sur l’axe X, et Zoom est le mouvement de la lentille motorisée le long de l’axe Y.
Pour installer les bibliothèques de développement de POCO, il faudra faire :
$ sudo apt-get install libpoco-dev
Les options de compilation seront :
-lPocoNet -lPocoFoundation
Pour tester la mise en oeuvre des bibliothèques POCO dans le cadre de nos besoins, nous allons utiliser un programme d’exemple fourni.
Celui-ci reçoit en argument de la ligne de commande l’URL (Uniform Resource Locator), émet une requête HTTP vers cette adresse web et reçoit la réponse du serveur :
#include <Poco/Net/HTTPClientSession.h>
#include <Poco/Net/HTTPRequest.h>
#include <Poco/Net/HTTPResponse.h>
#include <Poco/StreamCopier.h>
#include <Poco/Path.h>
#include <Poco/URI.h>
#include <Poco/Exception.h>
#include <iostream>
#include <string>
using namespace Poco::Net;
using namespace Poco;
using namespace std;
// sudo apt-get install libpoco-dev
// g++ -o test-poco-0 test-poco-0.cpp -lPocoNet -lPocoFoundation
int main(int argc, char **argv)
{
if (argc != 2)
{
cout << "Usage: " << argv[0] << " <uri>" << endl;
cout << " fetches the resource identified by <uri> and print it" << endl;
return -1;
}
try
{
// prepare session
URI uri(argv[1]);
HTTPClientSession session(uri.getHost(), uri.getPort());
// prepare path
string path(uri.getPathAndQuery());
if (path.empty()) path = "/";
// send request
HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1);
session.sendRequest(req);
// get response
HTTPResponse res;
cout << res.getStatus() << " " << res.getReason() << endl;
// print response
istream &is = session.receiveResponse(res);
StreamCopier::copyStream(is, cout);
}
catch (Exception &ex)
{
cerr << ex.displayText() << endl;
return -1;
}
return 0;
}
On fabrique l’exécutable :
$ g++ -o test-poco-0 test-poco-0.cpp -lPocoNet -lPocoFoundation
Et on réalise un simple test vers une l’adresse web http://tvaira.free.fr/test.htm
:
$ ./test-poco-0
Usage: ./test-poco-0 <uri>
fetches the resource identified by <uri> and print it
$ ./test-poco-0 http://tvaira.free.fr/test.htm
200 OK
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Un titre</title>
<meta http-equiv="Content-type" content="text/html; charset=ISO-8859-1" />
<style type="text/css">
body
{
background-color: #000000;
}
img
{
border: 1px solid #fff;
}
#entrer
{
position: absolute;
width: 100px; height: 100px;
top: 50%; left: 50%;
margin-left: -50px; margin-top: -50px;
}
</style>
</head>
<body>
<div id="entrer">
<img src="./logo.gif" alt="entrez !" />
</div>
</body>
</html>
Conclusion : le programme de test fourni est capable d’émettre une requête HTTP et recevoir une réponse du serveur contacté.
On reprend l’exemple précédent et on y intègre une URL vers un CGI de la caméra Wanscam. Ici pour le test, on se limite à une commande en montée de la caméra :
#include <Poco/Net/HTTPClientSession.h>
#include <Poco/Net/HTTPRequest.h>
#include <Poco/Net/HTTPResponse.h>
#include <Poco/StreamCopier.h>
#include <Poco/Path.h>
#include <Poco/URI.h>
#include <Poco/Exception.h>
#include <iostream>
#include <string>
using namespace Poco::Net;
using namespace Poco;
using namespace std;
// sudo apt-get install libpoco-dev
// g++ -o test-poco-1 test-poco-1.cpp -lPocoNet -lPocoFoundation
int main(int argc, char **argv)
{
// Commande en montée la caméra IP Wanscam
char url[] = "http://192.168.52.216:99/decoder_control.cgi?command=0&onestep=1&user=admin&pwd=";
// prepare session
URI uri(url);
HTTPClientSession session(uri.getHost(), uri.getPort());
// prepare path
string path(uri.getPathAndQuery());
if (path.empty()) path = "/";
// send request
HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1);
session.sendRequest(req);
// get response
HTTPResponse res;
cout << res.getStatus() << " " << res.getReason() << endl;
// print response
istream &is = session.receiveResponse(res);
StreamCopier::copyStream(is, cout);
return 0;
}
Les sources des exemples C++.