PyBluez - 蓝牙 Python 扩展模块

2024 年 8 月 29 日 | 阅读 6 分钟

引言

本教程讨论 PyBluez - 蓝牙 Python 扩展模块。本文旨在向您介绍蓝牙编程,并帮助您入门 PyBluez,这是一个 Python 蓝牙模块。蓝牙套接字编程与网络设计者用于 TCP/IP 连接的套接字编程相同,熟悉这种范式会有帮助,但不是必需的。Python 是一种通用且强大的动态类型面向对象语言,具有简洁的语法和内置的内存管理,因此程序员可以利用现有的算法,而不必担心内存泄漏或括号匹配。我可以集中精力。

Python 拥有庞大且全面的时尚库,但蓝牙支持仍需作为旧分发版的一部分。经过良好文档的 C API 允许软件开发人员创建第三方扩展模块,以扩展语言功能并提供对 Python 中尚不可用的操作系统资源的访问。PyBluez 是一个用 C 编写的 Python 扩展模块,它提供了面向对象的模块化访问系统蓝牙资源的方式。它为 Windows XP 和 GNU/Linux 编写。

蓝牙编程的基本术语和定义是什么?

蓝牙地址或设备地址

以这种方式制造的每个蓝牙芯片都印有唯一的、众所周知的蓝牙地址或设备地址的 48 位详细信息。这与以太网 MAC 地址相同,用于标识特定的蓝牙设备。

1. 传输协议

在多层网络结构中,传输协议是负责开发数据包、确保同步和鲁棒性以及防止丢失记录的层。Internet 编程使用 TCP 或 UDP 作为传输协议,但对于蓝牙,最常用的传输协议是 L2CAP 和 RFCOMM。

2. 蓝牙配置文件

蓝牙是蓝牙的短距离特性。蓝牙配置文件是某些承诺的组成部分。有单独的配置文件用于在物理环境中替换数据、打印到附近的打印机以及用于附近的调制解调器拨打电话。可能还有一个用于将蓝牙编程减少到 Internet 编程的配置文件。

3. 设备名称

这是蓝牙设备的易于阅读的名称,显示给用户,而不是设备的蓝牙地址。这通常是用户可配置的,并且可以对多个设备相同。用户代理负责将名称翻译成相应的蓝牙地址。TCP/IP 有一个名称服务器用于此目的,但对于蓝牙,客户端程序必须利用设备与用户指定的名称的接近度。

4. 端口号

一旦您知道数字地址和传输协议,蓝牙编程最重要的部分就是选择用于通信的端口号。同一主机上的多个应用程序不能在没有端口号的情况下使用相同的传输协议。此概念也用于 Internet 编程,使用不同的端口,例如 HTTP 和 TCP。端口是 L2CAP 传输协议中的协议服务多路复用器。RFCOMM 有 1 到 30 的通道编号。与 Internet 编程相比,蓝牙的端口数量非常有限。因此,蓝牙端口是根据应用程序需求在运行时分配的。在设计时,客户使用一种称为通用唯一标识符 (UUID) 的 128 位宽数字来了解要查找哪个端口描述。它通过使用称为服务发现协议的内容来实现此目的。

已定义蓝牙传输协议

蓝牙上有多种传输协议。传输协议如下所示:

1. L2CAP

此传输协议用于每个数据包都不重要但需要传输速度的情况。它与 UDP 协议非常相似,并且用于简化。它发送固定持续时间的可靠数据包,并且对于不同级别的可靠性是相当可定制的。实用程序可以使用三种规则

  1. 从不重传
  2. 丢弃数据包并继续处理排队记录。
  3. 重传直到连接失败(默认设置)。

2. RFCOMM

RFCOMM 协议非常类似于 TCP,并提供类似的服务和功能。在许多情况下,它非常容易使用,并且通常用于点对点程序。如果一部分数据在固定时间内未发送,则连接终止。当应用程序停止时,一旦定义了端口计数,它就与串行端口编程非常相似,并且可以使用与任何串行设备相同的实践。这是套接字编程中最直观、最容易的部分。

什么是 Bluez 堆栈和 PyBluez?

现在来谈谈邮件中的实际收入。PyBluez 是一个用于蓝牙套接字编程的 C(也称为 Bluez)和 Python 库。PyBluez 是一个用 C 编写的 Python 扩展模块,它以面向对象的模块化方式允许访问设备的蓝牙资源。虽然它在两种语言中都提供了类似的功能,但这里只讨论最好的基于 Python 的实现。PyBluez 可用于 Microsoft Windows(XP 及更高版本)和 GNU/Linux。本教程教授 Python 的基础知识,并熟悉 Linux 运行设备。

使用 Bash 进行蓝牙套接字编程

对于某些程序,使用 Bash 编写一些不错的蓝牙通信脚本非常重要。在我们的项目中,我们在转移到 Python 之前使用了这种方法,因为它与 ROS 兼容性很好。这些数据对于想要深入了解 Bash 并学习简单脚本的人来说很有价值。Bash 是一种解释性语言,类似于 Python,并且 Bash 脚本会逐条执行命令,就像您在终端中输入它们一样。用于串行通信的第一个命令是 sdptool。这将允许您在特定通道上使用串行端口。对于 RFCOMM,使用的通道是 22。然后您可以使用 rfcomm watch 命令将通道 22 绑定到 /dev/rfcomm0 22 的开发端口。使用这些简单的命令,您可以在 rfcomm 端口上收听串行统计信息。现在,当您将计算机与蓝牙设备和 Android 手机配对,并使用 BlueTerm 等蓝牙模拟器应用程序时,您应该能够将数据通过串行发送到您的计算机,并将其“echo”到显示屏或文件传输。

使用 PyBluez 进行蓝牙编程的标准步骤

蓝牙编程的一般步骤是:

  1. 选择要与之通信的设备
  2. 决定要使用的传输协议
  3. 设置出站或入站引用以进行加密
  4. 发送数据或接收数据

在 PyBluez 的使用中,这些步骤被高度抽象化,应用程序级别的包几乎与与串行设备进行串行通信相同。对于大多数程序,RFCOMM 被用作传输协议,并且预先确定了设备名称以避免混淆。在 PyBluez 中,可以根据设备名称直接指定用于通信的附近设备,而无需了解硬件地址。

编程以套接字编程的形式执行,通过创建 BluetoothSocket 对象。在这些设备的构造函数中,您可以指定要使用的传输协议(RFCOMM/L2CAP)。之后,您可以使用 join 方法实际连接到蓝牙设备。默认情况下,所有通信都在 RFCOMM 端口 1 上进行;但是,您可以动态选择端口。错误处理同样很简单。如果操作失败,将引发 BluetoothError,可以在 Python 中的 try-except 循环中捕获。

PyBluez 最吸引人的功能之一是使用服务发现协议的便利性。如上所述,服务发现协议允许我们在运行时发现我们将要连接的蓝牙端口(RFCOMM 或 L2CAP)。它不依赖于设计时端口号和/或设备地址的唯一性。advertise_service 方法通过本地 SDP 服务器广播服务,find_service 方法搜索所有蓝牙设备以查找特定服务,并且不需要设备 ID。get_available_port 返回给定协议的第一个可用端口变体,但不再存储,因此必须将其绑定到端口。由于时间差异,可用性可能会波动,并且可能会抛出 BluetoothException。还有高级用法选项,例如异步设备发现,它允许系统即使在尚未与设备建立连接时也能返回。此功能在某些情况下非常有用。