树莓派+Pixhawk之四:通过蓝牙在手机上控制

参考自
https://www.raspberrypi.org/forums/viewtopic.php?p=953141#p953141

打开树莓派的蓝牙

之前没有用,关掉了。
以下命令打开

sudo systemctl enable hciuart
sudo systemctl start hciuart

VNC连接,看到蓝牙图标又活跃了

树莓派+Pixhawk之四:通过蓝牙在手机上控制

配置蓝牙串口协议SPP

SPP不做深入探讨。
编辑文件 /lib/systemd/system/bluetooth.service

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

把这行改下

ExecStart=/usr/lib/bluetooth/bluetoothd

改成

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

有时候SAP会有错误,据说这个也没什么用,先disable掉。
有的文章里写这地方改成

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

我试了下,用“-E”参数启动有可能找不到手机。
保存后再执行

 sudo systemctl daemon-reload
 sudo systemctl restart bluetooth
 sudo hciconfig hci0 up

第三条命令打开和初始化蓝牙设备。hciconfig还有一些功能,详见《Android blueZ HCI(一):hciconfig实现及常用方法》 中的插图
树莓派+Pixhawk之四:通过蓝牙在手机上控制
手机配对的过程略过。

使用rfcomm 工具

RFCOMM是基于欧洲电信标准协会ETSI07.10规程的串行线性仿真协议。此协议提供RS232控制和状态信号。

RFCOMM是一个简单传输协议,其目的为了解决如何在两个不同设备上的应用程序之间保证一条完整的通信路径,并在它们之间保持一通信段的问题。

RFCOMM是为了兼容传统的串口应用,同时取代有线的通信方式,蓝牙协议栈需要提供与有线串口一致的通信接口而开发出的协议。

rfcomm工具在在蓝牙设备上监听,当有设备接入后模拟出 /dev/rfcomm0来。
用法:

sudo rfcomm watch hci0

在命令窗口内敲入后开始监听。

安卓手机上安装一个“蓝牙串口”,连接树莓派
树莓派+Pixhawk之四:通过蓝牙在手机上控制
连接成功后树莓派的界面出现信息:
树莓派+Pixhawk之四:通过蓝牙在手机上控制
在树莓派上打开一个新的命令行窗口,输入:

echo "This is from RaspBerry Pi"  > /dev/rfcomm0 | cat /dev/rfcomm0

手机能正常收发信息了。
树莓派+Pixhawk之四:通过蓝牙在手机上控制
树莓派+Pixhawk之四:通过蓝牙在手机上控制
查看串口波特率

stty -F /dev/rfcomm0

嗯,9600

speed 9600 baud; line = 0;
min = 1; time = 0;
-brkint -imaxbel
-icanon

貌似设成115200也没问题

stty -F /dev/ttyS0 ispeed 115200 ospeed 115200 

建RFCOMM服务随系统运行

新建服务

sudo nano /etc/systemd/system/rfcomm.service

内容为

[Unit]
Description=RFCOMM service
After=bluetooth.service
Requires=bluetooth.service
 
[Service]
ExecStart=/usr/bin/rfcomm watch hci0
 
[Install]
WantedBy=multi-user.target

保存后运行

sudo systemctl enable rfcomm
sudo systemctl start rfcomm

服务打开。

P.S.

树莓派的蓝牙功能十分不靠谱。原因是bluetooth服务经常起不来。