Автоматичне прийняття Bluetooth-з'єднань на Pi 3


14

Я хочу розробити платформу для свого автомобіля, яка автоматично підключає будь-який пристрій, який намагається підключитися до Pi через Bluetooth. Наразі Pi вимагає прийняття пари, але в цьому випадку екрану не буде, тому потрібно буде зробити це автоматично. Як я можу це досягти?


Ви можете, будь ласка, детальніше розглянути, яка модель pi у вас є, так як тільки pi 3 - це carib; e Bluetooth без зовнішнього обладнання?
Мохаммед Алі

Raspberry Pi 3 Model B - Вбудований через bluetooth
Олівер Кучі

Отже, все, що ви очікуєте, - це те, що Pi постійно транслюватиме і приймати будь-які з'єднання для з'єднання, що здійснюються вашим телефоном? ти розумієш наслідки для безпеки? правильно? А також пише невеликий сценарій Python, щоб зробити роботу прийнятним рішенням?
Мохаммед Алі

Так, але щоб зробити це більш безпечним, я пропоную показати, як обмежити одне з'єднання перед повторним відкриттям. Також не соромтеся додавати наслідки безпеки, щоб відповісти, щоб допомогти іншим :)
Олівер Кучі

Відповіді:


12

( Зауважте, що ця відповідь більше не працює як Raspbian Jessie, оскільки bluez видалив команду bluetooth-агента )

Отже, ви заявляєте, що можете підключитися до Pi просто добре, але вам потрібен монітор для процесу з’єднання.

Примітка: прийняття будь-якого з'єднання - це надзвичайно небезпечна ідея, і якщо ви використовуєте лише обмежений набір пристроїв, їх налаштування як надійних пристроїв матиме набагато більше сенсу, оскільки це обмежить підключення до ваших адрес Mac, але не дозволить отримати нові пристрої, які потрібно додавати без монітора

Але в будь-якому разі, команди, які вам потрібно буде виконати, щоб прийняти всі з'єднання, які здійснюються з Pi, щоб зробити його відкритим і встановити передбачуваний штифт, перелічені нижче:

Примітка. Можливо, вам буде потрібно змінити нуль на hci0 номер Bluetooth у своїх пристроях.

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.

Зі сторони: обов'язково виберіть випадковий штифт, щоб незначно підвищити безпеку

З іншого боку: Якщо ви хочете змінити назву пристрою Bluetooth, вам потрібно створити файл, /etc/machine-infoякий називається, який повинен містити наступне:

PRETTY_HOSTNAME=device-name

Потім бігайте service bluetooth restartза цим


2
Пам'ятайте , що &в кінці рядка в rc.localфайлі - без нього RPi не може завершити завантаження , як інтерпретатор чекає сценарій /path/to/script/mohammadIsAmazing.shдля завершення виконання , перш ніж вона продовжується - і якщо він не закінчить завантаження , ви не зможете sshв це для того, щоб виправити речі ...!
SlySven

Привіт, Мухаммеде. sudo bluetooth-agent - нерозпізнана команда
Олівер Кучі

@OliverKuchies спробуйте запустити apt-get install bluetooth bluezспочатку і скажіть, чи працює це для вас.
Мохаммед Алі

Я спробував бігати bluetooth-agentі не міг його також знайти. Встановлення пакетів не виправило.
Гілад Нааман

@GiladNaaman добре, що ос, ви використовуєте?
Мохаммед Алі

0

Виходячи з того, що я розумію, що вам потрібно - це підлеглий модуль Bluetooth. Ви можете скористатися популярним модулем HC-06 і підключити його до малинового пі за допомогою перемикача рівня до штифтів TX і RX на Pi та використовувати скрипт python для зчитування серійних даних та обробляти їх у міру необхідності


Я б припустив, що буде модуль python, який можна запустити, як тільки підключиться пристрій Bluetooth, а не апаратне забезпечення? Я не надто пошарпаний з пі, все ще новачок, але, здається, це був би логічний підхід
Олівер Кучі

@OliverKuchies Я ніколи не робив жодного програмування Bluetooth (або використання!) На Linux, але ви шукаєте якусь службу демона, яка відповість на такі речі. Щоб уточнити: модуль python не запускається сам, його потрібно використовувати в процесі, який вже працює. Це демон. Пошук "Bluetooth Linux демон" виявив деякі речі. Я думаю, що я помітив, що він systemdмає, ви, мабуть, повинні налаштувати його на поведінку конкретних способів.
золотинки

@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. Залежно від ОС, яку ви використовуєте, переконайтеся, що ви запускаєте auto_connect.sh на завантаженні.

Що все це робить:

  1. Встановлює пристрій завжди можна знайти.

  2. Коли пристрій підключається до нього, він автоматично позначає його на надійному пристрої та підключається до нього.

  3. Під час кожного завантаження він пройде через список відомих пристроїв і спробує підключитися до них.

Зауважте, що такий підхід прямо протилежний будь-якій безпеці, але можуть бути випадки, коли ви хочете досягти саме цього.


-1

У Raspberry Pi3 Model B є група з bluetooth та wifi. За допомогою OBEX-сервера ви можете отримувати файли з інших пристроїв, не запитуючи про запит на пару. Вам потрібно вперше створити пару з цим пристроєм і зробити одну директорію, щоб файли отримували весь час.

Просто перейдіть за кроком нижче посилання.

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


1
Ви читали питання? ОП спеціально запитує, як уникнути спарювання вручну, оскільки екрану не буде, і ви пропонуєте йому все-таки робити парування?
Дмитро Григор’єв

Ви повинні виконати спарювання лише один раз у цьому, щоб уперше ви могли з'єднатись із дисплеєм для створення пари.
Міхіт Ганді

Це потрібно робити лише один раз на кожному пристрої . І якщо хтось із нових хоче захопити його, це означає викопати його з будь-якого місця та підключити його до монітора та клавіатури, саме тому він шукає спосіб уникнути цього.
Різне55
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.