ดังนั้นฉันได้ทำงานในเรื่องเดียวกันประมาณหนึ่งปีแล้ว ฉันทำให้มันทำงานบน mac ได้อย่างรวดเร็ว แต่มีปัญหามากมายที่จะทำให้มันทำงานบนพีซีได้ ฉันได้ลองวิธีที่แตกต่างมากมาย ฉันมีระบบอัตโนมัติภายในบ้านที่เปิดเครื่องทำความร้อนและน้ำร้อน (ผ่านโมดูล arduino และ RF) เมื่อฉันหรือคู่ของฉันอยู่บ้าน (นั่นคือไอโฟนของเราสามารถตรวจจับได้ใน WiFi ที่บ้าน) ในที่สุดฉันใช้ 'nslookup' เพื่อค้นหาที่อยู่ IP สำหรับ iPhones (ในกรณีที่ที่อยู่ IP เปลี่ยนแปลงเนื่องจากเป็นแบบไดนามิก (แต่จริง ๆ แล้วพวกเขาไม่เคยทำบนเราเตอร์ของฉัน)) และ 'nmap' เพื่อตรวจสอบว่า iPhone เปิดอยู่หรือไม่ เครือข่าย. หาก iPhone อยู่ในโหมดสลีปที่ 'nmap' ไม่สามารถหาโทรศัพท์ได้เสมอดังนั้นฉันได้ทำการตรวจสอบ 10 ครั้งก่อนที่มันจะบอกว่าโทรศัพท์ไม่ได้อยู่บ้าน ด้านล่างเป็นส่วนหนึ่งของรหัสการทำงานอัตโนมัติในบ้านของฉันในไพ ธ อน ฉันใช้เธรด คำถามใด ๆ ที่มีรหัสด้านล่างแจ้งให้เราทราบ
# 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}
}
และ
# 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
และรหัสหลัก
# 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
รหัสอาจไม่ทำงานหากคุณคัดลอกมันลงในสคริปต์ของคุณโดยตรงเนื่องจากมีบางส่วนที่ขาดหายไปซึ่งฉันยังไม่ได้คัดลอกเพื่อพยายามทำให้สิ่งต่าง ๆ เรียบง่ายและอ่านง่าย แต่หวังว่ารหัสข้างต้นจะช่วยให้ทุกคนเข้าใจว่าฉันทำอย่างไร สิ่ง
hcitool ...
ได้ อย่างไรก็ตามคุณจะต้องเชื่อมโยงคำสั่งต่าง ๆ ดังตัวอย่างด้านบน การเชื่อมต่อใช้งานได้ในระยะเวลาสั้น ๆ เท่านั้นhcitool rssi ...
คุณสามารถเพิ่มความใกล้ชิดเข้าผสมด้วยการทำ