Projet #2 : Caméra à distance

chapeau-melon 5Ce projet consiste à contrôler la caméra RPi à distance de façon sécurisée. Cette solution vous permettra de prendre des photos à distance, de faire des time-laps (toujours à distance) ou encore de détecter les intrus dans votre garage ou pire les visiteurs dans votre cave à vin. De plus, vous pourrez télécharger ces photos et vidéos depuis votre cabanon sur la plage. Et ce projet se fait très bien durant une fin de semaine.

J’ai donc besoin d’un serveur web sur mon RPi, d’une application pour la gestion des photos et vidéos, et enfin d’un accés sécurisé à mon serveurPour ce projet:

  • Serveur Web: j’ai choisi Apache2, largement utilisé à travers le Monde: THE reference.
  • Gestion de la caméra : Application RaspiCamWebInterface
  • Accés sécurisé: plusieurs solutions sont testées et discutées ici (ngrok, weaved…) qui espérons-le vous aidera à choisir la votre.

Serveur Web

Apache est la réfèrence en la matière mais il existe d’autres alternatives comme par exemple nginx, qui semble plus rapide que Apache (cf ici). Pour ma part, je prèfère la valeur sure et largement documentée avec Apache2 et de plus vraiment très facile à installer. Le procéssus d’installation est bien décrite ici en français.

Je me contente ici d’afficher les commandes (toutes) et de faire des copies d’écran associées en date du 14 février 2016:

On installe le serveur Apache (l’instruction aptitude permet de voir les versions installées durant l’installation):

sudo aptitude install apache

Ouvrir ensuite safari et taper l’adresse de votre rpi . Le message It works parle de lui-meme, et ce n’est pas plus compliqué que cela !

 

Installer ensuite php (pas sur que ce soit indispensable pour le moment..)

sudo aptitude install php5

Les commandes défilent les unes derrière les autres:

install php5.png

Une fois terminé, faites un test en créant un fichier:

cd /var/www/html
sudo nano mytest.php

Ecrire dans le fichier les 3 lignes suivantes:

premier php  file

Fermer (CTRL+X), sauvegarder (Y), puis ouvrir safari, et taper la ligne suivante.

192.xxx.xxx.xxx/mytest.php

si la page suivante apparaît, c’est gagné, sinon, passez peut-etre à la couture ou la sculpture sur pierre…

php test


Caméra

La librairie Raspistill est installée par défaut avec la version NOOBS. Cette librairie vous permet d’envoyer des commandes simples depuis un code en Python par exemple pour prendre des photos,En revanche, elle ne vous fournit pas une interface graphique pour contrôler tous les paramètres de votre caméra. Le programme RPi_Cam_Web_Interface se présente comme une simple page web que vous allez insérer comme page principale dans votre serveur web. Il vous sera alors possible de controler à distance votre, photo, vidéos et même de les télécharger sans écrire une seule ligne de code.

Il existe une version de RaspiCam en C++ que j’utiliserais peut-être un jour si j’ai le temps pour faire une application custom. Mais pour aujourd’hui , nous allons nous contenter de cette application très compléte nommée RPi-Cam-Web-Interface.

Avant toute chose , assurez-vous d’avoir une caméra fonctionelle ! Les effets secondaires le cas écheant sont très surprenants, j’ai testé pour vous !

Donc, suivez ces étapes:

sudo raspi-config

ENABLE CAMERA

Activer la caméra, puis finish.

Depuis le terminal, lancer raspistill (installé par défaut):

raspistill issue

Oups, ca ne marche pas, je reçois ce message d’erreur…et en cherchant sur internet, j’ai fini par trouver une solution (il me faut ajouter mon usager au groupe video qui a du être crée lors de l’installation):

sudo usermod -a -G video monusername
logout , puis re-log-in.

A nouveau:

raspistill -0 cam.jpg

Vous devriez voir la caméra s’allumer (led rouge) , prendre une photo, et s’éteindre. la fichier cam.jpg est dans le répertoire par défaut.

Au prélable, j’avais essayé les 2 commandes suivantes qui n’avaient rien données. Je les mentionne quand même car il est possible que ce soit la combinaison des 3 commandes qui soit gagnante:

sudo chmod 755 /etc/rc.local
sudo chmod u+s /dev/vchiq

Vous pouvez vous amuser à retrouver ici quels droits sont associés à ce code octal 755 ! (Read,Write, Execute pour tous les usager mais cela ne donne les droits administrateurs).

Voilà , la caméra fonctionne !

