使用bluez gatt api编译代码

时间:2015-07-28 09:42:05

标签: c linux compilation bluetooth-lowenergy bluez

我目前正在使用来自C中GATT的{​​{1}} api实施 BLE 服务器。我需要使用自己的自定义服务。

问题是bluez5没有安装bluez5 api的所有标头。 GATT中的同一问题并未提供所有外部libbluetooth api。

我使用了错误的api吗?编译代码的技巧是什么? 目前的脏解决方案是使用我自己的代码替换GATT源工具目录中的btgatt-server.c,以便能够bluez我的实现。

编辑: 我使用的是dev/test的最后一个稳定版本:bluez

来自5.32

标头我需要编译我的代码:

bluez

功能:

#include "lib/bluetooth.h"
#include "lib/hci.h"
#include "lib/hci_lib.h"
#include "lib/l2cap.h"
#include "lib/uuid.h"

#include "src/shared/mainloop.h"
#include "src/shared/util.h"
#include "src/shared/att.h"
#include "src/shared/queue.h"
#include "src/shared/timeout.h"
#include "src/shared/gatt-db.h"
#include "src/shared/gatt-server.h"

这些包含不是由我的系统上的[arthur ] make 2>&1 | grep gatt_ | grep implicit tools/btgatt-server.c:32:2: error: implicit declaration of function ‘gatt_db_attribute_read_result’ [-Werror=implicit-function-declaration] tools/btgatt-server.c:60:2: error: implicit declaration of function ‘gatt_db_add_service’ [-Werror=implicit-function-declaration] tools/btgatt-server.c:67:2: error: implicit declaration of function ‘gatt_db_service_add_characteristic’ [-Werror=implicit-function-declaration] tools/btgatt-server.c:94:2: error: implicit declaration of function ‘gatt_db_service_set_active’ [-Werror=implicit-function-declaration] tools/btgatt-server.c:110:2: error: implicit declaration of function ‘bt_gatt_server_unref’ [-Werror=implicit-function-declaration] tools/btgatt-server.c:111:2: error: implicit declaration of function ‘gatt_db_unref’ [-Werror=implicit-function-declaration] tools/btgatt-server.c:186:2: error: implicit declaration of function ‘gatt_db_new’ [-Werror=implicit-function-declaration] tools/btgatt-server.c:192:2: error: implicit declaration of function ‘bt_gatt_server_new’ [-Werror=implicit-function-declaration] tools/btgatt-server.c:202:2: error: implicit declaration of function ‘bt_gatt_server_set_debug’ [-Werror=implicit-function-declaration] 的Makefile安装的。并且库文件不包括我需要的功能。

1 个答案:

答案 0 :(得分:1)

我稍后可能会使用dbus API。但是现在我总是使用来自bluez5的低c API(来自bluez5的示例路径:bluez5_utils-5.31 / tools / btgatt-server.c)。要在bluez5源目录之外编译这个独立代码,我使用的是bluez5中的一些include / library:

  • libshared-mainloop.a
  • libbluetooth-internal.a

在我的情况下,我正在使用buildroot。所以我在bluez5 mk文件中添加了一些代码来获取这个丢失的库:

define BLUEZ5_UTILS_EXTERNALIZE_GATT
    mkdir -p $(STAGING_DIR)/usr/local/bluez5/gatt
    cp $(BLUEZ5_UTILS_SRCDIR)/src/uuid-helper.o $(STAGING_DIR)/usr/local/bluez5/gatt/.
    cp $(BLUEZ5_UTILS_SRCDIR)/src/.libs/libshared-mainloop.a $(STAGING_DIR)/usr/local/bluez5/gatt/.
    cp $(BLUEZ5_UTILS_SRCDIR)/lib/.libs/libbluetooth-internal.a $(STAGING_DIR)/usr/local/bluez5/gatt/.

    $(INSTALL) -D -m 0755 $(@D)/tools/btmgmt $(STAGING_DIR)/usr/bin/btmgmt
    $(INSTALL) -D -m 0755 $(@D)/tools/btmgmt $(TARGET_DIR)/usr/bin/btmgmt
endef

然后在我的Makefile中我只需要链接这些库+ add -I来查找bluez5源目录中缺少的头文件:

# find bluez5 header
HEADER += -I$(BLUEZ_PATH)

# link bluez5 libraries
BLUEZ5_LIB = $(STAGING_DIR)/usr/local/bluez5/gatt/libshared-mainloop.a BLUEZ5_LIB += $(STAGING_DIR)/usr/local/bluez5/gatt/libbluetooth-internal.a

无论如何,这可能不是最好的方法,但它工作得很好。此外you don't need to do anything if you upgrade your bluez5 version。我找到了一些其他解决方案,比如fork bluez5,并在Makefile中进行了一些修改,以构建一个包含我需要的所有东西的静态库。但是这个解决方案非常痛苦,你需要在每个新的bluez5版本中更新你的工作。