Bluetooth 如何使用Bluez发送蓝牙低能GATT通知?

Bluetooth 如何使用Bluez发送蓝牙低能GATT通知?,bluetooth,bluetooth-lowenergy,bluez,Bluetooth,Bluetooth Lowenergy,Bluez,我正在Bluez源代码中扩展plugin/gatt_example.c以尝试BLE通知功能 没有成功。我正在使用Bluez源代码中包含的示例电池服务。它有1个 具有读取和通知属性的特征。我添加了dbus方法来调用attrib_db_update()以从蓝牙守护进程外部更新特征值 现在,我可以连接哪个客户端(Nexus4和安卓4.3以及iPhone(LightBlue免费应用)) 和开始通知(设置描述符CCC通知标志)。 (注意:ccc描述符字符具有默认的身份验证权限,因此从iPhone修改ccc

我正在Bluez源代码中扩展plugin/gatt_example.c以尝试BLE通知功能 没有成功。我正在使用Bluez源代码中包含的示例电池服务。它有1个 具有读取和通知属性的特征。我添加了dbus方法来调用attrib_db_update()以从蓝牙守护进程外部更新特征值

现在,我可以连接哪个客户端(Nexus4和安卓4.3以及iPhone(LightBlue免费应用)) 和开始通知(设置描述符CCC通知标志)。 (注意:ccc描述符字符具有默认的身份验证权限,因此从iPhone修改ccc (start notify)将使bluez返回错误:not authorize permission。由于我计划稍后处理授权,我临时将默认权限更改为none,iPhone可以设置CCC通知标志)

问题是,即使客户端(Android或iOS)有start notify,调用attrib_db_update()也不会使bluez向客户端发送任何通知(使用hcidump进行监视,不向客户端发送数据包)

问题:除了attrib_db_update()之外,是否需要任何步骤来让bluez向客户端发送通知?我感谢任何链接到样本源。另外,我使用bluez作为外围设备+gatt服务器配置(就像plugin/gatt_example.c中的电池服务一样),反之亦然

谢谢

===更新(我不知道注释格式是如何工作的……所以我在这里添加了更新。)
关于配置文件/警报示例:
是的,我在提问之前已经查看了个人资料/提醒。 另一个问题是我无法运行这些样本(这是我一开始问这个问题的原因之一)
profile/alert/server.c: attio_connected_cb()是一个回调函数,由server.c中的filter_devices_notify()注册。 它使用btd_device_add_attio_callback()(来自src/device.c)。 进一步检查src/device.c,它看起来像是检查device->attrib(如果存在),以执行回调(先插入到队列,然后执行回调),或者只是插入队列,直到设备连接?
调试它时,看起来设备->属性是空的,即使我已经连接了设备

对于有兴趣运行/调试示例警报配置文件的用户(因为没有文档:()。
如果(第564行附近)我们对这些检查不感兴趣,请将以下内容注释掉…

/* if (!g_str_equal(alert->srv, sender)) { DBG("Sender %s is not registered in category %s", sender, category); return btd_error_invalid_args(msg); } */ /* 如果(!g_str_equal(警报->srv,发送方)){ DBG(“发件人%s未在类别%s中注册”,发件人, 类别); 返回btd\u错误\u无效参数(msg); } */ 运行bluetoothd:ex.bluetoothd-n-d-p警报
连接您的设备直到启动通知

从其他控制台注册警报:

dbus-send --system --dest=org.bluez --type=method_call "/org/bluez" "org.bluez.Alert1.RegisterAlert" string:"simple" objpath:"/org/bluez/AlertAgent1" dbus send--system--dest=org.bluez--type=method_call“/org/bluez”“org.bluez.Alert1.RegisterAlert”字符串:“simple”objpath:“/org/bluez/AlertAgent1” 创建新警报:

dbus-send --system --dest=org.bluez --type=method_call "/org/bluez" "org.bluez.Alert1.NewAlert" string:"simple" uint16:"1" string:"test" dbus send--system--dest=org.bluez--type=method_call“/org/bluez”“org.bluez.Alert1.NewAlert”字符串:“simple”uint16:“1”字符串:“test” 我得到了以下蓝牙人的日志:

bluetoothd[1928]: src/attrib-server.c:attrib_db_update() handle=0x001c bluetoothd[1928]: src/attrib-server.c:attrib_db_update() handle=0x0021 bluetoothd[1928]: profiles/alert/server.c:register_alert() RegisterAlert("simple", "/org/bluez/AlertAgent1") bluetoothd[1928]: src/attrib-server.c:attrib_db_update() handle=0x001e bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() 0x1b6e718 registered ATT connection callback bluetoothd[1928]: src/device.c:device_set_auto_connect() 10:68:3F:E1:4E:F2 auto connect: 1 bluetoothd[1928]: src/adapter.c:adapter_connect_list_add() /org/bluez/hci0/dev_10_68_3F_E1_4E_F2 added to BlueZ 5.14's connect_list bluetoothd[1928]: src/adapter.c:trigger_passive_scanning() bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() device->attrib = false bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() cfunc = true bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() no idle bluetoothd[1928]: profiles/alert/server.c:new_alert() NewAlert("simple", 1, "simple") bluetoothd[1928]: src/adapter.c:passive_scanning_complete() status 0x03 bluetoothd[1928]: Wrong size of start scanning return parameters Bluetooth[1928]:src/attrib server.c:attrib_db_update()handle=0x001c Bluetooth[1928]:src/attrib server.c:attrib_db_update()handle=0x0021 Bluetooth[1928]:profiles/alert/server.c:register\u alert()RegisterAlert(“simple”,“/org/bluez/AlertAgent1”) Bluetooth[1928]:src/attrib server.c:attrib_db_update()handle=0x001e Bluetooth[1928]:src/device.c:btd_device_add_attio_callback()0x1b6e718注册的ATT连接回调 Bluetooth[1928]:src/device.c:device\u set\u auto\u connect()10:68:3F:E1:4E:F2 auto connect:1 Bluetooth[1928]:src/adapter.c:adapter_connect_list_add()/org/bluez/hci0/dev_10_68_3F_E1_4E_F2添加到bluez 5.14的connect_list中 Bluetooth[1928]:src/adapter.c:trigger\u passive\u scanning() Bluetooth[1928]:src/device.c:btd\u device\u add\u attio\u callback()device->attrib=false Bluetooth[1928]:src/device.c:btd\u device\u add\u attio\u callback()cfunc=true Bluetooth[1928]:src/device.c:btd\u device\u add\u attio\u callback()无空闲 Bluetooth[1928]:profiles/alert/server.c:new_alert()NewAlert(“simple”,1,“simple”) Bluetooth[1928]:src/adapter.c:被动扫描完成()状态0x03 Bluetooth[1928]:开始扫描返回参数的大小错误
备注:在device.c中添加一些调试输出。似乎device->attrib是空的。自动连接(为什么gatt服务器/外围设备必须连接到中心?)由于未知原因失败。

编辑:我已成功使用代码中的测试警报python脚本运行警报示例

我直接联系了开发人员并询问。结果发现,当运行bluez作为外围设备时,出现了一个bug,所以他在邮件列表上创建了几个补丁

应用修补程序后,运行服务器并尝试使用测试警报:

  • 连接并写入右侧ccc句柄,以便在客户端发出通知
  • 在服务器端,运行测试警报,例如(-w表示保持测试警报的持久性,-r表示注册电子邮件警报,-u表示未读电子邮件,30表示未读电子邮件的数量):

    测试警报-w-r电子邮件-u电子邮件30

  • 感谢Isa提供的信息。看起来这个补丁还没有在最新版本(5.14)中发布。我会从git获取最新的源代码,以找到答案。但正如Anderson所说,它可能无法完全工作。(我想理解为什么Android会将蓝牙堆栈从4.3切换到其他版本…)。我也在寻找另一个解决方案,比如bleno。上次我检查它时还没有通知,但我只是检查它是否已经实现了。坏消息。不幸的是,它没有工作(使用测试警报)。我使用iOS7蓝光连接,日志与我的更新相同(设备->属性为零,大小错误…)也使用Nexus 4进行测试(对于BLE,需要4.4.2,有许多错误修复程序无法使用4.3或4.4连接到bluez)这次日志不同。但我仍然没有收到发送给nexus的通知,也没有收到发送通知的hcidump