在Linux的C blueZ上进行蓝牙配对

在使用BlueZ蓝牙库编写的程序中,我找不到任何有关如何在Linux上配对蓝牙设备的参考。 我已经设法做一个HCI级别的查询,以获得设备连同RSSI水平(在设备发现期间),但目前我坚持这一点。 我看到一个build议,使用DBUS api的blueZ-simple-agent – 但有什么办法可以避免这种情况,只是使用一些C级的方法从BlueZ?

我在这里找到的一本很酷的书帮助了我: http : //people.csail.mit.edu/rudolph/Teaching/Articles/BTBook.pdf

它有c和python中的设置,配对等的例子。我想尝试用它来启动ipad上的bluetooth classic(spp)连接,但不认为内核有我需要的东西。

来自hcitool验证码(原始源代码可以在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); } 

并设置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); } 

您可以在这里下载最新版本的源代码: http : //www.bluez.org/有工具“btmgmt”,也可以用于配对的bluez-simple-agent。 代码全部在源代码中,还有一些文档(在文档文件夹中)。 也许你可以使用这些工具之一的代码来满足你的愿望,或者它可以帮助你理解配对。

我想首先将2个设备与bluez蓝牙库配对,但是我发现在bluez-tools的源代码中找到有用的代码。 有文件“btmgmt.c”和其中包含的实现配对的文件。

对我来说,不幸的是它不工作,我不明白为什么。 但也许你有更多的成功。 这里是你如何测试它。

如果您尚未下载,请在此处下载最新版本的源代码: http : //www.bluez.org/解压并在bluez文件夹中打开一个终端。

然后在终端中运行以下内容:

 ./configure --prefix=/usr \ --sysconfdir=/etc \ --localstatedir=/var \ --enable-tools \ --disable-test \ --disable-systemd 

我不记得你需要安装的所有软件包,但是你可以运行这个命令,并检查它为什么失败,然后安装软件包并重新运行,直到它工作。 如果您不知道您需要安装哪个软件包,请询问Google。 之后:

 make 

现在,您可以从终端切换到工具文件夹,然后键入./btmgmt以查看如何使用它。 你也可以安装它,只要输入“btmgmt”就可以使用它,不管你的位置在哪里。

 sudo /usr/bin/install -c tools/btmgmt /usr/bin/btmgmt 

您需要使用sudo权限才能使用它。

这个dbus命令可以用来启动配对

  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" 

这里1301是bluetoothd的进程号

/ org / bluez / agent_1317是蓝牙配对代理。在bluez / test中作为agent.c来的bluezagent可以用于此目的。