我是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_level, 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源代码后,我不知道如何修复它。
希望你能帮助我!
祝你好运
答案 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;
}