Voici maintenant la procédure d’installation de l’application RPi-Cam-Web-Interface. Vérifier ici la page officielle en anglais au besoin.

git clone https://github.com/silvanmelchior/RPi_Cam_Web_Interface.git
cd RPi_Cam_Web_Interface
chmod u+x *.sh
./RPi_Cam_Web_Interface_Installer.sh install

On peut retrouver les commandes de l’installateur à tout moment dans le fichier install.txt du répertoire RPi_Cam_Web_Interface. Par exemple (sans grand intérêt pour le moment), j’ai trouvé ces 2 lignes:

  • sudo chown motion:www-data /etc/motion/motion.conf
  • sudo chmod 664 /etc/motion/motion.conf

Enfin, on peut lancer le programme:

./start.sh

RPI-Cam ca marche

Malgré ces messages, ca marche bien !: J’ai remarqué par la suite qu’il n’était pas nécéssaire d’utiliser sudo pour démarrer ou arrêter ce programme , puisqu’une vérification rapide me permet de voir que ces 2 programmes ont le même accés que mon usager (mais pas www-data , ni pi).

rpi cam ok

D’ailleurs , ces messages (no process found) sont en contradiction avec ce que je peux observer ici. Si j’effectue la commande pour voir quels processus sont en cours:

ps -A

ou pour plus de détails:

ps -Af

J’obtiens :

RaspiCam Process.png

donc, raspimjpeg, et php sont bien actifs malgrès ce message.

Mais Motion , lui n’est pas actif, c’est vrai ! Que faire ?.  C’est normal puisque ce programme est activé depuis l’interface usager (motion detection start). Facile à vérifier en utilisant la commande ps-Af avant et après avoir cliqué sur le boutton Motion Detection Start.

Donc, voilà, tout fonctionne parfaitement, c’est terminé !

Pour arrêter le programme (dés lors, l’interface web demeure mais ne répond plus aux commandes):

./stop.sh

Corollaire

Au passage, on peut chercher le programme motion.conf, et éditer tous les paramètres du programme. La lecture du fichier donne une bonne idée des possibilités de ce programme, qui semble assez bien concu et particulièrement adapté aux hackers !

find /home -name motion

le fichier se trouve dans: /home/usager/RPi_Cam_Web_Interface/etc/motion

Je vérifie alors les droits. Je crois comprendre que l’installation de Apache a crée un groupe www-data. La commande suivante permet de voir dans quels groupes appartient l’usager ou ici le groupe http://www.-data

grep 'www-data' /etc/group

La commande groups permet de voir les groupes auxquels  l’usager courant appartient.

groups

Important: Alimentation du RPI

Lors des tests, j’ai remarqué que le témoin d’alimentation du RPI clignotait lorsque je lançais l’application RPI_Cam_Web_Interface, et particulièrement lorsque j’utilisais le mode MJPEG. En rèalité, il s’agissait tout simplement d’un problème de cable ! Mon cable d’alimentation ne permettait pas de tirer suffisemment de courant. Héhé !! il est donc bien important de choisir correctement son fournisseur , ou si comme moi ,vous avez plusieurs cables, de les tester un par un avec cette application par exemple.

A noter que l’installateur a écrasé le fichier index.html du Serveur Apache par défaut.

Architecture

Enfin, pour info, voici l’architecture de RaspiCam (source ici):

798px-RPiCamArchitecture


Accés Sécurisé

Il existe plusieurs solutions pour accéder à votre RPI depuis un autre appareil connecté à internet mais en dehors de votre de réseau local. Toutes ces solutions portent des noms barbares et leur compréhension reléve parfois du défi personel. On cherche ici à s’amuser, à toucher les technologies, mais il ne faudrait pas avoir l’illusion de comprendre en quelques heures, ce que d’autres maitrisent après plusieurs années de travail ! Ce domaine est sans nul doute d’une bonne complexité. Cependant, il est possible de tester ces solutions sans en comprendre toute l’étendue, c’est ce que nous faisons ici.

  1. Port Forwarding
  2. Tunnel behind Firewall
  3. Weaved
  4. VPN

Port Forwading

Cette solution est sans doute la plus simple à implémenter puisqu’elle consiste simplement à activer cette option sur votre router . Il vous faudra aussi obtenir un domaine DNS. Elle est très bien décrite en francais sur ce site.

Voici par exemple, la page de mon router D-Link, qui me permet de crèer des règles de Port Forwarding , comme par exemple, une activation certains jours de la semaine uniquement, à certaines heures.

Port Forwarding Dlink

Tunnel Ngrok

