Vì vậy, tôi đã làm việc về cùng một vấn đề trong khoảng một năm nay. Tôi đã làm cho nó hoạt động trên máy Mac của mình khá nhanh, nhưng gặp nhiều rắc rối khi khiến nó hoạt động ngay trên PC. Tôi đã thử nhiều cách tiếp cận khác nhau. Tôi có một hệ thống tự động hóa gia đình bật hệ thống sưởi và nước nóng (thông qua mô-đun arduino và RF) khi tôi hoặc đối tác của tôi ở nhà (đó là iPhone của chúng tôi có thể phát hiện được trên WiFi gia đình). Cuối cùng, tôi đã sử dụng 'nslookup' để tìm địa chỉ IP cho iPhone (trong trường hợp địa chỉ IP đã thay đổi khi chúng động (nhưng thực tế chúng không bao giờ thực hiện trên bộ định tuyến của tôi)) và 'nmap' để phát hiện xem iPhone có bật không mạng lưới. Nếu iPhone đang ngủ rất sâu, 'nmap' không phải lúc nào cũng tìm thấy điện thoại, vì vậy tôi đã kiểm tra 10 lần trước khi điện thoại không ở nhà. Dưới đây là một phần của mã tự động hóa nhà của tôi trong python. Tôi đã sử dụng luồng. Bất kỳ câu hỏi với mã dưới đây cho tôi biết.
# Dictionary to store variables to reuse on program restart
v = {
'boilerControlCH' : 'HIH', # 'scheduled' or 'HIH' (Honey I'm Home)
'boilerControlHW' : 'scheduled',
'thermostatSetPoint' : 20.8,
'thermostatVariance' : 0.1,
'morningTime' : datetime(1970,1,1,6,0,0),
'nightTime' : datetime(1970,1,1,23,0,0),
'someOneHome' : False,
'guest' : False,
'minimumTemperatureOO' : False,
'minimumTemperature' : 4.0,
'iPhoneMark' : {'iPhoneHostname' : 'marks-iphone', 'home' : False},
'iPhoneJessica' : {'iPhoneHostname' :'jessicaesiphone', 'home' : False}
}
và
# Check if anyone at home
def occupancyStatus(person, Bol = False):
with lockOccupancyStatus:
someOneHome = False
if 'iPhone' in person:
v[person]['home'] = Bol
elif 'retest' in person:
pass
else:
v[person] = Bol
if v['guest'] == True:
someOneHome = True
for key in v:
if 'iPhone' in key:
if v[key]['home'] == True:
someOneHome = True
v['someOneHome'] = someOneHome
variablesToFile()
return
và mã chính
# iPhone home status threading code
class nmapClass(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
global exitCounter
nmapThread()
msg.log('Exited nmapThread')
waitEvent.set()
waitEventAdjustable.set()
serialDataWaiting.set()
exitCounter += 1
def nmapThread():
iPhone = {}
maxCounts = 10
for phone in v:
if 'iPhone' in phone:
iPhone[phone] = {}
iPhone[phone]['hostname'] = v[phone]['iPhoneHostname']
iPhone[phone]['count'] = maxCounts
#msg.log(iPhone)
while exitFlag[0] == 0:
for phone in iPhone:
if iPhone[phone]['count'] > 0:
phoneFound = False
IPAddress = '0.0.0.0'
# Find iPhones IP address using its hostname
commandNsloolup = 'nslookup %s' %iPhone[phone]['hostname']
childNslookup = pexpect.popen_spawn.PopenSpawn(commandNsloolup, timeout = None)
output = childNslookup.readline()
while '\r\n' in output:
#msg.log(output)
if 'Name:' in output:
output = childNslookup.readline()
if 'Address:' in output:
tempStr = output
startPoint = tempStr.find('192')
tempStr = tempStr[startPoint:]
IPAddress = tempStr.replace('\r\n', '')
#msg.log(IPAddress)
output = childNslookup.readline()
if IPAddress == '0.0.0.0':
pass
#msg.error('Error finding IP address for %s' %iPhone[phone]['hostname'], GFI(CF()).lineno)
else:
#commandNmap = 'nmap -PR -sn %s' %IPAddress
#commandNmap = 'nmap -p 62078 -Pn %s' %IPAddress # -p specifies ports to try and access, -Pn removes pinging
commandNmap = 'nmap -p 62078 --max-rate 100 %s' %IPAddress
childNmap = pexpect.popen_spawn.PopenSpawn(commandNmap, timeout = None)
output = childNmap.readline()
while '\r\n' in output:
if 'Host is up' in output:
phoneFound = True
break
output = childNmap.readline()
#if phoneFound:
# break
if phoneFound:
iPhone[phone]['count'] = 0
if v[phone]['home'] == False:
msg.log('%s\'s iPhone has returned home' %phone)
occupancyStatus(phone, True)
waitEventAdjustable.set()
#else:
#msg.log('%s\'s iPhone still at home' %phone)
else:
iPhone[phone]['count'] -= 1
if v[phone]['home'] == True and iPhone[phone]['count'] == 0:
msg.log('%s\'s iPhone has left home' %phone)
occupancyStatus(phone, False)
waitEventAdjustable.set()
#else:
#msg.log('%s\'s iPhone still away from home' %phone)
elif iPhone[phone]['count'] < 0:
msg.error('Error with count variable in iPhone dictionary', GFI(CF()).lineno)
longWait = True
for phone in iPhone:
if iPhone[phone]['count'] > 0:
longWait = False
#msg.log('%s: %s' %(phone, iPhone[phone]['count']))
if longWait:
#msg.log('wait long')
# 600 = run every 10 minutes
waitEvent.wait(timeout=600)
for phone in iPhone:
iPhone[phone]['count'] = maxCounts
else:
#msg.log('wait short')
waitEvent.wait(timeout=60)
return
Mã có thể không hoạt động nếu bạn sao chép thẳng vào tập lệnh của mình, vì có một số phần bị thiếu mà tôi chưa sao chép để thử và giữ mọi thứ đơn giản và dễ đọc, nhưng hy vọng đoạn mã trên mang lại cho mọi người cảm giác về cách tôi đã làm nhiều thứ.
hcitool ...
. Tuy nhiên, bạn phải xâu chuỗi các lệnh như trong ví dụ đã nêu ở trên. Kết nối chỉ hoạt động trong một khoảng thời gian rất ngắn. Bạn có thể thêm sự gần gũi vào hỗn hợp bằng cách làmhcitool rssi ...
.