Site : tvaira.free.fr

Mise en oeuvre de POCO

POCO

Présentation

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).

Retour au sommaire

Objectifs

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.

Installation (Ubuntu 12.04)

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

Retour au sommaire

Exemple en C++

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é.

Exemple avec la caméra Wanscam

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++.

Retour au sommaire