├── README └── Bluetooth Proximity Light.py /README: -------------------------------------------------------------------------------- 1 | Requires python-bluez on ubuntu 2 | -------------------------------------------------------------------------------- /Bluetooth Proximity Light.py: -------------------------------------------------------------------------------- 1 | import fcntl 2 | import struct 3 | import array 4 | import bluetooth 5 | import bluetooth._bluetooth as bt 6 | import RPi.GPIO as GPIO 7 | import time 8 | import os 9 | import datetime 10 | 11 | def bluetooth_rssi(addr): 12 | # Open hci socket 13 | hci_sock = bt.hci_open_dev() 14 | hci_fd = hci_sock.fileno() 15 | 16 | # Connect to device (to whatever you like) 17 | bt_sock = bluetooth.BluetoothSocket(bluetooth.L2CAP) 18 | bt_sock.settimeout(10) 19 | result = bt_sock.connect_ex((addr, 1)) # PSM 1 - Service Discovery 20 | 21 | try: 22 | # Get ConnInfo 23 | reqstr = struct.pack("6sB17s", bt.str2ba(addr), bt.ACL_LINK, "\0" * 17) 24 | request = array.array("c", reqstr ) 25 | handle = fcntl.ioctl(hci_fd, bt.HCIGETCONNINFO, request, 1) 26 | handle = struct.unpack("8xH14x", request.tostring())[0] 27 | 28 | # Get RSSI 29 | cmd_pkt=struct.pack('H', handle) 30 | rssi = bt.hci_send_req(hci_sock, bt.OGF_STATUS_PARAM, 31 | bt.OCF_READ_RSSI, bt.EVT_CMD_COMPLETE, 4, cmd_pkt) 32 | rssi = struct.unpack('b', rssi[3])[0] 33 | 34 | # Close sockets 35 | bt_sock.close() 36 | hci_sock.close() 37 | 38 | return rssi 39 | 40 | except: 41 | return None 42 | 43 | 44 | 45 | far = True 46 | far_count = 0 47 | 48 | # assume phone is initially far away 49 | rssi = -255 50 | rssi_prev1 = -255 51 | rssi_prev2 = -255 52 | 53 | near_cmd = 'br -n 1' 54 | far_cmd = 'br -f 1' 55 | 56 | dagar_addr = '34:FC:EF:0C:8F:CB' 57 | emily_addr = '43:29:B1:55:00:00' 58 | 59 | debug = 1 60 | 61 | while True: 62 | # get rssi reading for address 63 | rssi = bluetooth_rssi(dagar_addr) 64 | 65 | if debug: 66 | print datetime.datetime.now(), rssi, rssi_prev1, rssi_prev2, far, far_count 67 | 68 | 69 | if rssi == rssi_prev1 == rssi_prev2 == None: 70 | print datetime.datetime.now(), "can't detect address" 71 | time.sleep(0) 72 | 73 | elif rssi == rssi_prev1 == rssi_prev2 == 0: 74 | # change state if nearby 75 | if far: 76 | far = False 77 | far_count = 0 78 | os.system(near_cmd) 79 | print datetime.datetime.now(), "changing to near" 80 | GPIO.setwarnings(False) 81 | GPIO.setmode(GPIO.BCM) 82 | GPIO.setup(17, GPIO.OUT) 83 | GPIO.output(17, GPIO.LOW) 84 | time.sleep(1) 85 | 86 | elif rssi < -2 and rssi_prev1 < -2 and rssi_prev2 < -2: 87 | # if were near and single has been consisitenly low 88 | 89 | # need 10 in a row to set to far 90 | far_count += 1 91 | if not far and far_count > 10: 92 | # switch state to far 93 | far = True 94 | far_count = 0 95 | os.system(far_cmd) 96 | print datetime.datetime.now(), "changing to far" 97 | GPIO.setmode(GPIO.BCM) 98 | GPIO.setup(17, GPIO.OUT) 99 | GPIO.output(17, GPIO.HIGH) 100 | time.sleep(1) 101 | 102 | else: 103 | far_count = 0 104 | 105 | 106 | rssi = rssi_prev1 107 | rssi_prev1 = rssi_prev2 108 | --------------------------------------------------------------------------------