Mise en oeuvre de la caméra IP Wanscam

Présentation

La caméra IP Wanscam est conçue pour être installée en intérieur. Elle peut être reliée via un câble réseau Ethernet RJ45 ou sans fil en WiFi B/G/N.

La caméra IP Wanscam JW0008

La caméra IP Wanscam JW0008

Ses caractèristiques principales sont :

  • Résolution de l’image 640x480 (VGA) ou 320x240 (QVGA)
  • Lentille : f 3,6mm
  • Eclairage IR à 10 LED pour une vision de nuit jusqu’à 10 mètres.
  • Filtre IR-CUT
  • Compression vidéo : MJPEG
Ne jamais tourner la caméra à la main, cela pourrait endommager son mécanisme.

Branchement de la caméra

  • Vissez l’antenne Wifi sur son connecteur sans forcer.
  • Branchez un câble réseau RJ45 sur la prise réseau.
  • Connectez la fiche de l’adaptateur secteur sur la prise “Power DC” de la caméra puis connectez l’adaptateur secteur sur une prise de courant.
  • Attendez 1 minute environ que la caméra démarre.

Lors de son démarrage, la caméra s’est autoconfigurée avec une adresse IP fournie par un serveur DHCP présent sur votre réseau.

La caméra est utilisable et administrable à partir d’un navigateur web.

Suivant les modèles, le port par défaut de la caméra est 99 (ou 81). 

L’accès se fait via http://ip-de-la-camera:99/ avec le compte admin sans mot de passe.

Par exemple :

La page d’accueil permet de choisir (la langue et) le lien adapté à son navigateur :

Par exemple pour Firefox :

En naviguant, on peut accéder à la page d’administration :

Tests CGI

Il est conseillé de lire la documentation de la caméra qui précise l’exploitation des programmes CGI.

CGI (Common Gateway Interface) est une interface utilisée par les serveurs HTTP. Elle a été normalisée par la RFC 3875. Au lieu d'envoyer le contenu d'un fichier (fichier HTML, image), le serveur HTTP exécute un programme, puis retourne le contenu généré. CGI est le standard industriel qui indique comment transmettre la requête du serveur HTTP au programme, et comment récupérer la réponse générée. Une des caractéristiques de l'interface CGI est d'être indépendante de tout langage de programmation, car elle utilise les flux standard et les variables d'environnement. Même si le langage Perl a historiquement été souvent utilisé pour en écrire, il est possible d'écrire un programme CGI en C, Python, PHP, script shell, en VB ou en tout autre langage de programmation. 

Informations

Quelques CGI fournissant des informations sur la caméra Wanscam JW0008 :

  • http://ip-de-la-camera:99/get_status.cgi?user=admin&pwd=
var alias="IPCAM"; 
var deviceid="JWEV-182544-CFCFF"; 
var sys_ver="67.2.2.158"; 
var now=1439042444; 
var alarm_status=0; 
var upnp_status=1; 
var dnsenable=0; 
var osdenable=0; 
var syswifi_mode=1; 
var mac="00:D1:13:11:36:ED"; 
var wifimac="00:D1:13:11:36:EE"; 
var dns_status=0; 
var authuser=0; 
var devicetype=21037151; 
var devicesubtype=0; 
var externwifi=1; 
var record_sd_status=0; 
var sdtotal=0; var sdfree=0; 
  • http://ip-de-la-camera:99/get_camera_params.cgi?user=admin&pwd=
var resolution=0; 
var vbright=1; 
var vcontrast=128; 
var vhue=64; 
var vsaturation=80; 
var OSDEnable=0; 
var mode=0; 
var flip=0; 
var enc_framerate=30; 
var sub_enc_framerate=15; 
var speed=10; 
var enc_bitrate=2048; 
var ircut=1; 
  • http://ip-de-la-camera:99/get_params.cgi?user=admin&pwd=
