답변:
낮은 수준의 무선 스캔없이 많은 사람들이 다른 장치를 감지하지 못하는 경우가 많았습니다. Bluetooth는 둘 다 자신의 장치 인 경우 iPhone에서 작동합니다.
일부 장치에서는 Wi-Fi 스캔이 작동 할 수 있지만 화면이 꺼져 있으면 iOS 장치가 연결되지 않습니다! 내 아이폰 6는 간단한 arp
명령 (동일한 서브넷에 연결된 장치의 ip 및 mac 번호 표 제공) 으로 감지 할 수 있지만 전화 화면이 켜진 경우에만 발생합니다. 전화 화면이 잠 자면 Wi-Fi의 범위를 벗어났습니다! 나는 이것이 배터리 수명에 관심이 있다고 확신합니다.
블루투스 동글이 작동했습니다. rPi 및 iPhone에서 전력 소비가 거의 없어 현재의 / 아무런도없는 일부 고급 알고리즘과 달리 거리 계산이 없습니다. rPi에 블루투스 동글을 다음과 같이 설치하십시오 : ( sudo aptitude install bluetooth bluez-utils bluez-compat
). 전화 장치를 검색 가능하게 hcitool scan
하여 rPi에서 ( ) 를 수행하여 전화 장치의 Mac을 파악하십시오 . 그런 다음 다음과 같이 장치에 연결하고 (검색 가능해야 함) sudo bluez-simple-agent hci0 mac_of_your_device
양쪽에 예라고 말하십시오. 그런 다음 sudo bluez-test-device trusted mac_of_your_device
. 이제 그들은 서로를 "알고"있습니다. 그런 다음sudo hcitool name mac_of_your_device
아이폰이 근처에 있는지 알아 내기 위해 좋아하는 스크립트에서. 이것은 연결을 만들지 않고 단지 hi라고 말합니다. 이름을 반환하면 전화가 근처에 있습니다. 아무 것도 반환하지 않으면 전화가 근처에 있지 않거나 블루투스가 꺼져있는 것입니다. 연결 또는 다른 거리 계산 방법을 만드는 것과 비교하여이 방법은 배터리를 양쪽에 절약하고 전파 오염을 최소화합니다.
저와 제 친구들은 해커 공간의 현관 문을 여는 블루투스 근접 식 스캐너를 개발하고 있습니다.
허용 된 모든 장치를 페어링했으며 기본적으로 hcitool
페어링 된 장치 중 하나가 근처에 있는지 테스트하는 데 사용 되었습니다. 예를 들어, 페어링 된 장치의 주소가 "00 : 00 : 00 : 00 : 00 : 00"이면 명령 줄 콘솔에서이 작업을 수행합니다.
hcitool cc 00:00:00:00:00:00 && hcitool auth 00:00:00:00:00:00 && hcitool dc 00:00:00:00:00:00;
이것이 0을 반환하면 장치는 근접한 것입니다.
한 가지 단점은 장치가 근처에 있지 않으면 시간이 초과 될 때까지 ~ 5 초가 걸린다는 것입니다.
사무실에있을 때 연결되는 WiFi 네트워크가있는 경우, x 시간마다 PI가 MAC 주소를 검색하고 현재 상태로 웹 페이지 (드롭 박스 등)를 업데이트 할 수 있습니다. 아마도 가장 신뢰할 수있는 경로 일 것입니다.
블루투스 및 USB 블루투스 어댑터로 무언가를 할 수는 있지만 경험이 없습니다.
파이 또는 파이가 연결된 네트워크에 연결되어 있지 않으면 많은 성공을 거둘 것이라고 생각하지 않습니다.
위의 답변을 읽으면 다음과 같은 가능성에 대해 생각하게되었습니다.
airmon-ng 를 사용 하여 wifi에서 클라이언트 장치에 대한 네트워크를 지속적으로 스캔하십시오. 출력은 파일에 기록 될 수 있으므로 파일이 변경되면 클라이언트가 pi의 범위를 입력하거나 그 범위를 벗어나게됩니다. 알려진 mac 주소 목록을 사용하면 사용자를 식별 할 수 있으며 파일 변경으로 인해 일부 작업이 트리거 될 수 있습니다.
꽤 흥미로운 아이디어입니다! 감사!
아르 연
장치가 모두 동일한 네트워크에있는 한 쉽게 Raspberry Pi를 사용하여이 작업을 수행 할 수 있습니다. 필요한 모든 코드가 포함 된 완벽한 프로젝트는 다음과 같습니다.
http://www.element14.com/community/people/mcollinge/blog/2014/09/12/raspberry-pi-network-spy--part-1
그래서 나는 약 1 년 동안 같은 문제를 연구 해 왔습니다. Mac에서 상당히 빨리 작동하도록했지만 PC에서 올바르게 작동하는 데 많은 문제가있었습니다. 나는 많은 다른 접근법을 시도했다. 저와 제 파트너가 집에있을 때 (아두 이노와 RF 모듈을 통해) 난방과 온수를 켜는 가정용 자동화 시스템이 있습니다 (즉, iPhone은 가정용 WiFi에서 감지 가능). 결국 나는 'nslookup'을 사용하여 iPhone의 IP 주소를 찾았습니다 (IP 주소가 동적으로 변경되었지만 실제로 라우터에서 절대로 변경하지 않는 경우) iPhone이 켜져 있는지 감지하기 위해 'nmap' 네트워크. 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 ...
.