我目前正在使用来自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安装的。并且库文件不包括我需要的功能。
答案 0 :(得分:1)
我稍后可能会使用dbus
API。但是现在我总是使用来自bluez5
的低c API(来自bluez5的示例路径:bluez5_utils-5.31 / tools / btgatt-server.c)。要在bluez5源目录之外编译这个独立代码,我使用的是bluez5中的一些include / library:
在我的情况下,我正在使用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版本中更新你的工作。