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

空扰寡人 提交于 2019-11-30 05:25:50

I got the example GATT server running for BlueZ 5.31 (latest as of this post):

My environment:
Vagrant
Virtual Box
Ubuntu Trusty Tahr as a guest OS (v. 14.04 32-bit OS)
Updated to linux kernel 3.19
Installed packages:
* libglib2.0-dev
* libdbus-1-dev
* libudev-dev
* libical-dev
* libreadline-dev

Downloaded BlueZ 5.31 from here: https://www.kernel.org/pub/linux/bluetooth/bluez-5.31.tar.xz
Installation of updated kernel (v. 3.19):
sudo apt-get update
sudo apt-get install --install-recommends linux-generic-lts-vivid

A reboot is necessary. I'm using Vagrant and lost shared folder access. If this happens to you, wait for vagrant to report the error and go into the VM anyway (vagrant ssh). In the VM, issue this command to fix the shared folder problem:
sudo /etc/init.d/vboxadd setup

I would reboot again (probably not necessary), to check that the shared folder is active again.
Once back in the VM, continue the installation of 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
make
sudo make install
sudo cp attrib/gatttool /usr/bin

Installation completed. Check it as follows:
hciconfig
You should get the follow response (or something similar):
hci0: Type: BR/EDR Bus: USB
BD Address: 00:1A:7D:DA:71:0C ACL MTU: 310:10 SCO MTU: 64:8
DOWN
RX bytes:15528 acl:126 sco:0 events:683 errors:0
TX bytes:6459 acl:146 sco:0 commands:234 errors:0

Configure the Bluetooth adapter, start advertising, start example GATT server (heart rate service) with verbose on (my adapter is hci0):
cd BlueZ 5.31 directory
sudo tools/btmgmt -i hci0 power off
sudo tools/btmgmt -i hci0 le on
sudo tools/btmgmt -i hci0 connectable on
sudo tools/btmgmt -i hci0 name "some friendly name"
sudo tools/btmgmt -i hci0 advertising on
sudo tools/btmgmt -i hci0 power on
tools/btgatt-server -i hci0 -s low -t public -r -v

Go to another device (I've used an iPod, an Android -- Samsung Galaxy 5S and Nexus tablet -- and another PC running BlueZ) and connect to the service. Here is how I did it on another PC running BlueZ:
gatttool -b MAC address of GATT server -I
connect
primary
characteristics

You can issue other commands to read and write to the GATT server.

I've also created a custom GATT server (your original request) by copying and editing this file: tools/btgatt-server.c. You can edit the Makefile.tools file to include your custom server in the build. You'll have to run automake, make, and sudo make install to get it running.

1) goto Bluez folder

2) sudo ./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc --localstatedir=/var --disable-systemd --enable-experimental --enable-maintainer-mode

3) sudo make all

4) Advertise connectable packets

activate bluetooth

sudo hciconfig hci0 up

set advertise data: "hello world"

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

start advertising as connectable

sudo hciconfig hci0 leadv 0

5) sudo service bluetooth stop

6) sudo src/bluetoothd -d -n

7) From other PC, type (Change MAC id gatt server mac)

gatttool -b gatt_server_mac --interactive

step 6 is for in case you want to compile plugins/gatt-example.c

if you want to compile server.c from profile/time or profle/alert(replace with alert in place of time) or anyother file in profile folder replace step 6

sudo src/bluetoothd --plugin=time -n

ya creating a time server is good to start with .profile/time has good custom example,clean-up code and try to maintain a minimal code and run with gatttool as client.If you want both a custom client and custom server than you can see tools/btgatt-client.c and tools/btgatt-server.c .

Run tools/btgatt-server.c in one pc with sudo ./btgatt-server in one pc

and sudo ./btgatt-client -d server_mac in another pc

I landed on this question a few times in my search for a standalone GATT server for C. The answers here require building your GATT server with the BlueZ stack. BlueZ added D-Bus support to allow standalone GATT servers and even includes a standalone sample GATT server for Python, but not for C.

Still needing a server, I started working on one with the intention of releasing a sample, but even a minimum implementation is still more code than I would be comfortable calling a sample.

The initial implementation is done now and has been released under LGPL (edit: the license was changed from GPL-3 to LGPL):

https://github.com/nettlep/gobbledegook

If it helps somebody, cool. If it helps somebody who has released code that has helped me, even better.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!