《使用树莓派实现蓝牙与手机APP的通信》

文章目录

  • 前言
  • 一、树莓派的蓝牙基本配置
  • 二、安装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一直报错。

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

    总结

  • 总的来说,树莓派和手机蓝牙通信的坑还是挺多的,上面就是我在开发时遇到的坑。
  • 第一次写下自己的记录文件,如果有哪里不对的,请大神们批评指正,互相交流。
  • 物联沃分享整理
    物联沃-IOTWORD物联网 » 《使用树莓派实现蓝牙与手机APP的通信》

    发表回复