Автоматически принимает Bluetooth-соединения на Pi 3

14

Я ищу разработку платформы для моей машины, которая автоматически подключает любое устройство, которое пытается подключиться к Pi через Bluetooth. В настоящее время требуется согласование пары с Pi, но в этом случае экран не будет отображаться, поэтому он должен будет сделать это автоматически. Как я могу сделать это?

Оливер Кучи
источник
не могли бы вы уточнить, какая модель pi у вас есть, так как только pi 3 - это carib; e из bluetooth без внешнего оборудования?
Мохаммед Али
Raspberry Pi 3 Модель B - Встроенный Bluetooth
Оливер Кучис
Таким образом, все, что вы ожидаете, - это чтобы Пи постоянно транслировал и принимал какие-либо сопряженные соединения, сделанные вашим телефоном? Вы понимаете последствия для безопасности? право? А также написание небольшого скрипта Python, чтобы сделать работу приемлемым решением?
Мохаммед Али
Да, но чтобы сделать его более безопасным, я предлагаю показать, как ограничить одно соединение перед повторным обнаружением. Также не стесняйтесь добавлять последствия для безопасности, чтобы ответить, чтобы помочь другим :)
Оливер Кучис

Ответы:

12

( Обратите внимание, что этот ответ больше не работает с Распбианом Джесси, поскольку bluez удалил команду bluetooth-agent )

Таким образом, в настоящее время вы заявляете, что можете нормально подключиться к 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 и подключить его к Raspberry Pi через переключатель уровня к контактам TX и RX на Pi и использовать скрипт Python для чтения последовательных данных и обработки их по мере необходимости

evolutionizer
источник
Я предположил бы, что был бы модуль python, который мог бы работать, как только устройство Bluetooth соединяется, а не соединяет аппаратные средства? Я не слишком плохой с пи, все еще новичок, но кажется, что это был бы логичный подход
Оливер Кучи
@OliverKuchies Я никогда не занимался программированием (или использованием!) Bluetooth на Linux, но вы ищете какой-нибудь сервис демона, который будет реагировать на такие вещи. Чтобы уточнить: модуль Python не будет работать сам по себе, он должен использоваться процессом, который уже запущен. Это демон. Поиск «bluetooth linux daemon» действительно приводит к появлению некоторых вещей. Я думаю, что заметил, 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 есть блюлит в блютус и вайфай. Используя OBEX-сервер, вы можете получать файлы с других устройств, не спрашивая каждый раз о запросе на сопряжение. Сначала вы должны выполнить сопряжение с этим устройством и создать один каталог, в котором файлы будут приниматься постоянно.

Просто перейдите по ссылке ниже по ссылке.

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

Михит Ганди
источник
1
Вы читали вопрос? ОП специально спрашивает, как избежать ручного сопряжения, потому что не будет экрана, и вы предлагаете ему все равно соединиться?
Дмитрий Григорьев
Вы должны выполнить сопряжение только один раз, поэтому в первый раз вы можете подключиться к дисплею для сопряжения.
Михит Ганди
Вы должны сделать это только один раз для каждого устройства . И если кто-то хочет получить его, это означает, что нужно выкопать его из любого места и подключить к монитору и клавиатуре, поэтому он ищет способ избежать этого.
Разное55