我正在Bluez源代码中扩展plugin / gatt_example.c以尝试BLE通知功能 没有成功。我正在使用Bluez源中包含的样本电池服务。它有1个 具有READ和NOTIFY属性的特征。我添加了dbus方法来调用attrib_db_update()来更新蓝牙守护程序外部的特征值。
现在,我可以连接哪个客户端(Nexus4与Android 4.3和iPhone(LightBlue免费应用程序)) 并开始通知(设置描述符CCC通知标志)。 (注意:ccc描述符char具有默认的auth权限,因此从iPhone修改CCC (启动通知)将使bluez返回错误:不授权权限。由于我打算稍后处理授权,我暂时将默认权限更改为none,并且iPhone可以设置CCC通知标志。)
问题是即使客户端(Android或iOS)都已启动通知,调用attrib_db_update()也不会使bluez向客户端发送任何通知(使用hcidump监控,没有数据包发送给客户端)。
问题:attrib_db_update()旁边是否需要执行bluez向客户端发送通知?我感谢任何与示例源的链接。 PS。我使用bluez作为外设+ gatt服务器配置(就像插件/ gatt_example.c中的电池服务一样),反之亦然。
感谢。
===更新(我不知道注释格式化工作如何...所以我在这里添加更新。)
关于个人资料/警报样本:
是的我在询问问题之前已经查看了个人资料/警报。
另一个问题是我无法运行这些样本(这是我首先提出问题的一个原因)。
资料/警报/ server.c:
attio_connected_cb()是一个回调函数,由server.c中的filter_devices_notify()注册。
它使用btd_device_add_attio_callback()(来自src / device.c)。
进一步检查src / device.c,它看起来像检查device-> attrib是否存在exec(先插入队列然后执行回调)回调或只是插入队列直到设备连接?。
调试它,即使我已连接设备,它看起来像device-> attrib是空的。
对于那些有兴趣运行/调试样本警报配置文件的人(因为没有doc :()
如果(在第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); } */
运行bluetoothd:ex。 bluetoothd -n -d -p alert
将您的设备连接到startNotify
从其他控制台注册警报:
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.NewAlert" string:"simple" uint16:"1" string:"test"
我得到了以下bluetoothd的日志:
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
备忘录:在device.c中添加一些调试输出。似乎device-> attrib是空的。并且autoconnect(为什么gatt服务器/外围设备必须连接到中心?)由于未知原因而失败。
答案 0 :(得分:3)
编辑:我已成功使用代码中的test-alert python脚本运行警报示例。
我直接联系了开发人员并询问。结果发现将bluez作为外设运行时存在一个错误,因此他在邮件列表上创建了几个补丁。
http://marc.info/?l=linux-bluetooth&m=139092431515560&w=2
应用补丁后,运行服务器并尝试使用test-alert:
test-alert -w -r email -u email 30