Skip to content

Instantly share code, notes, and snippets.

@mikerr
Created November 17, 2016 14:59
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mikerr/372911c955e2a94b96089fbc300c2b5d to your computer and use it in GitHub Desktop.
Save mikerr/372911c955e2a94b96089fbc300c2b5d to your computer and use it in GitHub Desktop.
Python script to output bluetooth LE MAC addresses and current RSSI (signal strength)
import sys
import os
import struct
from ctypes import (CDLL, get_errno)
from ctypes.util import find_library
from socket import (
socket,
AF_BLUETOOTH,
SOCK_RAW,
BTPROTO_HCI,
SOL_HCI,
HCI_FILTER,
)
btlib = find_library("bluetooth")
bluez = CDLL(btlib, use_errno=True)
dev_id = bluez.hci_get_route(None)
sock = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)
sock.bind((dev_id,))
err = bluez.hci_le_set_scan_parameters(sock.fileno(), 0, 0x10, 0x10, 0, 0, 1000);
if err < 0:
raise Exception("Set scan parameters failed")
# occurs when scanning is still enabled from previous call
# allows LE advertising events
hci_filter = struct.pack(
"<IQH",
0x00000010,
0x4000000000000000,
0
)
sock.setsockopt(SOL_HCI, HCI_FILTER, hci_filter)
err = bluez.hci_le_set_scan_enable(
sock.fileno(),
1, # 1 - turn on; 0 - turn off
0, # 0-filtering disabled, 1-filter out duplicates
1000 # timeout
)
while True:
data = sock.recv(1024)
# print bluetooth address from LE Advert. packet
addr = ':'.join("{0:02x}".format(ord(x)) for x in data[12:6:-1])
rssi = (ord(data[-1]))
print addr,rssi
@Eckaard
Copy link

Eckaard commented Jan 9, 2018

Hi Mike,

First of all thanks for the code. I was wondering if you could possible explain the RSSI readings to me. What are the readings given in, db? If so why are they all positive and increase in value as the BLE beacon moves closer to the receiver. How I understand it is the closer that the value is to 0 the stronger the signal. My goal is to obtain an estimate as to how far the beacon is from the receiver. Any help would be greatly appreciated.

Regards
Eckaard

@inyou
Copy link

inyou commented Feb 5, 2018

Hi Mike,
Thanks for the code. How can I retrieve the name of the device with data?
Regards

@NotTakenNameHopefully
Copy link

Hi Mike,

First of all thanks for the code. I was wondering if you could possible explain the RSSI readings to me. What are the readings given in, db? If so why are they all positive and increase in value as the BLE beacon moves closer to the receiver. How I understand it is the closer that the value is to 0 the stronger the signal. My goal is to obtain an estimate as to how far the beacon is from the receiver. Any help would be greatly appreciated.

Regards
Eckaard

I have exactly the same question. I know this is quite old, but have someone figure it out by now ?
Thanks in advance

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment