在 Pi 上通过 python 执行 bluetoothctl 命令

2024-03-10

每次我想在我的 pi 上运行 python 脚本之前,我都会在终端上运行一系列 Bluetoothctl 命令。我想从 pi 自动连接到 BLE 设备,无需任何配对确认或用户交互。 以下是每次在运行另一个 python 脚本之前重新启动 pi 时必须输入的命令(此后该脚本将继续运行几天,直到我停止或重新启动 pi):

$sudo bluetoothctl
[Bluetooth]power on
[Bluetooth]discoverable on
[Bluetooth]pairable on
[Bluetooth]agent NoInputNoOutput
[Bluetooth]default-agent 

我想自动化这个过程。 因此,我尝试使用 bluetoothctl 包装器并对其进行修改,但似乎不起作用。也没有错误。

import time
import pexpect
import subprocess
import sys
import re

class BluetoothctlError(Exception):
    """This exception is raised, when bluetoothctl fails to start."""
    pass


class Bluetoothctl:
    def __init__(self):
        out = subprocess.check_output("rfkill unblock bluetooth", shell = True)
        self.child = pexpect.spawn("bluetoothctl", echo = False)
        print("bluetoothctl")

    def get_output(self, command, pause = 0):
        """Run a command in bluetoothctl prompt, return output as a list of lines."""
        self.child.send(command + "\n")
        time.sleep(pause)
        start_failed = self.child.expect(["bluetooth", pexpect.EOF])

        if start_failed:
            raise BluetoothctlError("Bluetoothctl failed after running " + command)

        return self.child.before.split(b"\r\n")

    def make_discoverable(self):
        """Make device discoverable."""
        try:
            out = self.get_output("discoverable on")
            print("discoverable on")
        except BluetoothctlError as e:
            print(e)
            return None


    def power_on(self):
        """Start agent"""
        try:
            out = self.get_output("power on")
            print("power on")
        except BluetoothctlError as e:
            print(e)
            return None


    def pairable_on(self):
        """Start agent"""
        try:
            out = self.get_output("pairable on")
            print("pairable on")
        except BluetoothctlError as e:
            print(e)
            return None

    def agent_noinputnooutput(self):
        """Start agent"""
        try:
            out = self.get_output("agent NoInputNoOutput")
            print("agent Registered Successfully")
        except BluetoothctlError as e:
            print(e)
            return None

    def default_agent(self):
        """Start default agent"""
        try:
            out = self.get_output("default-agent")
            print("set as default agent")
        except BluetoothctlError as e:
            print(e)
            return None

if __name__ == "__main__":
    print("Init bluetooth...")
    bl = Bluetoothctl()
    bl.power_on()
    bl.make_discoverable()
    bl.pairable_on()
    bl.agent_noinputnooutput()
    bl.default_agent()

我编写了一个 python3 脚本来自动连接游戏柜上的游戏手柄。您必须为要连接的每个设备运行它,但不需要用户交互。它使用expect python 模块。我发现它比expect/tcl 脚本更容易使用。如果 python 找不到 pexpect,则需要安装 python3-pexpect。

sudo apt install python3-pexpect

你会想要改变mylistlist 变量来搜索与蓝牙设备的前 3 个字节(供应商部分)匹配的 MAC。因此,例如,如果设备上 MAC 的前 3 个字节以 AA:BB:CC: 开头,则将 EF\:17\:D8\: 部分更改为 AA\:BB\:CC\:

您可以在列表中添加任意数量的要扫描的设备mylist多变的。我的示例搜索两个不同的供应商,一个以 EF\:17\:D8\: 开头,另一个以 16\:04\:18\: 开头:该脚本将拒绝所有其他可能正在传输的蓝牙设备,并且仅连接您在中配置的游戏手柄 MACmylist多变的。

mylist = ['E4\:17\:D8\:[0-9A-F].[:][0-9A-F].[:][0-9A-F].', '16\:04\:18\:[0-9A-F].[:][0-9A-F].[:][0-9A-F].',pexpect.EOF]

这是 python3 脚本:

#!/usr/bin/python3
import os,sys,time,pexpect

def findaddress():
  address=''
  p = pexpect.spawn('hcitool scan', encoding='utf-8')
  p.logfile_read = sys.stdout
  mylist = ['E4\:17\:D8\:[0-9A-F].[:][0-9A-F].[:][0-9A-F].', '16\:04\:18\:[0-9A-F].[:][0-9A-F].[:][0-9A-F].',pexpect.EOF]
  p.expect(mylist)
  address=p.after
  if address==pexpect.EOF:
    return ''
  else:
    return address

def setbt(address):
  response=''
  p = pexpect.spawn('bluetoothctl', encoding='utf-8')
  p.logfile_read = sys.stdout
  p.expect('#')
  p.sendline("remove "+address)
  p.expect("#")
  p.sendline("scan on")

  mylist = ["Discovery started","Failed to start discovery","Device "+address+" not available","Failed to connect","Connection successful"]
  while response != "Connection successful":
    p.expect(mylist)
    response=p.after
    p.sendline("connect "+address)
    time.sleep(1)
  p.sendline("quit")
  p.close()
  #time.sleep(1)
  return


address='' 
while address=='':
  address=findaddress()
  time.sleep(1)
  
print (address," found")
setbt(address)

我编写了另一个 python 脚本,它将整个过程包装在 Vte 中,并显示正在发生的过程,并允许您在需要时退出它。如果你想看的话,请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Pi 上通过 python 执行 bluetoothctl 命令 的相关文章

随机推荐

  • 拖放导致的 WPF 内存泄漏

    使用 Red Gate 工具 我们检测到 System Windows DataObject 持有对拖拽对象 框架元素 的引用 该拖拽对象长期在完成的操作中徘徊 DragDrop DoDragDrop 一次后如何 清除 拖动对象 有没有办法
  • 当涉及多个设备时,核心数据 iCloud 迁移会“丢失”数据

    我最近在更新我的应用程序时遇到了一些重大问题 许多用户抱怨迁移到最新版本后数据丢失 几个小时后 我仍然不确定发生了什么 但我有一个理论想要证实 苹果在文档中说 迁移和 iCloud 对于与给定 NSPersistentStoreUbiqui
  • 导入错误:无法导入名称“LatentDirichletAllocation”

    我正在尝试导入以下内容 from sklearn model selection import train test split 并出现以下错误 这是堆栈跟踪 ImportError Traceback most recent call l
  • for的递归

    我花了很长时间试图弄清楚如何做到这一点 但它没有按预期工作 我正在编写一个有 1 到 k 个数字的代码 我需要找到所有可能的组合而不重复 例如对于 3 1 2 3 12 13 计算 4 位数字 1 2 3 4 5 的示例 int k 5 f
  • 如何编写更新查询来更新mongodb中的多个字段?

    如何编写此更新查询来更新 C 中的 mongo 记录 db collection update S Id 110 Name Name1 Batch 43 Date 9 2 2011 Status 0 我正在尝试这样 IMongoUpdate
  • cv::Mat 矩阵,如何减少 cv::Mat 中小数点右侧的数字?

    我有一个应用程序可以在 iPhone 屏幕上打印 3x3 cv Mat 我需要减少小数位 因为屏幕不太大 请参阅 1 004596557012473 0 003116992336797859 5 936915104939593 0 0072
  • 统计每天、上周和上个月的访客点击量

    我制作了一个包含文章的网站 我想计算每篇文章的浏览量以显示最受欢迎的文章 今天 本周和本月 您将如何为此制定数据库架构 如果知道一篇文章的显示次数就足够了 您可以使用如下内容 daily article views article id v
  • JCA 1.6 ResourceAdapter 是否需要 ManagedConnectionFactory?

    我写了一个之前的JCA资源适配器 http code google com p drools jca 然而 现在我发现自己不得不写一篇文章来访问BootstrapContext及其相关的WorkManager 并且有效地没有其他原因 如果我
  • getElementsByTagName 不起作用?

    在下面的代码中 我通过使用 javascript 动态分配 偶数 类给所有偶数行应用不同的背景颜色 我正在调用 body 标记的 alternamte 函数 onload 起初 我使用 getElementById 来获取表对象 并且我的代
  • FIREBASE 警告:用户回调引发异常。错误:发送后无法设置标头

    我们正在开发一个应用程序 我们使用 Firebase 作为数据库 并使用 Express 作为中间件 后端来路由我们的 RESTful API 该 API 供我们在 Reactjs 中开发的前端使用 下面是我们的 server js 文件的
  • 使用 REST Api,如何在我的类型请求模型中包含“任何类型的 json”?

    我正在使用 NET Framework 和 ASP NET Core 创建 REST Web Api 此 Web API 有一个调用 用于获取请求模型以保存数据 以及一些调用 用于稍后检索数据 大多数数据是我在后端需要的结构化信息 它们被保
  • Java 可重入锁和条件 |生产者完成工作,消费者陷入困境

    一般信息 三个读取器线程从文件中随机读取块 每个块都有一个 ID 然后写入普通的 ArrayList 一旦具有所需 ID 的块被添加到列表中 写入线程就会写入输出文件 因此 我编写了一个 BlockingChunkList 它应该同步 ad
  • 为什么 Firefox 拒绝 ttf 字体

    我有来自网络的 ttf 字体 它们在 ftp 客户端 目录中列为 Windows ttf 字体 我在 Mac OSX 平台上的 Firefox 上使用嵌入字体 但收到以下 Web 控制台错误 17 59 49 201 downloadabl
  • Angularjs 和 jquery 无法以我常规的简单形式工作

    我正在学习 Angularjs 并创建了简单的表单 实际上我是 PHP 开发人员 所以我更喜欢使用 php 作为服务器端脚本语言 我无法将数据提交到服务器 我尝试了很多方法 但是如果我尝试使用标准方法 Angularjs 不起作用 那么这些
  • 如何使用 jQuery 进行重定向? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我使用 HTML 表单提交给 jQuery 验证 然后通过 ajax 将信息发送到 PHP 处理页面 一切都 100 正常工作 除
  • Xcode 7.3 不断在空闲状态下构建

    I noticed that Xcode 7 3 always keep building even in idle time This loads CPU much so sometimes it stops responding Doe
  • 异步构造函数

    我怎样才能最好地处理如下情况 我有一个需要一段时间才能完成的构造函数 var Element function Element name this name name this nucleus this load nucleus name
  • 不在范围内:数据构造函数?

    我是哈斯克尔的新手 我遇到这个问题 Assignment12 hs 5 12 不在范围内 数据构造函数 Suit Assignment12 hs 5 18 不在范围内 数据构造函数 Rank Assignment12 hs 6 11 不在范
  • Java简单计算器

    我用Java编写了这个计算器程序 仅当同时计算两个数字时 此方法才有效 这意味着要获得 1 2 3 的总和 您必须这样做 按 1 按 按 2 按 按 按 3 按 计算结果为 6 但我想对此进行编程 以便我可以通过以下方式获得答案 按 1 按
  • 在 Pi 上通过 python 执行 bluetoothctl 命令

    每次我想在我的 pi 上运行 python 脚本之前 我都会在终端上运行一系列 Bluetoothctl 命令 我想从 pi 自动连接到 BLE 设备 无需任何配对确认或用户交互 以下是每次在运行另一个 python 脚本之前重新启动 pi