我正在尝试通过 Linux 上的 USB 蓝牙适配器设置虚拟串行端口,并通过 Android 设备向其发送消息。我使用的是 3.6 内核。我能够使用 gnome-bluetooth 成功与设备配对,并且还能够向其发送文件。
要设置串行端口,我首先将带有 SP 配置文件的通道添加到我的适配器:
sdptool add --channel=22 SP
然后我用 rfcomm 调用“listen”:
rfcomm listen /dev/rfcomm0 22
哪个阻塞
Waiting for connection on channel 22
显然 rfcomm 将在成功连接后创建 /dev/rfcomm0 。一旦发生这种情况,我想使用cutecom之类的东西来向连接的设备来回发送消息。
在我的 Android 设备上,我打开一个蓝牙 SPP 终端(有几个,我尝试了几个不同的)并尝试连接。他们都失败了。
鉴于我可以成功配对并毫无问题地发送文件,我知道蓝牙配对和通信是有效的。
我不太确定我还能尝试什么。我在本地设备和 Android 设备上使用了“sdptool browser”,以确保不存在任何 RFCOMM 通道冲突。
答案1
我现在似乎已经开始工作了。蓝牙似乎有点挑剔。我正在完整地回顾我的步骤,以防其他人发现它有用(尽管这几乎是我最初尝试的)。这适用于 Nexus 4 上的 Android JB (4.2.2) 和 Arch Linux 3.6.7-1,以及 Gnome 3.6 上的 bluez 4.101(带 gnome-bluetooth)。
(这一步可能没有任何用处) 关闭 Android 上的蓝牙并断开 USB/蓝牙适配器与 Linux 计算机的连接(或者如果您有内置适配器,请使用 hcitool devname reset 重置它)
在 Linux 上连接/打开蓝牙适配器。确保您的适配器可见(可以在 gnome-bluetooth 中设置 - 您应该看到蓝牙系统托盘图标)。
打开 Android 设备上的蓝牙。使用 Android 与适配器配对(我无法从 Linux 进行相反的配对)。将出现一个对话框,要求您提供密钥。输入您想要的任何 PIN 码。 Gnome 应该会弹出一条通知,要求您提供密钥;输入您之前输入的相同 PIN 码。此时您的 Android 设备和密钥应该已配对。
在 Linux 中,打开终端并输入以下内容来检查可用的蓝牙服务
sdptool browse local
如果您已经有串行端口服务,请记下它是什么通道。如果没有,您可以添加该服务:
sdptool add --channel=22 SP
现在使用 rfcomm 收听该频道:
sudo rfcomm listen /dev/rfcomm0 22
rfcomm 将阻塞,监听带有类似消息的连接
Waiting for connection on channel 22
回到 Android,我使用了 BlueTerm 应用程序(http://pymasde.es/blueterm/,也可以在谷歌游戏商店免费获得),但任何类似的应用程序都应该可以工作。打开 BlueTerm,转至选项 > 连接设备:选择配对的适配器。
希望该应用程序能够连接。您将在您阻止监听的终端中看到额外的验证,并显示如下消息:
Waiting for connection on channel 22
Connection from 22:22:22:22:22:22 to /dev/rfcomm0
Press CTRL-C for hangup
您在 BlueTerm 应用程序中输入的任何内容都应该发送至 /dev/rfcomm0。通过打开一个新终端并执行以下操作,您可以在键入时看到显示的内容:
cat /dev/rfcomm0
答案2
以下步骤对我有用:
首先,您必须配对设备。配对相对容易。我将呼叫客户端(开始说话)和服务器(回复)
您必须先设置服务器: 服务器端(作为 root):
sdptool add --channel=3 SP
mknod -m 666 /dev/rfcomm0 c 216 0
rfcomm watch /dev/rfcomm0 3 /sbin/agetty rfcomm0 115200 linux
客户端(作为 root):
sdptool add --channel=3 SP
rfcomm connect /dev/rfcomm0 [SERVER_ADDR] 3
现在在客户端上打开串行终端:
screen /dev/rfcomm0 115200
评论:
当您在客户端调用最后一个命令 rfcomm connect... 时,/dev/rfcomm0
将创建一个设备并将其关联到服务器/dev/recomm0
。这代表两者之间的串行链接
最后一个服务器命令:rfcomm watch
...将“侦听”传入连接。在连接丢失时,该命令将重新启动新的“监听”状态。
答案3
我通过对 Pris 的命令稍加修改来解决了这个问题。如果有人在设置 rfcomm 连接时仍然遇到问题,请尝试一下。
sudo service bluetooth restart
这 ^ 确保您每次尝试设置连接时都从头开始。
sdptool add --channel=<a_channel_#> SP
该通道编号应与当前分配的任何通道不同。
(可选)要检查频道:
sdptool browse local | grep Channel
我不确定为什么需要下一个命令,但它对我有用。
rfcomm release 0
然后监听传入的连接:
rfcomm watch 0 <a_channel_#>
注意:/etc/bluetooth/rfcomm.conf 中的 bt MAC 地址必须是您手机的 bt MAC。此外,此文件中的通道必须与为 a_channel_# 选择的通道相同。
完成这一切后,我使用手机上的 bt 终端模拟器来检查这一切。
答案4
我尝试过不同的蓝牙工具,但很难找到正确的命令序列来与蓝牙模块连接和交换数据。尝试使用 rfcomm 和 minicom:
这是我的/etc/bluetooth/rfcomm.conf
rfcomm0 {
# Automatically bind the device at startup
bind no;
# Bluetooth address of the device
device 11:22:33:44:55:66;
# RFCOMM channel for the connection
channel 3;
# Description of the connection
comment "This is Device 1's serial port.";
}
扫描蓝牙设备:
hcitool scan
Scanning ...
20:15:12:08:62:95 HC-06
使用 rfcomm 绑定
sudo rfcomm bind 0 20:15:12:08:62:95 1
注意:bind 0 指的是设备号 0 (rfcomm0),1 是通道。
然后将 minicom 与 sudo 结合使用并保存指定波特率和端口的配置。您可以找到更多信息这里。