Comment détecter un appareil mobile lorsqu'il se connecte à un réseau wifi domestique?


10

Quelle serait la meilleure façon de faire reconnaître un serveur lorsqu'un appareil mobile spécifique (téléphone portable, iPad, etc.) se connecte au réseau (sans fil, bien sûr)?

À titre d'exemple, une personne a son réseau wifi domestique correctement configuré sur son téléphone portable. Quand il arrive à portée du routeur, il se connecte (rien de nouveau à ce sujet). Lors de la connexion à ce routeur, son serveur domestique lancerait un certain programme (ou lancerait une notification, écrirait dans un fichier, etc.).

Je pensais qu'une solution possible serait une "application web" personnalisée hébergée sur le réseau qui serait lancée à partir du téléphone afin que le serveur reconnaisse que la page a été appelée. Cependant, si cela pouvait être fait lorsque le téléphone se connecte automatiquement, ce serait mieux.

Toutes les pensées ou solutions alternatives seraient grandement appréciées, alors merci d'avance!


S'il s'agit d'un téléphone Android, un travail cron sur un site Web local serait plus facile. Pour le faire du côté réseau, vous devez utiliser le protocole RADIUS et disposer d'un serveur RADIUS correctement configuré.
Huckle

Pourquoi ne pas simplement consulter les journaux de votre routeur. Étant donné que ces journaux sont basés sur du texte, il serait facile d'interroger les journaux et d'obtenir uniquement les informations dont vous avez besoin. Certes, quelqu'un a écrit le code pour le faire, mais sinon ce serait un exercice simple.

Réponses:


4

Je pense que cela peut être facilement accompli par arp-scan.

Installer arp-scan: sudo apt-get install arp-scan
Détectez tous les hôtes du réseau local:sudo arp-scan -l

Vous pouvez configurer une crontab pour exécuter périodiquement (toutes les 2 minutes peut-être) un script qui scanne le réseau avec arp-scan et analyse sa sortie pour découvrir les hôtes actifs.

Parfois, j'avais besoin du -r 3drapeau, qui le fait fonctionner trois fois; fonctionne beaucoup mieux que les 2 fois par défaut, qui manquent parfois certains appareils. Donc:

 sudo arp-scan -l -r 3 | grep {Phone Static Assigned IP} 

fonctionne mieux pour moi à LG V30 +.


Il convient de noter que certains appareils peuvent ne pas apparaître à moins qu'ils ne soient allumés. Mon Nexus 4 n'apparaîtra que si l'écran est allumé.
Nicolas Bouliane

3
import subprocess

if __name__ == '__main__':
    while True:
        sleep(5)
        p = subprocess.Popen("arp-scan -l | grep xx:xx:xx:xx:xx:xx", stdout=subprocess.PIPE, shell=True)
        (output, err) = p.communicate()
        p_status = p.wait()
        if output:
            print "Yay, the devine is connected to your network!"
        else:
            print "The device is not present!"

De cette façon, vous pouvez rechercher le MAC de votre appareil :)


2

En fait, j'envisage de mettre en œuvre une solution qui répond aux exigences suivantes:

  1. Le téléphone n'a pas besoin d'avoir une adresse IP attribuée sur le réseau.
  2. Le téléphone n'a pas besoin d'envoyer périodiquement des signaux qui déchargeraient sa batterie.
  3. S'il y a beaucoup de téléphones sur le réseau, ils seront tous détectés.

Mon intention est de monter le système de fichiers du téléphone avec ssh, mais il pourrait être utilisé pour n'importe quoi.

Disons que le réseau local est 192.168.1.0 ...

Donc je mettre en œuvre une APP qui écoute UDP diffuse à partir de l'adresse de diffusion: 192.168.1.255. Cette application ne viderait pas la batterie car elle est totalement passive. (il ne devient actif que lorsqu'un paquet est reçu).

Un démon sur l'ordinateur enverra périodiquement des diffusions à l'adresse de diffusion 192.168.1.255. Le téléphone répondra à ces signaux en donnant son nom, son identifiant, son adresse IP, etc.

Maintenant, l'ordinateur sait que le téléphone existe sur le réseau et, dans mon cas, peut invoquer le montage sshfs.

Cela nécessite certainement beaucoup de travail, y compris de programmation, et n'est pas facile. Mais je pense que ce serait la solution la plus fiable et la plus raisonnable.


1
Wow, donc fondamentalement un protocole personnalisé ... on pourrait penser qu'il existe déjà quelque chose comme ça.
Michael

1

La meilleure façon de penser est de donner à cet appareil une adresse IP statique, et d'utiliser un script simple pour envoyer une requête ping à l'appareil toutes les X secondes et déclencher votre programme / notification.

À noter: de nombreux téléphones ne se connecteront pas au réseau wifi avant le réveil. Votre script devra être capable de faire la différence entre le téléphone qui s'endort et le téléphone qui quitte la maison, éventuellement en tenant compte de l'heure de la journée. Après cela, avoir le script déclencher un programme à exécuter ou une notification à apparaître est trivial.


0

J'ai écrit un script qui fait quelque chose de similaire en utilisant arp-scan et une adresse IP statique sur un iPhone.

Vous pouvez trouver le code ici: https://github.com/blackairplane/pydetect

