Observer例程怎样正确获取广播包内容
//输出扫描结果
            if(pEvent->discCmpl.numDevs > 0)
            {
                int i, j;
                // Increment index of current result (with wraparound)
                for(j = 0; j < pEvent->discCmpl.numDevs; j++)
                {
                    PRINT("Device %d : ", j);
                    for(i = 0; i < 6; i++)
                    {
                        PRINT("%x ", pEvent->discCmpl.pDevList[j].addr[i]);
                    }
                    PRINT("\n");
                    PRINT("Data %d : ", j);
                    for(i = 0; i < pEvent->deviceInfo.dataLen; i++)
                    {
                        PRINT("%x ", pEvent->deviceInfo.pEvtData[i]);
                    }
                    PRINT("\n");

                }
            }

image.png

可以参考一下截图里的代码

emobile_2022-12-08_11-15-53.png


不能理解怎样的模仿,我下的包里的例程ObserverAddDeviceInfo函数只有这两个参数uint8_t *pAddr, uint8_t addrType。

以下是我的模仿,并不能正确获取广播内容,还请给个明确的回复。

typedef struct
{
    uint8_t eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES
    uint8_t addrType;         //!< Address Type: @ref GAP_ADDR_TYPE_DEFINES
    uint8_t addr[B_ADDR_LEN]; //!< Device's Address
    uint8_t dataLen;                  //!< Length (in bytes) of the data field (evtData)
    uint8_t *pEvtData;                //!< Data field of advertisement or SCAN_RSP
} gapDevRec_t;
static void ObserverAddDeviceInfo(uint8_t *pAddr, uint8_t addrType,uint8_t *pData)
{
    uint8_t i;

    // If result count not at max
    if(ObserverScanRes < DEFAULT_MAX_SCAN_RES)
    {
        // Check if device is already in scan results
        for(i = 0; i < ObserverScanRes; i++)
        {
            if(tmos_memcmp(pAddr, ObserverDevList[i].addr, B_ADDR_LEN))
            {
                return;
            }
        }

        // Add addr to scan result list
        tmos_memcpy(ObserverDevList[ObserverScanRes].addr, pAddr, B_ADDR_LEN);
        tmos_memcpy(ObserverDevList[ObserverScanRes].pEvtData, pData, sizeof(pData));
        ObserverDevList[ObserverScanRes].addrType = addrType;
        ObserverDevList[ObserverScanRes].dataLen = sizeof(pData);

        // Increment scan result count
        ObserverScanRes++;
    }
}
case GAP_DEVICE_INFO_EVENT:
        {
            ObserverAddDeviceInfo(pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType,pEvent->deviceInfo.pEvtData);
        }
        break;

        case GAP_DEVICE_DISCOVERY_EVENT:
        {
            PRINT("Discovery over...\n");

            //输出扫描结果
            if(pEvent->discCmpl.numDevs > 0)
            {
                int i, j;
                // Increment index of current result (with wraparound)
                for(j = 0; j < pEvent->discCmpl.numDevs; j++)
                {
                    PRINT("Device %d : ", j);
                    for(i = 0; i < 6; i++)
                    {
                        PRINT("%x ", pEvent->discCmpl.pDevList[j].addr[i]);
                    }
                    PRINT("\n");

                    PRINT("Data len : %d", pEvent->discCmpl.pDevList[j].dataLen);
                    PRINT("Data %d : ", j);
                    for(i = 0; i < pEvent->discCmpl.pDevList[j].dataLen; i++)
                    {
                        PRINT("%x ", pEvent->discCmpl.pDevList[j].pEvtData[i]);
                    }
                    PRINT("\n");

                }
            }

            GAPRole_ObserverStartDiscovery(DEFAULT_DISCOVERY_MODE,
                                           DEFAULT_DISCOVERY_ACTIVE_SCAN,
                                           DEFAULT_DISCOVERY_WHITE_LIST);
            PRINT("Discovering...\n ");
        }
        break;



我修改的部分在case GAP_DEVICE_INFO_EVENT:这个case语句中,在发现过程中对你需要的数据进行枚举。

可以尝试根据我提供的截图进行修改。您修改的部分是在 case GAP_DEVICE_DISCOVERY_EVENT:这时已将是扫描结束了,罗列出扫描到的数据。


重复说一下? ? ??我下的包里的例程ObserverAddDeviceInfo函数只有这两个参数uint8_t *pAddr, uint8_t addrType。?

我没法参考你截图里 使用 ObserverAddDeviceInfo函数 ,?ObserverAddDeviceInfo函数复制下了广播数据中的地址,你截图里有传入广播包内容的数据,我没办法模仿。

不清楚各种数据结构体的用途,唯一知道是广播的数据在case GAP_DEVICE_INFO_EVENT:进行复制,没有解释扫描结束输出的结构体数据,头文件里的是有结构体数据的定义但都是用来干嘛的,每次扫描都产生了什么数据,用户层能用到什么数据?


