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


14

Tôi đang tìm cách phát triển một nền tảng cho chiếc xe của mình, nó tự động kết nối bất kỳ thiết bị nào cố gắng kết nối với Pi thông qua bluetooth. Hiện tại nó yêu cầu sự chấp nhận ghép đôi của Pi nhưng trong trường hợp này sẽ không có màn hình nên nó sẽ cần phải tự động làm điều đó. Làm thế nào tôi có thể thực hiện điều này?


bạn có thể giải thích chi tiết về mẫu pi nào mà bạn có không, vì chỉ có pi 3 là carib; e của bluetooth mà không cần phần cứng bên ngoài?
Mohammad Ali

Raspberry Pi 3 Model B - Được tích hợp trong bluetooth
Oliver Kuchies

Vì vậy, tất cả những gì bạn mong đợi là Pi sẽ liên tục phát sóng và chấp nhận bất kỳ kết nối ghép nối nào được thực hiện bởi điện thoại của bạn? Bạn có hiểu ý nghĩa bảo mật? đúng? Và cũng đang viết một kịch bản Python nhỏ để thực hiện công việc là một giải pháp chấp nhận được?
Mohammad Ali

Đúng nhưng để làm cho nó an toàn hơn, tôi khuyên bạn nên chỉ ra cách giới hạn một kết nối trước khi khám phá lại. Ngoài ra, vui lòng thêm ý nghĩa bảo mật để trả lời để giúp đỡ người khác :)
Oliver Kuchies

Câu trả lời:


12

( Lưu ý rằng câu trả lời này không còn hoạt động như của Raspbian Jessie, vì bluez đã loại bỏ lệnh đại lý bluetooth )

Vì vậy, hiện tại bạn nói rằng bạn có thể kết nối với Pi tốt, nhưng yêu cầu màn hình cho quá trình ghép nối.

Lưu ý: chấp nhận bất kỳ kết nối nào là một ý tưởng không an toàn và nếu bạn chỉ sử dụng một bộ thiết bị giới hạn, thiết lập chúng là thiết bị đáng tin cậy sẽ có ý nghĩa hơn nhiều vì nó sẽ giới hạn kết nối với địa chỉ Mac của bạn nhưng không cho phép mới các thiết bị được thêm vào mà không có màn hình

Nhưng dù sao, các lệnh mà bạn sẽ cần phải chạy để chấp nhận tất cả các kết nối được thực hiện với Pi, để làm cho nó có thể phát hiện được và để đặt mã pin có thể dự đoán được liệt kê bên dưới:

Lưu ý: bạn có thể cần thay đổi số 0 hci0 thành số Bluetooth của thiết bị.

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

Bây giờ sau khi chạy các lệnh này và xem chúng có hoạt động như mong đợi không, chúng ta có thể chuyển sang thiết lập chúng để bắt đầu khởi động Pi của bạn.

  1. Chúng tôi bắt đầu bằng cách tạo một tệp bash bằng cách chạy lệnh sudo nano mohammadIsAmazing.sh
  2. Bây giờ chúng ta nhập thông tin sau vào tập tin đó:

    #!/bin/sh
    sleep 20
    hciconfig hci0 up
    hciconfig hci0 sspmode 1
    hciconfig hci0 piscan
    sudo bluetooth-agent 1234
    
  3. Bây giờ chúng tôi lưu và đóng tệp của chúng tôi bằng cách sử dụng control key and x

  4. Chúng tôi mở tệp /etc/rc.localbằng lệnh sau:

    Sudo nano /etc/rc.local
    
  5. Bây giờ chúng ta nhập lệnh để chạy tập lệnh bash của chúng ta vào /etc/rc.local

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

    Lưu ý: bạn phải đặt lệnh trước dòng cuối cùng trong /etc/rc.local có chứa: exit 0

  6. Bây giờ chúng ta lưu và đóng tệp đó, sau đó khởi động lại Pi.

Lưu ý phụ: hãy chắc chắn chọn một mã pin ngẫu nhiên để tăng cường bảo mật

Mặt khác, nếu bạn muốn thay đổi tên thiết bị bluetooth, bạn cần tạo một tệp /etc/machine-infocó tên như sau:

PRETTY_HOSTNAME=device-name

Sau đó chạy service bluetooth restartsau đó


2
Hãy nhớ rằng &ở cuối dòng trong rc.localtệp - nếu không có nó, RPi có thể không hoàn thành việc khởi động vì shell chờ kịch bản của bạn /path/to/script/mohammadIsAmazing.shhoàn tất thực thi trước khi tiếp tục - và nếu nó không hoàn thành việc khởi động, bạn sẽ không thể sshvào để sửa chữa mọi thứ ...!
SlySven

