C 中的低功耗蓝牙 - 使用 Bluez 创建 GATT 服务器

Bluetooth Low Energy in C - using Bluez to create a GATT server

我正在尝试在我的 Linux 盒子上使用 GATT 来设置具有大量特性的自定义服务。

使用 this question 和它 link 的代码,我能够确定我需要编写的代码(利用 gatt_service_add() 函数)。

我创建了一个名为 gatt_service.c 的单独文件,并编写了我认为需要的代码。但是,我不知道如何 link 我的代码到 Bluez 库以便编译和 运行 我的解决方案。例如 this site(虽然不是用于 BLE 开发)links 反对使用 -lbluetooth 作为 gcc 参数的 libbluetooth,我不知道 link 反对什么使我的代码工作。

我还没有 post 编辑任何样本,因为我不确定要 post - 如果有任何需要的,或者我没有提到什么,请让我知道。

提前致谢。

编辑 - 更多信息:

根据评论,我使用 plugins/time 作为基础为我自己的 "Broadcaster service" 编写了我自己的文件。完整代码位于:here(我不知道答案中应该放哪一段代码!)。

我的编译命令是:gcc gatt_broadcaster_service.c -Wall -o gatt_broadcaster_service -lbluetooth 'pkg-config --cflags --libs glib-2.0' -I/home/alexander/Documents/bluez-5.29/lib(包括 glib 位以修复报告的问题 here)。

我得到的错误是:gatt_broadcaster_service.c:11:27: fatal error: lib/bluetooth.h: No such file or directory #include "lib/bluetooth.h"

我的 C 文件存储在 Documents 中,我的研究告诉我它找不到 lib/bluetooth.h,因为它没有在正确的位置查找(this and this 谈论使用包含标志当文件不在一般位置时用于编译器,但我无法使其工作。

再次感谢!

1) 转到 Bluez 文件夹

2) sudo ./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc --localstatedir=/var --disable-systemd --enable-experimental --启用维护者模式

3) sudo make all

4) 通告可连接数据包

激活蓝牙

sudo hciconfig hci0 up

设置广告数据:"hello world"

sudo hcitool -i hci0 cmd 0x08 0x0008 48 45 4c 4c 4f 57 4f 52 4c 44

开始作为可连接的广告

sudo hciconfig hci0 leadv 0

5) sudo 服务蓝牙停止

6) sudo src/bluetoothd -d -n

7) 在其他 PC 上,输入 (Change MAC id gatt server mac)

gatttool -b gatt_server_mac --interactive

步骤 6 用于编译 plugins/gatt-example.c

如果你想从profile/timeprofle/alert编译server.c(替换为代替时间提醒)或配置文件文件夹中的任何其他文件替换步骤 6

sudo src/bluetoothd --plugin=time -n

ya 创建一个时间服务器是很好的开始。profile/time 有很好的自定义示例,清理代码并尝试维护最少的代码和 运行 与 gatttool 作为 client.If 你想要自定义客户端和自定义服务器比你看到的 tools/btgatt-client.ctools/btgatt-server.c

运行 tools/btgatt-server.c 在一台电脑中 sudo ./btgatt-server 在一台电脑中

sudo ./btgatt-client -d server_mac 在另一台电脑

我得到了用于 BlueZ 5.31 的示例 GATT 服务器 运行ning(最新 post):

我的环境:
流浪者
虚拟盒子
Ubuntu 作为客人的 Trusty Tahr OS(v. 14.04 32 位 OS)
已更新至 linux 内核 3.19
安装的软件包:
* libglib2.0-dev
* libdbus-1-dev
* libudev-dev
* libical-dev
* libreadline-dev

已从此处下载 BlueZ 5.31:https://www.kernel.org/pub/linux/bluetooth/bluez-5.31.tar.xz
安装更新内核 (v. 3.19):
sudo apt-get 更新
sudo apt-get install --install-recommends linux-generic-lts-vivid

需要重新启动。我正在使用 Vagrant 并丢失了共享文件夹访问权限。如果您遇到这种情况,请等待 vagrant 报告错误并进入 VM(vagrant ssh)。在 VM 中,发出此命令以修复共享文件夹问题:
sudo /etc/init.d/vboxadd 设置

我会再次重启(可能没有必要),以检查共享文件夹是否再次处于活动状态。
回到虚拟机后,继续安装 BlueZ 5.31:
cd ~
sudo apt-get install libglib2.0-dev libdbus-1-dev libudev-dev libical-dev libreadline-dev
wget https://www.kernel.org/pub/linux/bluetooth/bluez-5.31.tar.xz
tar xvf bluez-5.31.tar.xz
cd bluez-5.31
./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc --localstatedir=/var --disable-systemd --enable-experimental --enable-maintainer-mode
制作
须藤安装
sudo cp attrib/gatttool /usr/bin

安装完成。检查如下:
hciconfig
您应该得到以下响应(或类似的响应):
hci0: 类型:BR/EDR 总线:USB
BD地址:00:1A:7D:DA:71:0C ACL MTU:310:10 SCO MTU:64:8
向下
RX bytes:15528 acl:126 sco:0 events:683 errors:0
TX bytes:6459 acl:146 sco:0 commands:234 errors:0

配置蓝牙适配器,start 广告,start 示例 GATT 服务器(心率服务)打开(我的适配器是 hci0):
cd BlueZ 5.31目录
sudo tools/btmgmt -i hci0 关闭电源
sudo tools/btmgmt -i hci0 le on
sudo tools/btmgmt -i hci0 可连接
sudo tools/btmgmt -i hci0 name "一些友好的名字"
sudo tools/btmgmt -i hci0 广告
sudo tools/btmgmt -i hci0 power on
tools/btgatt-server -i hci0 -s low -t public -r -v

转到另一台设备(我使用过 iPod、Android -- Samsung Galaxy 5S 和 Nexus 平板电脑 -- 以及另一台 PC 运行ning BlueZ)并连接到该服务。这是我在另一台 PC 上的做法 运行ning BlueZ:
gatttool -b MAC GATT 服务器地址 -I
连接
小学
特征

您可以发出其他命令来读取和写入 GATT 服务器。

我还通过复制和编辑此文件创建了一个自定义 GATT 服务器(您的原始请求):tools/btgatt-server.c。您可以编辑 Makefile.tools 文件以在构建中包含您的自定义服务器。您必须 运行 automake、make 和 sudo make install 才能得到它 运行ning。

我在搜索 C 的独立 GATT 服务器时多次遇到这个问题。这里的答案需要使用 BlueZ 堆栈构建 GATT 服务器。 BlueZ 添加了 D-Bus 支持以允许独立的 GATT 服务器,甚至包括用于 Python 的独立示例 GATT 服务器,但不用于 C.

仍然需要一台服务器,我开始着手开发一个服务器,目的是发布一个示例,但即使是最小的实现,代码仍然比我调用 示例 时舒服.

初步实施现已完成,并已在 LGPL 下发布(编辑:许可证已从 GPL-3 更改为 LGPL):

https://github.com/nettlep/gobbledegook

如果对某人有帮助,那就太好了。如果它对发布了对我有帮助的代码的人有所帮助,那就更好了。