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.

[参考译文] LAUNCHXL-CC3235SF:在 P2P 模式下进行对等扫描和连接(WiFi Direct)

Guru**** 2576215 points
Other Parts Discussed in Thread: CC3235SF

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1000771/launchxl-cc3235sf-peer-scan-and-connect-in-p2p-mode-wifi-direct

器件型号:LAUNCHXL-CC3235SF
主题中讨论的其他器件:CC3235SF

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/997637/launchxl-cc3235sf-p2p-wifi-direct-in-network-terminal

如上面的链接中所述、我尝试手动扫描和连接两个 CC3235SF LaunchPad 之间的 P2P 连接。

根据 swru445网络处理器指南文档中的4.5.4

要检索对等设备、请激活 WiFi Direct 扫描策略、然后有两种方法可以搜索对等设备、即调用 P2P_DEVFOUND 事件或 sl_WlanGetNetworkList API。

我尝试了两种方法来检索对等项。 我 可以 在 P2P_DEVFOUND 事件中找到附近的对等器件、但无法在 SL_WlanGetNetworkList 中找到(返回值为0)

这是我的代码。(我修改'network_termination'示例)

(WiFi 直接策略集 Role_Negotiate 和 NEG_INITIATER_RAND_BACKOFF)

/* start p2p mode */
int32_t _setP2Pparams(void)
{
    int32_t    ret ;
    int32_t    Mode;
    uint8_t    channels[4] = {0};
    uint8_t    nameLen = 0;

    /* Sets role negotiations: P2P intent and negotiation initiator */
    ret =
        sl_WlanPolicySet(SL_WLAN_POLICY_P2P,
                         SL_WLAN_P2P_POLICY(
                             SL_WLAN_P2P_ROLE_NEGOTIATE,
                             SL_WLAN_P2P_NEG_INITIATOR_RAND_BACKOFF),
                         NULL, 0);
    ASSERT_ON_ERROR(ret, WLAN_ERROR);

    // connection policy for auto connection : auto, fast, anyp2p, auto provisioning(not p2p)
//    ret = sl_WlanPolicySet(SL_WLAN_POLICY_CONNECTION, SL_WLAN_CONNECTION_POLICY(1, 0, 1, 0), NULL, 0);
//    ret = sl_WlanPolicySet(SL_WLAN_POLICY_CONNECTION, SL_WLAN_CONNECTION_POLICY(1, 1, 0, 0), NULL, 0);
//    if (ret < 0)
//    {
//        UART_PRINT(
//            "Network Terminal - p2p wlanPolicy(connect) set fail \n");
//    }

    /* Set the P2P device type,
     * which is a part of the discovery process. Default is 1-0050F204-1 */
    ret =
        sl_WlanSet(SL_WLAN_CFG_P2P_PARAM_ID, SL_WLAN_P2P_OPT_DEV_TYPE,
                   strlen(P2P_DEVICE_TYPE),
                   (const  uint8_t *)P2P_DEVICE_TYPE);
    ASSERT_ON_ERROR(ret, WLAN_ERROR);

    /* Configure device listen and operation channels */
    channels[0] = LISTEN_CHANNEL;
    channels[1] = LISTEN_REGULATORY_CLASS;
    channels[2] = OPRA_CHANNEL;
    channels[3] = OPRA_REGULATORY_CLASS;

    ret =
        sl_WlanSet(SL_WLAN_CFG_P2P_PARAM_ID, SL_WLAN_P2P_OPT_CHANNEL_N_REGS,
                   sizeof(channels),
                   channels);
    ASSERT_ON_ERROR(ret, WLAN_ERROR);

    nameLen = sizeof(app_CB.P2P_CB.p2pDeviceName);

    /* Print the device's name */
    ret =
        sl_NetAppGet(SL_NETAPP_DEVICE_ID, SL_NETAPP_DEVICE_URN, &nameLen,
                     (uint8_t*)&app_CB.P2P_CB.p2pDeviceName[0]);
    ASSERT_ON_ERROR(ret, NETAPP_ERROR);

    UART_PRINT("\n\r[p2pstart] : Starting NWP in P2P role..\n\r");

    UART_PRINT("\n\rDevice name: %s\n\r", &app_CB.P2P_CB.p2pDeviceName);

    /* Set role to P2P and perform NWP reset */
    ret = sl_WlanSetMode(ROLE_P2P);
    ASSERT_ON_ERROR(ret, WLAN_ERROR);

    ret = sl_Stop(SL_STOP_TIMEOUT);
    ASSERT_ON_ERROR(ret, DEVICE_ERROR);

    Mode = sl_Start(0, 0, 0);

    if(Mode != ROLE_P2P)
    {
        UART_PRINT(
            "\r\n[p2pstart] : Failed to configure device to P2P mode...\r\n");
        ASSERT_ON_ERROR(Mode, DEVICE_ERROR);
        return(-1);
    }
    else
    {
        app_CB.P2P_CB.P2PsecParams.Key = (signed char *)"";
        app_CB.P2P_CB.P2PsecParams.KeyLen = strlen(
            (const char*)app_CB.P2P_CB.P2PsecParams.Key);
        app_CB.P2P_CB.P2PsecParams.Type = SL_WLAN_SEC_TYPE_P2P_PBC;
        app_CB.Role = ROLE_P2P;
    }

    /* enable scan policy */
    _u32 intervalInSeconds = 10;
    ret = sl_WlanPolicySet(SL_WLAN_POLICY_SCAN, SL_WLAN_SCAN_POLICY(1, 1), (_u8*)&intervalInSeconds, sizeof(intervalInSeconds));
    if (ret < 0)
    {
        UART_PRINT(
                "Network Terminal - p2p wlanPolicy(scan) set fail \n");
    }

    return(ret);
}

