首页 文章

如何使用Bluez发送蓝牙低功耗GATT通知?

提问于
浏览
5

我正在扩展Bluez源代码中的plugin / gatt_example.c来尝试BLE通知功能但没有成功 . 我正在使用Bluez源中包含的样本电池服务 . 它具有READ和NOTIFY属性的1个特征 . 我添加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中的电池服务一样),反之亦然 .

谢谢 .

===更新(我不知道注释格式化工作如何...所以我在这里添加更新 . )
关于 Profiles /警报样本:
是的我在询问问题之前已经查看了 Profiles /警报 . 另一个问题是我无法运行这些样本(这是我首先提出问题的一个原因) .
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是否存在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服务器/外围设备必须连接到中央?)由于未知原因而失败 .

1 回答

  • 3

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

    我直接联系了开发人员并询问 . 结果发现将bluez作为外设运行时存在一个错误,因此他在邮件列表上创建了几个补丁 .

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

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

    • 连接并写入正确的ccc句柄,以便在客户端进行通知

    • 在服务器端,运行测试警报,例如(-w是保持测试警报持久性,-r用于注册电子邮件警报,-u用于未读电子邮件,30是未读电子邮件的数量):

    test-alert -w -r email -u email 30

相关问题