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:更新过程中出现处理 SLNETERR_BSD_EAGAIN 错误

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1479115/cc3220sf-handling-slneterr_bsd_eagain-error-during-update-process

器件型号:CC3220SF

工具与软件:

社区、您好!

我在自定义应用程序中有 OTA 更新。 更新文件(.tar)位于服务器上。

更新过程中的某个时间、我会收到 SLNETERR_BSD_EAGAIN 错误。 当服务器在套接字超时之前没有响应时会发生这种情况。

我已将套接字超时设置为5秒、我认为服务器有足够的时间进行响应。

SLNETERR_BSD_EAGAIN 错误意味着重试,但在 ProcessOta()中,当该错误出现时,将停止 OTA 更新,显示错误消息"OTA_NOTIF_DOWNLOAD_ERROR" 。

为了避免这种情况、我将通过再次调用 GetChunk 回调尝试获取丢失的数据包、您也可以在下面的代码片段中看到。  

对于测试、我将重试尝试次数保持为10。

问题是、如果我不在两次尝试之间保持睡眠时间、则会连续出现相同的套接字超时错误、并且所有重试尝试都将消失。

保留此睡眠时间后、我仍然会收到此错误、但不会超过重试尝试次数。

我的问题是、为什么需要这个睡眠时间?

可能是 NWP 处理器繁忙而没有及时响应请求?

我无法理解这种行为。

以下代码片段来自函数 ProcessOta()的 ota_if.c 文件  

do
            {
                /* Now, fill the rest of the buffer (using GetChunk Callback) */
                rc = m_sessionCBs[m_ota.type].fGetChunk(m_ota.hSession, &m_ota.buff[nUnprocessed], OTA_BUFF_SIZE-nUnprocessed);
                if(rc > 0)
                {
                    /* Update counters with the actual number of bytes read */
                    m_ota.nTotalRead += rc;
                    nUnprocessed += rc;
                    ui8RetryCnt = 0;
                    LOG_DEBUG("ProcessOta:: read=%d (%d)", rc, m_ota.nTotalRead);
                }
                else if(rc == 0)
                {
                    /* mark end of input */
                    bEndOfInput = true;
                    LOG_DEBUG("ProcessOta:: read=0 (%d)", m_ota.nTotalRead);
                }
                else if((rc == SLNETERR_BSD_EAGAIN) && (ui8RetryCnt < OTA_PACKET_RETRY_COUNT))
                {
                    LOG_WARNING("ProcessOta:: Socket did not respond and trying again!");
                    sleep(1);
                }
                else
                {
                    LOG_ERROR("ProcessOta: ---- Can't get next chunk (%d)", rc);
                    return rc;
                }

                ui8RetryCnt++;
                if(ui8RetryCnt > OTA_PACKET_RETRY_COUNT)
                {
                    break;
                }
            }
            while(rc == SLNETERR_BSD_EAGAIN);

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

    您好!

    不确定您使用的 OTA 类型(本地或远程)、因为行为会略有不同。

    对于本地 OTA、NWP 是处理 HTTP 事务的服务器(使用 NetApp 机制)。

    对于远程 OTA、服务器位于云端、SL 上的 HTTP 客户端正在处理事务(因此实际上 SL 会在 NWP 上打开套接字)。

    我想您使用第二个选项。

    在这种情况下、我看不到 NWP 的繁忙状态、超时会更持久、为服务器提供更多的响应时间(因为这似乎是个问题、因为当您等待更多时它最终会成功)。

    Shlomi

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

    您好!

    感谢您的答复。  

    是的、我们正在测试远程 OTA。

    另外、我不明白的是得到 RC=0背后的原因。 因为在更新时、有时更新不完整并且 RC = 0。  

    在什么情况下 GetChunk 函数返回零? 因为如果服务器已断开连接或套接字已关闭、它应返回负值。

    在这种情况下、我们如何继续更新?

    此致、

    Swapnil

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

    您好!

    基本上,GetChunkData()调用 SlNetSock_recv() 并且返回值为0 应该意味着另一端关闭了连接。

    发生错误时、您会得到一个负值、因此0表示服务器断开了套接字。

    您是否看到返回值为0且更新成功的情况?

    Shlomi

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

    您好!

    否、当  SlNetSock_recv()的返回值为零时、更新会停止而不会成功。

    是否可以重新连接插槽并从断开的位置继续更新?

    如果是、如何才能做到这一点?

    此致、

    Swapnil

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

    现在有道理了。 0表示服务器端已关闭连接。

    我不知道从它离开的地方恢复数据的方法,在任何情况下,我认为它不依赖于客户端,只是从服务器获取数据。

    Shlomi