Pi 3'te Bluetooth bağlantılarını otomatik olarak kabul etme


14

Pi için Bluetooth ile Pi'ye bağlanmaya çalışan herhangi bir cihazı otomatik olarak bağlayan arabam için bir platform geliştirmek istiyorum. Şu anda Pi tarafından eşleştirme kabulü gerekiyor, ancak bu durumda ekran olmayacak, bu yüzden otomatik olarak yapması gerekecek. Bunu nasıl başarabilirim?


sadece pi 3 karib olduğu için hangi pi modeliniz olduğunu ayrıntılı olarak açıklayabilir misiniz; e harici donanım olmadan bluetooth?
Muhammed Ali

Raspberry Pi 3 Model B - Bluetooth
yerleşik

Peki beklediğiniz tek şey Pi'nin sürekli yayın yapması ve telefonunuz tarafından yapılan eşleştirme bağlantılarını kabul etmesidir? güvenlik sonuçlarını anlıyor musunuz? sağ? Ve ayrıca işi kabul edilebilir bir çözüm yapmak için küçük bir Python betiği yazmak mı?
Muhammed Ali

Evet ama daha güvenli hale getirmek için yeniden keşfetmeden önce bir bağlantıyla nasıl sınırlanacağınızı göstermenizi öneririm. Ayrıca başkalarına yardım etmek için güvenlik etkileri eklemek için çekinmeyin :)
Oliver Kuchies 18:16

Yanıtlar:


12

