Secara otomatis menerima koneksi Bluetooth pada Pi 3

14

Saya ingin mengembangkan platform untuk mobil saya yang secara otomatis menghubungkan perangkat apa pun yang mencoba untuk terhubung ke Pi melalui bluetooth. Saat ini memerlukan pemasangan yang diterima oleh Pi tetapi dalam kasus ini tidak akan ada layar sehingga perlu melakukannya secara otomatis. Bagaimana saya bisa mencapai ini?

Oliver Kuchies
sumber
dapatkah Anda menjelaskan model pi yang Anda miliki, karena hanya pi 3 yang carib; e dari bluetooth tanpa perangkat keras eksternal?
Mohammad Ali
Raspberry Pi 3 Model B - Built in bluetooth
Oliver Kuchies
Jadi yang Anda harapkan adalah agar Pi terus menyiarkan dan menerima koneksi pasangan yang dibuat oleh ponsel Anda? Anda mengerti implikasi keamanan? Baik? Dan juga menulis skrip Python kecil untuk melakukan pekerjaan itu solusi yang dapat diterima?
Mohammad Ali
Yap tetapi untuk membuatnya lebih aman saya sarankan menunjukkan bagaimana membatasi satu koneksi sebelum menemukan kembali. Juga merasa bebas untuk menambahkan implikasi keamanan sebagai jawaban untuk membantu orang lain :)
Oliver Kuchies

Jawaban:

12

( Perhatikan bahwa jawaban ini tidak lagi berfungsi pada Raspbian Jessie, karena bluez menghapus perintah agen bluetooth )

Jadi saat ini Anda menyatakan bahwa Anda dapat terhubung ke Pi dengan baik, tetapi memerlukan monitor untuk proses pemasangan.

Catatan: menerima koneksi apa pun adalah ide yang sangat tidak aman, dan jika Anda hanya menggunakan seperangkat perangkat terbatas, mengaturnya sebagai perangkat tepercaya akan jauh lebih masuk akal karena akan membatasi koneksi ke alamat Mac Anda, tetapi tidak akan mengizinkan yang baru perangkat yang akan ditambahkan tanpa monitor

Namun, perintah yang harus Anda jalankan untuk menerima semua koneksi yang dibuat untuk Pi, untuk membuatnya dapat ditemukan dan untuk mengatur pin yang dapat diprediksi tercantum di bawah ini:

Catatan: Anda mungkin perlu mengubah nol hci0 ke nomor Bluetooth perangkat Anda.

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

Sekarang setelah menjalankan perintah-perintah ini dan melihat apakah mereka berfungsi seperti yang diharapkan, kita dapat beralih ke pengaturannya untuk mulai pada boot Pi Anda.

  1. Kami mulai dengan membuat file bash dengan menjalankan perintah sudo nano mohammadIsAmazing.sh
  2. Kami sekarang memasukkan yang berikut ke dalam file itu:

    #!/bin/sh
    sleep 20
    hciconfig hci0 up
    hciconfig hci0 sspmode 1
    hciconfig hci0 piscan
    sudo bluetooth-agent 1234
    
  3. Sekarang kami menyimpan dan menutup file kami menggunakan control key and x

  4. Kami membuka file /etc/rc.localmenggunakan perintah berikut:

    Sudo nano /etc/rc.local
    
  5. Sekarang kita memasukkan perintah untuk menjalankan skrip bash kita /etc/rc.local

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

    Catatan: Anda harus meletakkan perintah sebelum baris terakhir di /etc/rc.local yang berisi: exit 0

  6. Kami sekarang menyimpan dan menutup file itu, lalu reboot Pi.

Di samping catatan: pastikan untuk memilih pin acak untuk sedikit meningkatkan keamanan

Di sisi lain catatan: Jika Anda ingin mengubah nama perangkat bluetooth, Anda perlu membuat file bernama /etc/machine-infoyang harus berisi yang berikut:

PRETTY_HOSTNAME=device-name

Kemudian jalankan service bluetooth restartsetelah itu

