Secara otomatis menerima pemasangan Bluetooth


9

Saya menjalankan Raspberry PI 3 tanpa kepala, dan saya ingin itu menerima pasangan secara otomatis dari perangkat apa pun.

Saya melihat jawaban ini dalam pertanyaan yang identik:

Secara otomatis menerima koneksi Bluetooth pada Pi 3

Tetapi tampaknya agak ketinggalan jaman dan beberapa perintah yang digunakan tampaknya tidak ada.

Saya menjalankan 2016-05-27-raspbian-jessie.imggambar OS.


Apa yang Anda maksud dengan "beberapa perintah yang digunakan tampaknya tidak ada"? Apa yang sebenarnya tidak berhasil untuk Anda?
Dmitry Grigoryev

1
Jika saya ingat dengan benar bluetooth-agent,, tapi saya tidak yakin.
Gilad Naaman

Jawaban:


7

Karena bluetooth-agentperintah tidak ada pada Jessie, cara modern adalah menyalurkan perintah yang relevan bluetoothctl. Berdasarkan pada pertanyaan SO ini , skrip berikut harus memungkinkan pemasangan otomatis tanpa entri pin manual:

sudo bluetoothctl <<EOF
power on
discoverable on
pairable on
agent NoInputNoOutput
default-agent 
EOF

1
Ini berfungsi agar RPi Zero W saya dapat ditemukan saat boot. Saya sebelumnya telah memperbarui konfigurasi Bluetooth saya melalui langkah-langkah yang dijelaskan di sini dan dengan skrip ini .
charliesneath

Ini berfungsi, tetapi apakah Anda keberatan memberi tahu saya cara membuat raspberry pi otomatis mempercayai perangkat setelah dipasangkan? Terima kasih
Daniele Segato

Tampaknya ini memungkinkan pemasangan, tetapi tidak mengizinkan koneksi karena kurangnya agen. Saya percaya bagian agen dari skrip ini tidak berfungsi dengan baik. Ketika saya menjalankan skrip ini, saya mengerti No agent is registered, sepertinya default-agentperintah berjalan dengan cepat. Ketika saya memasukkan perintah secara manual, itu tidak memberikan kesalahan ini, tetapi begitu saya berhenti bluetoothctlitu membatalkan registrasi agen dan mencoba untuk menghubungkan gagal. Jika saya berhenti bluetoothctlberlari, saya mendapatkan prompt yang menanyakan apakah akan mempercayai koneksi, yang tidak NoInputNoOutputsesuai harapan Anda ...
Matthijs Kooijman

Saya menduga NoInputNoOutputini bukan kebijakan otorisasi, tetapi bagian dari protokol bluetooth untuk mengetahui jenis mekanisme otorisasi apa (misalnya, apakah pin dapat digunakan?) Tersedia.
Matthijs Kooijman

