Linux上的C blueZ蓝牙配对

oki*_*pol 11 c linux bluetooth bluez

我找不到任何关于如何在Linux上使用BlueZ蓝牙库在用C编写的程序中配对蓝牙设备的参考.我已经设法进行HCI级别查询以获取设备及其RSSI级别(在设备发现期间),但目前我仍然坚持这一点.我看到了使用DBUS api for blueZ-simple-agent的建议 - 但是有什么方法可以避免这种情况并且只使用BlueZ的一些C级方法吗?

小智 6

身份验证代码来自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);
}
Run Code Online (Sandbox Code Playgroud)

并设置 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);
}
Run Code Online (Sandbox Code Playgroud)


pro*_*ogo 5

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

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

不幸的是,对我来说它不起作用,我不明白为什么。但也许你在这方面取得了更大的成功。这是您可以测试它的方法。

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

然后在终端中运行以下命令:

./configure --prefix=/usr    \
        --sysconfdir=/etc    \
        --localstatedir=/var \
        --enable-tools       \
        --disable-test       \
        --disable-systemd
Run Code Online (Sandbox Code Playgroud)

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

make
Run Code Online (Sandbox Code Playgroud)

现在您可以从终端切换到工具文件夹并键入 ./btmgmt 以查看如何使用它。无论您身在何处,您都可以通过键入“btmgmt”来安装它以使用它。

sudo /usr/bin/install -c tools/btmgmt /usr/bin/btmgmt
Run Code Online (Sandbox Code Playgroud)

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