2017-02-09 29 views
19

Tôi muốn sử dụng bất kỳ điện thoại di động nào để kết nối với thiết bị IoT qua Bluetooth Classic bằng giao thức cổng nối tiếp (SPP). Thiết bị IoT không có màn hình và không có bàn phím và nó phải chấp nhận kết nối tự động miễn là điện thoại kết nối biết mã PIN bí mật (nghĩa là tôi không muốn bị ssh vào thiết bị IoT để thiết lập ghép nối mọi lúc điện thoại di động mới cố gắng kết nối).Thiết lập ghép nối tự động Bluetooth trên Linux

Đây là những lệnh mà chúng tôi đã chạy rất xa trên thiết bị IOT:

# Make the device discoverable: 
hciconfig hci0 piscan 

# Register SPP: 
sdptool add --channel=22 SP 

# Start rfcomm: 
rfcomm -r watch /dev/rfcomm0 22 

Thật không may, tôi không thể tìm thấy bất cứ cách nào để thiết lập một mã PIN, và ghép nối thất bại khi cố gắng kết nối với điện thoại di động. Ngoài ra, thiết bị chỉ có thể phát hiện được trong một khoảng thời gian ngắn.

Làm cách nào để định cấu hình ngăn xếp Bluetooth của thiết bị IoT (chạy Bluez gần đây) để ghép nối tự động với bất kỳ điện thoại nào biết mã PIN đã cho và cách tôi thực hiện giai đoạn khám phá vĩnh cửu?

+0

Bạn có thể tận dụng các "bluetoothctl" tiện ích mà tàu với thư viện bluez . Bạn cần bật tác nhân để xác thực. Khi hệ thống của bạn không có đầu, sử dụng có thể sử dụng "NoInputNoOutput". Điều này tránh sự tương tác của passkey để xác thực (bluetoothctl agen NoInputNoOutput). Nhưng nếu bạn muốn chấp nhận tất cả kết nối, hãy sử dụng giao diện Dbus "org.bluez.AgentManager1" để đăng ký tác nhân của riêng bạn với phương thức tối thiểu "RequestAuthorization" được triển khai trong "org.bluez.Agent1" –

+0

Nhưng nếu tôi bắt đầu bluetoothctl và đặt " đại lý NoInputNoOutput ", nó vẫn sẽ hỏi tôi có chấp nhận kết nối hay không. Bạn đang nói với tôi nó có một hành vi khác nhau nếu nó được thiết lập trong chế độ hàng loạt? Đối với việc tạo ra thực hiện của riêng tôi của AgentManager1, nó có vẻ giống như một sự tái tạo của bánh xe. Bluez không giao tàu với người quản lý đại lý sao? –

+0

Có, nó vẫn yêu cầu xác nhận (có/không). Nhưng bạn có thể trả lời nó là "Có" bằng cách viết tác nhân đơn giản của riêng bạn bằng cách sử dụng giao diện Agent1. Có, BlueZ cung cấp trình quản lý tác nhân với "DisplayOnly", "DisplayYesNo", "KeyboardOnly", "NoInputNoOutput" và "KeyboardDisplay" các khả năng này. Khi bạn cần trường hợp đặc biệt để chấp nhận mà không có bất kỳ sự can thiệp nào, bạn có thể đạt được nó với Agent1 của riêng bạn gửi "Có" –

Trả lời

0

Bạn có thể chạy ứng dụng triển khai API BlueZ DBus. Tôi đề xuất BlueZ> = 5,42. Sử dụng giao diện đại lý và triển khai mã PIN của riêng bạn. Sau khi đăng ký tác nhân của bạn, bluez sẽ tự động gọi và sử dụng tác nhân của bạn khi ghép nối được hỏi.

Hơn nữa, bạn có thể đặt DiscoverableTimeout thành 0 đến DBus bằng giao diện org.bluez.Adapter1.

"Giá trị bằng không có nghĩa là thời gian chờ bị tắt và sẽ ở lại trong chế độ có thể phát hiện/giới hạn mãi mãi ở chế độ có thể phát hiện/giới hạn" .

https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/adapter-api.txt (dbus đối tượng bộ chuyển đổi doc) https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/agent-api.txt (dbus đối tượng đại lý doc) https://kernel.googlesource.com/pub/scm/bluetooth/bluez/+/5.44/test/simple-agent (mẫu) http://www.bluez.org/bluez-5-api-introduction-and-porting-guide/ (đọc ở phía dưới)

Các vấn đề liên quan