[TUTO] Détecter iPhone avec Livebox

Proposer ou rechercher un tutoriel concernant le Raspberry Pi

Modérateur : Francois

Répondre
Korhm
Raspinaute
Messages : 232
Enregistré le : ven. 19 sept. 2014 08:13
Localisation : Toulouse

[TUTO] Détecter iPhone avec Livebox

Message par Korhm » sam. 12 sept. 2015 09:19

Bonjour,

Un petit tuto qui permet de savoir si des iPhones (ou iPad) sont présent sur un réseau local, grâce à la livebox.
Je partage car je sais que j'ai pas mal galéré pour trouver une solution. En effet quand ils sont en veille, les terminaux sous iOS coupent le wifi pour économiser la batterie.
Heureusement la livebox sait exactement quel terminal est connecté en wifi, et on peut obtenir ces informations grâce à un simple curl

Mon script vérifie la présence d'au moins un iPhone sur deux.
Mais on peut adapter pour en mettre plus ou moins.

Voici donc mon scripts

On install jq qui va permettre de parser du format JSON

Code : Tout sélectionner

sudo apt-get install jq
On créer le script

Code : Tout sélectionner

mkdir -p /home/pi/logs
vi /home/pi/checkDevices.sh
On y insère le code suivant
Ne pas oublier bien sur d'adapter les adresse MAC et les IP

Code : Tout sélectionner

#!/bin/bash

# -------------------------
# ---- Variables ----------
# -------------------------

LOG_PRESENCE=/home/pi/logs/presence.log
LOG_DEVICES=/home/pi/logs/devices.log

datetime=`date +"[%Y-%d-%d %T] "`



# -------------------------
# ---- Main ---------------
# -------------------------

# Get data from Livebox
data=`curl --connect-timeout 10 -s -X POST -H "Content-Type: application/json" -d '{"parameters":{}}' http://192.168.1.1/sysbus/Devices:get`

# Check if at least one device is active
presence=`echo $data | jq  '[.result.status[] | select(.Key == "ADRESSE_MAC_IPHONE1", .Key == "ADRESSE_MAC_IPHONE2") | .Active] | any'`

# Log devices status (optional)
echo -n "{\"datetime\": \"$datetime\", \"data\": " >> $LOG_DEVICES
echo -n $(echo $data | jq -c '[.result.status[] | select(.Key == "ADRESSE_MAC_IPHONE1", .Key == "ADRESSE_MAC_IPHONE2") | {name: .Name, lastConnection: .LastConnection, lastChanged: .LastChanged, active: .Active, ip: .IPAddress, mac: .Key}]') >> $LOG_DEVICES
echo  "}" >> $LOG_DEVICES


echo -n $(date +"[%Y-%d-%d %T] ") >> $LOG_PRESENCE

# Do actions regarding presence
if [[ "$presence" == "true" ]]; then
        echo -n " Y'a qqn à la maison | " >> $LOG_PRESENCE

elif [[ "$presence" == "false" ]]; then
        echo -n " Y'a personne... | " >> $LOG_PRESENCE

