失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 树莓派学习3-树莓派蓝牙连接手机通信测试(蓝牙连接手机时断时序问题解决)

树莓派学习3-树莓派蓝牙连接手机通信测试(蓝牙连接手机时断时序问题解决)

时间:2020-12-22 23:19:23

相关推荐

树莓派学习3-树莓派蓝牙连接手机通信测试(蓝牙连接手机时断时序问题解决)

通过上一篇文章学习,我们可以将树莓派的蓝牙连接到蓝牙音箱,进行语音播放。那么对于蓝牙配置和蓝牙控制软件更新,在此不再赘述。

1、树莓派连接手机蓝牙时断时续问题

原以为手机蓝牙和音箱蓝牙直接可以直接连接,结果出现连接到手机瞬间,蓝牙就断开连接。出现了链接时断时续的问题,这里主要参考了这位大佬的文章,成功的解决了蓝牙连接手机。树莓派4b板载蓝牙连接其他蓝牙设备时出错的解决方法_ZeroSwift的博客-CSDN博客_树莓派4b连​​​​​​接蓝牙失败

2、树莓派与手机蓝牙通信测试

完成连接之后,我在手机上下载了蓝牙调试器app(应用商城可以搜到)。但是这个时候出现一个比较奇怪的问题,手机蓝牙已经连接了树莓派,但是app里面扫描结果并没有树莓派。具体原因未知,猜想的方向是app里面的蓝牙协议和手机连接的蓝牙协议应该不同,树莓派的蓝牙对app里面的蓝牙隐藏了。解决的方案是,打开界面里的蓝牙的discoverable配置,这时候app即可识别树莓派。

接下来便是树莓派蓝牙通信,首先安装pybluez库,pybluez库会在使用pip安装时自动编译相关的蓝牙库,所以需要在安装pybluez之前先把蓝牙开发环境配置好:

sudo apt-get install Python-devsudo apt-get install libbluetooth-devsudo pip3 install pybluez

然后编译蓝牙接收和发送python源码。

#-*- coding:utf-8 -*-import bluetoothimport 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还是有问题的)。

如果觉得《树莓派学习3-树莓派蓝牙连接手机通信测试(蓝牙连接手机时断时序问题解决)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。