var now1=1439042914; 
var tz=-28800; 
var ntp_enable=1; 
var ntp_svr="time.nist.gov"; 
var dhcpen=1; 
var ip="192.168.52.14"; 
var mask="255.255.255.0"; 
var gateway="192.168.52.1"; 
var dns1="8.8.8.8"; 
var dns2="192.168.52.1"; 
var port=99; 
var dev2_host="192.168.1.111"; 
var dev2_alias="IPCAM"; 
var dev2_user="ipc"; 
var dev2_pwd=""; 
var dev2_port=99; 
...
var user1_name=""; 
var user1_pwd=""; 
...
var wifi_enable=1; 
var wifi_ssid="wanscam_office"; 
var wifi_mode=0; 
var wifi_encrypt=0; 
var wifi_authtype=4; 
var wifi_defkey=0; 
var wifi_keyformat=0; 
var wifi_key1=""; 
var wifi_key2=""; 
var wifi_key3=""; 
var wifi_key4=""; 
var wifi_key1_bits=0; 
var wifi_key2_bits=0; 
var wifi_key3_bits=0; 
var wifi_key4_bits=0; 
var wifi_wpa_psk="88888888"; 
var wifi_channel=0; 
var pppoe_enable=0; 
var pppoe_user=""; 
var pppoe_pwd=""; 
var upnp_enable=1; 
var ddns_service=0; 
var ddns_proxy_svr="http://ipcpnp.com/upgengxin.asp"; 
var ddns_host=""; 
var ddns_user=""; 
var ddns_pwd=""; 
var ddns_proxy_port=80; 
var ddns_mode=1; 
var ddns_status=0; 
var mail_sender=""; 
var mail_receiver1=""; 
...
var mailssl=0; 
var mail_svr=""; 
var mail_user=""; 
var mail_pwd=""; 
var mail_port=0; 
var mail_inet_ip=0; 
var ftp_svr=""; 
var ftp_user=""; 
var ftp_pwd=""; 
var ftp_dir=""; 
var ftp_port=0; 
var ftp_mode=0; 
var ftp_upload_interval=0; 
var ftp_filename=7383708; 
var alarm_motion_armed=0; 
var alarm_motion_sensitivity=0; 
var alarm_input_armed=0; 
var alarm_ioin_level=0; 
var alarm_mail=0; 
var alarm_iolinkage=0; 
var alarm_ioout_level=0; 
var alarm_upload_interval=0; 
var alarm_presetsit=0; 
var alarm_snapshot=0; 
var alarm_record=0; 
var alarm_schedule_enable=0; 
var alarm_http=0; 
var alarm_http_url=""; 
var alarm_schedule_sun_0=0; 
var alarm_schedule_sun_1=0; 
var alarm_schedule_sun_2=0; 
var alarm_schedule_mon_0=0; 
var alarm_schedule_mon_1=0; 
var alarm_schedule_mon_2=0; 
var alarm_schedule_tue_0=0; 
var alarm_schedule_tue_1=0; 
var alarm_schedule_tue_2=0; 
var alarm_schedule_wed_0=0; 
var alarm_schedule_wed_1=0; 
var alarm_schedule_wed_2=0; 
var alarm_schedule_thu_0=0; 
var alarm_schedule_thu_1=0; 
var alarm_schedule_thu_2=0; 
var alarm_schedule_fri_0=0; 
var alarm_schedule_fri_1=0; 
var alarm_schedule_fri_2=0; 
var alarm_schedule_sat_0=0; 
var alarm_schedule_sat_1=0; 
var alarm_schedule_sat_2=0; 
  • http://ip-de-la-camera:99/get_log.cgi?user=admin&pwd=

etc …

Photo et vidéo

Les CGI fournissant l’accès à la prise de photo et au flux vidéo de la caméra Wanscam JW0008 :

  • Photo : http://ip-de-la-camera:99/snapshot.cgi

  • Vidéo : http://ip-de-la-camera:99/videostream.cgi?user=admin&pwd=&resolution=32&rate=0

Remarque : il est possible d’accéder à la caméra en utilisant vlc ou d’autres players.

Lire : les formats d’image

Commandes de déplacement

Les CGI fournissant les commandes de déplacement de la caméra Wanscam JW0008 :

  • Monter : http://adresse-ip-camera:99/decoder_control.cgi?command=0&onestep=1&user=admin&pwd=

  • Descendre : http://adresse-ip-camera:99/decoder_control.cgi?command=2&onestep=1&user=admin&pwd=

  • Gauche : http://adresse-ip-camera:99/decoder_control.cgi?command=4&onestep=1&user=admin&pwd=

  • Droite : http://adresse-ip-camera:99/decoder_control.cgi?command=6&onestep=1&user=admin&pwd=

etc …

Programmation