目前我只能设置扫描白名单来获取指定地址设置的广播数据,当扫描到多个设备的广播数据这怎么区分?



首先ObserverAddDeviceInfo里面的参数可以自行修改如static void ObserverAddDeviceInfo(uint8_t *pAddr, uint8_t addrType,uint8_t *pEvtData);按照截图修改case GAP_DEVICE_INFO_EVENT:的程序;后面相应的语句再进行修改就可以了。结构体的对应的注释都可以在ch58xble_lib.h里面看到。扫描到多个设备通过MAC地址来区分。


上面改的没看?不是我不想修改。不要再继续扯皮了,没对扫描数据说明我怎么保存下我想要的数据,请给出扫描数据的说明。


你留个邮箱我把修改后的的工程发给你。扫描到的数据是广播包,可以看这篇博客的讲解BLE 蓝牙广播包结构分享 - debugdabiaoge - 博客园 (cnblogs.com)


这篇我看过了,这跟我需要知道TMOS广播扫描到的数据怎么使用没有半毛钱关系,你一直理解不了我想问什么可以换个人来解答,正在考虑要不要换其他家蓝牙单片机做广播扫描了,太难用了。邮箱:个人信息保护,已隐藏


获取广播包和扫描应答包在结构体中已包含了:

uint8_t *pEvtData;? ? ? ? ? ? ? ? //!< Data field of advertisement or SCAN_RSP

直接根据长度打印出来即可:

1.jpg


解决了,一眼难尽。从ObserverEventCB回调函数的switch分支GAP_DEVICE_INFO_EVENT里存下每次发现的设备信息,在扫描结束的时候打印出来,程序如下。

typedef struct
{
    uint8_t eventType; //!< Indicates advertising event type used by the advertiser: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES
    uint8_t addrType;         //!< Address Type: @ref GAP_ADDR_TYPE_DEFINES
    uint8_t addr[B_ADDR_LEN]; //广播的设备地址
    int8_t rssi;              //RSSI值
    uint8_t dataLen;          //广播的数据长度
    uint8_t advertisingData[31];//广播的数据
} scanDevRec_t;

static scanDevRec_t ObserverDevList[DEFAULT_MAX_SCAN_RES];
static uint8_t cnt;//扫描发现设备  计数

static void ObserverEventCB(gapRoleEvent_t *pEvent)
{
    switch(pEvent->gap.opcode)
    {
        case GAP_DEVICE_INIT_DONE_EVENT:
        {
            GAPRole_ObserverStartDiscovery(DEFAULT_DISCOVERY_MODE,
                                           DEFAULT_DISCOVERY_ACTIVE_SCAN,
                                           DEFAULT_DISCOVERY_WHITE_LIST);
            PRINT("Discovering...\n");
        }
        break;

        case GAP_DEVICE_INFO_EVENT:
        {
            // 从发现的设备里保存下设备地址 广播的数据内容
            ObserverDevList[cnt].addrType = pEvent->deviceInfo.addrType;
            ObserverDevList[cnt].rssi = pEvent->deviceInfo.rssi;
            ObserverDevList[cnt].dataLen = pEvent->deviceInfo.dataLen;
            tmos_memcpy(ObserverDevList[cnt].addr, pEvent->deviceInfo.addr, B_ADDR_LEN);
            tmos_memcpy(ObserverDevList[cnt].advertisingData, pEvent->deviceInfo.pEvtData, pEvent->deviceInfo.dataLen);
            cnt++;
        }
        break;

        case GAP_DEVICE_DISCOVERY_EVENT:
        {
            PRINT("Discovery over...\n");

            //打印扫描结果
            if (cnt > 0)
            {
                unsigned char i, j;
                for (i = 0; i < cnt; i++)
                {
                    PRINT("Device %d addr:", i);
                    for(j = 0; j < 6; j++)
                    {
                        PRINT("%x ", ObserverDevList[i].addr[j]);
                    }
                    PRINT("\n");
                    PRINT("Device %d advertising data:", i);
                    for(j = 0; j < ObserverDevList[i].dataLen; j++)
                    {
                        PRINT("%x ", ObserverDevList[i].advertisingData[j]);
                    }
                    PRINT("\n");
                }
            }
            else {
                PRINT("No device found.\n");
            }
            cnt = 0;
            PRINT("---------------------------------------------------------------------------\n");
            GAPRole_ObserverStartDiscovery(DEFAULT_DISCOVERY_MODE,
                                           DEFAULT_DISCOVERY_ACTIVE_SCAN,
                                           DEFAULT_DISCOVERY_WHITE_LIST);
            PRINT("Discovering...\n ");
        }
        break;

        default:
            break;
    }
}

广播扫描数据的结构体gapRoleEvent_t里的gapEventHdr_t gap;里存了在扫描过程中发现设备的事件,对gapEventHdr_t    opcode值判断来执行想要的动作。



楼主你贴的第二次代码思路已经对了,可是打印的时候选错数组了~


只有登录才能回复,可以选择微信账号登录