有关蓝牙低功耗(BLE)通信中,GATT客户端与GATT服务端之间的问题

有关蓝牙低功耗(BLE)通信中,GATT客户端与GATT服务端之间的问题

持续更新…

1.服务端需要具有主动发消息事件吗?

在蓝牙低功耗(BLE)通信中,特别是使用GATT(Generic Attribute Profile)协议时,通常不直接发起“主动发送数据事件”。GATT协议本身基于客户端-服务端模型,传统上是由客户端发起读取或写入请求,服务端响应这些请求。然而,为了实现服务端向客户端的主动数据推送,可以利用以下几种机制:

  • Notification(通知):
    服务端可以通过通知特性来主动向已经订阅了特定特征的客户端发送数据更新。一旦特征值发生变化,服务端会自动发送一个通知给所有已订阅的客户端,无需客户端发起请求。
  • Indication(指示):
    类似于通知,但带有确认机制。服务端发送指示后,会等待客户端的确认响应,这提供了可靠的数据传输保证,但增加了通信的延迟。
  • Server-Sent Events (SSE):
    虽然SSE主要是在Web应用中用于HTTP通信的服务器推送技术,与BLE通信不是直接相关,但提到了服务端主动推送的概念。在BLE上下文中,可以类比理解为服务端通过Notification或Indication机制来模拟类似的效果。
  • WebSockets or MQTT over Bluetooth: 对于更复杂的双向通信需求,虽然超出了标准BLE
    GATT的范畴,但理论上可以通过在BLE之上实现WebSockets或MQTT等协议,来实现服务端的主动数据推送。这通常需要额外的协议栈支持和客户端-服务端的定制实现。

因此,虽然GATT协议本身不直接包含服务端主动发起的数据传输事件,但通过Notification和Indication机制,服务端能够有效地实现向客户端的主动数据推送。

2.客户端处理读取事件,服务端所发起的响应数据中包含着读取数据

  1. 客户端发起读取请求:客户端通过GATT协议向服务端发送一个读取请求(Read
    Request),请求中指定了想要读取的特征的句柄(Handle)。
  2. 服务端接收请求并处理:服务端接收到读取请求后,会触发一个读取事件(Read
    Event)。在这个事件处理过程中,服务端会根据请求中的特征句柄找到相应的特征值。
  3. 服务端构建响应:找到特征值后,服务端会构建一个读取响应(Read
    Response)消息。这个响应消息中包含了客户端请求读取的数据(即特征值)。
  4. 发送读取响应:服务端通过蓝牙链路将读取响应发送回客户端。这一步是实质性的数据传输步骤,确保客户端能够获得请求的数据。
服务端代码:
 	// 处理读取事件
    case ESP_GATTS_READ_EVT: {
        ESP_LOGI(GATTS_TAG, "GATT_READ_EVT, conn_id %d, trans_id %" PRIu32 ", handle %d", param->read.conn_id, param->read.trans_id, param->read.handle);
        // 初始化响应结构体
        esp_gatt_rsp_t rsp;
        memset(&rsp, 0, sizeof(esp_gatt_rsp_t));
        // 设置响应中的属性句柄
        rsp.attr_value.handle = param->read.handle;
        // 设置响应数据长度及内容
        rsp.attr_value.len = 4;     //attribute value lenght
        rsp.attr_value.value[0] = 0xde; // attribute value 
        rsp.attr_value.value[1] = 0xed;
        rsp.attr_value.value[2] = 0xbe;
        rsp.attr_value.value[3] = 0xef;
        //发送读取响应
        //rsp是响应数据
        esp_ble_gatts_send_response(gatts_if, param->read.conn_id, param->read.trans_id,
                                    ESP_GATT_OK, &rsp);
        break;

3.客户端给服务端发送数据的流程

1. 客户端发现服务和特征:

  • 客户端首先与服务端建立GATT连接。
  • 客户端通过发送Discover Services请求来查找服务端提供的所有GATT服务。
  • 收到服务列表后,客户端可以选择需要交互的服务,并进一步发现该服务下包含的特征(Characteristics)。

2. 客户端配置特征:

  • 如果客户端打算接收服务端的主动消息(例如通知或指示),它需要向服务端的特定特征发送Write Request,以配置客户端特征配置描述符(Client Characteristic Configuration Descriptor, CCCD),开启通知或指示功能。

3. 客户端发送消息(写入请求):

  • 客户端构建一个包含要发送数据的Write Request或Write Command,指定目标特征的句柄。
  • 数据可以是通过无响应写入(Write Without Response)发送,这不需要服务端的确认;或者通过带响应写入(Write with Response),在这种情况下,服务端会发送一个确认响应给客户端。

4. 服务端处理写入请求:

  • 服务端接收到写入请求后,根据请求中的特征句柄,处理接收到的数据。
  • 如果是配置特征的CCCD,服务端会记住这个配置,以便将来有数据更新时,根据配置向客户端发送通知或指示。
  • 对于普通数据写入,服务端可能根据接收到的数据执行特定的操作或更新内部状态。

5. 服务端响应(如有必要):

  • 如果客户端发送的是带响应的写入请求,服务端会发送一个Write Response作为确认,表明数据已成功接收。
  • 如果客户端订阅了服务端的特征通知或指示,服务端在数据更新时会主动向客户端发送通知或指示。
  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值