Il doit être nettoyé car je suis nouveau sur Python, mais je pense qu'il illustre le concept.


0

J'ai trébuché là-dessus et comme j'ai déjà fait quelque chose de similaire, j'ai décidé de poster une réponse.

J'ai fait ce qui suit:

1. Ping all addresses within given network and subnet (excluding network and broadcast addresses)
2. Wait for response has a timeout so that if device doesn't answer from furthest corner of your WiFi it is considered not present.
3. So we get all IPs on the net that answer to ICMP packets.
4. Then use each detected IP to ask for more and decide which device you like and which one you don't.

Dans mon cas, j'avais un serveur HTTP en cours d'exécution sur mon appareil. Je viens donc d'envoyer une requête HTTP HEAD pour pratiquement rien sur le port 80. Si l'appareil a répondu et que l'en-tête du serveur est correctement nommé, alors c'est mon appareil.

Mais je ne pouvais pas aller vite sans cingler d'abord. HTTP est TCP et la demande est importante, les délais d'attente doivent donc être de 4 secondes pour le WiFi. Faire cela pour 253 adresses est lent comme l'enfer. Mais vous n'auriez pas 253 appareils (probablement) plus de serveurs HTTP en moins. (ou dans votre cas, les téléphones)

La prise en compte des journaux de routeur est une très bonne idée et facile. Et encore plus vite que de tout cingler. Certains routeurs n'ont même pas besoin de se connecter pour y accéder.

En outre, il convient de vérifier si votre appareil prend en charge UPNP. Si c'est le cas, vous pouvez utiliser UPNP pour détecter sa présence. Ce serait une solution officielle (écoute en diffusion des UDP de l'UPNP). Mais tous les appareils ne le prennent pas en charge. Mais tous les appareils ne prennent pas en charge ICMP également. (ils ne souhaitent pas être bombardés inutilement).

Il existe une autre possibilité intéressante. Vous pouvez rechercher des paquets DHCP et voir quand un routeur donne une adresse IP à un nouveau périphérique. Mais cela ne fonctionnerait pas pour les appareils avec des adresses IP statiques. Ils ne toucheraient même pas au réseau avant d'avoir besoin de quelque chose. La connexion au WiFi lui-même est sur une autre couche et ne peut être facilement détectée que si vous souhaitez agir comme un renifleur. Je ne suis pas sûr, même si cela est possible avec une carte réseau en mode promisquous. Je pense que du matériel supplémentaire serait nécessaire pour cela.

Pour réaliser le ping en Python, sans sous-traiter le programme ping et perdre de la vitesse, vous devez créer un socket brut et construire le paquet ICMP manuellement. Ce n'est pas difficile. Il y en a un exemple quelque part sur le web. Bien sûr, pour l'envoyer, vous aurez besoin des autorisations root, tout comme le ping. Ceci est un inconvénient. Si vous distribuez le logiciel, vous ne pouvez pas vous attendre à ce que les utilisateurs souhaitent l'exécuter en tant que root.


0

J'ai eu deux solutions que j'ai utilisées. (Python)

Solution 1

La première consistait à créer des numéros IP connus que je veux suivre. Je l'ai fait en trois étapes. 1 # utilisez "-c1" pour n'envoyer qu'un seul ping. Si l'appareil est actif, il répondra et. La fonction se terminera avec succès 2 # utilisez "-c3" maintenant donnez-lui plus de temps pour répondre sur l'un des trois. C'est généralement suffisant lorsqu'il s'agit d'un mauvais signal wifi. 3 # utilisez "-c10", cela peut être nécessaire lorsque le signal wifi est vraiment mauvais. (J'ai remarqué que l'ancien iPad a besoin d'environ 10 tentatives pour répondre) Pour accélérer les choses, j'ai créé des processus distincts pour chaque numéro IP que je veux suivre.

J'ai également changé les intervalles de ping selon que c'est un succès ou non. S'il trouve l'appareil, il attendra plus longtemps jusqu'à ce qu'il vérifie à nouveau. Si c'est un échec, il réessaiera dans 60 secondes. (Je veux que la lumière soit allumée quand j'entre dans ma maison) donc 60 ans suffit pour me retrouver dans la rue

Cela a parfaitement fonctionné! Quand je suis rentré à la maison, il m'a senti et a éteint la lumière, et s'est éteint quand je suis parti.

Solution 2

Arping n'est peut-être pas lourd sur le réseau, mais j'ai changé la solution pour ignorer tous les pings et créé mon propre serveur DHCP sur mon Raspberry Pi.

J'ai ensuite ajouté "on commit" qui déclenche un script dès qu'un périphérique obtient un ipnumber. Ce script utilise un «appel API curl http» pour notifier mon serveur www (Flask) dès qu'un périphérique obtient ou renouvelle son ipnumber.

Sur mon Android, j'ai modifié les paramètres pour ne jamais désactiver le wifi lorsque l'écran est éteint. Je ne sais pas si c'est possible sur iPhone. Pas de grande différence sur la batterie (OnePlus 5)

La première solution comprenait également la numérisation Bluetooth pour un Mac spécifique. Donc, même si mon WiFi est désactivé sur mon téléphone, il détectera toujours le Bluetooth. L'utilisation de l'adresse Mac n'a pas besoin de le coupler ou de le mettre à la disposition de tous.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.