/* p2pscan command callback */
int32_t cmdP2PScancallback(void *arg)
{
    int32_t         ret = -1;
    uint8_t         triggeredScanTrials = 0;
    ScanCmd_t       ScanParams;
    _u32 intervalInSeconds = 10, getIntervalTime;
    _u32 length = sizeof(intervalInSeconds);
    _u8 policy = 0;

    /* set Scan policy */
    ret = sl_WlanPolicySet(SL_WLAN_POLICY_SCAN, SL_WLAN_SCAN_POLICY(1, 1), (_u8*)&intervalInSeconds, sizeof(intervalInSeconds));
    if (ret < 0)
    {
        UART_PRINT(
            "Network Terminal - p2p wlanPolicy(scan) set fail %d\n\r", ret);
    }

    ret = sl_WlanPolicyGet(SL_WLAN_POLICY_SCAN, &policy, (_u8*)&getIntervalTime, (_u8*)&length);
    if (ret < 0)
    {
        UART_PRINT(
            "Network Terminal - p2p wlanPolicy(scan) get fail %d\n\r", ret);
    }

    if (policy && SL_WLAN_SCAN_POLICY(0, 0))
    {
        UART_PRINT("scan policy is set to scan disable\n\r");
    }
    else if (policy && SL_WLAN_SCAN_POLICY(0, 1))
    {
        if (policy && SL_WLAN_SCAN_POLICY(1, 1))
        {
            UART_PRINT("scan policy is set to scan all ssid\n\r");
        }
        else
        {
            UART_PRINT("scan policy is set to scan hidden ssid\n\r");
        }
    }
    else if (policy && SL_WLAN_SCAN_POLICY(1, 0))
    {
        UART_PRINT("scan policy is set to scan visible ssid\n\r");
    }

    UART_PRINT("scan interval is %d\n\r", getIntervalTime);

    memset(&ScanParams, 0x0, sizeof(ScanParams));

    ScanParams.numOfentries = MAX_SSID_ENTRIES;

    /* Clear the results buffer */
    memset(&app_CB.gDataBuffer, 0x0, sizeof(app_CB.gDataBuffer));

    /* Get scan results from NWP -
        results would be placed inside the provided buffer */
    ret = sl_WlanGetNetworkList(ScanParams.index,
                                ScanParams.numOfentries,
                                &app_CB.gDataBuffer.netEntries[ScanParams.index]);

    /* If scan policy isn't set, invoking 'sl_WlanGetNetworkList()'
     * for the first time triggers 'one shot' scan.
     * The scan parameters would be according to the system persistent
     * settings on enabled channels.
     * For more information, see: <simplelink user guide, page: pr.>
     */
    if(SL_ERROR_WLAN_GET_NETWORK_LIST_EAGAIN == ret)
    {
        while(triggeredScanTrials < MAX_SCAN_TRAILS)
        {
            /* We wait for one second for the NWP to complete
             the initiated scan and collect results */
            sleep(1);

            /* Collect results form one-shot scans.*/
            UART_PRINT("trigger one-shot scan\n\r");

            /* Get scan results from NWP -
                results would be placed inside the provided buffer */
            ret = sl_WlanGetNetworkList(ScanParams.index,
                                        ScanParams.numOfentries,
                                        &app_CB.gDataBuffer.netEntries[ScanParams.index]);

            if(ret > 0)
            {
                break;
            }
            else
            {
                /* If NWP results aren't ready,
                 try 'MAX_SCAN_TRAILS' attempts to get results */
                triggeredScanTrials++ ;
            }
        }
    }

    if(ret <= 0)
    {
        UART_PRINT("\n\r[scan] : Unable to retrieve the network list %d\n\r", ret);
        return(-1);
    }
    /* Print the result table */
    printScanResults(ret);

    return ret;
}

        /* P2P_DEVFOUND event in slwlanevent handler */
        case SL_WLAN_EVENT_P2P_DEVFOUND:
        {
            UART_PRINT("\n\r[WLAN EVENT] P2P Remote device found\n\r");
            strncpy((char *)app_CB.P2P_CB.p2pPeerDeviceName, (char *)pWlanEvent->Data.P2PDevFound.GoDeviceName, pWlanEvent->Data.P2PDevFound.GoDeviceNameLen);
            app_CB.P2P_CB.p2pPeerDeviceName[pWlanEvent->Data.P2PDevFound.GoDeviceNameLen] = NULL;
            UART_PRINT("[WLAN EVENT] \tName: %s\n\r", app_CB.P2P_CB.p2pPeerDeviceName);
            UART_PRINT("[WLAN EVENT] \tName len: %d\n\r", pWlanEvent->Data.P2PDevFound.GoDeviceNameLen);
            UART_PRINT("[WLAN EVENT] \tMAC: %x:%x:%x:%x:%x:%x\n\r",
                       pWlanEvent->Data.P2PDevFound.Mac[0],
                       pWlanEvent->Data.P2PDevFound.Mac[1],
                       pWlanEvent->Data.P2PDevFound.Mac[2],
                       pWlanEvent->Data.P2PDevFound.Mac[3],
                       pWlanEvent->Data.P2PDevFound.Mac[4],
                       pWlanEvent->Data.P2PDevFound.Mac[5]);
            UART_PRINT("[WLAN EVENT] \tWpsMethod: %d\n\r", pWlanEvent->Data.P2PDevFound.WpsMethod);
            sem_post(&(app_CB.P2P_CB.DeviceFound));
        }

