Tự động chấp nhận ghép nối bluetooth


9

Tôi đang chạy Raspberry PI 3 không đầu và tôi muốn nó tự động chấp nhận ghép nối từ bất kỳ thiết bị nào.

Tôi thấy câu trả lời này trong một câu hỏi giống hệt nhau:

Tự động chấp nhận kết nối Bluetooth trên Pi 3

Nhưng nó có vẻ hơi lỗi thời và một số lệnh được sử dụng dường như không tồn tại.

Tôi đang chạy 2016-05-27-raspbian-jessie.imghình ảnh hệ điều hành.


Ý bạn là gì khi "một số lệnh được sử dụng dường như không tồn tại"? Chính xác thì điều gì không làm việc cho bạn?
Dmitry Grigoryev

1
Nếu tôi nhớ chính xác bluetooth-agent, nhưng tôi không chắc chắn.
Gilad Naaman

Câu trả lời:


7

bluetooth-agentlệnh không tồn tại trên Jessie, nên cách hiện đại là chuyển các lệnh có liên quan đến bluetoothctl. Dựa trên câu hỏi SO này , tập lệnh sau sẽ cho phép ghép nối tự động mà không cần nhập mã pin thủ công:

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

1
Điều này làm việc để làm cho RPi Zero W của tôi có thể được khám phá khi khởi động. Trước đây tôi đã cập nhật cấu hình Bluetooth của mình thông qua các bước được nêu ở đây và với tập lệnh này .
charliesneath

Điều này hoạt động, nhưng bạn có phiền khi nói với tôi cách làm cho mâm xôi pi tự động tin tưởng vào thiết bị sau khi ghép nối không? Cảm ơn
Daniele Segato

Có vẻ như điều này cho phép ghép nối, nhưng không cho phép kết nối vì thiếu tác nhân. Tôi tin rằng phần tác nhân của tập lệnh này không hoạt động đúng. Khi tôi chạy tập lệnh này, tôi nhận được No agent is registered, có vẻ như default-agentlệnh chạy rất nhanh. Khi tôi nhập các lệnh theo cách thủ công, nó không đưa ra lỗi này, nhưng một khi tôi thoát bluetoothctlnó, nó hủy đăng ký tác nhân và cố gắng kết nối không thành công. Nếu tôi tiếp bluetoothctltục chạy, tôi sẽ nhận được một câu hỏi có nên tin tưởng vào kết nối hay không, điều đó không đúng NoInputNoOutputnhư bạn hy vọng ...
Matthijs Kooijman

Tôi nghi ngờ NoInputNoOutputđây không phải là một chính sách ủy quyền, nhưng một phần của giao thức bluetooth để tìm ra loại cơ chế ủy quyền nào (ví dụ: có thể sử dụng mã pin không?).
Matthijs Kooijman

1
Có thể, nhưng sau đó bạn phải tiếp tục cho ăn có cho tất cả các lần thử ghép nối (và tôi không hoàn toàn chắc chắn nếu điều đó hoạt động từ stdin hoặc có lẽ kịch bản cố gắng thông minh và cố gắng mở thiết bị đầu cuối trực tiếp thay vì stdin (cũng vậy đôi khi xảy ra) ... Mặc dù vậy, tôi đã không thử sử dụng tập lệnh python từ gist.github.com/mill1000/74c7473ee3b4a5b13f6325e9994ff84c
Matthijs Kooijman

0

Tôi chỉ sử dụng một bản cài đặt mới 2016-09-23-raspbian-jessie-lite.imgđể dùng thử mà không cần cập nhật thêm. Không apt-get updatekhông apt-get install bluez-utilshoặc bất cứ điều gì. Lệnh duy nhất này làm cho Pi có thể khám phá và có thể chịu được. Không có tác nhân để kiểm soát ai có thể kết nối, nó chỉ cho phép bất cứ ai:

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
Một câu trả lời chỉ bao gồm mã không rõ ràng lắm, vì vậy vui lòng cung cấp một số giải thích chi tiết hơn về câu trả lời của bạn. Cũng thụt vào khối mã của bạn để làm cho nó xuất hiện như mã; sử dụng 4 dấu cách hoặc một tab, theo sở thích của bạn.

0

Tôi đã phải đối mặt với cùng một vấn đề và thấy phương pháp này có hiệu quả (RasPi 3, Model B, Raspbian 9 Stretch)

Tôi đang sử dụng Raspberry Pi làm Thiết bị IoT EDGE và cần nó để chấp nhận Yêu cầu cặp Bluetooth mà không cần can thiệp. Tôi có Ứng dụng Android truyền thông tin văn bản tới Pi qua Bluetooth và báo cáo sự cố của tôi cần bất kỳ thiết bị Android nào để kết nối.

Thứ nhất, tôi không chạy bất kỳ Đại lý Bluetooth riêng biệt nào (Không có Blueman, vì tôi phải xóa nó)

Đã chỉnh sửa tệp .bashrc tại

    sudo nano /home/pi/.bashrc

Đã thêm hai lệnh này vào cuối

    sudo hciconfig hci0 piscan 
    sudo hciconfig hci0 sspmode 1

piscan làm cho Raspberry Pi Bluetooth có thể khám phá

sspmode 1 cho phép 'Ghép nối đơn giản an toàn', cùng loại phương thức được sử dụng bởi Tai nghe hoặc Loa Bluetooth của bạn (về cơ bản là các thiết bị không có màn hình nơi bạn có thể xác nhận mã PIN). Và vì các lệnh này nằm trong .bashrc nên chúng chạy khi khởi động.

Chạy tập lệnh Bluetooth. Đôi. Mặc dù có một cửa sổ bật lên yêu cầu tôi xác nhận, tôi có thể liên lạc tin nhắn đến và từ Pi bằng ứng dụng của mình

Lưu ý: hci0 có thể không giống nhau trong suốt, có thể là hci1, hci2 vui lòng kiểm tra bằng cách chạy hciconfig trên CLI của bạn

Điều này gần giống như một cỗ máy, và tôi không chắc có bất kỳ hậu quả không xác định nào, nhưng nó hoạt động. Bất kỳ cải tiến đều được đánh giá cao


-1

Bạn có thể xem qua mã nguồn của EcoDroidLink . Nó chấp nhận kết nối Bluetooth mà không cần đăng nhập.

EDIT: Theo nhu cầu phổ biến, đây là đoạn trích mã của edl_agent mô-đun làm cho điều này xảy ra.

# - 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
Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Jacobm001

@ Jacobm001 Tôi đã thêm đoạn trích mã. Bây giờ có tốt hơn không?
Serge Stroobandt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.