我希望我的家庭自动化系统能够“知道”。我是否在家。因为我总是随身携带手机,我认为最好的方法是检查手机是否连接到wifi。我写了这个python脚本:
TIMEOUT = 30
result_array = []
for x in range(TIMEOUT):
result_array.append("0")
counter = 0
while True:
proc = subprocess.Popen(["ping", "-c 1", "-W 1", "192.168.1.101"], stdout=subprocess.PIPE)
output = proc.stdout.read()
result = re.search('transmitted, (.*?) received', str(output)).group(1)
print(datetime.datetime.now().strftime("%H:%M:%S"), " ", result)
result_array[counter] = result
counter+= 1
if counter == TIMEOUT:
counter = 0
if result == "1":
time.sleep(1)
online = False
for x in result_array:
if x == "1":
online = True
print(online)
运行它看起来像这样......
如果我的手机连接到wifi:
00:39:36 1
True
00:39:37 1
True
如果我的手机没有连接到wifi:
00:39:39 0
True
00:39:40 0
True
没有得到" 1" 30次尝试将切换到返回False:
00:40:23 1
False
00:40:24 1
False
这适用于我的Android手机,但对我的女朋友iPhone无效。如果显示器未点亮,iPhone不响应ping(ICMP)请求。到目前为止,我尝试了arp,arping和nmap,并得到了一些有效的解决方案 - 至少在某种程度上。它们要么不可靠(即使我连接到wifi也会显示False)或者需要很长时间(1分钟+)才能意识到我已离线。
我希望脚本能够达到99%以上的准确率(如果我真的那么,它应该永远不会检测到我没有连接。这就是为什么我的脚本需要30次失败的尝试才能切换到离线状态)我希望它是在检测到我离线时尽可能快。
有关如何优化此问题的任何想法?