{\rtf1\ansi\ansicpg1252\cocoartf2511 \cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fnil\fcharset0 Menlo-Regular;} {\colortbl;\red255\green255\blue255;\red0\green0\blue0;\red255\green255\blue255;} {\*\expandedcolortbl;;\cssrgb\c0\c0\c0;\cssrgb\c100000\c100000\c100000\c0;} \margl1440\margr1440\vieww10800\viewh8400\viewkind0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0 \f0\fs16 \cf2 \cb3 \CocoaLigature0 import blescan\ import sys\ import os\ import decimal\ from decimal import Decimal\ #import time\ from time import sleep\ import math\ import bluetooth._bluetooth as bluez\ import argparse\ import RPi.GPIO as GPIO\ GPIO.setwarnings(False)\ GPIO.setmode(GPIO.BOARD)\ GPIO.setup(11,GPIO.IN, pull_up_down = GPIO.PUD_DOWN)\ GPIO.setup(12,GPIO.IN, pull_up_down = GPIO.PUD_DOWN)\ GPIO.setup(7, GPIO.OUT)\ GPIO.setup(8, GPIO.OUT)\ GPIO.setup(15, GPIO.OUT)\ \ #Arguments parser\ parser = argparse.ArgumentParser(description='Reliable Bluetooth LE (iBeacon) scanner')\ parser.add_argument('-i', type=int, default=0, help='Bluetooth adapter ID')\ parser.add_argument('-t', type=int, default=10, help='Seconds between two survey. A small value can cause some beacon to be missed')\ parser.add_argument('-n', type=float, default=1.0, help='Path loss exponent')\ parser.add_argument('-pdz', type=int, default=1, help='TxPower at taring position')\ parser.add_argument('-dz', type=int, default=1, help='Distance of taring position (m) ')\ \ args = parser.parse_args()\ \ # Console colors\ W = '\\033[0m' # white (normal)\ R = '\\033[31m' # red\ G = '\\033[32m' # green\ O = '\\033[33m' # orange\ B = '\\033[34m' # blue\ P = '\\033[35m' # purple\ C = '\\033[36m' # cyan\ GR = '\\033[37m' # gray\ \ \ NearCount = 2\ InterCount = 2\ FarCount = 2\ \ \ def printInfo(str):\ print G + "[INFO]" + str\ \ def printError(str):\ print R + "[ERROR]" + str\ \ def gracefulExit():\ print\ print R + "Quitting... ByeBye!"\ print W\ GPIO.output(7, GPIO.LOW)\ GPIO.output(8, GPIO.LOW)\ GPIO.output(15, GPIO.LOW)\ sys.exit(0)\ \ def badExit():\ print\ print R + "Somethings went wrong...! Quitting!"\ print W\ sys.exit(1)\ \ def getDistance(rssi, oldDist):\ \ global NearCount\ global InterCount\ global FarCount\ \ if(rssi > -70):\ NearCount += 1\ if(NearCount >= 2):\ dist = "Near"\ NearCount = 0\ else:\ dist = oldDist\ elif(rssi > -85):\ InterCount += 1\ if(InterCount >= 2):\ dist = "Inter"\ InterCount = 0\ else:\ dist = oldDist\ else:\ FarCount += 1\ if(FarCount >= 2):\ dist = "Far"\ FarCount = 0\ else:\ dist = oldDist\ \ return str(dist)\ def getDistVal(rssi):\ dist = float(10)**(float(-40 - rssi)/float(100))\ return dist\ def blinkLED(dist, led):\ \ print (dist)\ \ if(dist == "Near"):\ GPIO.output(led, GPIO.LOW)\ sleep(0.1)\ GPIO.output(led, GPIO.HIGH)\ sleep(0.1)\ GPIO.output(led, GPIO.LOW)\ sleep(0.1)\ GPIO.output(led, GPIO.HIGH)\ sleep(0.1)\ GPIO.output(led,GPIO.LOW)\ sleep(0.1)\ GPIO.output(led,GPIO.HIGH)\ sleep(0.1)\ GPIO.output(led,GPIO.LOW)\ sleep(0.1)\ GPIO.output(led,GPIO.HIGH)\ elif(dist == "Inter"):\ GPIO.output(led, GPIO.LOW)\ sleep(1)\ GPIO.output(led, GPIO.HIGH)\ sleep(1)\ GPIO.output(led, GPIO.LOW)\ sleep(1)\ GPIO.output(led, GPIO.HIGH)\ else:\ GPIO.output(led, GPIO.HIGH)\ \ \ print O\ \ printInfo("Starting BLE thread on device ID: " + str(args.i) + "...")\ try:\ sock = bluez.hci_open_dev(int(args.i))\ \ except:\ printError("Error accessing bluetooth device!")\ badExit()\ \ \ printInfo("Setting up BLE device ...")\ try:\ blescan.hci_le_set_scan_parameters(sock)\ \ except:\ printError("Error setting up bluetooth device!")\ badExit()\ \ printInfo("Start scanning...")\ try:\ blescan.hci_enable_le_scan(sock)\ except:\ printError("Error scanning! Maybe not root?")\ badExit()\ \ GPIO.output(7, GPIO.LOW)\ connected = False\ disconnectCount = 0\ timmer = 50\ distance = "Far"\ distVal = 0;\ while True:\ try:\ #Try to retrive the full scan result\ returnedList = blescan.parse_events(sock, args.t)\ \ purgedList = []\ seen = set()\ purgedList = []\ #We search and delete all the beacon from the same device\ #Looping througth the returnedList, every time we found a MAC adr\ #that is not present in 'seen', we add it to 'seen' and 'purgedList'\ for d in returnedList:\ if(d['UUID'] == "c7c1a1bfbb004cad87049f2d2917ded2"):\ connected = True\ timmer = 50\ distance = getDistance(d['RSSI'][0], distance)\ #distVal = getDistVal(d['RSSI'][0])\ #t = d['MAC']\ #if t not in seen:\ #seen.add(t)\ #purgedList.append(d)\ else:\ timmer -= 1\ if(timmer < 0):\ disconnectCount += 1\ if(disconnectCount >= 5):\ connected = False\ disconnectCount = 0\ \ \ print(GPIO.input(12))\ if(connected and GPIO.input(12) == GPIO.HIGH):\ print("connected and Insight")\ GPIO.output(8, GPIO.LOW)\ GPIO.output(15, GPIO.LOW)\ blinkLED(distance, 7)\ elif(connected):\ print("connected")\ GPIO.output(7, GPIO.LOW)\ GPIO.output(8, GPIO.LOW)\ blinkLED(distance, 15)\ else:\ print("disconnected")\ GPIO.output(7, GPIO.LOW)\ GPIO.output(15, GPIO.LOW)\ GPIO.output(8, GPIO.HIGH)\ \ \ #for beacon in purgedList:\ #print G + "\{0:<20s\}\{1:<10s\}\{2:<10s\}\{3:<10s\}\{4:<10s\}\{5:<13s\}\{6:<10s\}".format("MAC","MAJOR","MINOR","RSSI","TxPOWER","DISTANCE(m)","UUDI")\ #print("\{0:<20s\}\{1:<10\}\{2:<10\}\{3:<10d\}\{4:<10d\}\{5:<13\}\{6:<10\}".format(beacon['MAC'],beacon['MAJOR'],beacon['MINOR'],beacon['RSSI'][0],beacon['TxPOWER'][0],getDistVal(beacon['RSSI'][0]),beacon['UUID']))\ \ \ #pr int P+"Scanning.... "\ except KeyboardInterrupt: #Did the user press CTRL+C ?\ print\ printInfo("User press CTRL+C")\ gracefulExit()\ except Exception, e: #Did somethings went wrong? (ie. hot-unpluged BT adapter)\ printError(str(e))\ badExit()\ \ if(GPIO.input(11) == GPIO.LOW):\ print W\ GPIO.output(7, GPIO.LOW)\ GPIO.output(8, GPIO.LOW)\ GPIO.output(15, GPIO.LOW)\ sys.exit(0)}