遇到的树莓派蓝牙Serial的坑(RFCOMM)

第一次接触树莓派蓝牙,卡了好久,现在解决了,我就记录下来这些坑。

这边用NodeJS来做蓝牙的Server端,使用的是经典蓝牙,Python的话应该也是差不多的,毕竟就是读写串口。

首先是日常的安装依赖库

sudo apt install pi-bluetooth bluez bluez-firmware blueman

修改蓝牙的服务

sudo nano /etc/systemd/system/dbus-org.bluez.service

修改ExecStart,增加ExecStartPost,然后保存

ExecStart=/usr/lib/bluetooth/bluetoothd -C
ExecStartPost=/usr/bin/sdptool add SP

重启树莓派

NodeJS这边需要准备 serialport 库

npm install serialport

树莓派的蓝牙打开之后,手机的蓝牙串口工具可能没办法连接,这个时候需要监听蓝牙的hci0设备,如果没有其他串口,默认在/dev/rfcomm0,/dev/rfcomm0只有在有设备连接的时候才会自动创建,所以如果没有设备连接的时候打开串口会报错,需要做检测。

sudo rfcomm watch hci0

接下来就是代码了:


var SerialPort = require("serialport")
var bthServer = new SerialPort("/dev/rfcomm0",{
  baudRate:9600, //默认比特率为9600
  autoOpen:false, //是否自动开启,如果是的话下方的open函数就不需要了
}

bthServer.open(function(err){
  console.log("Is opened:",bthServer.isOpen)
  console.log("Error:",err) //如果有错误的话就开不了
}

bthServer.on("data",function(data){
  console.log(data) //输出蓝牙接收到的数据
  bthServer.write("Received") //往回发数据
}

发表评论