【问题标题】:How come it is always the GATT server that exposes services?为什么总是 GATT 服务器公开服务?
【发布时间】:2015-12-18 18:16:30
【问题描述】:

查看各种GATT-based profiles,似乎服务总是暴露在GATT服务器而不是GATT客户端。例如,时间配置文件 (TIP) 让服务器公开当前时间服务 (CTS)。因此,如果手机要使用 TIP 将心率监视器更新为当前时间,则手机将是服务器,而监视器将是客户端。但是,作为心率监测器,心率配置文件要求监测器是 GATT 服务器。

那么,对于从手机获取当前时间的监视器,它应该是 GATT 客户端还是服务器?是否应该在与手机时间同步时设置为客户端,否则设置为服务器?是否应该实施自定义配置文件,以便改为在客户端中公开 CTS?

谢谢

【问题讨论】:

    标签: bluetooth gatt bluetooth-lowenergy


    【解决方案1】:

    通用属性配置文件 (GATT) 定义服务器和客户端如何通信 彼此使用属性协议来传输数据。客户 服务器角色在程序启动时确定,在程序结束时释放。因此,一个设备可以同时扮演这两个角色。

    我建议你阅读Bluetooth Spec。在 G 部分 2.2 中,它解释了角色和配置。

    客户端——这是向客户端发起命令和请求的设备 服务器并可以接收由服务器发送的响应、指示和通知 服务器。 服务器——这是接受传入命令和请求的设备 来自客户端并向客户端发送响应、指示和通知。

    回到你的问题:

    时间配置文件使设备能够获取日期、时间、时区、 和夏令时信息和控制时间相关的功能。

    在您的情况下,当它从手机上花费时间时,监视器将成为 GATT 客户端。但是,它可以同时是一个服务器,用于与电话的另一个过程(操作、请求等)。

    简而言之,客户端和服务器角色并不固定在设备上。当您的手机暴露当前时间时,它将是服务器。同样,当它从监视器获取当前时间时,它将是客户端。无需自定义配置文件。如果您希望您的手机从一台设备获取当前时间并将其公开给另一台设备,只需为您的手机实现客户端和服务器角色的相同配置文件即可。

    编辑:
    根据TIP profile spec,要获取当前时间信息,需要使用GATT Read Characteristic Value子过程和Current Time Characteristic的句柄。作为客户端的监视器将从服务器的 GATT 表中读取 当前时间特征(在本例中是电话)。一旦监视器从手机中检索到值,它就可以更新其当前时间特征值,并以三种方式将其暴露给其环境:

    1. 通知其订阅的客户端(BLE 通知)。如果您以这种方式执行此操作,您将自定义蓝牙 TIP 配置文件,因为此处未定义此过程(我快速查看了文档但没有看到它)。
    2. 在广告包中广播(不需要BLE连接)
    3. 另一个 BLE 设备连接到监视器并读取当前时间特性值。如果您想使用蓝牙 SIG 定义的 TIP 配置文件作为服务器,这是推荐的方式。

    【讨论】:

    • 我明白了。所以你的意思是当显示器需要与手机进行时间同步时,它应该成为 GATT 客户端——即使它可能已经是 GATT 服务器?因此,在此期间,它将同时是 GATT 客户端和 GATT 服务器。时间同步完成后,它会降级为 GATT 服务器 - 对吗?
    • 监视器应该是心率配置文件的 GATT 服务器。这是否意味着它必须在同步完成后从客户端切换到服务器?
    • 切换是什么意思?我的意思是你如何在角色之间切换?
    • 这其实是我的担心。在这种情况下,您的意思是监视器在整个生命周期内应同时作为 GATT 客户端和 GATT 服务器?如果是这种情况,将设备同时作为客户端和服务器运行会不会有潜在的麻烦?
    • 设备可以同时充当服务器和客户端角色,而且通常很正常。通过阅读正确的规范,您可以避免提出此类非常基本的问题。您提出的问题是在谈论 GATT 以及 GATT 客户端和服务器时首先讨论的主题之一。
    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 2018-02-27
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多