关于ESP32 BLE send_response 看法

结合Android BLE 服务端 API 解释;

https://developer.android.google.cn/reference/android/bluetooth/BluetoothGattServer
public boolean sendResponse (BluetoothDevice device, 
                int requestId, 
                int status, 
                int offset, 
                byte[] value)

Android 蓝牙开发中,作为服务器端APP,需要针对客服端每次的write、read请求时,都需要调用sendResponse,表示是否写入成功,或者读取成功;

而针对客户端下发的write函数,sendResonse仅是向客户端发送写入成功,并不会将value数据发送过去;因此,在sendResponse之后,需要调用

notifyCharacteristicChanged

进行value数据的回复;

具体参考

https://www.jianshu.com/p/ffce0bbba84d

回到ESP32的BLE开发中,手机APP客户端需要设置是否相应的参数,才能使ESP32的write_need_rsp为1;

WriteGattCharacteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);

与android开发一直,发送响应数据后,需要调用notify/READ_EVT对APP写相应数据;

经过测试

Android 使能通知开关

mBluetoothGatt.setCharacteristicNotification(characteristic, true);

ESP32 端监听通知使能是否开启成功,发送response给主机反馈开启成功;

if (heart_rate_handle_table[IDX_CHAR_CFG_A] == param->write.handle && param->write.len == 2){
         uint16_t descr_value = param->write.value[1]<<8 | param->write.value[0];
         if (descr_value == 0x0001){
               ESP_LOGI(GATTS_TABLE_TAG, "notify enable");
               ESP_LOGI(GATTS_TABLE_TAG,"heart_rate_handle_table[IDX_CHAR_CFG_A]=%d",param->write.handle);
               esp_err_t response_err =  esp_ble_gatts_send_response(gatts_if, param->write.conn_id, 
                param->write.trans_id, ESP_GATT_OK, NULL);  //send response
                        
                 if (response_err != ESP_OK){
                      ESP_LOGE(GATTS_TABLE_TAG, "response error\n");
                }else{
                      ESP_LOGE(GATTS_TABLE_TAG, "response OK\n");
                }
 }

当android app主机端下发数据后,从机反馈接受数据成功,并且返回应答数据(esp_ble_gatts_send_indicate);

if (param->write.need_rsp){
      ESP_LOGE(GATTS_TABLE_TAG, "Send response OK\n");
      esp_err_t response_err =  esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_APP_RSP, &rsp);
      if (response_err != ESP_OK){
         ESP_LOGE(GATTS_TABLE_TAG, "Send response error\n");
      }else{
         ESP_LOGE(GATTS_TABLE_TAG, "Send response OK\n");
         esp_err_t err =  esp_ble_gatts_send_indicate(gatts_if, param->write.conn_id, heart_rate_handle_table[IDX_CHAR_VAL_A],
          sizeof(repvalue), repvalue, false);
             if(err != ESP_OK){
                  ESP_LOGE(GATTS_TABLE_TAG,"NOTIFY");
                }else{
                  ESP_LOGE(GATTS_TABLE_TAG,"NOTIFY success");
                }
        }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值