Linux上的蓝牙低功耗:实施GATT客户端

时间:2018-01-29 13:52:53

标签: c linux bluetooth-lowenergy gatt

我是Bluetooth Low Energy的新手,我正在尝试在Linux上构建自己的C-Programm,它与蓝牙低功耗设备连接并进行交互。为此,我使用Linux蓝牙协议栈Bluez。

在阅读此博客(https://www.jaredwolff.com/blog/get-started-with-bluetooth-low-energy/)之后,我可以通过命令行与我的设备进行连接和通信。但现在我坚持用我的代码执行此操作。我查看了Gatttool Sourcefiles,但我很难理解......

我尝试使用gatt_conncect连接到设备(const char * src,const char * dst,             const char * dst_type,const char * sec_l​​evel,             int psm,int mtu,BtIOConnect connect_cb,             GError ** gerr),但我觉得我传给函数的参数有问题。

char dst[] = "XX:XX:XX:XX:XX:XX"; //device address
char dst_type = BDADDR_LE_RANDOM;
char sec_level = BT_IO_SEC_LOW;
GError *gerr;
BtIOConnect connect_cb; //Compiler says it´s uninitialized, but I don´t in wich way i have how to initialize it 
GIOhannel *chan;

chan = gatt_connect(NULL, dst, &dst_type, &sec_level, 0, 0, connect_cb, &gerr); 

该功能崩溃。我认为connect_cb functionpointer有问题。但在查看der Gattool源代码后,我不知道如何修复它。

希望你能帮助我!

祝你好运

1 个答案:

答案 0 :(得分:0)

gatt_connect的定义是:

GIOChannel *gatt_connect(const char *src, const char *dst,
            const char *dst_type, const char *sec_level,
            int psm, int mtu, BtIOConnect connect_cb,
            GError **gerr);

connect_cb是回调函数(typedef void(* BtIOConnect)(GIOChannel * io,GError * err,gpointer user_data);)将在连接时调用。因为你有垃圾回调可能就是它崩溃的原因!

以下是我正在使用的回调函数:

static void connect_cb(GIOChannel *io, GError *err, gpointer user_data)
{
    VVBOX_BLE_DEV_t *pdev = (VVBOX_BLE_DEV_t *)user_data;
    uint16_t mtu;
    uint16_t cid;

    if (err) {
        if (reply_to_listner) {
            mq_send_probe_ble_rsp(listener_id, 0, 5, "");
            reply_to_listner = 0;
        }
        printf("%s failed %s",__FUNCTION__, err->message);
        return;
    }

    bt_io_get(io, &err, BT_IO_OPT_IMTU, &mtu,
                BT_IO_OPT_CID, &cid, BT_IO_OPT_INVALID);

    if (err) {
        printf("%s Can't detect MTU, using default: %s", __FUNCTION__, err->message);
        g_error_free(err);
        mtu = ATT_DEFAULT_LE_MTU;
    }

    if (cid == ATT_CID)
        mtu = ATT_DEFAULT_LE_MTU;

    pdev->attrib = g_attrib_new(pdev->iochannel, mtu, false);
    printf("Connection successful\n");

    gatt_discover_primary(pdev->attrib, NULL, primary_all_cb, user_data);
    return;
}