我尝试使用 sl_WlanConnect 连接到找到的对等设备(上图中的 mysimplelink_bf)、但没有响应。

如何检索(使用 getnetworklist API)并连接到对等设备? 请给我一些建议。

谢谢。

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

    您好!

    仔细查看您的代码、它在很大程度上是正确的。 您似乎基本上已经从网络终端示例中获取了代码、这应该很好。

    您是否还完全实施了 Jesu 建议的网络终端更改(如您提供的线程中所链接的)?

    此致、

    Michael

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

    Jesu 建议使用硬编码手动连接、但每次启动时都会更改器件的 SSID。

    因此、我添加了新命令"p2pScan"和"p2pConnect"。

    现在、我已经成功地使用"p2pConnect"命令连接了每个 CC3235器件。 我错过了每个器件都需要调用'sl_WlanConnect' API 进行连接的机会。

    但是、我仍然不理解"sl_WlanGetNetworkList" API 的工作。

    P2P_DEVFOUND 事件在找到器件时运行良好、但"SL_WlanGetNetworkList" API (称为 cmdP2PScancyallback)有时返回0、即使周围有对等器件、有时也找不到对等器件、有时也能正常工作。

    我在哪里找不到?

    谢谢。

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

    您好!

    扫描过程将需要一些时间、如果在启用扫描策略后立即调用 sl_WlanGetNetworkList API、则在返回扫描结果 API 之前、您可能没有从 P2P 对等设备接收到广播。 这是您无法在 sl_WlanGetNetworkList()中获得一致结果的最可能原因。

    我建议使用 P2P_DEVFOUND 事件回调作为扫描 P2P 对等设备的可靠方法。

    此致、

    Michael

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

    感谢你的答复。

    1.使用 P2P_DEVFOUND 事件回调时、我认为无法知道对等设备是否仍然存在(连接时)

    我想获得一个仍然有效的对等项列表。 我应该如何实现它?

    (我在启用扫描策略和调用"sl_WlanGetNetworkList"之间添加了"Sleep (5)"、但 API 结果未更改。)

     

    2.我尝试更改设备名称。

        /* Set the P2P device name */
        uint8_t deviceName[] = "TestDevice";
    
        nameLen = strlen((char*)deviceName);
    
        ret = sl_NetAppSet(SL_NETAPP_DEVICE_ID, SL_NETAPP_DEVICE_URN, nameLen, (uint8_t *)&deviceName[0]);

    根据 NWP 指南文档(4.5.3.1)、器件名称是 URN 的复合字符和两个随机字符。

    但我的器件不是。 它工作正常吗?

     

      

    请给我建议。

    谢谢。

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

    您好!

    您是否将 CC3235的 URN 更改为"TestDevice"? 使用 CC32xx Launchpad 进行测试时、我可以通过 Android 手机看到两个随机字符。

    我认为、在您的情况下、使用 P2P_DEVFOUND 事件将是最可靠的、如果您在收到该事件后立即连接并在附近看到所需的 P2P 网络、则应避免对等设备不再存在的任何问题。 使用 sl_Stop/sl_Start 重新启动 NWP 应该使器件重新扫描并在需要时返回该事件。

    此致、

    Michael

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

    感谢你的答复。

     

    [引用 userid="300198" URL"~/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1000771/launchxl-cc3235sf-peer-scan-and-connect-in-p2p-mode-wifi-direct/3702036 #3702036"]您是否将 CC3235的 URN 更改为"测试设备"?

    是的、我将 URN 更改为"TestDevice"。 我还尝试将 URL 更改为另一个字符、它是相同的(它不会生成随机字符。)

    我的代码是在之前的回复中编写的。

     

    [引用 userid="300198" URL"~/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1000771/launchxl-cc3235sf-peer-scan-and-connect-in-p2p-mode-wifi-direct/3702036 #3702036"]使用 sl_Stop/sl_Start 重新启动 NWP 时,应使器件再次扫描并在需要时返回该事件。

    我将尝试此解决方案。

     

    谢谢。

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

    有更新吗?

    器件名称后仍不会创建随机字符。 设备名称仅为设备 URN。

    我可以获得您测试过的代码吗?

    谢谢。

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

    您好!

    Michael 已离开办公室几天、明天就会回来。 他回来后很快就能跟进。

    此致、

    本·M

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

    我仍在等待您的回答...

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

    您好!

    我运行测试的代码只是 SDK network_terminal 示例中的 p2pstart 代码、未进行修改。 因此、我的 URN 仍然是默认值。 如果运行默认 network_terminal 示例、是否能够获取这些随机字符?

    此外、如果您执行 sl_Stop/sl_Start、是否再次获得 P2P_DEVFOUND?

    此致、

    Michael

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="300198" URL"~/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1000771/launchxl-cc3235sf-peer-scan-and-connect-in-p2p-mode-wifi-direct/3723361 #372336"]如果运行默认 network_terminal 示例,是否能够获取这些随机字符?

    是的、当默认的 network_terminal 示例时、我可以获得随机字符。

    但是、如果我使用"sl_NetAppSet" API 更改器件 URN、则不会。

    更改设备 URL 时不会出现随机字符是否正确?

     

    [引用 userid="300198" URL"~/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1000771/launchxl-cc3235sf-peer-scan-and-connect-in-p2p-mode-wifi-direct/3723361 #372336"]此外,如果执行 sl_Stop/sl_Start,是否再次获得 P2P_DEVFOUND?

    是的、我可以在 sl_Stop/sl_Start 之后再次获得 P2P_DEVFOUND。

    谢谢。

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

    您好!

    我查看了 NWP ROM 源代码、结果是、仅当 URN 仍设置为默认值时才会添加随机字符-一旦您将其从默认器件 URN 更改为默认值、则不会再添加随机字符。 因此、您看到的行为是正确的、是预期的行为。

    此致、

    Michael

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

    感谢你的答复。 我的所有问题都已得到解决。