5

我在 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 服务器/外围设备必须连接到中央?)由于未知原因而失败。

4

1 回答 1

3

编辑:我已经使用代码中的 test-alert python 脚本成功运行了警报示例。

我直接联系了开发商并询问。原来在运行 bluez 作为外围设备时有一个错误,所以他在邮件列表上创建了几个补丁。

http://marc.info/?l=linux-bluetooth&m=139092431515560&w=2

应用补丁后,运行服务器并尝试使用 test-alert :

  1. 连接并写入正确的 ccc 句柄以在客户端进行通知
  2. 在服务器端,运行 test-alert 例如(-w 是保持 test-alert 持久化,-r 用于注册电子邮件警报,-u 用于未读电子邮件,30 是未读电子邮件的数量):

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

于 2014-01-23T07:40:33.523 回答