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.
Ses caractèristiques principales sont :
Ne jamais tourner la caméra à la main, cela pourrait endommager son mécanisme.
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 :
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.
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 …
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
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 …
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 :
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)VideoCapture
pour l’acquisition vidéo en provenance d’une caméra ou d’un fichierL’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
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
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 :
cvlc
de VLClibavcodec
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
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.
Objectif : Être capable de visionner une vidéo à partir d’une application GUI/Qt.
Lien : activite-qt-video