在 python 中使用树莓派蓝牙时遇到问题

Posted

技术标签:

【中文标题】在 python 中使用树莓派蓝牙时遇到问题【英文标题】:Having trouble using raspberry pi bluetooth in python 【发布时间】:2018-03-10 20:25:09 【问题描述】:

首先,如果有人知道使用 python 在我的树莓派零 w 上编写蓝牙以打开发现、侦听配对请求、连接并保存配对设备等的好教程,那将是很棒的。我测试蓝牙发现的代码如下。

import bluetooth

print("performing inquiry...")

nearby_devices = bluetooth.discover_devices(
        duration=8, lookup_names=True, flush_cache=True)

print("found %d devices" % len(nearby_devices))

for addr, name in nearby_devices:
    try:
        print("  %s - %s" % (addr, name))
    except UnicodeEncodeError:
        print("  %s - %s" % (addr, name.encode('utf-8', 'replace')))

TraceBack 在下面

Traceback (most recent call last):
  File "bluetoothConnect.py", line 6, in <module>
    duration=8, lookup_names=True, flush_cache=True)
  File "/usr/lib/python2.7/dist-packages/bluetooth/bluez.py", line 17, in discover_devices
    sock = _gethcisock ()
  File "/usr/lib/python2.7/dist-packages/bluetooth/bluez.py", line 226, in _gethcisock
    raise BluetoothError ("error accessing bluetooth device")
bluetooth.btcommon.BluetoothError: error accessing bluetooth device

【问题讨论】:

您使用的是哪种树莓派?它有蓝牙设备吗?您是否尝试过以 root 身份运行? 树莓派零 w,是的,它有蓝牙。 以 root 身份运行怎么样?这可能是这里的关键之一 那我该怎么做呢? 如果其他人知道我可以尝试解决此问题的任何其他内容。 pi zero w 带有蓝牙,但我必须安装蓝牙和 python-bluez 包。我不明白为什么会出现此错误 【参考方案1】:

("错误访问蓝牙设备") 是线索。 是的 - 如前所述,您需要提升权限。 只需使用 sudo 运行脚本... 例如 - sudo python myscript.py 输入您的密码 它现在应该可以工作了..用于测试目的。 虽然接下来我会创建一个特权用户,并将该用户添加到具有设置 /bin/false 的根组中。 然后使用该用户运行所有脚本..

【讨论】:

【参考方案2】:

遇到了同样的问题,然后我编写了这个简单的脚本来使用 python3 包装 Bluetoothctl。在树莓派 4 上测试。

import subprocess
import time


def scan(scan_timeout=20):
    """ scan
        Scan for devices
        Parameters
        ----------
        scan_timeout : int
            Timeout to run the scan
        Returns
        ----------
        devices : dict
            set of discovered devices as MAC:Name pairs
    """
    p = subprocess.Popen(["bluetoothctl", "scan", "on"])
    time.sleep(scan_timeout)
    p.terminate()
    return __devices()


def __devices():
    """ devices
        List discovered devices
        Returns
        ----------
        devices : dict
            set of discovered devices as MAC:Name pairs
    """
    devices_s = subprocess.check_output("bluetoothctl devices", shell=True).decode().split("\n")[:-1]
    devices = 
    for each in devices_s:
        devices[each[7:24]] = each[25:]
    return devices


def info():
    """ Info
        Returns
        ----------
        info : str
            information about the device connected currently if any
    """
    return subprocess.check_output("bluetoothctl info", shell=True).decode()


def pair(mac_address):
    """ pair
        Pair with a device
        Parameters
        ----------
        mac_address : str
           mac address of the device tha you need to pair
    """
    subprocess.check_output("bluetoothctl pair ".format(mac_address), shell=True)


def remove(mac_address):
    """ remove
        Remove a connected(paired) device
        Parameters
        ----------
        mac_address : str
           mac address of the device tha you need to remove
    """
    subprocess.check_output("bluetoothctl remove ".format(mac_address), shell=True)


def connect(mac_address):
    """ connect
        Connect to a device
        Parameters
        ----------
        mac_address : str
           mac address of the device tha you need to connect
    """
    subprocess.check_output("bluetoothctl connect ".format(mac_address), shell=True)


def disconnect():
    """ disconnect
        Disconnects for currently connected device
    """
    subprocess.check_output("bluetoothctl disconnect", shell=True)


def paired_devices():
    """ paired_devices
            Return a list of paired devices
    """
    return subprocess.check_output("bluetoothctl paired-devices", shell=True).decode()

【讨论】:

以上是关于在 python 中使用树莓派蓝牙时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

在 LE 读取远程使用的功能时,树莓派的蓝牙连接失败

树莓派连接wifi和蓝牙

用树莓派探索蓝牙

树莓派树莓派3与手机之间蓝牙连接配置记录

更改树莓派蓝牙设备名称?

Arduino UNO与树莓派3B搭建一个视觉小车