This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2340R5:广播 pData 解析以获取扫描结果

Guru**** 2595805 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1352098/cc2340r5-advertising-pdata-parsing-for-scan-results

器件型号:CC2340R5

您好!

SDK 中是否有任何允许解析从扫描报告接收到的数据的实用程序?

我将 CC2340配置为中央设备、并扫描在广播数据中使用特定128位 UUID 进行广播的设备。  

这是我要发送的广播数据的格式:

uint8_t advData1[] =
{
  0x02,
  GAP_ADTYPE_FLAGS,
  GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED | GAP_ADTYPE_FLAGS_GENERAL,

  0x11,
  GAP_ADTYPE_128BIT_MORE,
  0x1d,
  0xe9,
  0xd9,
  0xe7,
  0x62,
  0x7c,
  0x44,
  0xad,
  0x90,
  0xd8,
  0x0f,
  0xbb,
  0x86,
  0x1f,
  0x73,
  0x99,




};

在中央侧、我目前只查找0x11、然后是 GAP_ADTYPE___128bit_more:

        case BLEAPPUTIL_ADV_REPORT:
        {
            bleStk_GapScan_Evt_AdvRpt_t *pScanRpt = &scanMsg->pBuf->pAdvReport;
            if (pScanRpt->pData != NULL)
            {
                uint8_t indx = 0;
                while (indx < pScanRpt->dataLen)
                {
                    // index is greater than 1 and 128 Bit UUID
                    if (indx && pScanRpt->pData[indx] == GAP_ADTYPE_128BIT_MORE) {
                        // check length field
                        if(pScanRpt->pData[indx-1] == 0x11 && indx+0x11 <= pScanRpt->dataLen) {
                            snprintf(sUUID, sizeof(sUUID),"%X",&pScanRpt->pData[indx+1]);
                            MenuModule_printf(APP_MENU_SCAN_EVENT + 1, 0, "128 Bit UUID: %s", sUUID);
                            //for(size_t i = indx+1; i < indx+0x10; i++ ) {
                            //    MenuModule_printf(APP_MENU_SCAN_EVENT + 1, 14+i-indx-1, "%x", pScanRpt->pData[i]);
                            //}
                        }
                    }
                    //
                    indx++;
                }
            }

但这不是打印我期望的数据、而且根据我看到的结果、我犹豫是否只做一个完整的 memcmp 来确定匹配项。

因此、我只想检查堆栈中是否有任何实用程序可以用于解析此扫描报告数据并返回指向请求字段值的指针?

穆南

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Munan:

    感谢您与我们联系。 我们将查看您的问题、并尽快与您联系。

    此致、

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Munan:

    恐怕我们没有任何实用工具来解析扫描报告数据、

    但我建议您看一看此答案 (1) CC2642R:在 simple_central 中显示广播器名称-蓝牙论坛- BluetoothRegistered︎ ñ ol - TI E2E 支持论坛中显示 展示如何解析 pData。

    我还建议您使用 cc13xx_cc26xx SLA 中的此函数 将 UUID 转换为字符串:

    char *Util_convertBytes2Str(uint8_t *pData, uint8_t length)
    {
      uint8_t     charCnt;
      char        hex[] = "0123456789ABCDEF";
      static char str[(3*31)+1];
      char        *pStr = str;
    
      for (charCnt = 0; charCnt < length; charCnt++)
      {
    *pStr++ = hex[*pData >> 4];
    *pStr++ = hex[*pData++ & 0x0F];
    if(!((charCnt+1) >= length))
    {
        *pStr++ = ':';
    }
      }
      str[(3*length)-1] = '\0';
      pStr = NULL;
    
      return str;
    }

    希望这对您有所帮助、

    丹桂语

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、唐吉、

    好的、谢谢、这肯定会有所帮助! 我最终得到了一种方法,使用 sprintf 来实现这一点,并将值转换为两个很长的 uint,但这可能是更轻的重量和更清洁。

    穆南