Android手机通过树莓派 Zero W / 树莓派 3 的蓝牙连接终端

Author Avatar
Apache553 2018年09月30日
  • 在其它设备中阅读本文章

缘由

因为原来连接树莓派 ZeroW 的方法 (手机 wifi 热点) 太过蛋疼,想到 ZeroW 上有一个蓝牙模块,于是就去研究了下怎么利用它来当串口终端来使用。

大致思路

蓝牙有一个 profile(SPP, Serial Port Profile) 可以用来实现串口通信。要通过蓝牙连接树莓派的终端,大致要做就是:

  • 配置 SDP Server 让手机知道树莓派上的蓝牙可以提供串口通讯服务
  • 配置 rfcomm 在树莓派上作为串口的另外一端
  • 使用 agetty 在串口上提供 tty 服务
  • 手机与树莓派配对,然后使用软件连接

操作步骤

先配置蓝牙为可用的状态(自己想办法)

然后使用 sdptool 为树莓派添加串口服务,服务工作于 rfcomm 频道 20
执行# sdptool add --channel 20 SP
应该会输出Serial Port service registered

调用 rfcomm 创建并监听串口设备,在第一次连接的时候自动执行 agetty
执行# rfcomm listen /dev/rfcomm0 20 /sbin/agetty rfcomm0 linux
应该会输出Waiting for connection on channel 20并阻塞

使用手机通过蓝牙串口软件进行连接
连接上的话 应该会继续输出

Waiting for connection on channel 20
Connection from xx:xx:xx:xx:xx:xx to /dev/rfcomm0
Press CTRL-C for hangup

可能遇到的问题

执行# sdptool add --channel 20 SP没有输出
尝试在/lib/systemd/system/bluetooth.serviceExecStart最后面加上--compat选项

通过 systemd 自动运行

将以下内容写到/etc/systemd/system/bluetooth-serial-console.service

[Unit]
Description=Bluetooth Serial Console Service
After=bluetooth.target network.target

[Service]
Type=simple
ExecStartPre=/usr/bin/sdptool add --handle 0x10010 --channel=20 SP
ExecStart=/usr/bin/rfcomm listen /dev/rfcomm0 20 /sbin/agetty rfcomm0 linux
ExecStopPost=/usr/bin/sdptool del 0x10010
Restart=always

[Install]
WantedBy=multi-user.target

然后执行# systemctl daemon-reload
重启之后就可以见到效果了