当前位置: 首页 > 知识库问答 >
问题:

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

卫和洽
2023-03-14

我扩展插件/gatt_example. c在Bluez源尝试BLE通知功能没有成功。我正在使用Bluez源中包含的电池服务示例。它具有1个具有READ和NOTIFY属性的特性。我添加dbus方法来调用attrib_db_update()来从蓝牙守护进程外部更新特征值。

现在,我可以连接哪个客户端(带有Android 4.3的Nexus4和iPhone(不含LightBlue的应用程序))并启动通知(设置描述符CCC通知标志)。(注意:ccc描述符字符具有默认的身份验证权限,因此从iPhone修改ccc(开始通知)将使bluez返回错误:未授权权限。由于我计划稍后处理授权,我临时将默认权限更改为“无”,iPhone可以设置CCC通知标志)。

问题是,即使客户端(Android或iOS)有start notify,调用attrib_db_update()也不会让bluez向客户端发送任何通知(使用hcidump进行监控,不向客户端发送数据包)。

问题:除了attrib_db_update()之外,是否需要任何步骤来让bluez向客户端发送通知?我很感激与样品来源的任何链接。注:我使用bluez作为外围gatt服务器配置(就像plugin/gatt_example.c中的电池服务一样),反之亦然。

谢谢

===更新(我不知道注释格式是如何工作的……所以我在这里添加了更新。)
关于配置文件/警报示例:
是的,我在提问之前已经查看了配置文件/警报。另一个问题是我无法运行这些样本(这是我一开始问这个问题的原因之一)
配置文件/警报/服务器。c:attio_connected_cb()是一个回调函数,由服务器中的filter_devices_notify()注册。c、 它使用btd_device_add_attio_callback()(来自src/device.c)。进一步检查src/设备。c、 它看起来像是一个检查设备-

对于那些有兴趣运行/调试示例警报配置文件的人(因为没有文档:( ).
注释下面的if(第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
连接设备,直到启动通知

从其他控制台注册警报:


    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"

我得到了以下Bluetooth的日志:


    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

备忘录:在设备中添加一些调试输出。似乎那个装置-

共有1个答案

詹弘毅
2023-03-14

编辑:我在代码中使用测试警报Python脚本成功运行警报示例。

我直接联系了开发商并询问。事实证明,在将bluez作为外围设备运行时出现了一个bug,所以他在邮件列表上创建了几个补丁。

http://marc.info/?l=linux-bluetooth

应用修补程序后,运行服务器并尝试使用测试警报:

>

  • 连接并写入右侧ccc句柄以通知客户端
  • 在服务器端,运行测试警报,如(-w是保持测试警报持久,-r是注册电子邮件警报,-u是未读电子邮件,30是未读电子邮件的数量):

    测试警报-w-r email-u email 30

  •  类似资料:
    • 我正在调查与GATT相关的蓝牙低能量(BLE)中可用的安全类型。更具体地说,当使用指定了不同安全级别(低、中、高)的gatttool时,会执行什么类型的操作?我的理解是,BLE中的安全管理器支持4种不同的安全属性: 没有配对 与不支持中间人(MitM)保护(JustWorks)的关联模型配对 与MitM保护配对(密码输入、数字比较、OOB) LE安全连接配对。 这些安全属性是否与gatttools

    • 问题内容: 我试图在Linux机器上使用GATT来设置具有许多特征的自定义服务。 使用[这个问题及其链接的问题,我能够识别出我需要编写的代码(利用该函数)。 我创建了一个单独的文件gatt_service.c,并编写了我认为需要的代码。但是,我无法解决如何将我的代码链接到Bluez库以编译和运行我的解决方案。例如,此站点(并非用于BLE开发)使用gcc参数链接到libbluetooth ,而我无法

    • 我正在尝试构建一个使用蓝牙的android应用程序。在教程中,他们使用128位UUID,但我只有16位UUID。我必须使用服务UUID和蓝牙基础创建一个新的128位UUID。 例子: 警报通知服务UUID(16bit)= 通过组合这两个UUID,我们收到。。。 警报通知服务UUID(128bit)= 有没有合适的方法?

    • > 我们正在尝试检测C/C中的事件 我们在Linux上使用Bluez作为我们的蓝牙库 我们的目标是在触发该事件时运行外部脚本 具体来说,我们有一个摩托罗拉H730耳机,上面有一个按钮,我们正在寻找检测按钮的按下情况 我们已经配对了蓝牙设备(hcitool),我们可以连接到它(bluez测试音频),但我们有兴趣将这种方法迁移到C/C 连接设备并按下按钮时,hcidump的输出为: HCI sniff

    • 运行后,Android部分返回connection be success(BluetoothGattCallback::onConnectionStateChange的参数为STATE_CONNECTED),但是linux中的程序(btgatt-server)没有得到任何响应,仍然阻止等待接受。(第485行)。 我还使用了另一个示例代码:l2cap-ble.c,结果完全相同。 有人能帮我吗?我的目

    • 最近,我买了一台iBeacon设备,打算创建Android应用程序,以便识别和使用它。我是一个在Android应用程序中使用蓝牙的新手,有很多事情我还不知道。在互联网和本论坛中,我找到了使用Radius Networks的Android IBeacon库的建议,但是,唉,现在它不再可用了: https://github.com/RadiusNetworks/android-ibeacon-serv