- A2DP
- 为无头安装准备Raspberry Pi
- 在Raspberry Pi中安装的先决条件
- 将蓝牙设备与Raspberry Pi配对
- 使用Python脚本自动化蓝牙配对过程
- 使用按钮触发蓝牙配对脚本
- 电路原理图
- 设置Cron作业以在启动时启动Bluetooth Speaker Python程序
Raspberry Pi是具有内置蓝牙,Wi-Fi,以太网端口,摄像头端口等的掌上型计算机,这使其成为最适合基于IoT的嵌入式应用程序的微控制器。它还用于制造多种服务器,例如打印服务器,媒体服务器,Web服务器等。今天,我们将学习Raspberry Pi如何将具有3.5mm插孔的普通扬声器转换为无线蓝牙扬声器。
在这篇文章中,我们将融合A2DP,Linux和音频编解码器的功能,将数据包从音频源无线传输到音频接收器,从而构建基于Raspberry Pi的蓝牙扬声器。为此,我们将对Linux系统进行一些修改,并用bash和python编写一段代码,然后我们就会开展业务。
A2DP
A2DP是Advanced Audio Distribution Profile的首字母缩写。这是几乎所有支持Bluetooth的设备中都存在的协议。只要它们都通过蓝牙相互连接,它就为声音从一个设备到另一设备的数据传输铺平了道路。A2dp使用无损压缩算法在传输之前压缩音频数据包以减少等待时间,但是由于这种压缩所造成的损失几乎是人耳无法感知的。
为无头安装准备Raspberry Pi
要将Raspberry Pi转换为无线Speaker,首先将操作系统(Raspbian Stretch)安装到Raspberry PI SD卡中,如果您不熟悉Raspberry Pi,请按照本文开始使用Raspberry Pi。
我们大多数人都拥有Raspberry Pi和笔记本电脑,但缺少显示器。但是为了通过SSH连接到Raspberry Pi,我们希望将其连接到与计算机连接的同一网络中。我们需要将显示器连接到Pi,通过它我们可以选择Wi-Fi并建立连接?
其实我们没有。通过将条目添加到名为 wpa_supplicant.conf 的文件中,可以将Raspberry Pi连接到Wi-Fi。
为此,请将SD卡连接到计算机,然后打开文件 rootfs / etc / wpa_supplicant / wpa_supplicant.conf ,并将以下条目添加到该文件中。不要忘记使用管理员(root)特权打开文件。
网络= {ssid =“ wifi_ssid” psk =“ wifi_passkey” key_mgmt = WPA-PSK}
条目应与此类似。
上面的条目应该使我们连接到Wi-Fi,但这不足以在Raspberry Pi和计算机之间创建和维护SSH连接。默认情况下,在Raspberry Pi中禁用SSH,因此要启用它,请在启动目录中创建一个名为ssh的空文件。
现在,Raspberry Pi在技术上已启用,可以远程访问。将树莓派连接到电源。现在pi将自动连接到Wi-Fi,但是需要SSH的IP地址。有多种方法可以找出相同的结果。我使用nmap命令
nmap -sn / 24
该命令将为我们提供网络中连接的所有设备的IP地址。例如,
其中之一是树莓派的。现在我们知道pi的IP地址,让我们连接到它
ssh pi @ pi_ip_address
还可以通过其他方式无休止地启动Raspberry Pi,请查看链接以了解相同的知识。
在Raspberry Pi中安装的先决条件
蓝色Z
BlueZ是Raspbian发行版随附的默认应用程序。它用于访问系统的蓝牙控件。如果仅出于您可能知道的原因而在pi中不可用,也可以安装它。
下面的命令将在我们的pi中安装蓝牙接口应用程序。
apt-get安装bluez
脉冲音频
Pulse Audio是将计算机数据字节转换为人类感知的应用程序。它也被称为音乐播放器。PulseAudio应用程序插件中提供了A2DP协议。因此,让我们使用以下命令安装所有与脉冲音频相关的应用程序:
apt-get install pulseaudio- *。
将蓝牙设备与Raspberry Pi配对
使用以下命令打开BlueZ应用程序
蓝牙
一个蓝牙代理是经纪人两个蓝牙之间的谈判功能的设备并初始化它们之间的连接。有不同类型的蓝牙代理。我们将使用的是 NoInputNoOutput 代理,因为它使我们无需用户干预即可进行连接。因此,让我们通过运行以下命令来初始化代理。
代理NoInputNoOutput
您将收到消息“ 代理注册 ”作为响应。现在我们已经注册了代理,让我们 将其设置为默认 代理。
默认代理
其响应应为“默认代理请求成功”
现在让我们让设备变得可发现
可发现于
为此,响应应为“成功后可发现”
现在尝试将手机或计算机连接到Raspberry Pi
应用程序将提示我们授权服务,而我们不需要这样做。相反,我们将仅信任该设备并连接它。信任设备非常重要,因为当受信任的设备尝试与pi连接时,它无需用户干预即可允许pi。
信任 连接
完成所有这些操作后,您的终端应类似于此终端。
好极了!我们的手机通过蓝牙与Raspberry Pi连接。但是够了吗?显然,我们希望将声音数据包从电话传输到pi,然后再从pi传输到与pi的音频端口相连的扬声器。
通过运行以下命令,确保我们的电话在 PulseAudio 应用程序的音频源中列出:
pactl列表短
它将列出所有已加载的声音模块,音频接收器和音频源
查看序列号30的值。Bluez_source表示通过BlueZ应用程序(蓝牙)的音频源。交叉检查在bluez_source和a2dp_source之间的设备mac地址以及您在BlueZ应用程序中拥有的地址。在我的情况下,它是bluez_source.3C_28_6D_FD_65_3D.a2dp_source,与BlueZ应用程序中的相同。现在,如果您从连接到pi的设备播放歌曲,则应将其路由到连接到raspberry pi音频端口的扬声器。
尤里卡!我们已经成功地制造了蓝牙扬声器。我们已经路由了声音,但这还不是全部。我们无法手动完成上述所有步骤,因此让我们使用 期望脚本 和接口pi通过一个开关使它们自动化,按下该开关时,会将Pi与设备配对。
凉?现在让我们开始做生意。
使用Python脚本自动化蓝牙配对过程
Expect脚本就像bash脚本一样,但是是自动化的。它在终端中查找给定的单词,当单词到达时,它将按照脚本发送命令。让我们自动化配对过程。创建一个名为 pair_bluetooth_device.expect 的文件
设置超时30生成bluetoothctl期望“#”发送“ agent off \ r”期望“?gistered”发送“ \ r”期望“#”发送“ agent NoInputNoOutput \ r”期望“ Agent register”发送“ \ r”期望“# “发送” default-agent \ r“期望”默认代理请求成功“发送” \ r“期望”#“发送” discoverable on \ r“期望”授权“发送” yes \ r“发送” exit \ r“
复制代码并将其粘贴到文件中。它只是自动执行,这是我们在将手机与树莓派配对时执行的操作。它只是让设备连接,但不信任它。要信任设备,我们需要它的mac地址。因此,我们应将此期望脚本的输出打印到一个日志文件中,可以从中获取mac地址。
grep -Pom 1“(?<=设备)。*(?=已连接)”
上面的命令打印出字符串“ Device”和“ Connected”之间的值。在我们的情况下(Device 3C:28:6D:FD:65:3D Connected:no),它是设备的mac地址。
让我们编写一个 期望脚本 ,该 脚本 将mac地址作为第一个参数,并信任并连接到该设备。
创建一个名为 trust_and_connect.expect 的文件
设置超时30 生成bluetoothctl 期望“#” 发送“ agent off \ r” 期望“?egistered” 发送“ \ r” 期望“#” 发送“ agent on \ r” 期望“ Agent register” 发送“ \ r” 期望“# “ 发送” default-agent \ r“ 期望”默认代理请求成功“ 发送” \ r“ 期望”#“ 发送” trust \ r“ 期望” Changing“ 发送” connect \ r“ 期望”连接成功“ 发送” exit \ r“
将上面的代码复制到该文件中。它自动执行信任和连接部分。
现在让我们将所有这些内容放入Python脚本文件中,以便可以使整个配对过程自动化。
让我们创建一个文件 pair_and_trust_bluetooth_device.sh
cd $ {dirname $ 0) echo“ Pairing…” 期望pair_bluetooth_device.expect> Expect_script.log chmod 777 Expect_script.log sleep 2 echo“信任和连接..” device_mac_address = $(cat Expect_script.log-grep -Pom 1“ (?<= Device)。*(?= Connected)“) echo mac address is $ device_mac_address if]; 然后 期待trust_and_connect.expect $ device_mac_address 其他 回声“无设备连接的” 网络连接 RM expect_script.log
所以bash脚本,
- 调用一个期望脚本(其输出将被打印到名为Expect_script.log的文件中),
- 启动 NoInputNoOutput 代理
- 使其成为默认代理
- 开启pi的可发现性
- 等待某人连接并在某人超时或超时时退出
- 睡2秒钟
- 获取设备Mac地址的Expect_script.log文件
- 如果mac_address为null,则信任并连接设备
- 删除残留文件 Expect_script.log
使用按钮触发蓝牙配对脚本
现在我们有了脚本来自动执行配对过程。但是,只要用户需要,该脚本就必须在方便时运行。因此,让我们用一个物理按钮来连接此脚本,以便每次按下按钮时都会调用此脚本。中断是嵌入式编程的重要组成部分之一。对于初学者而言,检测到中断时会将该程序置于常规例程中,并运行称为中断服务例程的预定义ISR。
因此,让我们将按钮连接到gpio引脚11并为其分配一个ISR。在ISR内部,我们将调用脚本。
让我们创建一个名为 Bluetooth-speaker-main.py 的python文件,并将下面的代码添加到其中。我已在程序中添加了注释,以防万一您使用此代码,
#import所需的软件包 import子 进程import RPi.GPIO as gpio import time import os import logging pair_pin = 11 #获取运行python脚本的文件目录 fileDirectory = os.path.dirname(os.path.realpath(__ file__)) #将日志文件的位置设置为与python脚本的位置相同 logFile = fileDirectory +“ / bluetoothSpeaker.log” logging.basicConfig(filename = logFile,filemode ='w',format ='%(name)s-%(levelname)s -%(message)s',level = logging.INFO) def pairNewDevice(channel): #ISR用于引脚11 print(“ Waiting to pair”) logging.info(“ Waiting to pair”) output = subprocess.call() gpio.setmode(gpio。板) gpio.setup(pair_pin,gpio.IN,pull_up_down = gpio.PUD_UP) 尝试: #将pair_pin设置为检测下降沿的中断引脚,并在执行此操作时,调用pairNewDevice函数 gpio.add_event_detect(pair_pin,gpio.FALLING, callback = pairNewDevice,bouncetime = 1000) print(“蓝牙程序已启动”) logging.info(“蓝牙程序已启动”) True :time.sleep(5), KeyboardInterrupt除外: gpio.cleanup()
电路原理图
下面是将按钮与Raspberry Pi的GPIO11连接以触发蓝牙配对过程以通过蓝牙进行音频传输的电路图。
设置Cron作业以在启动时启动Bluetooth Speaker Python程序
现在,最后让我们设置一个cron作业,每次pi启动时,该作业都会启动此python程序。
crontab -e
选择您喜欢的编辑器,然后在文件末尾添加以下行
@reboot python3 /home/pi/blueooth-speaker/Bluetooth-speaker-main.py
每当pi启动时,这将调用我们的python程序。
就是这样。鹰已着陆。您已经制作了无头Raspberry Pi蓝牙扬声器。
重新启动树莓派,配对手机并传输音频。:)
可以从GitHub帐户下载此Raspberry Pi蓝牙扬声器的所有脚本。还要检查下面给出的视频。