Séquence 1 : Visualisation du flux vidéo

Objectif : Être capable de visualiser le flux vidéo de la caméra à partir d’une application GUI/Qt.

Il y a plusieurs possibilités pour accéder au flux vidéo de la caméra. Par exemple, on pourra utiliser :

  • la classe QWebView pour afficher la page web que fournit la caméra (monitor.htm pour IE, serverpush.htm pour Firefox et mobile.htm pour les mobiles)
  • la bibliothèque OpenCV qui fournit une classe VideoCapture pour l’acquisition vidéo en provenance d’une caméra ou d’un fichier

Solution n°1 : QWebView

L’utilisation de la classe QWebView est très facile pour afficher un document HTML dans une fenêtre Qt :

// instancie le widget QWebView
QWebView *webView = new QWebView;

// facultatif : il est possible d'utiliser des signaux de QWebView
//connect(webView, SIGNAL(urlChanged(QUrl)), this, SLOT(webview_changed(const QUrl &)));

// Fabrique une URL
QUrl URL("index.htm");

// Charge le document 
webView->load(URL);

Si le document nécessite une authentification, il faudra faire :

// Fabrique une URL
QUrl URL("index.htm");

URL.setUserName("admin");
URL.setPassword("");

// Charge le document 
webView->load(URL);

Il faudra tout d’abord activer le module QtWebKit dans son fichier de projet .pro :

...
QT += core gui webkit
...

Documentation : La classe QWebView en Qt4 (en)

L’application lira les paramètres d’accès à la caméra dans un fichier INI :

[wanscam]
adresse="192.168.52.93"
port=99
user=admin
pwd=
script=mobile.htm

Code source fourni : test-qt-webview.zip

Solution n°2 : OpenCV

Pré-requis : faire la mise en oeuvre d’OpenCV.

Pour réaliser la capture du flux vidéo et son affichage, le principe est le suivant avec OpenCV sous Qt :

VideoCapture cap;
Mat frame;
QLabel* imageLabel = new QLabel;
QString url = "http://192.168.52.93:99/videostream.cgi?user=admin&pwd=&resolution=32&rate=0";
QString path = url + "&.mjpg";

// on ouvre le flux de la caméra
cap.open(path.toStdString().c_str());
if(cap.isOpened())
{
    // on lit une frame
    bool bSuccess = cap.read(frame);

    // ou :
    //cap.grab();
    //bool bSuccess = capt.retrieve(frame);

    if (!bSuccess)
    {
        qDebug() << QString::fromUtf8("<IHM::capturer()> erreur : could not grab a frame !");
    }
    else
    {
        IplImage *img = new IplImage(frame);
        
        QImage qtemp;

        if (newImage && cvGetSize(newImage).width > 0)
        {
            int x;
            int y;
            char* data = newImage->imageData;

            qtemp = QImage(newImage->width, newImage->height,QImage::Format_RGB32 );
            for( y = 0; y < newImage->height; y++, data +=newImage->widthStep )
                for( x = 0; x < newImage->width; x++)
                {
                    uint *p = (uint*)qtemp.scanLine (y) + x;
                    *p = qRgb(data[x * newImage->nChannels+2],
                              data[x * newImage->nChannels+1],data[x * newImage->nChannels]);
                }
        }

        imageLabel->setPixmap(QPixmap::fromImage(qtemp));
        imageLabel->resize(imageLabel->pixmap()->size());
    }
    
    // on ferme le flux de la caméra
    if(cap.isOpened())
        cap.release();
}
else
{
    qDebug() << QString::fromUtf8("<IHM::ouvrir()> erreur : video device not open !");
}

Remarques : Sous Qt, on utilisera un objet QLabel et un objet QImage pour assurer l’affichage des frames dans l’IHM. À partir d’une frame de type Mat ou IplImage, il faut pouvoir la convertir dans un type Qt (ici QImage ). Pour cela, on va se servir de la méthode Ipl2QImage() qui permet de convertir une image OpenCV de type IplImage vers une image Qt de type QImage. Pour assurer le rafraîchissement, on pourra utiliser soit un QTimer soit un thread (QThread).

L’application devra lire les paramètres d’accès à la caméra ainsi que ceux de la vidéo dans un fichier INI :

[wanscam]
adresse="192.168.52.93"
port=99
user=admin
pwd=
script=videostream.cgi