Télécharger le fichier ngrok-stable-linux-arm.zip depuis le site officiel. J’ai eu quelques soucis avec Safari – le fichier ne portait pas le même nom, je ne pouvais pas le décompresser. Bref, après quelques recherches sur la toile, j’ai réalisé que c’était peut-certainement un bug. J’ai donc utilisé Internet Explorer depuis mon PC, et j’ai pu télécharger le fichier sans problème. Il vous faut aussi créer un compte pour obtenir une clef ou jeton (token).

1 ngrok download

Pour copier le fichier depuis mon ordinateur vers le RPI, j’utilise FileZilla (qui me semble plus riche que CyberDuck que j’utilisais jusqu’alors. Pour une raison qui m’échappe, Cyberduck est incapable de se logger sur ce RPI alors qu’il peut se logger sur mon autre RPi , et que par ailleurs, FileZilla, lui , se connecte très bien !. Il doit s’agir d’une histoire de droits)… Bref, voici l’interface de FileZilla.

2 ngrok - filezilla

Ensuite, décomprésser le fichier tel qu’indiqué ci-dessous, puis exécuter le programme:

./ngrok

3 ngrok installFaire un copie de votre clef (token) depuis le site de ngrok, et envoyer la commande:

./ngrok authtoken xxxxxxxxxxxxxxxxx

4 ngrok-authtoken

Ce message d’avertissement est sans effet pour la suite. Sélectionnez au besoin votre serveur (par defaut , le serveur est USA, le mien à singapour en version Beta):

./ngrok http -region ap 80

Voilà, c’est fait, maintenant , faites une demande pour ouvrir le tunnel:

./ngrok http 80

La fenêtre suivante apparaît dans votre terminal, et le service en attente de traffic, vous indique l’adresse http de votre page (Forwarding).

5 ngrok exec

C’est cette commande envoyée au serveur ngrok, qui ouvre le tunnel. On peut le vérifier sur le site web de ngrok (après login) dans la section Status.

ngrok tunnel open

Editer donc cette adresse dans dans votre explorateur, et vous devriez voir apparaitre votre page web (dans ce projet, la page principale de RPi_Cam_Web_Interface).

Et dans le terminal ci-dessous, vous pouvez voir le traffic dans votre tunnel (HTTP Requests):

traffic sur tunnel

Voila, c’est terminé.

L’inconvénient de cette solution est qu’elle exige d’ouvrir un tunnel pour chaque accés et d’aller chercher l’adresse sur le serveur . Mais il existe peut-être une solution pour intégrer cette solution dans une application plus robuste.  Voici un autre tunnel à creuser !  Par exemple, réduire la résolution vidéo (par défaut Full HD) ou encore, dans le menu System de la page web, cliquer sur MJPEG Stream, et le flux vidéo devient très fluide.


Weaved

Sur weaved.com, créer un compte. Puis, suivre les instructions ici sur le site officiel ():

sudo apt-get update

sudo apt-get install weavedconnectd

sudo weavedinstaller

1 install weaved

Weaved offre différents service dont celui qui nous intérésse: ouvrir une page web sur mon RPI sur le port 80. Sélectionner cette option:

2 weaved

Ensuite, le programme vous demande un nom pour le service qui apparaitera uniquement sur votre compte weaved.

3 weaved

Enfin, ouvrir votre navigateur et cliquer sur le lien en dessous de Name.

4 weaved

Le lien ressemble à https://xxxxxxx.xxx.weaved.com/index.php

Vous devriez voir votre page web désormais en ligne !

Il existe une alternative qui me semble similaire à weaved : dataplicity.com.

VPN

Votre RPI contient un installateur libre de VPN par défaut. Sans aucun doute, la configuration reléve du défi et réserve des surprise.. Si l’aventure vous appelle, elle  est décrite ici en anglais et encore plus détaillée ici en anglais (à lire aprés un café bien serré).

Pour ma part, je passe mon tour !

Tests de performance

J’ai fait quelques tests de performance disponible sur viméo et dans la section video sur ce blog.IMG_3638

Conclusion: C’est à mon sens très acceptable si vous devez faire de la vidéosurveillance. ngrok ou weaved ? Très semblable ..

Maintenant, pas question de regarder un match de tennis dans ces conditions.

J’ai pu remarquer que les 4 CPU ne travaillent pas beaucoup (pas plus de 20% au maximum) donc, vous pouvez encore faire travailler votre Rpi pour connecter d’autres capteurs (T,H,P…etc..) en meme temps que la caméra.

Amusez-vous !

Publicités