结合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");
}
}
}