1、问题描述:默认开机开启蓝牙,此时可以搜索到周围蓝牙设备,但无法配对,重新开关蓝牙后,配对功能正常。
2、问题根因:系统未等BtmReadBufferSize回调完成就执行了HCI_SetBufferSize,导致g_readBufferSizeResult.hcAclDataPacketLength为0,从而HciFargmentAndSendData发送数据失败,HCI log中未触发SMP连接。

正常打印

3、解决方法:

diff --git a/services/bluetooth/stack/src/btm/btm_controller.c b/services/bluetooth/stack/src/btm/btm_controller.c

index 73691ae..0f5c766 100644

--- a/services/bluetooth/stack/src/btm/btm_controller.c

+++ b/services/bluetooth/stack/src/btm/btm_controller.c

@@ -40,6 +40,7 @@

 static HciEventCallbacks g_hciEventCallbacks;

 

 static Event *g_waitSetupController = NULL;

+static bool g_btm_read_buffer_done = false;

 

 static HciResetReturnParam g_hciResetResult;

 static HciReadBufferSizeReturnParam g_readBufferSizeResult;

@@ -69,6 +70,7 @@ static void BtmControllerOnResetComplete(const HciResetReturnParam *returnParam)

 static void BtmControllerOnReadBufferSizeComplete(const HciReadBufferSizeReturnParam *returnParam)

 {

     g_readBufferSizeResult = *returnParam;

+    g_btm_read_buffer_done = true;

     EventSet(g_waitSetupController);

 }

 

@@ -328,26 +330,38 @@ static int BtmHciReset()

 

 static int BtmReadBufferSize()

 {

+    memset(&g_readBufferSizeResult, 0, sizeof(g_readBufferSizeResult));

+    g_btm_read_buffer_done = false;

+    EventClear(g_waitSetupController);

+

     int result = HCI_ReadBufferSize();

     if (result != BT_SUCCESS) {

         LOG_ERROR("HCI_ReadBufferSize failed: %{public}d", result);

         return result;

     }

+

     if (EventWait(g_waitSetupController, WAIT_CMD_TIMEOUT) == 0) {

-        switch (g_readBufferSizeResult.status) {

-            case HCI_SUCCESS:

-            case HCI_UNKNOWN_HCI_COMMAND:

-                result = BT_SUCCESS;

-                break;

-            default:

-                LOG_ERROR("HCI_ReadBufferSize status: 0x%02x", g_readBufferSizeResult.status);

-                result = BT_OPERATION_FAILED;

-                break;

+        int retry = 10;

+        while (retry-- > 0 && !g_btm_read_buffer_done) {

+            usleep(1000);

         }

     } else {

         LOG_ERROR("HCI_ReadBufferSize Timeout");

         result = BT_OPERATION_FAILED;

+        return result;

+    }

+

+    switch (g_readBufferSizeResult.status) {

+        case HCI_SUCCESS:

+        case HCI_UNKNOWN_HCI_COMMAND:

+            result = BT_SUCCESS;

+            break;

+        default:

+            LOG_ERROR("HCI_ReadBufferSize status: 0x%02x", g_readBufferSizeResult.status);

+            result = BT_OPERATION_FAILED;

+            break;

     }

+

     return result;

 }

 

添加全局变量g_btm_read_buffer_done,在确定BtmControllerOnResetComplete执行完成后,再往下执行

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