我在 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(start notify)会使bluez返回error: not authorize permission。由于我打算稍后处理授权,所以我暂时将默认权限更改为none ,并且 iPhone 能够设置 CCC 通知标志)。
问题是即使客户端(Android 或 iOS)已经开始通知,调用 attrib_db_update() 也不会让 bluez 向客户端发送任何通知(使用 hcidump 进行监控,没有数据包发送到客户端)。
问题:除了 attrib_db_update() 是否需要任何步骤来使 bluez 向客户端发送通知?我感谢任何指向示例源的链接。PS。我使用 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 是否存在执行(先插入队列然后执行回调)回调或只是插入队列直到设备连接?
调试它,即使我已经连接了设备,它看起来 device->attrib 是空的。
对于那些有兴趣运行/调试示例警报配置文件的人(因为没有文档 :( )。
注释掉以下 if (大约第 564 行),我们对这些检查不感兴趣......
/* if (!g_str_equal(alert->srv, sender)) { DBG("发件人 %s 未在类别 %s 中注册", sender, 类别); 返回 btd_error_invalid_args(msg); } */
运行蓝牙:例如。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" 字符串:"simple" uint16:"1" 字符串:"test"
我得到了以下蓝牙的日志:
蓝牙 [1928]: src/attrib-server.c:attrib_db_update() 句柄=0x001c 蓝牙 [1928]: src/attrib-server.c:attrib_db_update() 句柄=0x0021 bluetoothd[1928]:profiles/alert/server.c:register_alert() RegisterAlert("simple", "/org/bluez/AlertAgent1") 蓝牙 [1928]: src/attrib-server.c:attrib_db_update() 句柄=0x001e bluetoothd[1928]: src/device.c:btd_device_add_attio_callback() 0x1b6e718 注册的 ATT 连接回调 蓝牙 [1928]:src/device.c:device_set_auto_connect() 10:68:3F:E1:4E:F2 自动连接:1 bluetoothd[1928]: src/adapter.c:adapter_connect_list_add() /org/bluez/hci0/dev_10_68_3F_E1_4E_F2 添加到 BlueZ 5.14 的 connect_list 蓝牙 [1928]: src/adapter.c:trigger_passive_scanning() 蓝牙 [1928]: src/device.c:btd_device_add_attio_callback() 设备->attrib = false 蓝牙 [1928]: src/device.c:btd_device_add_attio_callback() cfunc = true 蓝牙 [1928]:src/device.c:btd_device_add_attio_callback() 没有空闲 bluetoothd[1928]:profiles/alert/server.c:new_alert() NewAlert("simple", 1, "simple") 蓝牙 [1928]: src/adapter.c:passive_scanning_complete() 状态 0x03 bluetoothd[1928]:开始扫描返回参数的大小错误
备忘:在 device.c 中添加一些调试输出。似乎 device->attrib 是空的。并且自动连接(为什么 gatt 服务器/外围设备必须连接到中央?)由于未知原因而失败。