Перечислите устройства, подключенные к моему маршрутизатору, используя python 3 в Windows - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь написать скрипт, чтобы проверить, сколько устройств подключено к Интернету.Это часть более крупного проекта, чтобы доказать моему провайдеру, что мой интернет - отстой.Я выполняю тест скорости каждую минуту и ​​записываю его в текстовый файл.Я хотел бы одновременно регистрировать, сколько устройств подключено, просто чтобы убедиться, что проблема не в том, что интернет отстой только после подключения определенного количества устройств.В этой сети не много потоковых людей, поэтому я знаю, что это не проблема, но если это проблема с устройствами, возможно, мне придется обновить интернет.Я попытался использовать модули neighbourhood и lanscan, но не могу заставить их работать на моей машине.

С lanscan Я попытался lanscan.lanscan.networks() и получил сообщение об ошибке

"модуль 'lanscan' не имеет атрибута 'lanscan'"

Моя Python IDE предполагает, что эти модули должны существовать с этой структурой.lanscan.networks() выдает ту же ошибку за исключением того, что в ней говорится, что «сети» не существует ».Кроме того, neighbourhood использует функции, которые не работают в Windows, например, os.geteuid(), поэтому я не думаю, что он совместим с Windows.

Есть ли способ узнать, какие из моих устройствв настоящее время подключен к моей сети интернет?На самом деле, все, что мне действительно нужно, это количество устройств.Я знаю, что, если я подключу IP-адрес моего маршрутизатора / модема, я смогу увидеть подключенные устройства в виде имен и их IP-адресов, поэтому я смогу как-то найти эту информацию, я чувствую.

Соседство Lanscan

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Второй способ - более медленный. Это проверяет все ips от 0 до 255. Я переключился на маршрутизатор xfinity и обнаружил, что они используют довольно случайные числа при назначении динамических ips, в отличие от motorola, который просто использует серийные номера, начиная с 192.168.0.10 (в моей модели). Этот ответ носит более общий характер. Я смотрю на все 255 возможностей, но я ограничиваю время отклика до 100 мс (с параметром '-w' и '100', чтобы это не занимало вечность. Должно потребоваться около 25 секунд, чтобы пропинговать все, но если обнаружится, это займет больше похоже на минуту.

for i in range(255):
    command=['ping', '-n', '1','-w','100', '10.0.0.'+str(i)]
    subprocess.call(command)

arpa = subprocess.check_output(("arp", "-a")).decode("ascii")
n_devices=len([x for x in arpa.split('\n') if '10.0.0.' in x and  
    all(y not in x for y in ['10.0.0.1 ','10.0.0.255']) ])
0 голосов
/ 17 апреля 2019

Я нашел один ответ, хотя, похоже, он не на 100% точен.Я замечаю, что все устройства, которые подключаются к моему маршрутизатору, получают прямые имена.Мой IP-адрес - 192.168.0.1, поэтому мои устройства - 192.168.0.1 0 , 192.168.0.1 1 , 192.168.0.1 2 и т. Д. Поэтому я простопинг первых 10 устройств.Я не обязательно доверяю только этому ответу.После проверки я запускаю arpa -a через систему Windows с подпроцессом.

import subprocess

#this for loop depends on ho wlong you are willing to wait. I am
for i in range(10):   #look for up to 10 devices
    command=['ping', '-n', '1', '192.168.0.1'+str(i)]   #icrement the device names
    subprocess.call(command)   #ping the devices to update data before  "arp -a'

arpa = subprocess.check_output(("arp", "-a")).decode("ascii") #call 'arp -a' and get results

#I count lines that contain 192.1868, but not ['192.168.0.1 ','192.168.0.255'] 
#because those are the router and broadcast gateway. Note that the machine 
#you are running the code from will get counted because it will be in the 
#first line "Interface: 192.168.0.10 --- 0x4" in my case
n_devices=len([x for x in arpa.split('\n') if '192.168' in x and  all(y not in x for y in ['192.168.0.1 ','192.168.0.255']) ])
...