[video]
; cf. doc
resolution=32
rate=0
periode=40 ; en ms (1000/40 = 25 images/s)

Code source fourni : test-qt-view.zip

Séquence 2 : Enregistrement du flux vidéo

Objectif : Être capable d’enregistrer le flux vidéo de la caméra à partir d’une application GUI/Qt.

Il y a plusieurs possibilités pour enregistrer le flux vidéo de la caméra. Par exemple, on pourra utiliser :

  • les bibliothèques ou la commande cvlc de VLC
  • la bibliothèque libavcodec qui contient tous les encodeurs et décodeurs audio/video de FFmpeg ou sa commande ffmpeg

Pour faire simple, on va utiliser ici la commande cvlc :

$ sudo apt-get install vlc

$ cvlc "http://192.168.52.93:99/videostream.cgi?user=admin&pwd=&resolution=32&rate=0" --sout file/ts:./video-test.mjpg

Pour exécuter cette commande qui permet d’enregistrer le flux vidéo, on va avoir besoin de la classe QProcess qui permet d’exécuter des programmes externes.

Pour lancer un processus, il faut donner le nom de l’exécutable et la liste des arguments du programme que vous voulez démarrer dans les arguments de la méthode start(). Les arguments sont fournis sous forme de chaînes de caractères individuelles dans une QStringList.

QString programme = "cvlc";
QStringList arguments;

arguments << "http://192.168.52.93:99/videostream.cgi?user=admin&pwd=&resolution=32&rate=0" << "--sout" << "file/ts:./video-test.mjpg";
 
QProcess *processus = new QProcess();
processus->start(programme, arguments);

// éventuellement, il faut appeler la méthode kill() pour l'arrêter (ce qui sera notre cas ici)
processus->kill();

Documentation : La classe QProcess en Qt4 (en)

L’application lira les paramètres destinés à l’enregistrement dans un fichier INI :

[enregistrement]
url="http://192.168.52.93:99/videostream.cgi?user=admin&pwd="
resolution=32
rate=0
duree=15000 ; en ms
; si vide dans le répertoire de l'application
chemin=
fichier=enregistrement
extension=mjpg

Au final, on obtent :

Remarque : avec cette caméra, le fichier vidéo (extension .mjpg) est au format Motion JPEG ou M-JPEG qui est un codec vidéo qui compresse les images une à une en JPEG.

Code source fourni : test-qt-record.zip

Séquence 3 : Informations et Orientation (PTZ)

Objectif : Être capable de commander la caméra à partir d’une application GUI/Qt.

Avec l’API Qt, il est possible ici d’utiliser le module QtNetwork qui fournit notamment la classe QNetworkAccessManager pour envoyer des requêtes et recevoir des réponses.

Il faut tout d’abord activer le module QtNetwork dans son fichier de projet .pro :

...
QT += core gui network
...

Documentation : La classe QNetworkAccessManager en Qt4 (en)

Son fonctionnement est assez simple :

QNetworkAccessManager *manager;

// instancie la classe QNetworkAccessManager
manager = new QNetworkAccessManager(this);

// à la fin de l'envoie de la requête, on déclenchera le slot qui réceptionne les données reçues dans la réponse
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));

// on émet une requête pour déplacer la caméra à droite
QString URL = "http://192.168.52.14:99/decoder_control.cgi?command=6&onestep=1&user=admin&pwd=";
manager->get(QNetworkRequest(QUrl(URL)));

// le slot de réception
void replyFinished(QNetworkReply *reply)
{
    if(reply->bytesAvailable()) 
    {
        //reply->read();   
        QByteArray datas = reply->readAll();
        qDebug() << QString::fromUtf8("<IHM::replyFinished()> reply : ") << datas;
    }
}

L’application lira les paramètres d’accès à la caméra dans un fichier INI :

[wanscam]
adresse="192.168.52.93"
port=99
user=admin
pwd=

On gèrera aussi les erreurs d’accès :

Code source fourni : test-qt-ptz.zip

Voir aussi : L’utilisation des bibliothèques POCO permet aussi d’émettre des requêtes HTTP vers les CGI de la caméra Wanscam afin de commander son orientation PTZ.

Séquence 4 : Visionner une vidéo

Objectif : Être capable de visionner une vidéo à partir d’une application GUI/Qt.

Lien : activite-qt-video

Retour au sommaire