Linux bluetoothctl到hcitool等效命令

Linux bluetoothctl到hcitool等效命令,linux,bluetooth,Linux,Bluetooth,在Linux中,我曾经使用“hidd--connect-mmac”来连接BT设备,但自从Bluez5之后,这种情况就消失了。 我可以使用bluetoothctl手动建立连接,但我需要从我的应用程序中使用这些命令,使用bluetoothctl将很困难 与bluetoothctl相同的hcitool命令是什么 例如,我会键入bluetoothctl: select <cmac> scan on trust <mmac> pairable on pair <mmac>

在Linux中,我曾经使用“hidd--connect-mmac”来连接BT设备,但自从Bluez5之后,这种情况就消失了。 我可以使用bluetoothctl手动建立连接,但我需要从我的应用程序中使用这些命令,使用bluetoothctl将很困难

与bluetoothctl相同的hcitool命令是什么

例如,我会键入bluetoothctl:

select <cmac>
scan on
trust <mmac>
pairable on
pair <mmac>
connect <mmac>
选择
浏览
信任
可对
一对
连接
我可以用“hcitool扫描”进行扫描,但我还没有找到连接。 我尝试过使用“hcitool cc mmac”和“hcitool auth mmac”,但没有任何效果


或者hcitool可以做bluetoothctl做的事情吗?

我使用的脚本如下所示:

#!/bin/bash
bluetoothctl << EOF
power on
EOF
echo -e 'power on\nquit' | bluetoothctl

(我正在使用bluez-5.21-r1-不确定这是否取决于版本)

您可以像这样向bluetoothctl传递命令:

#!/bin/bash
bluetoothctl << EOF
power on
EOF
echo -e 'power on\nquit' | bluetoothctl
您甚至可以使用tab自动完成:

echo -e 'power on\nconnect \t \nquit' | bluetoothctl
我并不是在对Jiri的答案发表评论,所以它更容易看到。

另一个解决方案(我认为最好的)是使用expect TCL脚本和bluetoothctl

我使用它自动连接到蓝牙设备使用蓝牙CTL,而不必与之交互

例如,连接到由MAC地址标识的设备

#!/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
如果您想查看输出,只需将
log\u user
值设置为1

我使用解决了这个问题,即:

  • 安装
    tmux

    apt安装tmux

  • 创建会话:

    tmux新会话-d-s服务器故障'sudo bluetoothctl-a |&tee/run/shm/BLUETOOTH_输出'

  • 然后可以发出如下命令:

    tmux发送密钥-t服务器故障“配对AC:22:0B:9F:0C:D6”输入


  • 我写了一个python3脚本来自动连接游戏柜上的游戏板。您必须为要连接的每个设备运行它,但不需要用户交互。它使用expect python模块(与上述答案类似)与bluetoothctl通信。我发现它比expect/tcl脚本更易于使用。如果python找不到pexpect,则需要安装python3 pexpect

    sudo apt install python3-pexpect
    
    您需要更改mylistlist变量,以搜索与蓝牙设备前3个字节(供应商部分)匹配的Mac。因此,例如,如果设备上MAC的前3个字节以AA:BB:CC:开头,则将EF \:17 \:D8 \:部分更改为AA \:BB \:CC\:

    您可以在mylist变量中添加任意数量的要扫描的设备。我的示例搜索两个不同的供应商,一个以EF\:17\:D8\:开始,另一个以16\:04\:18\:开始。脚本将拒绝所有可能正在传输的其他蓝牙设备,并且只连接您在mylist变量中配置的gamepad 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中,并显示正在发生的过程,如果需要,还允许您退出它。如果你想看的话,请告诉我。

    我从来没有弄明白hcitool,所以我最终使用bluetoothctl发送它的标准输入并处理它的标准输出。这个问题似乎离题了,因为它是关于Linux的一般用法,而不是任何编程。请在unix.stackexchange.com或askubuntu.com中询问。这与编程有关。我从一个Java应用程序(使用Java.lang.Runtime.exec)发出这些命令,这是一个连接到蓝牙设备的前端应用程序。在我的另一篇评论中,我解释说我发现了一个使用stdin/stdout的bluetoothctl的解决方案,其中包括使用java.lang.ProcessBuilder。不过,这对配对并不起作用。。。开机和关机几乎是唯一能真正起作用的命令。。。已尝试配对,但未执行。启用代理对某些油嘴滑舌的人不起作用error@Lukas1-我想这确实是因为
    bluetoothctl
    是异步工作的。为了编写更复杂的脚本,您需要以某种方式等待每个命令完成。