我无法列出 Raspberry Pi 附近的 BLE 设备(python、btmgmt)

2024-02-27

我想通过使用 cron 脚本调用的 python 脚本来扫描 Raspberry 环境中的 ble 设备。 但是当我在 cron 中执行此操作时(我的意思是我添加到 sudo crontab -e),我总是得到一个空列表。

当我以 pi 用户身份登录时 - btmgmt (仅)在 su 权限下正常工作:

pi@Pluto:~ $ btmgmt find
Unable to start discovery. status 0x14 (Permission Denied)

pi@Pluto:~ $ sudo btmgmt find
Discovery started
hci0 type 7 discovering on
hci0 dev_found: 77:F8:D7:8A:1E:E5 type LE Random rssi -83 flags 0x0000 
...

所以在我的Python脚本中我写道:

flog.write("P01:\r\n")
out = subprocess.Popen(['sudo', '/usr/bin/btmgmt', 'find'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
stdout, stderr = out.communicate()
flog.write("stderr: " + str(stderr) + "\r\n")
cDvc = stdout.split('\n')
flog.write("Amount of lines = " + str(len(cDvc)) + "\r\n")
for line in cDvc:
    line = line + '\r\n'
    if debugflag:
        print(line)
        flog.write(line)
..

从 shell 提示符运行此脚本工作正常..在日志文件 (flog) 中我得到:...

P01:
stderr: None
Amount of lines = 40
Discovery started
hci0 type 7 discovering on
hci0 dev_found: 70:D0:FD:74:34:AC type LE Random rssi -59 flags 0x0000 
AD flags 0x1a 
..

作为 crontab -e 行运行相同的脚本:没有显示任何设备,我找不到原因:

...
P01:
stderr: None
Amount of lines = 1
P02:
...

有人可以帮我从这里出去吗?


如果您使用 BlueZ DBus API 来获取信息,则无需使用 sudo。它还避免了您必须使用 btmgmt,因为我不确定它是否打算以这种方式编写脚本

DBus API 的文档位于:

https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/adapter-api.txt https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/adapter-api.txt

https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/device-api.txt https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/device-api.txt

pydbus 库对于访问 BlueZ DBus API 非常有帮助:https://pypi.org/project/pydbus/ https://pypi.org/project/pydbus/

一些帮助您入门的有用信息:

  1. bluez 的 Dbus 服务称为“org.bluez”
  2. 默认蓝牙适配器通常将“/org/bluez/hci0”作为其 DBus 对象路径。
  3. BlueZ/DBus 有一个对象管理器,用于存储有关设备的信息

我做了以下脚本来测试这个想法:

from datetime import datetime
import os
import pydbus
from gi.repository import GLib

discovery_time = 60
log_file = '/home/pi/device.log'

# Create an empty log file
def write_to_log(address, rssi):
    if os.path.exists(log_file):
        open_mode = 'a'
    else:
        open_mode = 'w'

    with open(log_file, open_mode) as dev_log:
        now = datetime.now()
        current_time = now.strftime('%H:%M:%S')
        dev_log.write(f'Device seen[{current_time}]: {address} @ {rssi} dBm\n')

bus = pydbus.SystemBus()
mainloop = GLib.MainLoop()

class DeviceMonitor:
    def __init__(self, path_obj):
        self.device = bus.get('org.bluez', path_obj)
        self.device.onPropertiesChanged = self.prop_changed
        print(f'Device added to monitor {self.device.Address}')

    def prop_changed(self, iface, props_changed, props_removed):
        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():
    """Handler for end of discovery"""
    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
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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我无法列出 Raspberry Pi 附近的 BLE 设备(python、btmgmt) 的相关文章

  • 生成 Flask 中使用的签名会话 cookie 值

    我正在用另一个需要将项目注入会话的 Flask 服务器代理 Flask 服务器 两台服务器具有相同的密钥 因此加密签名将相同 当使用 Flask 和会话时 http 响应包含一个 Set Cookie 标头session text 其中 t
  • 使用 glGetFloatv 检索 pyglet 中的模型视图矩阵

    我正在使用 pyglet 在 python 中进行 3D 可视化 并且需要检索模型视图和投影矩阵来进行一些选择 我使用以下方式定义我的窗口 from pyglet gl import from pyglet window import wi
  • 在 Python 中同时插入行

    我正在尝试对我的代码进行矢量化 但遇到了障碍 我有 nxd x 值数组 x1 xn 其中每一行 x1 有很多点 x11 x1d nxd y 值数组 y1 y2 y3 其中每一行 y1 有很多点 y11 y1d x 值的 nx1 数组 x 1
  • 如何将人物传奇带到前台?

    我有一系列子图 其中每个子图都有一个图例 我想在每个子图之外与相邻子图重叠 问题在于图例位于其自己的图的 顶部 但位于相邻图的下方 Legend 不将 zorder 作为参数 所以我不知道如何解决这个问题 这是我使用过的代码 import
  • 使用 Matplotlib 的范围绘制图像的 3D 轮廓

    正如我所介绍的here https stackoverflow com questions 18792624 fits image input to a range in plot python 在二维中 我想知道如何 缩放 要绘制到绘图中
  • 使用 Python 将阿拉伯语或任何从右到左书写系统的字符串打印到 Linux 终端

    非常简单的例子是 city print city 我期望输出是 但实际上输出是相反的字符串 字母看起来有点不同 因为它们有开始 中间和结束形式 我无法将其粘贴到此处 因为复制粘贴会再次更正字符串的顺序 如何在 Linux 终端上正确打印阿拉
  • 按字符串子字符串的列过滤 Pandas 数据框

    我正在尝试使用列中的字符串值是数据框外部字符串的子字符串的条件来过滤数据框 下面的例子 df a b c hello bye hello reference str hello there output a c 一种方法可能是使用正则表达式
  • Django Rest Framework 序列化器中的聚合(和其他带注释的)字段

    我正在尝试找出添加带注释字段的最佳方法 例如将任何聚合 计算 字段添加到 DRF 模型 序列化器 我的用例只是一种情况 端点返回的字段未存储在数据库中 而是从数据库计算得出 让我们看下面的例子 模型 py class IceCreamCom
  • 如何使直方图列的宽度都相同

    我在操作直方图时遇到了一些麻烦 我有一个包含两列的 df 我将它们绘制为堆叠直方图 我将它们放入特定的垃圾箱中 请参阅下面的代码 但我想在最后制作一个大垃圾箱 4000 10000 但是 默认情况下 大垃圾箱的列宽很大 有没有办法让这个大垃
  • 使用 matplotlib 设置或固定二元分布值

    I ve animated a bivariate gaussian distribution using matplotlib 我已经计算过这个distribution通过调整COV matrix来考虑特定的变量 我可以提供有关此过程的更
  • 模拟类:Mock() 还是 patch()?

    我在用mock http www voidspace org uk python mock index html使用Python 想知道这两种方法中哪一种更好 阅读 更Pythonic 方法一 只需创建一个模拟对象并使用它 代码如下 def
  • 导入我自己的模块时出现“ImportError:没有名为...的模块”

    我正在尝试导入模块 但不断收到导入错误 在 PortfolioStatus py 文件中 我有以下代码 它从 share data py 模块导入 share data 类 from Shares share data import sha
  • 如何向 RetrievalQA.from_chain_type 添加内存?或者,如何向 ConversationalRetrievalChain 添加自定义提示?

    如何向 RetrievalQA from chain type 添加内存 或者 如何向 ConversationalRetrievalChain 添加自定义提示 在过去的两周里 我一直在尝试制作一个可以通过文档聊天的聊天机器人 因此不仅仅是
  • 如何使用 selenium 获取 javascript 结果?

    我有以下代码 from selenium import selenium selenium selenium localhost 4444 chrome http some site com selenium start sel selen
  • 如何连接多个字符串? [复制]

    这个问题在这里已经有答案了 如何将 stringList 中的所有字符串合并为一个而不打印它 例如 s joinStrings very hot day returns string print s Veryhotday 感觉有点倒退 但是
  • 执行许多插入重复键更新错误:未使用所有参数

    所以我一直在尝试使用 python 2 7 15 使用 mysql connector 执行此查询 但由于某种原因 它似乎不起作用并且总是返回错误 并非所有参数都被使用 表更新有一个主键 即 ID 这是我尝试运行此 SQL 的查询 sql
  • 如何从 IDLE 命令行运行 Python 脚本?

    在 bash shell 中 我可以使用 bash 或 source 手动调用脚本 我可以在 Python IDLE 的交互式 shell 中做类似的事情吗 我知道我可以转到文件 gt gt 打开模块 然后在单独的窗口中运行它 但这很麻烦
  • 重新安装后使用 pandas dataframes 时出现问题

    我已经重新安装了 Python 和 Anaconda 现在面临以下问题 在我将 pkl 文件加载到数据帧并尝试 查看 该文件后 如下所示 df pd read pickle example pkl df 我收到错误 AttributeErr
  • 将 .parquet 编码为 io.Bytes

    目标 将 Parquet 文件上传到 MinIO 这需要将文件转换为字节 我已经能够做到这一点了 csv json and txt bytes data to csv encode utf 8 bytes json dumps self d
  • Python Web 编程的不同方法的优缺点

    我想使用 Python 编写一些服务器端脚本 但我对这样做的方法有点迷失了 它从 DIY CGI 方法开始 似乎以一些相当强大的框架结束 这些框架基本上可以自己完成所有工作 中间有很多东西 比如web py http webpy org P

随机推荐

  • 在不同的 Excel 文件中使用一个宏

    我写了一个宏 我想在不同的Excel文件中使用它 这些文件具有几乎相同的表结构但不同的数据 那么是否有可能将我的宏脚本 包含 到任何 Excel 文件中 我已经读过this tip https web archive org web 201
  • PHP 和 PDO:一个连接与多个连接

    在我的 PHP 程序中 我需要针对任何给定的网页请求访问数据库 0 到 3 次 我正在使用 PDO 与 MySQL 交互 首先 我使用如下内容创建一个数据库连接 dbh new PDO mysql host hostname dbname
  • 辅助功能、字段集图例和标题标签

    我正在开发的网站的一个要求是它必须符合 508 标准 目前我们大多数的 html 视图都以 header 开头h1然后该视图中需要的任何内容 现在对于表单 建议使用fieldsets and legend除其他众多准则外 在处理可访问性时也
  • 谷歌分析是否将裸域与 www 子域结合起来?

    我为自己的域安装了谷歌分析 http mydomain com 输入的用户是否会http www mydomain com也被分析脚本计算在内吗 对我来说 这似乎是合乎逻辑的 因为裸域地址与 www 前缀的站点位于同一站点是很常见的 但分析
  • 重置被拒绝的 HTML 通知

    我有一个网络应用程序 在其中使用 HTML 通知 如果用户第一次允许它并开始使用它 它工作正常 但是如果用户第一次通过单击阻止按钮阻止通知 然后尝试通过某些用户手势再次请求权限 则浏览器不会触发 允许 阻止 弹出窗口 这是我第二次触发许可
  • 按键时的 JTable 编辑

    我正在尝试以编程方式开始编辑当前行的第三列JTable在按键上 我已经实现了一个 KeyListener 其中keyReleased 包含这段代码 if e getKeyCode KeyEvent VK ENTER myTab change
  • 在 Powershell 中优雅地停止

    How do I catch and handle Ctrl C in a PowerShell script I understand that I can do this from a cmdlet in v2 by including
  • JVM 何时抛出 OutOfMemoryError

    我们正在运行一个有时会 冻结 的 Java 应用程序 因为某些线程正在使用几乎所有堆 尽管 JVM 执行的 Full GC 持续了 60 秒以上 但应用程序从未因 OutOfMemoryError 错误而终止 我从 Java 文档中读到 如
  • amqp 与 amqplib - 哪个 Node.js amqp 客户端库更好?

    这些 amqp 客户端库之间有什么区别 哪一款最值得推荐 主要区别是什么 我会推荐amqp node https github com squaremo amqp node and bramqp https github com bakke
  • Json.Net 没有以相同的方式序列化小数两次

    我正在测试我正在处理的购物车的 Json NET 序列化 并注意到当我序列化 gt 反序列化 gt 再次序列化时 我发现某些文件的尾随零格式有所不同decimal字段 这是序列化代码 private static void TestRoun
  • 检测 Excel 设置的语言并将其显示在文件的单元格中

    我正在设计一组它们之间相关的相关Excel文件 目标是引用彼此文档的宏可以在任何给定的计算机 路径中工作 因此 我使用了一组相对路径 使宏能够正常工作 我使用了以下功能 CELDA nombrearchivo A 1 nombredearc
  • UIPasteboard 字符串从 Today 扩展返回 null

    似乎在 iOS 9 Xcode 7 beta 5 中 我无法访问 UIPasteboard generalPasteboard string 来自我的 今日 小部件扩展 因为每次无论内容如何 它都会返回 NULL 我浏览了发行说明 但没有看
  • PHP ftp_put 返回“无法建立数据连接:连接被拒绝”

    我有一台通过 PHP 运行一些 FTP 的 PC 我知道它在 1 2 个月前还可以工作 但现在我返回它 发现该 PC 不再工作了 我知道我一直在使用电脑 但我想不出可能会发生什么变化 PHP 抛出错误消息读取 无法建立数据连接 连接被拒绝
  • 本机 PHP 5.6 OpenSSL Composer.phar 无法在 Windows 上启用加密

    我在 Windows 计算机上使用本机 PHP 5 6 时遇到问题 当我尝试运行 Composer 更新 php Composer phar update 时出现此错误 Composer Downloader TransportExcept
  • Google OAuth2 集成错误 400:redirect_uri_mismatch

    我收到这个错误Error 400 redirect uri mismatch即使在给出正确的重定向 uri 之后 您可以查看下面的图片以供参考 它适用于我的本地主机 但它在我的服务器上显示此错误 我的域名看起来像https xxx topL
  • Golang - “go run main.go”和编译之间的区别

    在用 Go 编写了一些脚本之后 我问自己 编译一个 go file 以及稍后的执行和go run FILE go在性能等方面的命令 如果我使用这些方法之一启动 Web 服务有什么优势吗 go run只是一步编译然后运行的快捷方式 虽然它对开
  • 绝对位置和溢出:隐藏

    div div div div 我需要显示比父元素大的子元素 但不删除 Overflow hidden 这可能吗 父元素有position relative 子元素一旦超出其父元素的边界 就会被删除 元素定义了额外的 css 为了清晰起见
  • C++ const 强制转换,不确定这是否安全

    这似乎是一个愚蠢的问题 但我确实需要澄清这一点 这会给我的程序带来任何危险吗 Is the const cast甚至需要 如果我更改输入指针值 它将安全地工作std string或者它会产生未定义的行为 到目前为止 唯一担心的是 每当我修改
  • 具有一个视频轨道和多个音频轨道的 AVPlayer

    我试图让我的应用程序中的播放器能够拥有一个视频轨道和多个音频轨道 针对不同的语言 我已经这样做了 但播放器无法启动 AVMutableComposition composition AVMutableComposition composit
  • 我无法列出 Raspberry Pi 附近的 BLE 设备(python、btmgmt)

    我想通过使用 cron 脚本调用的 python 脚本来扫描 Raspberry 环境中的 ble 设备 但是当我在 cron 中执行此操作时 我的意思是我添加到 sudo crontab e 我总是得到一个空列表 当我以 pi 用户身份登