我正在尝试通过蓝牙连接2个或更多Raspberry Pi 3主板。我正在寻找配对时设置安全性的选项。我正在使用Raspian-stretch(最新的一个)。 RPI-3上的Bluez版本为5.23(如bluetoothd -v命令所示)。
我正在使用无头版本。我希望配对是安全的(在我没有用户登录的情况下,我应该设置某种身份验证,如PIN(4位)或密码(6位))。因此,如果我必须将手机连接到RPI,我无需登录RPI以输入PIN / Passkey。 然后我想建立蓝牙PAN网络,以便我可以在连接到PAN网络的设备之间进行通信。
我希望使用PIN在设备中配对,该PIN可以在系统中的文件中找到,也可以指向某个地方。例如,/ temp /目录中的pin.txt文件或运行代理来设置PIN。我从其他帖子中读到,bluez5.x摆脱了早期版本bluez中使用的bluetooth-agent来完成我可以完成的事情。
bluetoothctl中的代理,例如DisplayOnly,KeyboardDisplay,NoInputNoOutput,DisplayYesNo,KeyboardOnly,或者设置动态密钥,必须手动输入或确认密码,或者只允许任何设备在NoInputNoOutput的情况下进行配对和连接而不进行任何身份验证
以下是我在此论坛中发现的链接,指出代理商不再可用: https://www.raspberrypi.org/forums/viewtopic.php?t=133961 我还提到了一些示例,显示了设备的配对,但没有解决我正在寻找的问题。
手册页上也没有可用的信息。 https://manpages.debian.org/stretch/bluez/bluetoothctl.1.en.html
这是我发现的关于命令的东西,但仍然不是我想要的东西。 https://wiki.archlinux.org/index.php/Bluetooth
我还发布了这个Raspberry Pi论坛。链接在这里: https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=195090
任何有关此问题的帮助或建议或我可以参考的documnets链接都表示赞赏。
提前致谢。
答案 0 :(得分:1)
经过几天的摆弄,这就是我所得到的。 使用BlueZ 5.50 和Raspbian Stretch(Pi Zero W):
从-compat 开始蓝牙:
附加到 /etc/systemd/system/dbus-org.bluez.service
中的 ExecStart 行
或
在rc.local中:sudo bluetoothd --compat&
接下来的步骤由下面发布的代码处理,但为清楚起见,hciconfig需要设置为:
sudo hciconfig hci0 sspmode 0
注释#1::从Android配对时,使用“ sspmode 1 ”时,会提示您输入PIN,但随后Pi会自动生成6位数字的密码,并且配对失败。 / p>
注释#2: hciconfig hci0 不能通过 auth 或加密进行设置,而这些将实际注册仅显示代理(我们将在下一步创建代理)作为 KeyboardDisplay (使用sudo btmon进行验证),并且配对不会使用预定义的PIN。不确定DisplayOnly无法使用auth,加密(可能与设置安全模式3有关)的原因。
然后,我们将使用 bluetoothctl :
pi@raspberrypi:~ $ bluetoothctl
Agent registered
[bluetooth]# agent off
Agent unregistered
[bluetooth]# agent DisplayOnly
Agent registered
[bluetooth]# default-agent
Default agent request successful
[bluetooth]# discoverable on
Changing discoverable on succeeded
[CHG] Controller 11:22:33:44:55:66 Discoverable: yes
[bluetooth]# pairable on
Changing pairable on succeeded
[CHG] Controller 11:22:33:44:55:66 Pairable: yes
// Initiate pairing on remote device //
[NEW] Device AA:BB:CC:DD:EE:FF Android_phone
// Enter any PIN on Device AA:BB:CC:DD:EE:FF
Request PIN code
// retype your PIN below (on Pi)
[agent] Enter PIN code: <your PIN>
[CHG] Device AA:BB:CC:DD:EE:FF Class: 0x005a020c
...
[CHG] Device AA:BB:CC:DD:EE:FF Paired: yes
[bluetooth]# quit
注释#3:会碰上使用BlueZ 5.43(Stretch的默认版本)使用pexpect(如果要运行下面发布的代码,请注意一下)注册代理
下面是Python 2.7代码,该代码设置sspmode并处理与预生成的PIN配对:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function # import print from python3: end=""
import time
import re
import pexpect # sudo apt-get install python-pexpect
import subprocess
import random
# !!! make sure bluetoothd runs in --compat mode before executing this script !!!
def pair_with_pin(start_time, pin, time_limit=60): # int(time.time()), pin - \d{4}, time_limit - approximate pairing window time in seconds, it might take up to 2x (nested timeout conditions)
"exectutes pairing with entered PIN on bluetooth adapter side"
pairing_status = False
try:
subprocess.call(['sudo','hciconfig','hci0','sspmode', '0'])
# bluetoothctl
child = pexpect.spawn('bluetoothctl')
child.expect("#")
child.sendline('agent off') # might be unnecessary
child.expect("unregistered")
child.sendline('agent DisplayOnly')
child.expect("Agent registered")
child.sendline('pairable on')
child.expect("pairable on succeeded")
child.sendline('discoverable on')
child.expect("discoverable on succeeded")
child.sendline('default-agent')
print ('Please input PIN: ' + pin)
# waiting for Phone to send a pairing request...
child.expect('Enter PIN code:', timeout = time_limit ) # timeout <= PAIRING_TIME_LIMIT to keep some kind of logic
while int(time.time()) < start_time + time_limit: # allow multiple pairing attempts during pairing window
child.sendline(pin)
i = child.expect(['Paired: yes', 'Enter PIN code:'], timeout = time_limit)
if i == 0: # found 'Paired: yes' == successful pairing
trust_mac = 'trust ' + re.search(r'(?:[0-9a-fA-F]:?){12}.+$', child.before).group(0) # extract MAC from last line, one with 'Paired: Yes'
child.sendline(trust_mac) # optionally add device to trusted
child.expect('trust succeeded', timeout = 10)
pairing_status = True
break
#else: # i == 1
# print('wrong PIN, retrying if time will allow')
except pexpect.EOF:
print ('!!!!!!!! EOF')
except pexpect.TIMEOUT:
print ('!!!!!!!! TIMEOUT')
# hide Pi's bluetooth for security reasons
child.sendline('pairable off')
child.expect("pairable off succeeded")
child.sendline('discoverable off')
child.expect("discoverable off succeeded")
child.close()
return pairing_status
#main program body
PAIRING_TIME_LIMIT = 60
BT_PIN = random.randint(1000,10000) # generate random 4-digit PIN 1000..9999
status = pair_with_pin(int(time.time()), str(BT_PIN), PAIRING_TIME_LIMIT)
if status == True:
print('Pairing successful')
最后的提示:成功配对后,可能可能会打开加密功能,请尝试:
hciconfig hci0加密
或
hcitool enc $ BDADD
答案 1 :(得分:0)
我能够使用测试脚本。
对于有兴趣了解详细信息的任何人,请参阅我在Raspberry Pi论坛上的帖子。以下是链接。
https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=195090&p=1221455#p1221455
答案 2 :(得分:-1)
首先,必须针对针脚请求配置sspmode 0:hciconfig hci0 sspmode 0
并使用bt-agent复制(您也可以作为守护进程运行):
bt-agent -c NoInputNoOutput -p /root/bluethooth.cfg
编辑文件配置,您可以输入MAC地址和图钉:例如:XX:XX:XX:XX:XX:XX 1234
或者,如果您希望将所有设备的密码固定为相同的密码,例如1234,请编辑文件:* 1234
这对我有用!