我是靠谱客的博主 无私哑铃,最近开发中收集的这篇文章主要介绍树莓派蓝牙与手机APP通信前言一、树莓派的蓝牙基本配置二、安装pybluez库总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 前言
  • 一、树莓派的蓝牙基本配置
  • 二、安装pybluez库
    • 1.安装pybluez的必要编译环境
    • 2.示例传输代码
    • 3.运行文件
    • 4.可能存在的问题
        • 4.1 无法连接蓝牙
        • 4.2 命令端口显示:python Address already in use 端口已经被占用的解决方法
        • 4.3 如果想直接连接手机蓝牙,但是发现蓝牙时断时续,在bluetoothctl界面,连上立刻断开
        • 4.5 pybluez报错import bluetooth,显示没有内部元素
  • 总结


前言

最近毕设是使用树莓派对交通标志图片进行检测,将检测结果使用蓝牙串口方式与手机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一直报错。

解决方法:
修改文件名称,不和导入的库文件同名

总结

  • 总的来说,树莓派和手机蓝牙通信的坑还是挺多的,上面就是我在开发时遇到的坑。
  • 第一次写下自己的记录文件,如果有哪里不对的,请大神们批评指正,互相交流。

最后

以上就是无私哑铃为你收集整理的树莓派蓝牙与手机APP通信前言一、树莓派的蓝牙基本配置二、安装pybluez库总结的全部内容,希望文章能够帮你解决树莓派蓝牙与手机APP通信前言一、树莓派的蓝牙基本配置二、安装pybluez库总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部