用蓝牙实现两个树莓派之间的通信

本文介绍了如何在树莓派上利用Python的bluetooth库通过蓝牙进行通信,包括蓝牙的基础配置、通过RFCOMM和L2CAP协议建立连接的示例代码,以及遇到的问题与改进方案。在蓝牙通信过程中,当客户端断开时,服务端会持续接收空字符,改进方法是使服务端在检测到异常后回到等待连接的状态。
摘要由CSDN通过智能技术生成

一、树莓派中的蓝牙

Raspberry中已经安装了Bluez。我使用的版本是5.50。你可以通过以下命令检查自己的BlueZ版本:

bluetoothd -v

可以用下面的命令检查Bluez的运行状态:

systemctl status bluetooth

在这里插入图片描述
可以看到我的返回结果显示蓝牙已经打开并正在运行。
你可以用下面命令手动启动或关闭蓝牙服务:

sudo systemctl start bluetooth
sudo systemctl stop bluetooth

此外,你还可以让蓝牙服务随系统启动:

sudo systemctl enable bluetooth

在Raspberry中,基本的蓝牙操作可以通过bluez中的bluetoothctl命令进行。该命令运行后,将进入到一个新的Shell。在这个shell中输入:

list

将显示树莓派上可用的蓝牙模块,例如:
在这里插入图片描述
运行scan命令,开启扫描:

scan on

虽然树莓派中已经有了蓝牙,但是还是建议执行一下以下命令,以方便蓝牙的使用:
一、升级安装蓝牙相关软件包

sudo apt-get update 
sudo apt-get upgrade -y 
sudo apt-get dist-upgrade -y 
sudo apt-get install pi-bluetooth bluez bluez-firmware blueman

二、最关键一点:添加pi用户到蓝牙组

sudo usermod -G bluetooth -a pi

三、重启

sudo reboot

执行完毕之后你就会发现树莓派上面状态栏多了一个蓝牙的图标,方便使用蓝牙。
在这里插入图片描述

二、通过python使用树莓派蓝牙

python中有蓝牙对应的库可以使用,比如:bluetooth库。这个库对应的是pybluez蓝牙。
通过蓝牙名称来查找蓝牙:

import bluetooth
 
target_name = "Device Name"
target_address = None
 
nearby_devices = bluetooth.discover_devices()
 
for bdaddr in nearby_devices:
    if target_name == bluetooth.lookup_name( bdaddr ):
        target_address = bdaddr
        break
 
if target_address is not None:
    print("found target bluetooth device with address ", target_address)
else:
    print("could not find target bluetooth device nearby")

运行如上代码可能会发生如下报错:

ModuleNotFoundError: No module named ‘bluetooth’

原因可能是你安装bluez库时是使用python 2版本下载的,python 2版本不支持bluez。
解决方法:用python 3版本下载bluez。

python3 -m pip install pybluez

三、通过蓝牙进行通信

可采用类似于socket编程模型的方式进行蓝牙通信的编程,主要有两种协议:RFCOMM协议和L2CAP协议。
用这两种协议的用法没什么太大的区别,除了端口以外其他都差不多。
网上有些教程说RFCOMM支持的端口范围为1~30号端口,L2CAP端口是0x1001到0x8FFF之间的奇数端口。但是我使用L2CAP协议时,端口分别设置为0x1001到0x1009都无法成功通讯,设置为0x100b以及后面的奇数端口才成功连接通信,我不知道是L2CAP支持的端口不是从0x1001开始的问题还是我树莓派对应的端口已经被占用了的问题。使用命令 netstat -nultp 查看已经使用的端口发现上述端口并未被占用,所以我也搞不懂了,你们也可以自己测试一下哪些端口可以成功

  • 8
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
两个STM32之间蓝牙通信可以通过使用蓝牙模块来实现。以下是一种常见的实现方法: 1. 硬件准备: - 两个STM32开发板 - 符合蓝牙规范的蓝牙模块(例如HC-05、HC-06等) - 杜邦线和面包板等连接器 2. 连接蓝牙模块: 将蓝牙模块的TX引脚连接到一个STM32的RX引脚,将蓝牙模块的RX引脚连接到另一个STM32的TX引脚。同时,将两个STM32的地(GND)连接在一起,确保共地。 3. 编程实现: - 在每个STM32上,使用相应的开发工具(例如STM32CubeIDE)创建一个新的工程。 - 配置串口通信,设置波特率和数据位等参数,使得STM32能够与蓝牙模块进行通信。 - 在代码中,使用串口通信库(例如HAL库)来实现蓝牙模块的通信。可以发送AT命令给蓝牙模块来进行配对和连接。 - 一旦两个STM32都成功连接到各自的蓝牙模块,它们就可以通过发送和接收数据进行通信了。 4. 数据传输: - 在发送STM32上,可以使用串口发送函数将数据发送到蓝牙模块。 - 在接收STM32上,可以使用串口接收函数接收来自蓝牙模块的数据。 注意事项: - 确保蓝牙模块的电源和STM32的电源供应正常。 - 配对和连接过程可能需要一些额外的配置步骤,具体取决于使用的蓝牙模块和开发工具。 - 在编程过程中,需要注意处理蓝牙模块的响应和错误情况。 这只是一个简单的示例,具体的实现方式可能会根据你所使用的STM32型号、蓝牙模块和开发工具而有所不同。希望这些信息对你有所帮助!
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值