获取未连接蓝牙设备的RSSI



我目前正在使用树莓pi,希望获得未连接蓝牙地址的RSSI。我正在使用

import bluetooth
result=bluetooth.lookup_name('XX:XX:XX:XX:XX:XX',timeout=5)
if(result !=None):
print("user near")
else:
print("user far")

但我想更精确一点,并在更近的距离内到达另一个块,因此我需要RSSI值。请帮忙。我是树莓和Python的新手。(我在蟒蛇3(

BlueZ设备API支持在Raspberry Pi上获取RSSI值。

在下面的示例中,我使用pydbus作为访问BlueZ的D-Bus API的库。此示例扫描60秒,并将设备地址和RSSI值写入文件。您可以修改代码,以便在找到特定地址和RSSI值时采取行动。

from datetime import datetime
from pathlib import Path
import pydbus
from gi.repository import GLib
discovery_time = 60
log_file = Path('/home/pi/device.log')

def write_to_log(address, rssi):
"""Write device and rssi values to a log file"""
now = datetime.now()
current_time = now.strftime('%H:%M:%S')
with log_file.open('a') as dev_log:
dev_log.write(f'Device seen[{current_time}]: {address} @ {rssi} dBmn')
bus = pydbus.SystemBus()
mainloop = GLib.MainLoop()
class DeviceMonitor:
"""Class to represent remote bluetooth devices discovered"""
def __init__(self, path_obj):
self.device = bus.get('org.bluez', path_obj)
self.device.onPropertiesChanged = self.prop_changed
rssi = self.device.GetAll('org.bluez.Device1').get('RSSI')
if rssi:
print(f'Device added to monitor {self.device.Address} @ {rssi} dBm')
else:
print(f'Device added to monitor {self.device.Address}')
def prop_changed(self, iface, props_changed, props_removed):
"""method to be called when a property value on a device changes"""
rssi = props_changed.get('RSSI', None)
if rssi is not None:
print(f'tDevice Seen: {self.device.Address} @ {rssi} dBm')
write_to_log(self.device.Address, rssi)

def end_discovery():
"""method called at the end of discovery scan"""
mainloop.quit()
adapter.StopDiscovery()
def new_iface(path, iface_props):
"""If a new dbus interfaces is a device, add it to be  monitored"""
device_addr = iface_props.get('org.bluez.Device1', {}).get('Address')
if device_addr:
DeviceMonitor(path)
# BlueZ object manager
mngr = bus.get('org.bluez', '/')
mngr.onInterfacesAdded = new_iface
# Connect to the DBus api for the Bluetooth adapter
adapter = bus.get('org.bluez', '/org/bluez/hci0')
adapter.DuplicateData = False
# Iterate around already known devices and add to monitor
print('Adding already known device to monitor...')
mng_objs = mngr.GetManagedObjects()
for path in mng_objs:
device = mng_objs[path].get('org.bluez.Device1', {}).get('Address', [])
if device:
DeviceMonitor(path)
# Run discovery for discovery_time
adapter.StartDiscovery()
GLib.timeout_add_seconds(discovery_time, end_discovery)
print('Finding nearby devices...')
try:
mainloop.run()
except KeyboardInterrupt:
end_discovery()

如果需要安装CCD_ 1库;安装系统提供的PyGObject";有关Debian的说明,请访问:https://pygobject.readthedocs.io/en/latest/getting_started.html#ubuntu-开始

Bluepy库看起来对RaspberryPI有益。别忘了你应该像来自终端的"sudo python3 name.py"

有关更多信息:https://github.com/IanHarvey/bluepy/tree/master/docs

from bluepy.btle import Scanner
while True:
try:
#10.0 sec scanning
ble_list = Scanner().scan(10.0)
for dev in ble_list:
print("rssi: {} ; mac: {}".format(dev.rssi,dev.addr))
except:
raise Exception("Error occured")

最新更新