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

时间:2013-09-27 07:11:55

标签: bluetooth bluetooth-lowenergy bluez

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

      

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

  3.