• 树莓派板载蓝牙使用


    1 设置树莓派板载蓝牙

    1.1 相关环境安装、配置

    sudo apt-get update
    sudo apt-get install pi-bluetooth bluez bluez-firmware blueman
    
    • 1
    • 2

    1.2 树莓派蓝牙操作

    参考: https://blog.csdn.net/guzhong10/article/details/78574577

    有时候会失败, 可以尝试重启树莓派蓝牙服务。 实在不行重启树莓派, 多尝试几次, 一般都会成功。

    命令比较多, 不经常使用的话也不容易记住, 可以通过bluetoothctlj命令进入蓝牙模式后,用help命令进行查看, 每个命令有非常详细的解释。
    在这里插入图片描述
    另外, 网上有些教程中会使用hcitool工具进行蓝牙连接, 其实功能和bluetoothctl类似, 目前hcitool 已被bluetoothctl取代, 推荐使用bluetoothctl
    hcitool 常用命令是hcitool scan,可以用于扫描发现周围的蓝牙设备。 注意这里有个坑, hcitool scan只能扫描到正常的蓝牙设备, 扫描不到低功耗蓝牙(BLE)设备, 可以用hcitool lescan.

    1.3 修改配置文件

    修改 /etc/systemd/system/dbus-org.bluez.service

    在ExecStart =/usr/lib/Bluetooth/bluetoothd 后面添加-C
    紧接着添加一行:ExecStartPost=/usr/bin/sdptool add SP

    在这里插入图片描述
    这个操作不知道有什么作用。
    很多教程里面都提到了

    添加用户组:
    sudo usermod -G bluetooth -a pi
    这个应该与权限有关, 不见得有用, 反正就是出错的时候可以尝试。

    最后, 重启树莓派。

    2 树莓派蓝牙连接手机蓝牙进行测试

    为了验证树莓派蓝牙的功能, 最简单的办法就是连上手机蓝牙。 因为手机上有很多现成的蓝牙调试助手, 可以方便地进行蓝牙功能的调试验证。

    我使用的一个蓝牙助手是HC-蓝牙助手, 下载链接: http://www.hc01.com/download

    由于我通过树莓派蓝牙没扫描到手机蓝牙, 直接用树莓派蓝牙去连接手机蓝牙也会失败。 因此我尝试用手机蓝牙去连接树莓派的蓝牙。

    连接成功后, 通过sudo rfcomm watch hci0查看会出现如下信息:
    在这里插入图片描述
    并且此时, 在/dev 目录下会多出一个 /dev/rfcomm0 的设备出来, 这是蓝牙映射到树莓派的串口。 可以直接向这个串口读写数据:

    尝试向串口写数据:

    echo 'send form pi' >/dev/rfcomm0
    
    • 1

    手机端的串口助手会收到该信息:
    在这里插入图片描述

    尝试从串口读数据:

    cat /dev/rfcomm0
    
    • 1

    在手机端发送消息:
    在这里插入图片描述

    树莓派串口接收到数据:
    在这里插入图片描述

    除了在命令行中通过cat echo读写数据外, 还可以通过python进行程序读写:

    import serial
    ser = serial.Serial("/dev/rfcomm0", 9600)
    ser.write("send from pi by python".encode())
    out = ser.read(100)
    
    • 1
    • 2
    • 3
    • 4

    结果如下:
    在这里插入图片描述

    3 树莓派蓝牙连接其他蓝牙使用

    连接手机蓝牙只是为了更便捷的测试树莓派蓝牙, 实际使用中需要连接其他蓝牙使用。 我实际使用的还是一款HC-42D的蓝牙模组。

    经过一番折腾, 基本上网上的方法都试了个遍,树莓派的板载蓝牙死活连不上HC-42D这个蓝牙模组, 最后无奈放弃。基本上在配对阶段一直失败, 但connect可以成功, 最后还是永不了。

    最后采用的方法是, 不使用树莓派的板载蓝牙, 给树莓派外挂一个蓝牙模组, 这个蓝牙模组也用同样的HC-42D。 最终树莓派上外挂的HC-42D 这个蓝牙可以与另一个HC-42D 蓝牙连接, 并且进行正常通信。 这么使用其实没有有效利用树莓派本身的板载蓝牙, 有点浪费, 但是没办法, 实在折腾不出来。

    可以通过串口方式外接蓝牙, 这时串口地址是/dev/ttyAMA0, 可以直接对这个串口读写, 就可以向另外一个蓝牙发送数据或者接收另外一个蓝牙的数据了。

    也可以通过USB口外接蓝牙, 这时串口地址是/dev/ttyUSB0, 其他的是一样的。

    其实通过连接其他蓝牙的方式使用树莓派, 本教程中的内容基本上就用不上了。 但是没准有些树莓派的板载蓝牙可以正常使用呢。

    这里有一个树莓派蓝牙连接打印机蓝牙成功的例子:https://blog.csdn.net/weixin_42473844/article/details/95310704

    4 常见问题

    4.1 通过scan on 扫描不到附近的蓝牙设备

    比如, 我打开了手机的蓝牙, 其他蓝牙设备都能发现手机蓝牙信号, 但是树莓派的蓝牙没有扫描到手机蓝牙。
    原因未知。 我在过程中只有一次扫描到了手机蓝牙, 之后无论怎么尝试都搜不到手机蓝牙了。

    4.2 手机蓝牙扫描不到树莓派蓝牙

    原因未知。 我一开始时手机能发现树莓派蓝牙, 之后一直搜不到。后来我尝试在树莓派上执行 sudo bluetoothctl discoverable yes 手机蓝牙可扫描到树莓派蓝牙。 猜测可能是某个误操作导致树莓派蓝牙信号不可见。

    4.3 树莓派连接其他蓝牙pair失败, 但是connect可以成功, 然而好像不能正常使用

    在这里插入图片描述

    连接完成后/dev 目录下没有/dev/rfcomm0, 强行通过 sudo rfcomm bind /dev/rfcomm0 XX:XX:XX:XX:XX:XX 1(xxx是你想要连接的蓝牙的MAC地址) 后, dev 目录下有/dev/rfcomm0, 但是使用这个串口进行读写操作都会失败。
    原因未知, 貌似不能这么强行绑定, 正常配对连接成功会自动生成/dev/rfcomm0。

    4.4 Failed to set power on: org.bluez.Error.Failed

    尝试

    rfkill block bluetooth
    rfkill unblock bluetooth
    
    • 1
    • 2

    如果依然有问题, 尝试执行:

    systemctl stop bluetooth.service
    systemctl start bluetooth.service
    
    • 1
    • 2

    上述命令实际上就是关闭蓝牙并重新打开蓝牙, 很多报错问题都可以尝试这样解决。如果还是不行, 终极解决办法就是重启设备。

    4.5 手机蓝牙可以连接树莓派蓝牙, 并且可以正常收发数据, 但是树莓派蓝牙连接手机失败

    曾经有一次连成功, 但是此后一直未能复现。 所以应该是没法用。

  • 相关阅读:
    ignore()函数不带参数,则它会忽略输入流中的一个字符
    【毕业设计】基于STM32的智能路灯设计与实现 - 物联网 嵌入式 单片机
    机器学习 - 似然函数:概念、应用与代码实例
    技术保证质量,软件测试的这些测试方法你都掌握了吗?
    【2022杭电多校5 1012题 Buy Figurines】STL的运用
    教育类《中学政史地》收稿方向-投稿邮箱
    密钥密码学(三)
    crypto:Url编码
    Databend 开源周报第 115 期
    Tomcat 漏洞处理
  • 原文地址:https://blog.csdn.net/leo0308/article/details/128123223