Tôi không thể tìm thấy bất kỳ tham chiếu nào về cách ghép nối thiết bị bluetooth trên linux trong chương trình được viết bằng C sử dụng thư viện Bluetooth BlueZ. Tôi đã quản lý để làm một truy vấn cấp HCI để có được các thiết bị cùng với mức RSSI của họ (trong khi phát hiện thiết bị) nhưng hiện tại tôi đang mắc kẹt với điều này. Tôi thấy một đề nghị để sử dụng api DBUS cho blueZ-đơn giản-đại lý - nhưng có cách nào để tránh điều này và chỉ cần sử dụng một số phương pháp cấp C từ BlueZ?Ghép nối Bluetooth trong C blueZ trên Linux
Trả lời
Một cuốn sách thực sự mát mẻ mà tôi tìm thấy ở đây đã giúp tôi trong lĩnh vực này: http://people.csail.mit.edu/rudolph/Teaching/Articles/BTBook.pdf
Nó có ví dụ trong c và trăn lập, ghép nối vv Tôi muốn thử và sử dụng nó để bắt đầu một cổ điển bluetooth (spp) kết nối trên ipad nhưng không nghĩ hạt nhân có những thứ mà tôi cần.
Bạn có thể tải xuống phiên bản mới nhất của mã nguồn tại đây: http://www.bluez.org/ Có công cụ "btmgmt" và tác nhân đơn giản bluez có thể được sử dụng để ghép nối. Mã là tất cả trong các nguồn và cũng có một số tài liệu (trong thư mục tài liệu). Có lẽ bạn có thể sử dụng mã của một trong những công cụ này cho mong muốn của bạn hoặc có thể nó giúp bạn hiểu được việc ghép nối.
Tôi muốn ghép nối 2 thiết bị với thư viện bluetooth bluez ở vị trí đầu tiên nhưng tôi rất vui khi tìm mã hữu ích trong nguồn cho các công cụ bluez. Có tệp "btmgmt.c" và một số tệp được bao gồm trong tệp thực hiện ghép nối.
Đối với tôi không may là nó không hoạt động và tôi không thể hiểu tại sao. Nhưng có thể bạn đã thành công hơn với nó. Đây là cách bạn có thể kiểm tra nó.
Nếu bạn chưa tải xuống, hãy tải xuống phiên bản mới nhất của mã nguồn tại đây: http://www.bluez.org/ Trích xuất và mở một thiết bị đầu cuối trong thư mục bluez.
Sau đó chạy lệnh sau trong terminal:
./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--enable-tools \
--disable-test \
--disable-systemd
Tôi không nhớ tất cả các gói bạn cần phải cài đặt nhưng bạn có thể chạy lệnh này và kiểm tra lý do tại sao nó không thành công, sau đó cài đặt gói và chạy lại nó cho đến khi nó hoạt động. Hỏi google nếu bạn không biết bạn cần cài đặt gói nào. Sau đó:
make
Bây giờ bạn có thể chuyển vào thư mục công cụ từ terminal và gõ ./btmgmt để xem làm thế nào để sử dụng nó. Bạn cũng có thể sử dụng nó để có thể sử dụng nó bằng cách chỉ cần gõ "btmgmt" bất kể vị trí của bạn.
sudo /usr/bin/install -c tools/btmgmt /usr/bin/btmgmt
Bạn cần quyền sudo để sử dụng.
Mã xác thực từ hcitool
(mã nguồn gốc có thể nhìn thấy ở http://git.kernel.org/cgit/bluetooth/bluez.git/tree/tools/hcitool.c)
/* Request authentication */
static void cmd_auth(int dev_id, int argc, char **argv)
{
struct hci_conn_info_req *cr;
bdaddr_t bdaddr;
int opt, dd;
for_each_opt(opt, auth_options, NULL) {
switch (opt) {
default:
printf("%s", auth_help);
return;
}
}
helper_arg(1, 1, &argc, &argv, auth_help);
str2ba(argv[0], &bdaddr);
if (dev_id < 0) {
dev_id = hci_for_each_dev(HCI_UP, find_conn, (long) &bdaddr);
if (dev_id < 0) {
fprintf(stderr, "Not connected.\n");
exit(1);
}
}
dd = hci_open_dev(dev_id);
if (dd < 0) {
perror("HCI device open failed");
exit(1);
}
cr = malloc(sizeof(*cr) + sizeof(struct hci_conn_info));
if (!cr) {
perror("Can't allocate memory");
exit(1);
}
bacpy(&cr->bdaddr, &bdaddr);
cr->type = ACL_LINK;
if (ioctl(dd, HCIGETCONNINFO, (unsigned long) cr) < 0) {
perror("Get connection info failed");
exit(1);
}
if (hci_authenticate_link(dd, htobs(cr->conn_info->handle), 25000) < 0) {
perror("HCI authentication request failed");
exit(1);
}
free(cr);
hci_close_dev(dd);
}
Và thiết lập mã PIN
/* Activate encryption */
static void cmd_enc(int dev_id, int argc, char **argv)
{
struct hci_conn_info_req *cr;
bdaddr_t bdaddr;
uint8_t encrypt;
int opt, dd;
for_each_opt(opt, enc_options, NULL) {
switch (opt) {
default:
printf("%s", enc_help);
return;
}
}
helper_arg(1, 2, &argc, &argv, enc_help);
str2ba(argv[0], &bdaddr);
if (dev_id < 0) {
dev_id = hci_for_each_dev(HCI_UP, find_conn, (long) &bdaddr);
if (dev_id < 0) {
fprintf(stderr, "Not connected.\n");
exit(1);
}
}
dd = hci_open_dev(dev_id);
if (dd < 0) {
perror("HCI device open failed");
exit(1);
}
cr = malloc(sizeof(*cr) + sizeof(struct hci_conn_info));
if (!cr) {
perror("Can't allocate memory");
exit(1);
}
bacpy(&cr->bdaddr, &bdaddr);
cr->type = ACL_LINK;
if (ioctl(dd, HCIGETCONNINFO, (unsigned long) cr) < 0) {
perror("Get connection info failed");
exit(1);
}
encrypt = (argc > 1) ? atoi(argv[1]) : 1;
if (hci_encrypt_link(dd, htobs(cr->conn_info->handle), encrypt, 25000) < 0) {
perror("HCI set encryption request failed");
exit(1);
}
free(cr);
hci_close_dev(dd);
}
lệnh dbus Điều này có thể được sử dụng để bắt đầu cặp
dbus-send --system --print-reply --dest=org.bluez /org/bluez/1301/hci0 org.bluez.Adapter.CreatePairedDevice string:"XX:XX:XX:XX:XX:XX" objpath:/org/bluez/agent_1317 string:"NoInputNoOutput"
Ở đây 1301 là id quá trình của bluetoothd
/org/bluez/agent_1317 là đại lý ghép nối bluetooth. Bluezagent có dạng agent.c trong bluez/test có thể được sử dụng cho mục đích này.
sử dụng bluetoothctl, có sẵn từ Bluez5 trở đi, trong đó chỉ cần tạo đại lý trên – ashish
Đã trả lời một câu hỏi tương tự tại đây: http://stackoverflow.com/questions/29767053/bluez-programming/ Nó có thể giúp bạn! – Zimano