블루투스를 통해 Pi에 연결을 시도하는 모든 장치를 자동으로 연결하는 자동차 플랫폼을 개발하려고합니다. 현재 Pi의 페어링 수락이 필요하지만이 경우 화면이 없으므로 자동으로 수행해야합니다. 어떻게하면 되나요?
블루투스를 통해 Pi에 연결을 시도하는 모든 장치를 자동으로 연결하는 자동차 플랫폼을 개발하려고합니다. 현재 Pi의 페어링 수락이 필요하지만이 경우 화면이 없으므로 자동으로 수행해야합니다. 어떻게하면 되나요?
답변:
( bluez가 bluetooth-agent 명령을 제거했기 때문에이 답변은 Raspbian Jessie부터 더 이상 작동하지 않습니다. )
따라서 현재 Pi에 잘 연결할 수 있지만 페어링 프로세스에 대한 모니터가 필요하다고 말합니다.
참고 : 모든 연결을 수락하는 것은 매우 안전하지 않은 아이디어이며, 제한된 장비 세트 만 사용하는 경우 신뢰할 수있는 장비로 설정하면 Mac 주소에 대한 연결은 제한되지만 새로운 것은 허용되지 않으므로 훨씬 더 의미가 있습니다. 모니터없이 추가 할 장치
그러나 어쨌든 Pi에 대한 모든 연결을 수락하고 검색 가능하게하고 예측 가능한 핀을 설정하기 위해 실행해야하는 명령은 다음과 같습니다.
참고 : hci0
장치의 Bluetooth 번호를 0으로 변경해야 할 수도 있습니다 .
hciconfig hci0 up
hciconfig hci0 sspmode 1
hciconfig hci0 piscan
sudo bluetooth-agent 1234
이제이 명령을 실행하고 예상대로 작동하는지 확인한 후 Pi 부팅시 시작하도록 설정할 수 있습니다.
sudo nano mohammadIsAmazing.sh
이제 해당 파일에 다음을 입력하십시오.
#!/bin/sh
sleep 20
hciconfig hci0 up
hciconfig hci0 sspmode 1
hciconfig hci0 piscan
sudo bluetooth-agent 1234
이제 파일을 저장하고 닫습니다. control key and x
/etc/rc.local
다음 명령을 사용 하여 파일 을 엽니 다 .
Sudo nano /etc/rc.local
이제 bash 스크립트를 실행하는 명령을 입력하십시오. /etc/rc.local
sudo /path/to/script/mohammadIsAmazing.sh &
참고 : 다음을 포함하는 /etc/rc.local의 마지막 행 앞에 명령을 넣어야합니다. exit 0
이제 해당 파일을 저장하고 닫은 다음 Pi를 재부팅하십시오.
참고 사항 : 보안을 약간 향상시키기 위해 임의의 핀을 선택하십시오
다른 쪽 참고 : 블루투스 장치 이름을 변경 /etc/machine-info
하려면 다음을 포함 하는 파일을 만들어야합니다 .
PRETTY_HOSTNAME=device-name
그런 다음 실행 service bluetooth restart
그 후
&
에서 줄의 끝에 rc.local
파일을 -없이 스크립트가 쉘 대기로 부팅을 완료하지 않을 수 RPI /path/to/script/mohammadIsAmazing.sh
하고 부팅을 완료하지 않을 경우 당신은 할 수 없습니다 - 그것은 계속하기 전에 실행을 완료하기 ssh
로 문제를 해결하기 위해 ...!
apt-get install bluetooth bluez
먼저 실행을 시도 하고 그것이 당신에게 효과가 있는지 말해 보십시오 .
bluetooth-agent
그것을 찾을 수 없었습니다. 패키지를 설치해도 문제가 해결되지 않았습니다.
내가 이해하는 것을 바탕으로 슬레이브 블루투스 모듈이 있습니다. 널리 사용되는 HC-06 모듈 을 사용하고 레벨 시프터를 통해 Pi의 TX 및 RX 핀에 라즈베리 파이에 연결하고 파이썬 스크립트를 사용하여 직렬 데이터를 읽고 필요에 따라 처리 할 수 있습니다
systemd
하나 가 있음을 알았 으므로 아마도 특정 방식으로 작동하도록 구성해야합니다.
보안 영향에 대해서는 논의하지 않을 것이지만 이것이 내가하는 방법입니다.
#!/bin/bash
bt-adapter --set Powered 1
bt-adapter --set DiscoverableTimeout 0
bt-adapter --set Discoverable 1
bt-adapter --set PairableTimeout 0
bt-adapter --set Pairable 1
/path/to/python_script.py >/dev/nul 2>dev/nul &
list=""
bt-device -l | grep -E -o '[[:xdigit:]]{2}(:[[:xdigit:]]{2}){5}' | { while read line
do
list="$list connect $line
"
done
bluetoothctl << EOF
$list
EOF
}
#!/usr/bin/python3
from __future__ import absolute_import, print_function, unicode_literals
#import gobject
from gi.repository import GObject as gobject
import re
import dbus
import dbus.mainloop.glib
import subprocess
relevant_ifaces = [ "org.bluez.Adapter1", "org.bluez.Device1" ]
def property_changed(interface, changed, invalidated, path):
iface = interface[interface.rfind(".") + 1:]
for name, value in changed.iteritems():
val = str(value)
print("{%s.PropertyChanged} [%s] %s = %s" % (iface, path, name, val))
def interfaces_added(path, interfaces):
for iface in interfaces:
if not(iface in relevant_ifaces):
continue
try:
found = re.search('dev\_(..\_..\_..\_..\_..\_..)', path).group(1)
except AttributeError:
found = '' # apply your error handling
mac=found.replace("_",":")
cmd='echo -e "trust '+mac+' \\nconnect '+mac+' \\nquit" | bluetoothctl'
subprocess.call(cmd, shell=True)
def interfaces_removed(path, interfaces):
for iface in interfaces:
if not(iface in relevant_ifaces):
continue
print("{Removed %s} [%s]" % (iface, path))
if __name__ == '__main__':
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SystemBus()
bus.add_signal_receiver(interfaces_added, bus_name="org.bluez", dbus_interface="org.freedesktop.DBus.ObjectManager", signal_name="InterfacesAdded")
bus.add_signal_receiver(interfaces_removed, bus_name="org.bluez", dbus_interface="org.freedesktop.DBus.ObjectManager", signal_name="InterfacesRemoved")
mainloop = gobject.MainLoop()
mainloop.run()
이 모든 것 :
장치를 항상 검색 가능하도록 설정합니다.
장치가 페어링되면 신뢰할 수있는 장치에 자동으로 표시되어 연결됩니다.
부팅 할 때마다 알려진 장치 목록을 통해 순회하며 연결을 시도합니다.
이 접근 방식은 모든 종류의 보안에 직접적으로 영향을 미치지 만이를 달성하려는 경우 사용자 사례가있을 수 있습니다.
Raspberry Pi3 Model B에는 블루투스와 Wi-Fi가 있습니다. OBEX 서버를 사용하면 매번 페어링 요청에 대해 묻지 않고 다른 장치에서 파일을 수신 할 수 있습니다. 파일이 항상 수신되었다는 점에서 해당 장치와 처음으로 페어링하고 하나의 디렉토리를 만들어야합니다.
아래 링크 단계를 따르십시오.
https://www.raspberrypi.org/forums/viewtopic.php?p=963751#p963751