( Bluez bluetooth-agent komutunu kaldırdığından, bu cevabın artık Raspbian Jessie'den beri çalışmadığını unutmayın )

Şu anda Pi'ye iyi bağlanabileceğinizi belirtiyorsunuz, ancak eşleştirme işlemi için bir monitöre ihtiyacınız var.

Not: herhangi bir bağlantıyı kabul etmek inanılmaz derecede güvensiz bir fikirdir ve yalnızca sınırlı sayıda cihaz kullanıyorsanız, bunları güvenilir cihazlar olarak ayarlamak Mac adreslerinize bağlantıyı sınırlayacağı için çok daha mantıklı olacaktır, ancak yeni adreslere izin vermeyecektir monitör olmadan eklenecek cihazlar

Ama yine de, Pi'ye yapılan tüm bağlantıları kabul etmek, keşfedilebilir hale getirmek ve öngörülebilir bir pim ayarlamak için çalıştırmanız gereken komutlar aşağıda listelenmiştir:

Not: hci0 Cihazınızın Bluetooth numarasını sıfır olarak değiştirmeniz gerekebilir .

hciconfig hci0 up
hciconfig hci0 sspmode 1
hciconfig hci0 piscan
sudo bluetooth-agent 1234

Şimdi bu komutları çalıştırdıktan ve beklendiği gibi çalışıp çalışmadığını gördükten sonra Pi'nizin önyüklemesinde başlayacak şekilde ayarlamaya devam edebiliriz.

  1. Komutu çalıştırarak bir bash dosyası oluşturarak başlıyoruz. sudo nano mohammadIsAmazing.sh
  2. Şimdi bu dosyaya aşağıdakileri giriyoruz:

    #!/bin/sh
    sleep 20
    hciconfig hci0 up
    hciconfig hci0 sspmode 1
    hciconfig hci0 piscan
    sudo bluetooth-agent 1234
    
  3. Şimdi dosyamızı control key and x

  4. /etc/rc.localAşağıdaki komutu kullanarak dosyayı açıyoruz :

    Sudo nano /etc/rc.local
    
  5. Şimdi bash betiğimizi çalıştırmak için /etc/rc.local

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

    Not: Komutu /etc/rc.local dosyasındaki son satırdan önce: exit 0

  6. Şimdi bu dosyayı kaydedip kapatıyoruz, ardından Pi'yi yeniden başlatıyoruz.

Bir yan notta: güvenliği marjinal olarak artırmak için rastgele bir iğne seçtiğinizden emin olun

Başka bir not: Bluetooth cihaz adını değiştirmek isterseniz /etc/machine-info, aşağıdakileri içermesi gereken bir dosya oluşturmanız gerekir:

PRETTY_HOSTNAME=device-name

Sonra service bluetooth restartpeşinden koş


2
Unutmayın &içinde hattın ucunda rc.localdosyası - onsuz senaryonuz için kabuk bekler olarak önyükleme işlemini bitirmesine olmayabilir RPI /path/to/script/mohammadIsAmazing.shve çizme bitiş değil eğer mümkün olmayacaktır - bu devam etmeden önce yürütme bitmesini sshiçine bir şeyleri düzeltmek için ...!
SlySven

Merhaba Muhammed. sudo bluetooth-agent tanınmayan bir komuttur
Oliver Kuchies

@OliverKuchies apt-get install bluetooth bluezönce koşmayı dene ve bana bunun işe yarayıp yaramadığını söyle.
Muhammed Ali

Koşmayı denedim bluetooth-agentve bulamadım. Paketleri kurmak sorunu çözmedi.
Gilad Naaman

@GiladNaaman iyi hangi işletim sistemini kullanıyorsunuz?
Muhammed Ali

0

Ne istediğini anladığım dayanarak bir köle bluetooth modülü. Popüler HC-06 Modülünü kullanabilir ve Pi'deki TX ve RX pinlerine seviye değiştirici ile ahududu pi'ye bağlayabilir ve seri verileri okumak ve gerektiği gibi işlemek için bir python betiği kullanabilirsiniz.


Bir bluetooth cihazı bağlanmak yerine bağlanır bağlanmaz çalıştırılabilecek bir python modülü olacağını varsayabilirim? Pi ile hala perişan değilim, hala yeni başlayanlar ama mantıklı bir yaklaşım gibi görünüyor
Oliver Kuchies

@OliverKuchies Linux üzerinde hiç bluetooth programlama yapmadım (ya da kullanmayın!) Ama bu tür şeylere cevap verecek bir tür daemon servisi arıyorsunuz. Ayrıntılı olarak açıklamak gerekirse: bir python modülü kendi kendine çalışmaz, zaten çalışan bir işlem tarafından kullanılmalıdır. Bu bir arka plan programı. "Bluetooth linux daemon" araması bazı şeyleri ortaya çıkarır. Sanırım bir tane olduğunu fark ettim systemd, muhtemelen belirli şekillerde davranacak şekilde yapılandırmanız gerekiyor.
goldilocks

@OliverKuchies bir de göz blog.miguelgrinberg.com/post/...
evolutionizer

0

Güvenlik etkisini tartışmayacağım ya da tartışmayacağım ama bunu şu şekilde yapıyorum:

  1. Aşağıdaki içeriğe sahip auto_connect.sh adlı bir komut dosyası oluşturun:
#!/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 dosyasını aşağıdaki içerikle oluşturun:
#!/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. Kullandığınız işletim sistemine bağlı olarak, önyüklemenizde auto_connect.sh dosyasını çalıştırdığınızdan emin olun.

Tüm bunlar ne yapar:

  1. Cihazı her zaman bulunabilir olacak şekilde ayarlar.

  2. Bir cihaz eşleştiğinde, otomatik olarak güvenilir cihazda işaretler ve ona bağlanır.

  3. Her önyüklemede, bilinen aygıtların listesi aracılığıyla gezinebilir ve bunlara bağlanmaya çalışır.

Lütfen bu yaklaşımın doğrudan her türlü güvenliğe karşı olduğunu unutmayın, ancak bunu başarmak istediğinizde kullanıcı durumları olabilir.


-1

Raspberry Pi3 Model B'de bluetooth ve wifi'de bir bulit var. OBEX sunucusunu kullanarak, her seferinde eşleştirme isteği sormadan dosyaları diğer cihazlardan alabilirsiniz. Bu cihazla ilk kez eşleştirme yapmanız ve dosyaların her zaman alması için bir dizin oluşturmanız gerekir.

Aşağıdaki bağlantıyı izlemeniz yeterlidir.

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


1
Soruyu okudun mu? OP özellikle el ile eşleştirmenin nasıl önleneceğini sorar, çünkü ekran olmayacaktır ve yine de eşleştirme yapmasını önerirsiniz?
Dmitry Grigoryev

Eşleştirme için ekrana ilk kez bağlanabilmeniz için bu işlemde yalnızca bir kez eşleştirme yapmanız gerekir.
Mihit Gandhi

Her cihaz için yalnızca bir kez yapmanız gerekir . Ve eğer herhangi biri yeni bir şey yapmak isterse, bu onu bulunduğu yerden kazmak ve bir monitöre ve klavyeye bağlamak anlamına gelir, bu yüzden bundan kaçınmanın bir yolunu arıyor.
Different55
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.