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:是否有办法从服务器获取主要服务 UUID 而无需连接该服务器

Guru**** 1831610 points
Other Parts Discussed in Thread: SYSCONFIG, CC2541
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1417988/cc2340r5-is-there-a-way-to-get-the-primary-services-uuid-from-a-server-without-connecting-to-it

器件型号:CC2340R5
主题中讨论的其他器件:SysConfigCC2541

工具与软件:

你好

CC2340设置为中央设备。

扫描时、我想展示一个具有一个特定服务 UUID (自定义)的器件列表。

被扫描但没有该服务的任何其他 BT 设备应被忽略且不列出。

现在、我必须连接到设备并发出 GATT_DiscAllPrimaryServices (gapEstMsg->connectionHandle、bleAppTaskID);以便发现设备具有哪些服务。

由于我必须传递连接句柄、因此我必须首先连接到服务器、然后调用此函数。

是否有办法在扫描过程中通过 ADV 报告仅获取可用服务的 UUID? 或者至少运行一些过程以尝试在不连接到器件的情况下发现此信息?

感谢您发送编修

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

    您好、Alexandre、

    可以通过 Adv 报告数据显示不同大小的 UUID。 请看一下 SysConfig 中的 Adv Data。

    在中央侧、这个可配置为根据外设中设置的预定义 UUID 自动连接到外设。 逻辑将类似如下(查看如何比较 uuid 值):

    static bool FindSerialStreamServer(
            const uint8_t *uuid, const uint8_t *pManufData, uint8_t manDataLen,
            uint8_t *pData, uint8_t dataLen)
    {
        uint8_t matchingIdAndUuid = 0;
        uint8_t adLen;
        uint8_t adType;
        uint8_t *pEnd;
    
        pEnd = pData + dataLen - 1;
    
        // While end of data not reached
        while ((dataLen > 0) && (pData < pEnd))
        {
            // Get length of next AD item
            adLen = *pData++;
            if (adLen > 0)
            {
                adType = *pData;
    
                // If AD type is for 128-bit service UUID
                if ((adType == GAP_ADTYPE_128BIT_MORE)
                        || (adType == GAP_ADTYPE_128BIT_COMPLETE))
                {
                    pData++;
                    adLen--;
    
                    // For each UUID in list
                    while (adLen >= 2 && pData < pEnd)
                    {
                        // Check for match
                        if (!memcmp(pData, uuid, ATT_UUID_SIZE))
                        {
                            matchingIdAndUuid++;
                        }
    
                        // Go to next
                        pData += 2;
                        adLen -= 2;
                    }
    
                    // Handle possible erroneous extra byte in UUID list
                    if (adLen == 1)
                    {
                        pData++;
                    }
                }
    
                // REMOVED FOR TESTING
                if (adType == GAP_ADTYPE_MANUFACTURER_SPECIFIC)
                {
                    // Floor to the lowest length
                    uint8_t len = adLen;
                    if (manDataLen < len)
                    {
                        len = manDataLen;
                    }
    
                    if (memcmp(pManufData, pData, len))
                    {
                        matchingIdAndUuid++;
                    }
                }
    
                if (matchingIdAndUuid < 2)
                {
                    // Go to next item
                    pData += adLen;
                }
                else
                {
                    return TRUE;
                }
    
            }
        }
    
        // Match not found
        return FALSE;
    }
    

    希望这对您有所帮助。

    David。

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

    你好、David

    感谢您花时间提供帮助。

    我还´m 使用 NRF Connect 应用程序连接到我的外设、该应用程序可以在未连接的情况下检索服务以及设备名称信息、因此我的外设已经在广播这种信息、或者该应用程序运行一些程序来在未连接的情况下检索信息。 由于这些信息是立即显示的(应用程序打开,扫描半秒,并显示所有的信息,如下图),我相信它通过广告包获得所有的数据。

    下面以红色显示了两种类型的器件。 第一种是使用 CC2541。 第二种是使用 BT900。 两者都由应用在未连接的情况下发现服务0x181D (体重秤)。

    您发布的代码看起来很有前途、但传递给 静态 bool FindSerialStreamServer 的参数需要 pData 缓冲区来查找 UUID 以及 pData lenight 值。

    我认为它是在接收到的广播包的数据缓冲区内部查找,但在 Central_Scan Handler(Uint32 event, BLEAppUtil_msgHdr_t *pMsgData)函数(app_centr.c)内查看 Scan_Evt_Adv 的 advReport,我有一个空的 pData 缓冲区和0作为 dataLen。

    Adv 报告地址来自我的外设、但 dataLen 和 pData 为空。

    我启用了在 gap_scanner.h 文件中记录额外的数据字段:

    /// Default adv report fields to record
    #define SCAN_PARAM_DFLT_RPT_FIELDS         (SCAN_ADVRPT_FLD_EVENTTYPE|\
                                                SCAN_ADVRPT_FLD_ADDRTYPE |\
                                                SCAN_ADVRPT_FLD_ADDRESS  |\
                                                SCAN_ADVRPT_FLD_ADVSID   |\
                                                SCAN_ADVRPT_FLD_RSSI     |\
                                                SCAN_ADVRPT_FLD_DATALEN  |\
                                                SCAN_ADVRPT_FLD_TXPOWER  |\
                                                SCAN_ADVRPT_FLD_PRDADVINTERVAL  )

    仍然没有 Central_Scan 处理程序中的数据(app_central.c)

    您能否指出此报告中的哪个函数可能具有完整的数据缓冲区和长度信息以检查 UUID´s?

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

    您好、Alexandre、

    我认为本培训材料会有助于了解如何检索广播报告: 低功耗蓝牙扫描和广播(请参阅任务2:扫描任务2–打印扫描结果)。 请参见 pData_Evt_Adv Rpt_t 结构中包含的 Stk_Gap。 另外、请记住按照指南所述将 BLEAPPUTIL_ADV_REPORT 事件添加到 centralScanHandler 处理程序中。

    BR、

    David。

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

    谢谢 David 我找到了 Adv 报告中有 dataLen 和 pData 用于搜索信息的地方。

    案例已解决。

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

    哦、顺便说一下。 您能否提供一个文档以便我可以查看广播 pData 中每个字段的含义?

    最初的问题现已解决、由于我必须了解 Adv 数据的含义、因此欢迎使用任何可以提供帮助的文档。

    谢谢你

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

    您好、Alexandre、

    很高兴知道您能够继续前进。

    我建议查看 SysConfig 以进行首次参考。 如果您单击"?" 符号、您可以查看有关字段的信息。

    有关更多详细信息、还可以查看低功耗蓝牙规范中的字段: https://www.bluetooth.com/specifications/specs/core-specification-5-3/

    BR、

    David。