前言
最近毕设是使用树莓派对交通标志图片进行检测,将检测结果使用蓝牙串口方式与手机APP进行传输。本文主要描述树莓派与手机蓝牙通信的过程和遇到的一些奇怪的BUG。
提示:以下是本篇文章正文内容,下面案例可供参考
一、树莓派的蓝牙基本配置
1.安装蓝牙相关软件包
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get install pi-bluetooth bluez bluez-firmware blueman
2.添加pi用户到蓝牙组
sudo usermod -G bluetooth -a pi
sudo reboot
3.修改配置文件,添加SPP协议
sudo nano /etc/systemd/system/dbus-org.bluez.service
提示:按ctrl+O +回车 开始修改文件
具体修改方法:
修改这两句(已经是修改后的图片):
二、安装pybluez库
1.安装pybluez的必要编译环境
sudo apt-get install Python-dev
sudo apt-get install libbluetooth-dev
sudo pip3 install pybluez
提示:如果是python2 就使用sudo pip install pybluez
2.示例传输代码
#-*- 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();
转载至:https://www.jerryzone.cn/raspi-bluetooth-socket/
3.运行文件
python test.py
4.可能存在的问题
4.1 无法连接蓝牙
首先要打开树莓派蓝牙的discoverable 可以使用bluetoothctl命令 + discoverable yes
或者
直接点击树莓派蓝牙图标选择 Make Discoverable
此时树莓派开始可以被扫描到(未扫描到可以等一会,开启此项需要一些时间,大概5-10s。并且树莓派长时间未连接后,会自动关闭discoverable,需要手动打开)
4.2 命令端口显示:python Address already in use 端口已经被占用的解决方法
问题原因:
说明此时的端口已经被占用,可能是你之前运行程序时直接关闭了运行界面。
解决方法:
重启树莓派,再每次调用代码函数后按Ctrl+C停止端口的使用,关闭函数。
4.3 如果想直接连接手机蓝牙,但是发现蓝牙时断时续,在bluetoothctl界面,连上立刻断开
解决方法:
在连接前运行这段代码:
sudo rfcomm watch hci0
然后再尝试连接,可以连接上
或者:
可以点击手机蓝牙,找到名字为raspberry的设备,点一下,回到蓝牙串口APP,再次尝试连接。
4.5 pybluez报错import bluetooth,显示没有内部元素
描述:
这个问题可能我只有我能遇上,由于我把程序代码命名为了bluetooth.py程序内部会自动先去同名的文件找相应的库。导致我的import bluetooth一直报错。文章来源:https://www.toymoban.com/news/detail-418066.html
解决方法:
修改文件名称,不和导入的库文件同名文章来源地址https://www.toymoban.com/news/detail-418066.html
总结
- 总的来说,树莓派和手机蓝牙通信的坑还是挺多的,上面就是我在开发时遇到的坑。
- 第一次写下自己的记录文件,如果有哪里不对的,请大神们批评指正,互相交流。
到了这里,关于树莓派蓝牙与手机APP通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!