fi
Et bien sur on rend le script exécutable et on met une crontab (J'ai mis 5 minutes pour ma part)

Code : Tout sélectionner

chmod +x checkDevices.sh
crontab -e
Ajouter à la fin

Code : Tout sélectionner

# Presence
*/5 * * * * /home/pi/checkDevices.sh

zeverybest
Raspinaute
Messages : 136
Enregistré le : sam. 18 oct. 2014 19:09

Re: [TUTO] Détecter iPhone avec Livebox

Message par zeverybest » sam. 12 sept. 2015 11:58

J'ai fait un truc similaire avec ma freebox

L'API est documenté, mais mal documenté

J'ai fais ça en PHP avec des requettes HTTP

As tu une doc ou des infos sur ce qu'il est possible de recuperer de la livebox?

Korhm
Raspinaute
Messages : 232
Enregistré le : ven. 19 sept. 2014 08:13
Localisation : Toulouse

Re: [TUTO] Détecter iPhone avec Livebox

Message par Korhm » mar. 20 oct. 2015 12:25

Bonjour,

il n'y a aucune documentation pour récupérer ces info depuis la Livebox. J'ai juste fait de l'analyse de requêtes HTTP.
Il y a deux type d'informations que l'on peut récupérer : celles qui nécessitent une authentification, et celle qui n'en ont pas besoin.
Dans les deux cas, je me connecte sur l'interface web de la box, ouvre la console Firefox et trouve la page qui m'interesse

Les requêtes qui ne nécessitent pas une authentification
Par exemple pour récupérer la liste des devices

Code : Tout sélectionner

curl --connect-timeout 10 -s -X POST -H "Content-Type: application/json" -d '{"parameters":{}}' http://192.168.1.1/sysbus/Devices:get
Les requêtes qui nécessitent une authentification
1. S'authentifier si besoin. Il faut envoyer le login/password en GET, et sauvegarder le context-id et le cookie
ATTENTION, l’authentification est en clair. A éviter de faire ça depuis Internet
Ici la commande jq ne sert qu'à parser la réponse au format json. On peut très bien se débrouiller avec un grep

Code : Tout sélectionner

curl --connect-timeout 10 -s -H "Content-type: application/json" -c ./cookies -d "" "http://192.168.1.1/authenticate?username=USER&password=PASSWORD" | jq -r '.data.contextID' > ./context
2. Faire un http POST pour demander les info souhaitées, en précisant le context-id et le cookie
Par exemple pour récupérer les infos du serveur DHCP :

Code : Tout sélectionner

curl --connect-timeout 10 -s -H "Content-type: application/json" -H "X-Context: $(cat ./context)" -b ./cookies -d '{"parameters":{}}' "http://192.168.1.1/sysbus/NMC:getLANIP"

Code : Tout sélectionner

{"result":{"status":null,"data":{"Address":"192.168.1.1","Netmask":"255.255.255.0","DHCPEnable":true,"DHCPMinAddress":"192.168.1.250","DHCPMaxAddress":"192.168.1.251"}}}
livebox_curl_dhcp.png
Analyse des requêtes HTTP
livebox_curl_dhcp.png (92.06 Kio) Vu 7989 fois
Par exemple pour activer/désactiver le wifi (remplacer les paramétres à "false" pour la désactivation)

Code : Tout sélectionner

curl --connect-timeout 10 -s -H "Content-type: application/json" -H "X-Context: $(cat ./context)" -b ./cookies -d '{"parameters":{"Enable":true,"Status":true}}' "http://192.168.1.1/sysbus/NMC/Wifi:set"

Code : Tout sélectionner

{"result":{"status":true}}

Kalipso
Messages : 2
Enregistré le : lun. 18 janv. 2016 14:25

Re: [TUTO] Détecter iPhone avec Livebox

Message par Kalipso » lun. 18 janv. 2016 14:45

Bonjour Korhm et merci pour ces infos. J'essaye désespérément de communiquer avec ma Livebox 3 sous Windows 7 64 bits.

J'ai installé cURL et jq dans un répertoire, ensuite exécuté la commande cmd (en mode administrateur ou pas) et essayé comme indiqué plus haut, avec le bon login et pass, mais sans succès :

Code : Tout sélectionner

curl --connect-timeout 10 -s -H "Content-type: application/json" -c ./cookies -d "" "http://192.168.1.1/authenticate?username=abcdefgh&password=12345678" | jq --raw-output ".data.contextID" > ./context

curl --connect-timeout 10 -s -H "Content-type: application/json" -H "X-Context: $(cat ./context)" -b ./cookies -d '{"parameters":{"Enable":true,"Status":true}}' "http://192.168.1.1/sysbus/NMC/Wifi:set"

La première ligne sauve bien 2 fichiers : cookies et context

La seconde ligne me renvoie à chaque fois cette erreur: <html><head><title>Gateway Timeout</title></head><body><h1>504 - Gateway Timeout </h1></body></html>

Avez-vous une solution à me proposer ?

D'avance merci.

Korhm
Raspinaute
Messages : 232
Enregistré le : ven. 19 sept. 2014 08:13
Localisation : Toulouse

Re: [TUTO] Détecter iPhone avec Livebox

Message par Korhm » mer. 20 janv. 2016 09:14

Bonjour,

La deuxième ligne fait appelle à la commande linux "cat" pour afficher le contenu du fichier context précédemment sauvegarder.

Code : Tout sélectionner

$(cat ./context)
Je ne suis pas sur que Windows comprenne cette commande, du coup le header de la requête doit être bizarre.

Je ne connais pas trop les scripts batchs sous windows, mais à priori ça donnerais quelque chose du genre

Code : Tout sélectionner

curl --connect-timeout 10 -s -H "Content-type: application/json" -c ./cookies -d "" "http://192.168.1.1/authenticate?username=abcdefgh&password=12345678" | jq --raw-output ".data.contextID" > ./context

set /p context=<./context
curl --connect-timeout 10 -s -H "Content-type: application/json" -H "X-Context: %context%" -b ./cookies -d '{"parameters":{"Enable":true,"Status":true}}' "http://192.168.1.1/sysbus/NMC/Wifi:set"

Kalipso
Messages : 2
Enregistré le : lun. 18 janv. 2016 14:25

Re: [TUTO] Détecter iPhone avec Livebox

Message par Kalipso » mer. 20 janv. 2016 14:15

Merci pour votre réponse, j'ai vu après la commande linux "cat". Il y a malheureusement toujours l'erreur "504 - Gateway Timeout".

J'ai résolu le problème hier, j'ai essayé de passer directement avec une variable, mais je n'y suis pas arrivé, je ne connais pas suffisamment les fichiers batchs, curl et jq.

Pour allumer le Wi-Fi sur la Livebox 3 :

Code : Tout sélectionner

curl --request POST --cookie-jar ./cookie_session "http://livebox/authenticate?username=LOGIN&password=PASSWORD" | jq --raw-output ".data.contextID" > ./contextID
set /p valeur_contextID=<./contextID
curl --request POST --header "X-Context: %valeur_contextID%" --cookie ./cookie_session --data {\"parameters\":{\"Enable\":true,\"Status\":true}} "http://livebox/sysbus/NMC/Wifi:set"
curl --request POST http://livebox/logout
Pour éteindre le Wi-Fi sur la Livebox 3 :

Code : Tout sélectionner

curl --request POST --cookie-jar ./cookie_session "http://livebox/authenticate?username=LOGIN&password=PASSWORD" | jq --raw-output ".data.contextID" > ./contextID
set /p valeur_contextID=<./contextID
curl --request POST --header "X-Context: %valeur_contextID%" --cookie ./cookie_session --data {\"parameters\":{\"Enable\":false,\"Status\":false}} "http://livebox/sysbus/NMC/Wifi:set"
curl --request POST http://livebox/logout
Merci encore pour votre aide.

Répondre

Retourner vers « Tutoriels »