2016-12-31 20 views
11

Tôi đang viết trình điều khiển bluetooth cho Intel Edison. Phần mềm Board mới nhất có sẵn và tôi đang phát triển bằng cách sử dụng IDE dựa trên Eclipse. Số phiên bản Bluez trong phiên bản edison này là 5,37.Làm cách nào để sử dụng API Bluez5 DBUS trong C++ để ghép nối và kết nối các thiết bị mới?

Tôi thiết kế một hệ thống trong đó có để đáp ứng các yêu cầu sau:

  • Scan cho các thiết bị bluetooth xung quanh. [X]
  • Phát hiện thiết bị cảm biến dựa trên tên và địa chỉ MAC. [X]
  • Ghép nối và tự động kết nối các thiết bị cảm biến. []

Mục cuối cùng là vấn đề vì tôi có thể phát hiện thiết bị cảm biến nhưng tôi không thể ghép nối chúng bằng giao diện bluez5. Cho đến nay tôi đã cố gắng sử dụng giao diện D-BUS nhưng nó không hoạt động vì tôi tiếp tục nhận được thông báo lỗi sau:

Phương thức "FindAdapter" với chữ ký "s" trên giao diện "org.bluez.Manager" không tồn tại

Mã được trình bày ở đây. Xin lưu ý:

  • DBusConnection * conn -> DBUS_BUS_SYSTEM
  • const char * adapter -> "hci0".

Code:

DBusMessage *msg, *reply; 
DBusError err; 
const char *reply_path; 
char *path; 

msg = dbus_message_new_method_call("org.bluez", "/","org.bluez.Manager", "FindAdapter"); 
dbus_message_append_args(msg, DBUS_TYPE_STRING, &adapter,DBUS_TYPE_INVALID); 
dbus_error_init(&err); 
reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err); 
dbus_message_unref(msg); 

Bất kỳ ý tưởng?

+0

Bạn có thể sử dụng một số API cấp cao hơn, ví dụ Qt5 có mô-đun Bluetooth ngay bây giờ (cũng sử dụng bluez dưới mui xe). Có lẽ điều đó có thể đơn giản hơn để sử dụng. – Venemo

Trả lời

3

Để cung cấp cho bạn anwser, Ghép nối và Kết nối được liên kết với device-api.txt. Để gọi các phương pháp này bạn có thể gửi tin nhắn dbus (như bạn đã làm trong mã trình bày ở trên) hoặc xây dựng một đối tượng Proxy với các thông số sau (tìm thấy trong tài liệu):

tên: "org.bluez"

giao diện "org.bluez.Device1"

đường dẫn: "/ org/bluez/dev_AA_BB_CC_DD_EE" trong đó AA_BB_CC_DD_EE là địa chỉ mac thiết bị của bạn.

Nếu bạn chọn tạo đối tượng proxy, bạn có thể gọi các phương thức như Ghép hoặc Kết nối thông qua proxy.


Bạn có thể giải thích những gì bạn đang cố gắng đạt được trong mã ở trên không? Tôi hiểu rằng bạn muốn tìm bộ điều hợp để sử dụng (tôi thấy phương pháp "FindAdapter") tuy nhiên có vẻ như bạn đã biết rằng tên bộ điều hợp của bạn là "hci0".


Tôi đã làm việc với API DBus do Bluez tiếp xúc gần đây và tôi không quen với giao diện "org.bluez.Manager".

Sau một tìm kiếm nhanh trong tài liệu chính thức (https://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc) tôi đã có thể tìm ra sau cam kết xác định rằng giao diện đã bị bỏ vào năm 2012: https://git.kernel.org/cgit/bluetooth/bluez.git/commit/doc?id=86a7b07c22f3a595ba3c48092359287905bf0878

Tôi cũng nhận thấy bạn đang sử dụng dbus ở mức độ thấp API, theo lời khuyên của freedesktop (đọc ở cuối trang ở đây: https://dbus.freedesktop.org/doc/api/html/group__DBus.html), đây là API rất phức tạp, hữu ích để tạo các ràng buộc bằng các ngôn ngữ khác. Nếu bạn có thể, chuyển sang GLib GDBus cho một API đơn giản hơn nhiều.

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