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.

[参考译文] CC3220SF:配置停止后的网络扫描行为

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1294777/cc3220sf-network-scan-behaviour-after-provisioning-stop

器件型号:CC3220SF

尊敬的社区:

我使用定制板开发定制应用。  

对于我的应用、当路由器断开连接时、器件会进入配置模式、并扫描可用网络。 10分钟后、配置停止且仍在进行扫描。

但配置停止后、我在扫描网络时总是收到-2073错误。 在配置停止之前、扫描工作正常、我得到了可用的网络。 我在两次扫描之间提供了足够的时间(30秒)。  

为避免此错误、在配置 停止后、我现在使用 sl_stop 和 sl_start 来重新初始化 NWP、然后扫描正常工作、并且我没有收到-2073错误。

但我的问题是、配置停止时会发生什么情况、为什么必须重新初始化 NWP 才能正常进行扫描?  

 配置停止后、如何在没有收到-2073错误的情况下继续扫描并避免重新初始化 NWP?

谢谢。此致、

斯瓦普尼尔

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

    您好!

    您 在配置时是否使用了 sl_WlanGetNetworkList (),并为您提供了扫描结果? 基本上、在配置过程中、大部分 API 都应被阻止、您应该得到 SL_RET_CODE_PROVISIONING_IN_PROGRESS、因此与理论不一致。

    请提供一个代码片段、其中包含您应用的过程。

    此致、

    什洛米

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

    您好 Shlomi:

    感谢您的答复。

    在配置过程中、并行调用以下函数来扫描网络。 当扫描完成并且找到信号强度良好的已知网络时、器件已连接到网络、配置停止。 与配置并行执行此过程时没有遇到任何错误。

    int32_t provisioning_scanCallback(SlWlanNetworkEntry_t *netEntries)
    {
        int32_t         ret = -1;
        uint8_t         triggeredScanTrials = 0;
    
    
        /* Get list of the networks available */
         ret = sl_WlanGetNetworkList(0, 30, &netEntries[0]);
    
        /* 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(30);
    
                /* Get scan results from NWP -
                results would be placed inside the provided buffer */
                ret = sl_WlanGetNetworkList(0, 30, &netEntries[0]);
    
                if(ret > 0)
                {
                    break;
                }
                else
                {
                    /* If NWP results aren't ready,
                     try 'MAX_SCAN_TRAILS' attempts to get results */
                    triggeredScanTrials++ ;
                }
            }
        }
    
        return(ret);
    }
    
    static int16_t provisioning_ScanAndConnect(void)
    {
        int16_t iRetVal = 0;
        SlWlanNetworkEntry_t netEntries[30];
        _u8 i;
        Provisioning_AppContext *const pCtx = &gAppCtx;
        static bool bProvStpFlag;
    
        /* Reinitialize the NWP after provisioning is stopped */
        if(pCtx->currentState == PrvsnStatus_Stopped)
        {
            if(bProvStpFlag == false)
            {
                bProvStpFlag = true;
                iRetVal = sl_WlanSetMode(ROLE_AP);
                ASSERT_ON_ERROR(iRetVal);
    
                iRetVal = sl_Stop(SL_STOP_TIMEOUT);
                ASSERT_ON_ERROR(iRetVal);
    
                sleep(3);
    
               iRetVal = sl_Start(0, 0, 0);
               ASSERT_ON_ERROR(iRetVal);
               UART_PRINT("[Provisioning task]: NWP is reinitialized after provisioning stop\n\r");
            }
        }
    
        /* Wait for WLAN networks */
        sleep(5);
    
        /* Get list of the networks available */
        _i16 resultsCount = provisioning_scanCallback(netEntries);
        iRetVal = resultsCount;
    
        for(i=0; i < resultsCount; i++)
        {
    //        UART_PRINT("[Provisioning task]: Available scanned WLAN networks: %s MAC:[%02x:%02x:%02x:%02x:%02x:%02x]\n\r",
    //                   netEntries[i].Ssid, netEntries[i].Bssid[0], netEntries[i].Bssid[1], netEntries[i].Bssid[2],
    //                   netEntries[i].Bssid[3], netEntries[i].Bssid[4], netEntries[i].Bssid[5]);
    
            /* Compare every found network with saved network */
            if(strcmp((char*)gui8NetworkSSID, (const char*)netEntries[i].Ssid) == 0)
            {
                /* If signal strength of saved network is good, then connect to network  */
                if(netEntries[i].Rssi > -70)
                {
                    _u8  index;
                    _i8  ssid[32];
                    _i16 ssidLen;
                    _u8  macAddr[6];
                    SlWlanSecParams_t secParams;
                    SlWlanGetSecParamsExt_t secExtParams;
                    _u32 priority;
    
                    for(index = 0; index < SL_WLAN_MAX_PROFILES; index ++)
                    {
                        if(sl_WlanProfileGet(index, ssid, &ssidLen, macAddr, &secParams, &secExtParams, &priority) >= 0)
                        {
                            if(strcmp((char*)gui8NetworkSSID, (const char*)ssid) == 0)
                            {
                                bProvStpFlag = false;
                                SignalProvisioningEvent(PrvnEvent_Stopped);
                                iRetVal = sl_WlanSetMode(ROLE_STA);
                                ASSERT_ON_ERROR(iRetVal);
    
                                iRetVal = sl_Stop(SL_STOP_TIMEOUT);
                                ASSERT_ON_ERROR(iRetVal);
    
                                iRetVal = sl_Start(0, 0, 0);
                                ASSERT_ON_ERROR(iRetVal);
    
                                sl_WlanConnect((const _i8*)ssid, ssidLen, 0, (const SlWlanSecParams_t*)&secParams, 0);
    
                                UART_PRINT("[Provisioning task]: Connection established with WLAN!\n\r");
    
                                /* Jump out of last loop */
                                i = resultsCount;
                                iRetVal = PROV_SUCCESSFUL_CONNECTION_WITH_NETWORK;
    
                                /* Wait for connection */
                                sleep(5);
                                break;
                            }
                            else
                            {
                                iRetVal = PROV_NETWORK_PROFILE_ID_NOT_MATCHED;
                            }
                        }
                        else
                        {
                            iRetVal = PROV_FAILED_TO_GET_NETWORK_PROFILE;
                        }
                   }
                }
                else
                {
                    iRetVal = PROV_LOW_SIGNAL_STRENGTH_OF_WLAN_NETWORK;
                    break;
                }
            }
            else
            {
                iRetVal = PROV_COULD_NOT_FIND_SAVED_NETWORK;
            }
        }
        return iRetVal;
    }

    谢谢。此致、

    斯瓦普尼尔

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

    您好!

    奇怪的是、它在配置期间可以工作。

    因此, Prvproc Status_Stopped 状态下的 sl_Stop()-> sl_Start()是一种变通办法?

    基本上,当您收到该 Status_Stopped 事件时,可能是由于 NWP 中的进程过期,或直接从应用程序调用,在任何一种情况下 API 都应恢复正常。

    获取扫描请求的 EAGAIN 意味着扫描表为空。 如果禁用扫描并重新启用、会出现什么情况? 可通过调用以下命令来完成此操作:

    • sl_WlanPolicySet (SL_WLAN_POLICY_SCAN、SL_WLAN_SCAN_POLICY (0、0)、NULL、0);
    • sl_WlanPolicySet (SL_WLAN_POLICY_SCAN、SL_WLAN_SCAN_POLICY (1、1)、(_u8 *)&ScanInterval、sizeof (ScanInterval));

    什洛米

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

    你好

    是的 sl_Stop ()-> sl_Start () 只是目前的工作。

    我在以下序列中使用

    • sl_WlanPolicySet (SL_WLAN_POLICY_SCAN、SL_WLAN_SCAN_POLICY (0、0)、NULL、0);
    • sl_WlanPolicySet (SL_WLAN_POLICY_SCAN、SL_WLAN_SCAN_POLICY (1、1)、(_u8 *)&ScanInterval、sizeof (ScanInterval));

    但是、 扫描后我无法获得新网络、它只能检测旧网络。 该列表在扫描后不会更新。

    此致、

    斯瓦普尼尔

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

    您好!

    您能否详细说明以下内容:

    • 如何触发配置? 是否在初始化后自动执行或通过 API 手动执行?
    • 为什么要在配置期间扫描? 配置过程在内部进行扫描、并等待调试请求。 无论如何、在 通过 API (而不是自动触发的配置过程中)触发的配置过程中、大多数 API 都会被阻止并应返回 SL_RET_CODE_PROVISIONING_IN_PROGRESS 、因此命令甚至不会返回到 NWP (驱动程序返回此错误)。 我们首先更好地了解在您的 XML 文件中

    此致、

    什洛米

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

    您好!

    如何触发配置? 是否在初始化后自动执行或通过 API 手动执行?

    ->我正在使用开箱即用的演示作为参考,并在此基础上构建我的应用程序。 据我所知、如果在初始化期间没有网络、则 调用此 API 'SignalProvisioningEvent(Prvn Event_Triggered)'来触发配置、然后执行配置。 因此、如果我回答正确、配置始终是手动完成的、而不是自动完成。

    为什么要在配置期间扫描?  

    ->在应用程序运行期间,如果网络断开连接,我希望传感器提供一个设置工具,如果旧网络在一段时间后变为可用,它应该停止配置并连接到网络。

    如果在配置期间 API 被阻止、那么配置期间扫描是如何成功完成的、并显示可用的网络、至少直到配置停止?

    此致、

    斯瓦普尼尔

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

    您好!

    如果您使用的是 OOB、则需要手动操作。

    进入配置的代码是@wlan_sta_roe_up (),包括:

    retVal = sl_WlanProvisioning(pCtx->provisioningMode, ROLE_STA,
                                         PROVISIONING_INACTIVITY_TIMEOUT, NULL,0);

    从这一点开始,_SlDrvDriverIsApiAllowed ()宏应该为每个命令完成/事件测试来自 NWP 的状态位。  SL_IS_PROVISIONING_ACTIVE 此时应置位、并防止除停止配置、恢复默认值、停止/启动等之外的任何 API。

    不知道它在您的情况下为什么不同、您能否测试此位并查看得到了什么?

    此外、NWP 日志在这里可能会有所帮助。 它在 NWP 指南的第20章 https://www.ti.com/lit/ug/swru455m/swru455m.pdf?中、ts = 1700744809196&ref_url=https%253A%252F%252Fwww.google.com%252F

    此致、

    什洛米