Xin chào Mohammad. sudo bluetooth-agent là một lệnh không được công nhận
Oliver Kuchies

@OliverKuchies hãy thử chạy apt-get install bluetooth blueztrước và cho tôi biết nếu điều đó làm việc cho bạn.
Mohammad Ali

Tôi đã thử chạy bluetooth-agentvà không thể tìm thấy nó là tốt. Cài đặt các gói đã không sửa nó.
Gilad Naaman

@GiladNaaman tốt gì os, bạn đang sử dụng?
Mohammad Ali

0

Dựa trên những gì tôi hiểu những gì bạn yêu cầu là một mô-đun bluetooth nô lệ. Bạn có thể sử dụng Mô-đun HC-06 phổ biến và kết nối nó với raspberry pi thông qua bộ dịch mức cho các chân TX và RX trên Pi và sử dụng tập lệnh python để đọc dữ liệu nối tiếp và xử lý theo yêu cầu


Tôi cho rằng sẽ có một mô-đun python có thể chạy ngay khi thiết bị bluetooth kết nối thay vì kết nối phần cứng? Tôi không quá tồi tệ với pi, vẫn là người mới bắt đầu nhưng có vẻ như đó sẽ là một cách tiếp cận hợp lý
Oliver Kuchies

@OliverKuchies Tôi chưa bao giờ thực hiện bất kỳ chương trình bluetooth (hoặc sử dụng nào!) Trên linux nhưng bạn đang tìm kiếm một loại dịch vụ daemon nào đó sẽ đáp ứng những điều đó. Để giải thích: một mô-đun python sẽ không tự chạy, nó phải được sử dụng bởi một quy trình đã chạy. Đó là một daemon. Tìm kiếm "bluetooth linux daemon" sẽ xuất hiện một số thứ. Tôi nghĩ rằng tôi đã nhận thấy systemdcó một, bạn có lẽ phải cấu hình nó để hành xử theo những cách cụ thể.
goldilocks


0

Tôi sẽ không thảo luận về ý nghĩa bảo mật hay không nhưng đây là cách tôi thực hiện:

  1. Tạo một tập lệnh có tên auto_connect.sh với nội dung sau:
#!/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. Tạo tệp /path/to/python_script.py với nội dung sau:
#!/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. Tùy thuộc vào hệ điều hành bạn đang sử dụng, hãy đảm bảo bạn chạy auto_connect.sh khi khởi động.

Tất cả những điều này làm gì:

  1. Đặt thiết bị luôn luôn có thể khám phá.

  2. Khi một thiết bị ghép với nó, nó sẽ tự động đánh dấu nó vào thiết bị đáng tin cậy và kết nối với nó.

  3. Trên mỗi lần khởi động, nó sẽ lưu thông qua danh sách các thiết bị đã biết và sẽ cố gắng kết nối với chúng.

Xin lưu ý rằng phương pháp này trực tiếp chống lại bất kỳ loại bảo mật nào, nhưng có thể có trường hợp người dùng khi bạn muốn đạt được điều đó.


-1

Trong Raspberry Pi3 Model B có một lỗ hổng trong bluetooth và wifi. Sử dụng máy chủ OBEX, bạn có thể nhận các tệp từ các thiết bị khác mà không cần hỏi về yêu cầu ghép nối mỗi lần. Bạn phải thực hiện ghép nối lần đầu tiên với thiết bị đó và tạo một thư mục, trong đó các tệp nhận được mọi lúc.

Chỉ cần làm theo các bước của liên kết dưới đây.

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


1
Bạn đã đọc câu hỏi chưa? OP đặc biệt hỏi làm thế nào để tránh ghép nối thủ công vì sẽ không có màn hình và bạn có đề nghị anh ta nên ghép nối không?
Dmitry Grigoryev

Bạn phải thực hiện ghép nối chỉ một lần trong lần này để lần đầu tiên bạn có thể kết nối với màn hình để ghép nối.
Mihit Gandhi

Bạn chỉ phải làm điều đó một lần cho mỗi thiết bị . Và nếu bất cứ ai mới muốn sử dụng nó, điều đó có nghĩa là đào nó từ bất cứ nơi nào và nối nó với màn hình và bàn phím, đó là lý do tại sao anh ta tìm cách để tránh điều đó.
Khác nhau
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.