通过上一篇文章学习,我们可以将树莓派的蓝牙连接到蓝牙音箱,进行语音播放。那么对于蓝牙配置和蓝牙控制软件更新,在此不再赘述。
1、树莓派连接手机蓝牙时断时续问题
原以为手机蓝牙和音箱蓝牙直接可以直接连接,结果出现连接到手机瞬间,蓝牙就断开连接。出现了链接时断时续的问题,这里主要参考了这位大佬的文章,成功的解决了蓝牙连接手机。树莓派4b板载蓝牙连接其他蓝牙设备时出错的解决方法_ZeroSwift的博客-CSDN博客_树莓派4b连接蓝牙失败
2、树莓派与手机蓝牙通信测试
完成连接之后,我在手机上下载了蓝牙调试器app(应用商城可以搜到)。但是这个时候出现一个比较奇怪的问题,手机蓝牙已经连接了树莓派,但是app里面扫描结果并没有树莓派。具体原因未知,猜想的方向是app里面的蓝牙协议和手机连接的蓝牙协议应该不同,树莓派的蓝牙对app里面的蓝牙隐藏了。解决的方案是,打开界面里的蓝牙的discoverable配置,这时候app即可识别树莓派。
接下来便是树莓派蓝牙通信,首先安装pybluez库,pybluez库会在使用pip安装时自动编译相关的蓝牙库,所以需要在安装pybluez之前先把蓝牙开发环境配置好:
sudo apt-get install Python-dev
sudo apt-get install libbluetooth-dev
sudo pip3 install pybluez
然后编译蓝牙接收和发送python源码。
#-*- coding:utf-8 -*-
import bluetooth
import threading
#服务器套接字(用来接收新链接)
server_socket=None
#连接套接字服务子线程
def serveSocket(sock,info):
#开个死循环等待客户端发送信息
while True:
#接收1024个字节,然后以UTF-8解码(中文),如果没有可以接收的信息则自动阻塞线程(API)
receive=sock.recv(1024).decode('utf-8');
#打印刚刚读到的东西(info=地址)
print('['+str(info)+']'+receive);
#为了返回好看点,加个换行
receive=receive+"\n";
#回传数据给发送者
sock.send(receive.encode('utf-8'));
#主线程
#创建一个服务器套接字,用来监听端口
server_socket=bluetooth.BluetoothSocket(bluetooth.RFCOMM);
#允许任何地址的主机连接,未知参数:1(端口号,通道号)
server_socket.bind(("",1))
#监听端口/通道
server_socket.listen(1);
#开死循环 等待客户端连接
#本处应放在另外的子线程中
while True:
#等待有人来连接,如果没人来,就阻塞线程等待(这本来要搞个会话池,以方便给不同的设备发送数据)
sock,info=server_socket.accept();
#打印有人来了的消息
print(str(info[0])+' Connected!');
#创建一个线程专门服务新来的连接(这本来应该搞个线程池来管理线程的)
t=threading.Thread(target=serveSocket,args=(sock,info[0]))
#设置线程守护,防止程序在线程结束前结束
t.setDaemon(True)
#启动线程
t.start();
保存文件名为bt.py,然后执行,这里我遇到python编译问题,注意自己的python版本和pybluez匹配。
python出现SyntaxError: Non-ASCII character '\xe6' in file \的错误 - 魏三斗 - 博客园
AttributeError: 'module' object has no attribute 'AF_INET'处理办法——python_wzh111wzh的博客-CSDN博客
python bt.py
这时候手机app里连接树莓派,然后树莓派就可以与手机正常通信(现阶段只实现了安卓手机,ios还是有问题的)。