树莓派 pybluez 蓝牙通信

前言

这两天在搞树莓派蓝牙通信,发现里面的坑还真不少,在次记录一下,以备查询

安装 pybluez

我用的python3,现在差不多没人用Python2了吧…
首先需要安装 libbluetooth-dev

 sudo apt-get install libbluetooth-dev

然后安装 pybluez

 sudo pip3 install pybluez

使用

可以先看看官方的示例程序 点我跳转

我使用了 rfcomm-server.py 这个程序,遇到以下错误

1. no such file or directory
解决办法:修改文件

sudo nano /lib/systemd/system/bluetooth.service

找到如下一行

ExecStart=/usr/lib/bluetooth/bluetoothd

在末尾添加 -E -C

ExecStart=/usr/lib/bluetooth/bluetoothd -E -C

如果没有这一行,需要自行添加,写在上面那条语句下面即可

ExecStartPost=/usr/bin/sdptool add SP

Ctrl+o 保存 Ctrl+x 退出

2. no advertisable device
这是由于蓝牙不可见导致
解决办法:在原程序上增加两句,使蓝牙可发现

#!/usr/bin/env python3
"""PyBluez simple example rfcomm-server.py
Simple demonstration of a server application that uses RFCOMM sockets.
Author: Albert Huang <albert@csail.mit.edu>
$Id: rfcomm-server.py 518 2007-08-10 07:20:07Z albert $
"""

import bluetooth
import os
import sys

#增加以下两句 修改蓝牙可见
os.system("bluetoothctl power on")
os.system("bluetoothctl discoverable on")


server_sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
server_sock.bind(("", bluetooth.PORT_ANY))
server_sock.listen(1)

port = server_sock.getsockname()[1]

uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"

bluetooth.advertise_service(server_sock, "SampleServer", service_id=uuid,
                            service_classes=[uuid, bluetooth.SERIAL_PORT_CLASS],
                            profiles=[bluetooth.SERIAL_PORT_PROFILE],
                            # protocols=[bluetooth.OBEX_UUID]
                            )

print("Waiting for connection on RFCOMM channel", port)

client_sock, client_info = server_sock.accept()
print("Accepted connection from", client_info)

try:
    while True:
        data = client_sock.recv(1024)
        if not data:
            break
        print("Received", data)
except OSError:
    pass

print("Disconnected.")

client_sock.close()
server_sock.close()
print("All done.")

3.Permission denied
解决办法:修改文件权限

sudo chmod 777 /var/run/sdp

参考链接

  1. https://bbs.archlinux.org/viewtopic.php?id=201672
  2. https://blog.youkuaiyun.com/qq21497936/article/details/110940484
### 关于 NULL 的本质 在 C 语言中,`NULL` 是一个宏定义,其核心意义是用来表示空指针。它的值被定义为 `0` 或 `(void*)0`,这取决于具体的编译环境以及标准库的实现方式[^1]。 对于树莓派上的蓝牙通信开发而言,虽然问题涉及到了 `NULL` 的概念,但实际上它与蓝牙通信并无直接关联。以下是关于如何在树莓派上实现蓝牙通信的具体方法: --- ### 树莓派蓝牙通信基础 #### 软件准备 为了在树莓派上启用并配置蓝牙功能,通常需要安装以下软件包: ```bash sudo apt-get update sudo apt-get install bluez python-bluez blueman ``` 这些工具提供了基本的蓝牙支持和 Python 接口以便更方便地编写程序。 #### 配置蓝牙设备 通过命令行可以检查当前系统的蓝牙状态及其可用性: ```bash hciconfig ``` 如果未检测到任何蓝牙适配器,则可能需要加载相应的驱动模块或者确认硬件连接正常。 #### 编写简单的蓝牙客户端/服务器模型 下面是一个基于 Python 和 PyBlueZ 库的小型示例代码片段用于演示数据交换过程: ##### 服务端 (Server Side) ```python import bluetooth server_sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM ) port = 1 server_sock.bind(("", port)) server_sock.listen(1) client_sock, address = server_sock.accept() print(f"Accepted connection from {address}") data = client_sock.recv(1024) print(f"Received [{data}]") client_sock.close() server_sock.close() ``` ##### 客户端 (Client Side) ```python import bluetooth bd_addr = "XX:XX:XX:XX:XX:XX" # 替换为目标设备MAC地址 port = 1 sock=bluetooth.BluetoothSocket(bluetooth.RFCOMM) sock.connect((bd_addr, port)) sock.send("Hello World!") sock.close() ``` 以上脚本展示了最基本的 RFCOMM 协议下的消息传递机制。其中需要注意的是,在实际部署前应当替换掉虚拟 MAC 地址部分以匹配真实目标装置的身份标识符。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值