我编写了一个 python3 脚本来自动连接游戏柜上的游戏手柄。您必须为要连接的每个设备运行它,但不需要用户交互。它使用expect python 模块。我发现它比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\: 开头:该脚本将拒绝所有其他可能正在传输的蓝牙设备,并且仅连接您在中配置的游戏手柄 MACmylist多变的。
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)
我编写了另一个 python 脚本,它将整个过程包装在 Vte 中,并显示正在发生的过程,并允许您在需要时退出它。如果你想看的话,请告诉我。