Pi 3에서 블루투스 연결 자동 수락


14

블루투스를 통해 Pi에 연결을 시도하는 모든 장치를 자동으로 연결하는 자동차 플랫폼을 개발하려고합니다. 현재 Pi의 페어링 수락이 필요하지만이 경우 화면이 없으므로 자동으로 수행해야합니다. 어떻게하면 되나요?


파이 3 만 캐리 브 (carib)이므로 외부 하드웨어가없는 블루투스로 어떤 파이 모델을 정교하게 설명해 주시겠습니까?
모하마드 알리

라즈베리 파이 3 모델 B – 블루투스 내장
Oliver Kuchies

따라서 Pi가 지속적으로 브로드 캐스팅되고 휴대 전화로 이루어진 페어링 연결을 수락하기 만하면됩니다. 보안 영향을 이해합니까? 권리? 또한 작업을 수용 가능한 솔루션으로 만들기 위해 작은 Python 스크립트를 작성하고 있습니까?
Mohammad Ali

그러나 더 안전하게하려면 재검색 전에 하나의 연결로 제한하는 방법을 보여주십시오. 또한 다른 사람들을 돕기 위해 보안에 대한 시사점을 자유롭게 추가하십시오 :)
Oliver Kuchies

답변:


12

( 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 부팅시 시작하도록 설정할 수 있습니다.

  1. 우리는 명령을 실행하여 bash 파일을 만드는 것으로 시작합니다. sudo nano mohammadIsAmazing.sh
  2. 이제 해당 파일에 다음을 입력하십시오.

    #!/bin/sh
    sleep 20
    hciconfig hci0 up
    hciconfig hci0 sspmode 1
    hciconfig hci0 piscan
    sudo bluetooth-agent 1234
    
  3. 이제 파일을 저장하고 닫습니다. control key and x

  4. /etc/rc.local다음 명령을 사용 하여 파일 을 엽니 다 .

    Sudo nano /etc/rc.local
    
  5. 이제 bash 스크립트를 실행하는 명령을 입력하십시오. /etc/rc.local

    sudo /path/to/script/mohammadIsAmazing.sh &
    

    참고 : 다음을 포함하는 /etc/rc.local의 마지막 행 앞에 명령을 넣어야합니다. exit 0

  6. 이제 해당 파일을 저장하고 닫은 다음 Pi를 재부팅하십시오.

참고 사항 : 보안을 약간 향상시키기 위해 임의의 핀을 선택하십시오

다른 쪽 참고 : 블루투스 장치 이름을 변경 /etc/machine-info하려면 다음을 포함 하는 파일을 만들어야합니다 .

PRETTY_HOSTNAME=device-name

그런 다음 실행 service bluetooth restart그 후


2
그 기억 &에서 줄의 끝에 rc.local파일을 -없이 스크립트가 쉘 대기로 부팅을 완료하지 않을 수 RPI /path/to/script/mohammadIsAmazing.sh하고 부팅을 완료하지 않을 경우 당신은 할 수 없습니다 - 그것은 계속하기 전에 실행을 완료하기 ssh로 문제를 해결하기 위해 ...!
SlySven

안녕 모하마드 sudo bluetooth-agent는 인식 할 수없는 명령입니다
Oliver Kuchies

@OliverKuchies가 apt-get install bluetooth bluez먼저 실행을 시도 하고 그것이 당신에게 효과가 있는지 말해 보십시오 .
Mohammad Ali 12

나는 달리기를 시도했지만 bluetooth-agent그것을 찾을 수 없었습니다. 패키지를 설치해도 문제가 해결되지 않았습니다.
Gilad Naaman 2016 년

@GiladNaaman 잘 운영하고 있습니까?
Mohammad Ali

0

내가 이해하는 것을 바탕으로 슬레이브 블루투스 모듈이 있습니다. 널리 사용되는 HC-06 모듈 을 사용하고 레벨 시프터를 통해 Pi의 TX 및 RX 핀에 라즈베리 파이에 연결하고 파이썬 스크립트를 사용하여 직렬 데이터를 읽고 필요에 따라 처리 할 수 ​​있습니다


하드웨어를 연결하지 않고 블루투스 장치가 연결되는 즉시 실행할 수있는 파이썬 모듈이 있다고 가정합니다. 나도 아직 파이, 초보자와 초라한 아니에요하지만 논리적 인 방법이 될 것 같다
올리버 Kuchies

@OliverKuchies 나는 리눅스에서 블루투스 프로그래밍 (또는 사용!)을 해 본 적이 없지만 그러한 것들에 응답하는 데몬 서비스를 찾고 있습니다. 자세히 설명하자면, 파이썬 모듈 자체는 실행되지 않으며 이미 실행중인 프로세스에서 사용해야합니다. 데몬입니다. "bluetooth linux daemon"을 검색하면 일부 내용이 나타납니다. 나는 systemd하나 가 있음을 알았 으므로 아마도 특정 방식으로 작동하도록 구성해야합니다.
goldilocks

@OliverKuchies은 봐 가지고 blog.miguelgrinberg.com/post/...
evolutionizer

0

보안 영향에 대해서는 논의하지 않을 것이지만 이것이 내가하는 방법입니다.

  1. 다음 내용으로 auto_connect.sh라는 스크립트를 작성하십시오.
#!/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
}
  1. 다음 내용으로 /path/to/python_script.py 파일을 작성하십시오.
#!/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()
  1. 사용중인 OS에 따라 부팅시 auto_connect.sh를 실행해야합니다.

이 모든 것 :

  1. 장치를 항상 검색 가능하도록 설정합니다.

  2. 장치가 페어링되면 신뢰할 수있는 장치에 자동으로 표시되어 연결됩니다.

  3. 부팅 할 때마다 알려진 장치 목록을 통해 순회하며 연결을 시도합니다.

이 접근 방식은 모든 종류의 보안에 직접적으로 영향을 미치지 만이를 달성하려는 경우 사용자 사례가있을 수 있습니다.


-1

Raspberry Pi3 Model B에는 블루투스와 Wi-Fi가 있습니다. OBEX 서버를 사용하면 매번 페어링 요청에 대해 묻지 않고 다른 장치에서 파일을 수신 할 수 있습니다. 파일이 항상 수신되었다는 점에서 해당 장치와 처음으로 페어링하고 하나의 디렉토리를 만들어야합니다.

아래 링크 단계를 따르십시오.

https://www.raspberrypi.org/forums/viewtopic.php?p=963751#p963751


1
질문을 읽었습니까? OP 화면이 없기 때문에 수동 페어링을 피하는 방법을 구체적으로 묻습니다. 그래도 페어링 을해야한다고 제안하십니까?
Dmitry Grigoryev

이 경우 한 번만 페어링하면 페어링 용 디스플레이에 처음 연결할 수 있습니다.
Mihit Gandhi

장치 당 한 번만 수행하면 됩니다 . 그리고 새로운 누군가가 그것을 원한다면, 그것이 어디에 있든지 그것을 파서 모니터와 키보드에 연결하는 것을 의미하기 때문에, 그는 그것을 피할 수있는 방법을 찾고 있습니다.
Different55
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.