Comment utiliser la caméra SFR home RC8221W

Un ami m'avait donné des caméras SFR home, je voulais les utiliser mais je les avais finalement laissé de coté. J'ai un peu de temps en ce moment et je voulais me replonger dedans. Il y a un dépôt github assez bien fait (https://github.com/edent/Sercomm-API/blob/master/README.md) qui documente les API de la caméra mais il semble que sur les forum il n'était pas possible d'utiliser les notifications du capteur PIR (infrarouge) effectivement lors de mes tests ça ne fonctionnait pas mais je me suis dit réessaye et persiste ^^ et je me suis dit : tiens et si tu utilisais un de test serveur comme proxy pour détecter justement les alertes et finalement c'est beaucoup trop simple ;)

Il faut :
- un serveur
- y installer nginx
- créer un petit server sinatra


Je mets les sources plus bas ainsi que la config de la caméra.

Trouver votre caméra sur le réseau, avec probablement (ça dépend de votre réseau...)
nmap -p 554 192.168.0.1-254

Disons que ma caméra soit sur 192.168.1.207 et que mon serveur soit sur 192.168.1.190

Ensuite il faut activer la configuration, mettez l'ip de votre caméra et lancer ces urls dans votre navigateur web (firefox par exemple, et pas chrome hein Güven ^) : Si on vous demande un login/password, essayez :

admin/cgiconfig

# Affichage de la configuration actuelle (si vous avez besoin de la remettre après...)  
http://192.168.1.207/adm/get_group.cgi?group=HTTP_NOTIFY
http://192.168.1.207/adm/set_group.cgi?group=HTTP_NOTIFY&http_password=pouet&http_user=pouet
http://192.168.1.207/adm/set_group.cgi?group=HTTP_NOTIFY&proxy_user=pouet&proxy_password=pouet
http://192.168.1.207/adm/set_group.cgi?group=HTTP_NOTIFY&http_url=http://example.com/
http://192.168.1.207/adm/set_group.cgi?group=HTTP_NOTIFY&http_notify=1&http_proxy_no=80&http_proxy=192.168.1.190
# Vérifiez que tout est enregistré :
http://192.168.1.207/adm/get_group.cgi?group=HTTP_NOTIFY
# Afficher les logs de la caméra après détection (permettra de débugger plus tard)
http://192.168.1.207/adm/log.cgi
# Activer toutes les notifications de type ping http
http://192.168.1.207/adm/set_group.cgi?group=HTTP_NOTIFY&event_data_flag=1
http://192.168.1.207/adm/set_group.cgi?group=EVENT&event_fd=httpn:1;httppost:1
http://192.168.1.207/adm/set_group.cgi?group=EVENT&event_httpc=httpn:1;httppost:1
http://192.168.1.207/adm/set_group.cgi?group=EVENT&event_mt=httpn:1;httppost:1
http://192.168.1.207/adm/set_group.cgi?group=EVENT&event_in2=httpn:1;httppost:1
http://192.168.1.207/adm/set_group.cgi?group=EVENT&event_in1=httpn:1;httppost:1
http://192.168.1.207/adm/set_group.cgi?group=EVENT&event_pir=httpn:1;httppost:1
http://192.168.1.207/adm/set_group.cgi?group=EVENT&event_trigger=1 


Mise en place du serveur nginx, voici le fichier de configuration du serveur (dans /etc/nginx/sites-available/camera_sfr)

server { listen 80; server_name devices.sf-sfr.fr; proxy_http_version 1.1; location / { proxy_pass http://127.0.0.1:3001/; proxy_read_timeout 120s; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; access_log /var/log/nginx/access_camera_sfr.log; error_log /var/log/nginx/error_camera_sfr.log error; } }
Mise en place du serveur sinatra
riven@monserveur:~/chemin$ cat camera_sfr_sinatra.rb 
# Contenu du fichier
require 'rubygems'
require 'sinatra'
require 'net/http'
require 'uri'
require 'json'

set :bind, '0.0.0.0'
set :port, 3001

# Mettez à jour ce chemin qui va stocker vos enregistrements  
RECORD_DIR = "/bli/blo/blu/records"
# Durée de l'enregistrement  
RECORD_TIME = 10

get '/homewatch/alert' do
  #File.write("/home/riven/rivsc/camera.log", params.to_s, mode: "a+")  
  
  # exemple de params reçu, securitycode contient le code de la caméra visible sur l'autocollant de la caméra
  # {"securitycode"=>"XXXXX", "t"=>"XXXX", "mode"=>"instant", "hash"=>"XXXXXX", "event"=>"motion,92,md_window0"}

  # Récup snapshot picture (celui qui pingue ce serveur EST la caméra donc on récupère son IP est on récupère l'image)
  url = URI.parse("http://#{@env['HTTP_X_FORWARDED_FOR'] || @env['REMOTE_ADDR']}/img/snapshot.cgi?size1=quality=1")

  # Effectuer la requête GET
  response = Net::HTTP.get_response(url)

  output_filename = "#{params[:securitycode]}_#{Time.now.strftime('%d-%m-%Y__%H-%M-%S')}"

  # Vérifier si la requête a réussi
  if response.is_a?(Net::HTTPSuccess)
    # Enregistrer la réponse dans un fichier
    File.open(File.join(RECORD_DIR, output_filename), "w") do |file|
      file.write(response.body)
    end
    
    # nécessite ffmpeg : sudo snap install ffmpeg
    # fonctionne à l'extérieur de sinatra, permet d'enregistrer le flux rtsp (video + audio)
    rtsp_url = "rtsp://administrator:cgiconfig@#{@env['HTTP_X_FORWARDED_FOR'] || @env['REMOTE_ADDR']}/img/media.sav"
    `sudo -u www-data ffmpeg -i #{rtsp_url} -c copy -t #{RECORD_TIME} #{File.join(RECORD_DIR, output_file)}.mp4`

    puts "La réponse a été enregistrée dans response.txt"
  else
    puts "Erreur lors de la requête : #{response.code} #{response.message}"
  end

  status 200
  body 'ok'
end


Ensuite le serveur se lance comme ceci (il faudra peut-être installer sinatra au préalable : gem install sinatra :

ruby camera_sfr_sinatra.rb

Voilà, les derniers post datent d'il y a quelques annnées et je trouve dommage de ne pas exploiter ces caméras.
Amusez-vous bien !