已合并
add SetBleMtu #1977
已合并
Kingys创建于 7月6日
共 4 个文件变更+42-0
@@ -49,6 +49,7 @@ enum NapiAsyncType : int {
49 BLE_DISABLE_ADVERTISING,49 BLE_DISABLE_ADVERTISING,
50 GENERATE_LOCAL_OOB_DATA,50 GENERATE_LOCAL_OOB_DATA,
51 BAS_GET_BATTERY_LEVEL,51 BAS_GET_BATTERY_LEVEL,
52+ GATT_CLIENT_MTU_CHANGED,
52};53};
53 54 
54static constexpr bool ASYNC_WORK_NEED_CALLBACK = true;55static constexpr bool ASYNC_WORK_NEED_CALLBACK = true;
@@ -67,6 +67,7 @@ public:
67#endif67#endif
68 68 
69 static napi_value SetBLEMtuSize(napi_env env, napi_callback_info info);69 static napi_value SetBLEMtuSize(napi_env env, napi_callback_info info);
70+ static napi_value SetBLEMtu(napi_env env, napi_callback_info info);
70 static napi_value GetRssiValue(napi_env env, napi_callback_info info);71 static napi_value GetRssiValue(napi_env env, napi_callback_info info);
71 static napi_value GetDeviceName(napi_env env, napi_callback_info info);72 static napi_value GetDeviceName(napi_env env, napi_callback_info info);
72 static int GattStatusFromService(int status);73 static int GattStatusFromService(int status);
@@ -32,6 +32,10 @@
32#include "napi_event_subscribe_module.h"32#include "napi_event_subscribe_module.h"
33#include "parser/napi_parser_utils.h"33#include "parser/napi_parser_utils.h"
34 34 
35+#ifndef GATT_MAX_MTU_SIZE
36+#define GATT_MAX_MTU_SIZE 517
37+#define GATT_DEF_BLE_MTU_SIZE 23
38+#endif
35 39 
36namespace OHOS {40namespace OHOS {
37namespace Bluetooth {41namespace Bluetooth {
@@ -149,6 +153,7 @@ void NapiGattClient::DefineGattClientJSClass(napi_env env)
149 DECLARE_NAPI_FUNCTION("readDescriptorValue", ReadDescriptorValue),153 DECLARE_NAPI_FUNCTION("readDescriptorValue", ReadDescriptorValue),
150 DECLARE_NAPI_FUNCTION("getRssiValue", GetRssiValue),154 DECLARE_NAPI_FUNCTION("getRssiValue", GetRssiValue),
151 DECLARE_NAPI_FUNCTION("setBLEMtuSize", SetBLEMtuSize),155 DECLARE_NAPI_FUNCTION("setBLEMtuSize", SetBLEMtuSize),
156+ DECLARE_NAPI_FUNCTION("setBLEMtu", SetBLEMtu),
152 DECLARE_NAPI_FUNCTION("on", On),157 DECLARE_NAPI_FUNCTION("on", On),
153 DECLARE_NAPI_FUNCTION("off", Off),158 DECLARE_NAPI_FUNCTION("off", Off),
154 DECLARE_NAPI_FUNCTION("onBlePhyUpdate", OnBlePhyUpdate),159 DECLARE_NAPI_FUNCTION("onBlePhyUpdate", OnBlePhyUpdate),
@@ -693,6 +698,40 @@ napi_value NapiGattClient::SetBLEMtuSize(napi_env env, napi_callback_info info)
693 return NapiGetBooleanTrue(env);698 return NapiGetBooleanTrue(env);
694}699}
695 700 
701+napi_value NapiGattClient::SetBLEMtu(napi_env env, napi_callback_info info)
702+{
703+ std::vector<int32_t> validErrCodes = {
704+ BT_ERR_PERMISSION_FAILED, BT_ERR_INVALID_PARAM, BT_ERR_API_NOT_SUPPORT,
705+ BT_ERR_OPERATION_BUSY, BT_ERR_INTERNAL_ERROR, BT_ERR_GATT_CONNECTION_NOT_ESTABILISHED,
706+ };
707+ NAPI_BT_CONTEXT(env, "ble.GattClientDevice.SetBLEMtu", validErrCodes);
708+ 
709+ NapiGattClient* gattClient = nullptr;
710+ int32_t mtuSize = 0;
711+ 
712+ auto status = CheckSetBLEMtuSize(env, info, mtuSize, &gattClient);
713+ NAPI_BT_ASSERT_ERR_NUM_RETURN_VERIFY(env, status == napi_ok, BT_ERR_INVALID_PARAM);
714+ 
715+ std::shared_ptr<GattClient> client = gattClient->GetClient();
716+ NAPI_BT_ASSERT_ERR_NUM_RETURN_VERIFY(env, client != nullptr, BT_ERR_INTERNAL_ERROR);
717+ NAPI_BT_ASSERT_ERR_NUM_RETURN_VERIFY(env,
718+ ((mtuSize >= GATT_DEF_BLE_MTU_SIZE) && (mtuSize <= GATT_MAX_MTU_SIZE)), BT_ERR_INVALID_PARAM);
719+ 
720+ NapiAsyncType asyncType = GATT_CLIENT_MTU_CHANGED;
721+ auto func = [client, mtuSize] {
722+ int ret = client->RequestBleMtuSize(mtuSize);
723+ HILOGI("ret: %{public}d", ret);
724+ ret = GetSDKAdaptedStatusCode(GattStatusFromService(ret));
725+ return NapiAsyncWorkRet(ret);
726+ };
727+ auto asyncWork = CREATE_ASYNC_WORK_WITH_CONTEXT(env, info, func, ASYNC_WORK_NEED_CALLBACK);
728+ NAPI_BT_ASSERT_ERR_NUM_RETURN_VERIFY(env, asyncWork, BT_ERR_INTERNAL_ERROR);
729+ bool success = gattClient->GetCallback()->asyncWorkMap_.TryPush(asyncType, asyncWork);
730+ NAPI_BT_ASSERT_ERR_NUM_RETURN_VERIFY(env, success, BT_ERR_INTERNAL_ERROR);
731+ asyncWork->Run();
732+ return asyncWork->GetRet();
733+}
734+ 
696static napi_status ParseGattClientReadRssiValue(napi_env env, napi_callback_info info, NapiGattClient **outGattClient)735static napi_status ParseGattClientReadRssiValue(napi_env env, napi_callback_info info, NapiGattClient **outGattClient)
697{736{
698 size_t expectedArgsCount = ARGS_SIZE_ONE;737 size_t expectedArgsCount = ARGS_SIZE_ONE;
@@ -150,6 +150,7 @@ void NapiGattClientCallback::OnMtuUpdate(int mtu, int ret)
150 HILOGI("ret: %{public}d, mtu: %{public}d", ret, mtu);150 HILOGI("ret: %{public}d, mtu: %{public}d", ret, mtu);
151 auto nativeObject = std::make_shared<NapiNativeInt>(mtu);151 auto nativeObject = std::make_shared<NapiNativeInt>(mtu);
152 eventSubscribe_.PublishEvent(STR_BT_GATT_CLIENT_CALLBACK_BLE_MTU_CHANGE, nativeObject);152 eventSubscribe_.PublishEvent(STR_BT_GATT_CLIENT_CALLBACK_BLE_MTU_CHANGE, nativeObject);
153+ AsyncWorkCallFunction(asyncWorkMap_, NapiAsyncType::GATT_CLIENT_MTU_CHANGED, nativeObject, ret);
153#endif154#endif
154}155}
155 156