Caméra et RaspberryPi

J’ai voulu faire une caméra de surveillance accessible par Internet qui ne partage pas mes données et ne soit pas complètement obsolète dans quelques mois.

Tous ce que j’ai vu sur le marché ce sont des caméras qui passent nécessairement par le « cloud », comprendre des serveurs aux USA ou en Chine, gérés par on ne sait quelles personnes qui se ménagent un contrôle permanent à la caméra et un accès à votre réseau local par l’occasion.

Lintérêt de cette solution est de décharger autant que se peu l’utilisateur des problèmes de configuration réseau.

Mais ce n’est plus trop une caméra personnelle. Je sais configurer un NAT, IPv6 existe, merci au revoir.

De plus, je ne sais comment m’assurer que ces caméras ne se connectent pas toute seules à leur service en ligne. Vu que justement, le but c’est qu’elle se connectent automatiquement dans toutes les conditions, car sinon l’utilisateur ne va pas pouvoir utiliser le produit…

En même temps, si l’appareil ne peut être mis à jour et qu’il est exposé à tout internet alors il se fera piraté à la prochaine faille publique.

Quand j’ai vu des appareils chinois (Foscam, Thomson, Opticam, Netis, Qcam, Sab…) avec identifiants en durs dans le firmware… je me suis dit que le choix devenait compliqué.

Je suis donc parti sur un raspberry (OS Raspbian complet) et MotionEye qui est juste le logiciel et s’installe sur une Raspbian.

Il existe aussi MotionEyeOS qui est une distribution complète. S’installe rapidement sur une carte SD mais ne supporte pas l’accès par SSL et n’est pas prévue pour une exposition directe sur Internet.

Je vais décrire ci-après les étapes de ma config.

Néanmoins, je voudrais soulever les critères de qualité d’une caméra qui ne sont jamais mis en avant sur les produits :

  • définition : par ceci j’entends le piqué de l’image et pas juste une bouillie de pixel. Donc la résolution ne fait pas tout. Au contraire, on cherche le meilleur piqué dans une faible résolution pour limiter le coût en bande passante et CPU. Le caméra du Raspberry est plutôt très bonne je trouve.
  • fluidité : A quoi bon avoir une caméra haute résolution, si dans ce mode, vous avez une image toutes les 2 secondes. La limite de puissance du CPU du raspberry et la bande passante d’un flux HD (dans votre connexion montante ADSL haha) vont mettre à genoux la fluidité. Sans compter que vous n’avez pas forcément envie de pourrir en permanence votre Wifi avec du flux vidéo HD par caméra.
  • latence : décalage de temps entre l’action et le moment où vous la voyez à l’écran. Si vous avez 5 secondes de latence, ca ne va peut être pas le faire. Le client sera sorti du magasin avant que vous rendiez compte qu’il était rentré. Ajouter du traitement (changement de format, etc…) crée de la latence sur le Raspberry.
  • compatibilité : le JPEG marche depuis un navigateur quelconque. il y a des standard comme RTSP pour la vidéo (pensez aux chaines TV de Free que vous lisez dans VLC). Si vous avez besoin d’une application non open source qui ne fonctionne que sous Windows ou Android (osbolete et avec des permissions de merde en plus) pour accéder à votre caméra, ça craint.
  • stockage : vous savez quelle taille prend un film de 2H en HD en H264 si vous télécharger des torrent. Ben imaginez 24H… et regardez votre carte SD et pensez à sa durée de vie si elle contient aussi le système.

Bilan de l’installation sur RaspberryPi:

  • En JPEG, vous ne pouvez raisonnablement pas streamer du HD à cause de la contrainte de la bande passante.
  • Il n’y a pas de service de streaming H264 cross plaform de la caméra du raspberry sans latence. Une solution est d’encoder le flux avec VLC pour avoir du RTSP mais vous avez de la latence. La deuxième solution est d’utiliser Gstreamer, pas de latence (car le décodage est déporté sur le client) mais le client doit être Gstreamer donc ne fonctionne que si le client est un Linux. Quid de l’authentification de l’accès au flux H264 et de son chiffrement ?
  • Je n’ai pas trouvé de solution pour faire du H264 dans une page web (Java c’est pas du web hein)

Ce sont vraiment des infos que j’aurai voulu savoir avant d’acheter le raspberry et sa caméra. Je pensais au départ qu’il aurait été possible d’avoir du 1920×1080 en 30 images par secondes dans un navigateur. Après des heures de recherche sur Internet, j’ai lâché l’affaire. Un peu con quand on voit le nombre de pixels que sait sortir la caméra (1080p30)

Finalement, je fais du JPEG 1024x960px où j’ai 10-20 images/s sur le réseau local et 0.5 images/s derrière l’ADSL. Mais ca marche depuis n’importe quel navigateur sans installer d’appli et c’est chiffré.

Les étapes:

  • Installer Raspbian sur une carte SD
  • mettre un fichier « ssh » vide dans la partition « boot » afin de pouvoir y accéder au démarrage
  • se connecter en tant que pi@raspberrypi.local avec le mot de passe « raspberry »
  • passer root (sudo su), créer un mot de passe pour root, créer un nouvel utilisateur, supprimer l’utilisateur pi
  • paramétrer l’appareil avec raspi-config. Changer le hostname, activer la caméra, mettre la config wifi.
  • mettre à jour les paquets de Raspbian : « apt update; apt upgrade »
  • installer fail2ban, ntpdate
  • installer MotionEye
  • se connecter sur http://hostname.local:8765 en remplacant « hostname » par le nom que vous avez donné à votre raspberry
  • mettre des mots de passe à admin et user
  • couper les services qui ne servent pas (motion detection, streaming, etc…)
  • plutot qu’utiliser root pour lancer le service, créer un utilisateur « motioneye »
adduser motioneye --system
usermod -aG video motioneye
  • dans /home/motioneye/conf mettre le fichier de configuration de motioneye. Editer ce fichier pour mettre des chemins accessibles en écriture pour l’utilisateur motioneye. Mettre le service en écoute sur l’interface local uniquement car on passera par NGINX pour exposer la caméra.
  • installer nginx
  • faire un proxy vers le port de motioneye en utilisant SSL avec letsencrypt. En gros :
server {    
  listen 443 ssl;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  location /camera/ {      
    proxy_pass http://127.0.0.1:8765/;
   proxy_read_timeout 120s; 
   access_log off;
  }
}
  • Configurer votre DHCP pour avoir une IP fixe pour l’adresse MAC de votre raspberry.
  • rediriger le port 443 de votre box internet vers l’IP du raspberry
  • apt install certbot
  • lancer le script de letsencrypt

Voila, vous pouvez accéder à votre flux en local depuis le hostname.local ou depuis internet en suivant la redirection des ports.

4 réactions sur “ Caméra et RaspberryPi ”

  1. Johny

    Salut je pense que ton projet c’est très intéressant j’ai aussi un Raspberry Pi et je veux aussi des configurer webcam verse mon pi. mais j’ai une question quelle caméra as-tu achete, merci pour votre réponse

  2. Tuxicoman

    @KillyTheBid Je n’ai pas réussi à le faire marcher. J’ai pris le deb pour tester mais impossible de voir une vidéo.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.