bluetoothctl到hcitool等效命令

时间:2014-02-18 16:23:42

标签: linux bluetooth

在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的工作吗?

6 个答案:

答案 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解决了这个问题,即:

  1. 安装tmux

    apt install tmux

  2. 创建会话:

    tmux new-session -d -s ServerFault 'sudo bluetoothctl -a |& tee /run/shm/BLUETOOTH_OUTPUT'

  3. 然后您可以发出如下命令:

    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