Mohammad Ali
sumber
2
Ingat bahwa &pada akhir baris dalam rc.localfile - tanpa itu RPi mungkin tidak menyelesaikan booting ketika shell menunggu skrip Anda /path/to/script/mohammadIsAmazing.shselesai dieksekusi sebelum melanjutkan - dan jika tidak menyelesaikan boot Anda tidak akan bisa sshmasuk ke dalam untuk memperbaiki hal-hal ...!
SlySven
Hai Mohammad. sudo bluetooth-agent adalah perintah yang tidak dikenal
Oliver Kuchies
@OliverKuchies coba jalankan apt-get install bluetooth bluezdulu dan beri tahu saya jika itu berhasil untuk Anda.
Mohammad Ali
Saya telah mencoba berlari bluetooth-agentdan tidak dapat menemukannya juga. Menginstal paket tidak memperbaikinya.
Gilad Naaman
@GiladNaaman baik apa yang Anda gunakan?
Mohammad Ali
0

Berdasarkan apa yang saya mengerti apa yang Anda butuhkan adalah modul bluetooth slave. Anda dapat menggunakan Modul HC-06 yang populer dan menghubungkannya ke raspberry pi melalui level shifter ke pin TX dan RX pada Pi dan menggunakan skrip python untuk membaca data serial dan memprosesnya sesuai kebutuhan

evolusionis
sumber
Saya akan berasumsi akan ada modul python yang dapat dijalankan segera setelah perangkat bluetooth menghubungkan daripada menghubungkan perangkat keras? Saya tidak terlalu buruk dengan pi, masih pemula tetapi tampaknya itu akan menjadi pendekatan yang logis
Oliver Kuchies
@OliverKuchies Saya belum pernah melakukan pemrograman bluetooth (atau gunakan!) Di linux tetapi Anda mencari beberapa jenis layanan daemon yang akan menanggapi hal-hal seperti itu. Untuk menguraikan: modul python tidak akan berjalan sendiri, itu harus digunakan oleh proses yang sudah berjalan. Itu adalah dasmon. Mencari "bluetooth linux daemon" memang memunculkan beberapa hal. Saya pikir saya perhatikan systemdada satu, Anda mungkin harus mengkonfigurasinya untuk berperilaku dengan cara tertentu.
goldilocks
@OliverKuchies melihat blog.miguelgrinberg.com/post/…
evolusionis
0

Saya tidak akan membahas implikasi keamanan atau tidak, tetapi ini adalah bagaimana saya melakukannya:

  1. Buat skrip bernama auto_connect.sh dengan konten berikut:
#!/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. Buat file /path/to/python_script.py dengan konten berikut:
#!/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. Bergantung pada OS yang Anda gunakan, pastikan Anda menjalankan auto_connect.sh di boot Anda.

Apa yang dilakukan semua ini:

  1. Mengatur perangkat agar selalu dapat ditemukan.

  2. Ketika sebuah perangkat berpasangan dengannya, itu akan secara otomatis menandainya di perangkat tepercaya dan terhubung dengannya.

  3. Pada setiap boot itu akan keliling melalui daftar perangkat yang dikenal dan akan mencoba untuk terhubung ke mereka.

Harap diingat bahwa pendekatan ini bertentangan langsung dengan segala jenis keamanan, tetapi mungkin ada kasus pengguna ketika Anda ingin mencapai hal itu.

Emil Borconi
sumber
-1

Di Raspberry Pi3 Model B ada bulit di bluetooth dan wifi. Menggunakan server OBEX Anda dapat menerima file dari perangkat lain tanpa bertanya tentang permintaan pasangan setiap kali. Anda harus melakukan pairing pertama kali dengan perangkat itu dan membuat satu direktori, dalam hal file diterima sepanjang waktu.

Cukup ikuti langkah tautan di bawah ini.

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

Mihit Gandhi
sumber
1
Sudahkah Anda membaca pertanyaan? OP secara khusus bertanya bagaimana menghindari pemasangan manual karena tidak akan ada layar, dan Anda menyarankan dia tetap melakukan pairing?
Dmitry Grigoryev
Anda harus melakukan pemasangan hanya satu kali saja sehingga untuk pertama kalinya Anda dapat terhubung dengan tampilan untuk pemasangan.
Mihit Gandhi
Anda hanya perlu melakukannya sekali per perangkat . Dan jika ada orang baru yang ingin menggunakannya, itu berarti menggali dari mana pun dia berada dan menghubungkannya ke monitor dan keyboard, itulah sebabnya dia mencari cara untuk menghindari itu.
Berbeda55