1
Mungkin, tetapi kemudian Anda harus terus memberi makan ya untuk semua upaya pemasangan (dan saya tidak sepenuhnya yakin apakah itu bekerja dari stdin atau mungkin skrip mencoba menjadi pintar dan mencoba untuk membuka terminal langsung daripada stdin (yang juga terjadi kadang-kadang) ... Belum pernah mencoba ini, akhirnya saya menggunakan skrip python dari gist.github.com/mill1000/74c7473ee3b4a5b13f6325e9994ff84c
Matthijs Kooijman

0

Saya baru saja menggunakan instal baru 2016-09-23-raspbian-jessie-lite.imguntuk mencobanya tanpa pembaruan tambahan. Tidak, apt-get updatetidak, apt-get install bluez-utilsatau apa pun. Perintah tunggal ini membuat Pi dapat ditemukan dan dipasangkan. Tanpa agen untuk mengontrol siapa yang dapat terhubung, itu hanya memungkinkan siapa saja:

sudo hciconfig hci0 piscan

0

Raspbian - Jessie

sudo apt-get install expect

xxxxx.sh

#!/usr/bin/expect -f
set prompt "#"
spawn sudo bluetoothctl
sleep 1
expect -re $prompt
sleep 1
send "agent NoInputNoOutput\r"
sleep 2
expect "Agent registered"
send "default-agent\r"
expect -re $prompt
sleep 3
interact
expect eof

1
Jawaban yang hanya terdiri dari kode tidak terlalu eksplisit, jadi berikan penjelasan yang lebih terperinci tentang jawaban Anda. Juga indentasi blok kode Anda untuk membuatnya tampak seperti kode; gunakan 4 spasi atau tab, sesuai keinginan Anda.

0

Saya menghadapi masalah yang sama dan menemukan metode ini berfungsi (RasPi 3, Model B, Raspbian 9 Stretch)

Saya menggunakan Raspberry Pi sebagai Perangkat IoT EDGE dan membutuhkannya untuk menerima Permintaan Pasangan Bluetooth tanpa intervensi. Saya memiliki Aplikasi Android yang mengkomunikasikan informasi teks ke Pi melalui Bluetooth dan pernyataan masalah saya memerlukan perangkat Android apa pun untuk terhubung.

Pertama, saya tidak menjalankan Agen Bluetooth yang terpisah (No Blueman, infact saya harus menghapusnya)

Mengedit file .bashrc di

    sudo nano /home/pi/.bashrc

Menambahkan dua perintah untuk ini di akhir

    sudo hciconfig hci0 piscan 
    sudo hciconfig hci0 sspmode 1

piscan membuat Raspberry Pi Bluetooth dapat ditemukan

sspmode 1 mengaktifkan 'Secure Simple Pairing' yang merupakan metode yang sama dengan yang digunakan oleh Bluetooth atau Speaker Bluetooth Anda (pada dasarnya perangkat yang tidak memiliki tampilan tempat Anda dapat mengonfirmasi PIN). Dan karena perintah-perintah ini dalam .bashrc mereka dijalankan saat boot.

Jalankan Skrip Bluetooth. Pasangan. Meskipun ada pop-up yang meminta saya untuk mengonfirmasi, saya dapat mengkomunikasikan pesan ke dan dari Pi dengan aplikasi saya

Catatan: hci0 mungkin tidak sama, bisa hci1, hci2 silakan periksa dengan menjalankan hciconfig pada CLI Anda

Ini hampir seperti alat, dan saya tidak yakin apakah ada dampak yang tidak diketahui, tetapi berhasil. Setiap perbaikan dihargai


-1

Anda dapat mengambil mengintip di kode sumber dari EcoDroidLink . Ini menerima koneksi Bluetooth tanpa perlu login.

EDIT: Dengan permintaan populer, berikut adalah cuplikan kode dari edl_agent modul yang membuat ini terjadi.

# - automate the agent for running on a headless Pi - to answer pair and connection requests without a blocking query

import dbus
import dbus.service
import dbus.mainloop.glib
import bluezutils

BUS_NAME = 'org.bluez'
AGENT_INTERFACE = 'org.bluez.Agent1'
AGENT_PATH = "/test/agent"

bus = None
device_obj = None
dev_path = None

def set_trusted(path):
    props = dbus.Interface(bus.get_object("org.bluez", path),
                    "org.freedesktop.DBus.Properties")
    props.Set("org.bluez.Device1", "Trusted", True)

def dev_connect(path):
    dev = dbus.Interface(bus.get_object("org.bluez", path),
                            "org.bluez.Device1")
    dev.Connect()

class Rejected(dbus.DBusException):
    _dbus_error_name = "org.bluez.Error.Rejected"

class Agent(dbus.service.Object):
    exit_on_release = True

    def set_exit_on_release(self, exit_on_release):
        self.exit_on_release = exit_on_release

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="", out_signature="")
    def Release(self):
        printlog("Release")
        if self.exit_on_release:
            mainloop.quit()

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="os", out_signature="")
    def AuthorizeService(self, device, uuid):
        printlog("AuthorizeService (%s, %s)" % (device, uuid))
        authorize = "yes" #ask("Authorize connection (yes/no): ")
        if (authorize == "yes"):
            return
        raise Rejected("Connection rejected by user")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="o", out_signature="s")
    def RequestPinCode(self, device):
        printlog("RequestPinCode (%s)" % (device))
        set_trusted(device)
        return "0000" #ask("Enter PIN Code: ")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="o", out_signature="u")
    def RequestPasskey(self, device):
        printlog("RequestPasskey (%s)" % (device))
        set_trusted(device)
        passkey = "0000" #ask("Enter passkey: ")
        return dbus.UInt32(passkey)

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="ouq", out_signature="")
    def DisplayPasskey(self, device, passkey, entered):
        printlog("DisplayPasskey (%s, %06u entered %u)" %
                        (device, passkey, entered))

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="os", out_signature="")
    def DisplayPinCode(self, device, pincode):
        printlog("DisplayPinCode (%s, %s)" % (device, pincode))

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="ou", out_signature="")
    def RequestConfirmation(self, device, passkey):
        printlog("RequestConfirmation (%s, %06d)" % (device, passkey))
        confirm = "yes" #ask("Confirm passkey (yes/no): ")
        if (confirm == "yes"):
            set_trusted(device)
            return
        raise Rejected("Passkey doesn't match")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="o", out_signature="")
    def RequestAuthorization(self, device):
        printlog("RequestAuthorization (%s)" % (device))
        auth = "yes" #ask("Authorize? (yes/no): ")
        if (auth == "yes"):
            return
        raise Rejected("Pairing rejected")

    @dbus.service.method(AGENT_INTERFACE,
                    in_signature="", out_signature="")
    def Cancel(self):
        printlog("Cancel")

1
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Jacobm001

@ Jacobm001 Saya menambahkan kutipan kode. Apakah sekarang lebih baik?
Serge Stroobandt
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.