在Linux中,我曾经使用" hidd --connect mmac"与BT设备连接,但现在自Bluez5以来已经消失。 我可以使用bluetoothctl手动建立连接但我需要从我的应用程序使用这些命令并使用bluetoothctl将是困难的。
什么是hcitool等效命令来执行bluetoothctl的工作?
例如,我输入bluetoothctl:
select <cmac>
scan on
trust <mmac>
pairable on
pair <mmac>
connect <mmac>
我可以使用&#34; hcitool scan&#34;扫描,但我还没有想到连接。 我尝试过使用&#34; hcitool cc mmac&#34;其次是&#34; hcitool auth mmac&#34;但没有任何作用。
或者hcitool可以做bluetoothctl的工作吗?
答案 0 :(得分:13)
我在这样的脚本中使用 bluetoothctl :
#!/bin/bash
bluetoothctl << EOF
power on
EOF
可以将多个命令指定为每行一个命令。
奇怪的是,不对我来说是这样的:
echo "power on" | bluetoothctl
(我正在使用bluez-5.21-r1 - 不确定这是否依赖于版本)
答案 1 :(得分:7)
您可以将命令传递给bluetoothctl,如下所示:
您甚至可以使用标签自动填充:
url(r'^category/(?P<category_slug>[\w\-]+)/$', views.category, name='category'),
我不会将此作为对Jiri答案的评论添加,以便更加明显。
答案 2 :(得分:5)
另一种解决方案(我认为最好的解决方案)是使用期望TCL脚本与bluetoothctl。
我使用它来使用bluetoothctl自动连接到蓝牙设备,而无需与之互动。
例如,连接到由其MAC地址标识的设备
library(stringr)
strings <- LETTERS[1:2]
# "A" "B"
lookin <- c("ALPHABET", "DOG")
str_detect(lookin, strings)
# TRUE FALSE
您可以#!/usr/bin/expect -f
set address [lindex $argv 0]
set prompt "#"
log_user 0
spawn bluetoothctl
expect $prompt
send -- "remove $address\r"
expect $prompt
send -- "scan on\r"
expect "Discovery started"
sleep 10
send -- "scan off\r"
expect "Discovery stopped"
expect $prompt
send -- "trust $address\r"
expect "trust succeeded"
expect $prompt
send -- "pair $address\r"
expect "Pairing successful"
expect "Device $address Connected: no"
expect $prompt
send -- "connect $address\r"
expect "Connection successful"
expect $prompt
send "quit\r"
expect "eof"
启动此脚本
如果要查看输出,只需将./myExpectScript <MAC_addr>
值设置为1
答案 3 :(得分:1)
我使用tmux解决了这个问题,即:
安装tmux
:
apt install tmux
创建会话:
tmux new-session -d -s ServerFault 'sudo bluetoothctl -a |& tee /run/shm/BLUETOOTH_OUTPUT'
然后您可以发出如下命令:
tmux send-keys -t ServerFault "pair AC:22:0B:9F:0C:D6" Enter
答案 4 :(得分:0)
我写了一个python3脚本来自动连接游戏柜上的游戏手柄。您必须为要连接的每个设备运行它,但是不需要用户交互。与上述答案类似,它使用Expect python模块与bluetoothctl通信。我发现它比Expect / tcl脚本更容易使用。如果python无法找到pexpect,则需要安装python3-pexpect。
sudo apt install python3-pexpect
您将要更改 mylist 列表变量,以搜索与蓝牙设备的前3个字节(供应商部分)匹配的MAC。因此,例如,如果设备上MAC的前3个字节以AA:BB:CC:开头,则将EF \:17 \:D8 \:部分更改为AA \:BB \:CC \:>
您可以在 mylist 变量中添加要扫描的设备。我的示例搜索两个不同的供应商,一个以EF \:17 \:D8 \:开头,另一个以16 \:04 \:18 \开头:该脚本将拒绝可能正在传输的所有其他蓝牙设备,并且仅连接您在 mylist 变量中配置的游戏手柄MAC。
mylist = ['E4\:17\:D8\:[0-9A-F].[:][0-9A-F].[:][0-9A-F].', '16\:04\:18\:[0-9A-F].[:][0-9A-F].[:][0-9A-F].',pexpect.EOF]
这是python3脚本:
#!/usr/bin/python3
import os,sys,time,pexpect
def findaddress():
address=''
p = pexpect.spawn('hcitool scan', encoding='utf-8')
p.logfile_read = sys.stdout
mylist = ['E4\:17\:D8\:[0-9A-F].[:][0-9A-F].[:][0-9A-F].', '16\:04\:18\:[0-9A-F].[:][0-9A-F].[:][0-9A-F].',pexpect.EOF]
p.expect(mylist)
address=p.after
if address==pexpect.EOF:
return ''
else:
return address
def setbt(address):
response=''
p = pexpect.spawn('bluetoothctl', encoding='utf-8')
p.logfile_read = sys.stdout
p.expect('#')
p.sendline("remove "+address)
p.expect("#")
p.sendline("scan on")
mylist = ["Discovery started","Failed to start discovery","Device "+address+" not available","Failed to connect","Connection successful"]
while response != "Connection successful":
p.expect(mylist)
response=p.after
p.sendline("connect "+address)
time.sleep(1)
p.sendline("quit")
p.close()
#time.sleep(1)
return
address=''
while address=='':
address=findaddress()
time.sleep(1)
print (address," found")
setbt(address)
我编写了另一个python3脚本,该脚本将整个过程包装在Vte中并显示正在发生的过程,并允许您在需要时退出它。如果您想看看,请告诉我。
答案 5 :(得分:0)
您可以直接从 shell 将命令作为参数提供给 bluetoothctl
,而无需期望脚本。
我在 Ubuntu 20.04 的 Bash 脚本中使用它:
mac="90:03:B7:17:00:08"
# turn on bluetooth in case it's off
rfkill unblock bluetooth
bluetoothctl power on
bluetoothctl connect $mac
要断开连接,请使用
bluetoothctl disconnect
这当然假设目的地 $mac
已经配对。如果不是,你可以先做
bluetoothctl pair $mac
要列出所有可用的命令:
bluetoothctl help