Linux BlueZ 4.101 允许 GATT 连接但不在 Ubuntu 上公开 GATT 服务

Linux BlueZ 4.101 Allows GATT Connection but does not Expose GATT Services on Ubuntu

我的目标是在 Ubuntu 14.04 上使用 BlueZ 4.101(不是 BlueZ 5.X)通过 USB BLE Dongle(Cambridge Silicon Radio CSR8510 A10)公开 GATT 服务器。 BlueZ 4.101 附带了一个 gatt-example 插件,几个人已经确认它适用于他们。例如,post 中的最后一个答案声称它有效:Bluez: advertise service / gatt server example?

最终,我想在 BlueZ 4.101 中实现我自己的 GATT 服务器,类似于此 post: http://gaiger-programming.blogspot.tw/2015/01/bluetooth-low-energy-customizing-gatt.html

我已经能够使用我的 iPhone 查看 BLE 广告并连接到 BLE 服务器,但我看不到 BlueZ 4.101 附带的 GATT 服务器示例的任何特征或服务。 phone 上的多个 BLE 扫描仪应用程序显示 BLE 服务器广告并允许连接,但它们都说此设备没有服务。

我已经成功地在 Ubuntu 14.04 上完全删除了包管理器的 BlueZ 4.101 版本,并按照以下指令集自行编译:

sudo apt-get remove --purge bluez* -y
sudo apt-get install bison byacc flex -y
wget http://www.kernel.org/pub/linux/bluetooth/bluez-4.101.tar.gz
tar xvf bluez-4.101.tar.gz
cd bluez-4.101
sudo service bluetooth stop
sudo make clean
sudo make distclean
sudo ./configure CFLAGS='-Wall -Wextra -O2 -Wno-error' --prefix=/usr --enable-maintainer-mode
sudo make all
sudo make install
sudo vim /etc/bluetooth/main.conf

# Enable the GATT functionality. Default is false
EnableGatt = true

# Enable the GATT Attribute Server. Default is false, because it is only
# useful for testing. Attribute server is not enabled over LE if EnableLE
# is false.
AttributeServer = true

然后我像这样启动 GATT 服务器(作为 root):

#!/bin/sh

killall bluetoothd 2>/dev/null
bluez-4.101/tools/hciconfig hci1 down
bluez-4.101/mgmt/btmgmt -i hci1 power off
bluez-4.101/mgmt/btmgmt -i hci1 le on
bluez-4.101/tools/hciconfig hci1 up
bluez-4.101/tools/hciconfig hci1 sspmode 1
bluez-4.101/tools/hcitool -i hci1 cmd 0x08 0x0008 48 45 4c 4c 4f 57 4f 52 4c 44
bluez-4.101/mgmt/btmgmt -i hci1 bondable off
bluez-4.101/mgmt/btmgmt -i hci1 connectable on
bluez-4.101/mgmt/btmgmt -i hci1 bredr off
bluez-4.101/mgmt/btmgmt -i hci1 advertising on
bluez-4.101/mgmt/btmgmt -i hci1 power on
#tools/hcitool -i hci1 cmd 0x08 0x0008 15 02 01 06 11 06 fe f8 46 3e 16 00 0d b5 e2 11 62 75 10 18 98 b6
#src/bluetoothd -d -n --noplugin=time,audio,input,serial,network,alert,proximity,thermometer &
#src/bluetoothd -d -n --plugin=thermometer &
#src/bluetoothd -d -n --plugin=gatt_example &
bluez-4.101/src/bluetoothd -d -n &
sleep 3
bluez-4.101/mgmt/btmgmt -i hci1 name "MyCustomBLETest"
bluez-4.101/tools/hciconfig hci1 leadv

如果我尝试只启用 1 个插件 "time" - 我收到以下错误并且无法发现该设备:

bluetoothd[6373]: Bluetooth daemon 4.101
bluetoothd[6373]: src/main.c:parse_config() parsing main.conf
bluetoothd[6373]: src/main.c:parse_config() discovto=0
bluetoothd[6373]: src/main.c:parse_config() pairto=0
bluetoothd[6373]: src/main.c:parse_config() pageto=8192
bluetoothd[6373]: src/main.c:parse_config() auto_to=60
bluetoothd[6373]: src/main.c:parse_config() name=%h-%d
bluetoothd[6373]: src/main.c:parse_config() class=0x000100
bluetoothd[6373]: src/main.c:parse_config() Key file does not have key 'DeviceID' in group 'General'
bluetoothd[6373]: Starting SDP server
bluetoothd[6373]: src/plugin.c:plugin_init() Loading builtin plugins
bluetoothd[6373]: Ignoring (cli) audio
bluetoothd[6373]: Ignoring (cli) input
bluetoothd[6373]: Ignoring (cli) serial
bluetoothd[6373]: Ignoring (cli) network
bluetoothd[6373]: Ignoring (cli) service
bluetoothd[6373]: Ignoring (cli) thermometer
bluetoothd[6373]: Ignoring (cli) alert
bluetoothd[6373]: src/plugin.c:add_plugin() Loading time plugin
bluetoothd[6373]: Ignoring (cli) gatt_example
bluetoothd[6373]: Ignoring (cli) proximity
bluetoothd[6373]: Ignoring (cli) deviceinfo
bluetoothd[6373]: Ignoring (cli) hciops
bluetoothd[6373]: Ignoring (cli) mgmtops
bluetoothd[6373]: Ignoring (cli) formfactor
bluetoothd[6373]: Ignoring (cli) storage
bluetoothd[6373]: Ignoring (cli) adaptername
bluetoothd[6373]: src/plugin.c:plugin_init() Loading plugins /home/pi/Desktop/bluez-4.101/plugins/.libs
bluetoothd[6373]: Ignoring (cli) external_dummy
bluetoothd[6373]: Not enough free handles to register service
bluetoothd[6373]: adapter_ops_setup failed

现在 Phone 可以看到并连接到加密狗,但永远看不到任何服务或读取任何特征:

我如何让 GATT 服务器完全工作并正确地做广告并允许与其服务和特性进行交互?

显然这与所使用的收音机有关。 CSR BLE Dongle 不能作为 GATT 服务器运行。我在另一块带有 Texas Instruments WL1271 的电路板上执行了这些确切的步骤并且它有效! iPhone可以看到GATT Service / Characteristics.