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.

[参考译文] CC3230SF:sl_NetAppDnsGetHostByName -在首次成功调用后立即返回 SL_API_ABORTED。

Guru**** 2482105 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1333501/cc3230sf-sl_netappdnsgethostbyname---returns-sl_api_aborted-right-after-the-first-successful-call

器件型号:CC3230SF

您好!  

工作环境:simplelink-7  

我正在使用 OTA、需要调用 sl_NetAppDnsGetHostByName 两次。 我看到我使它工作的第一个调用并返回- IP 地址、连接成功关闭、在另一个实例中使用相同的服务器名称进行第二个调用、它返回: SL_API_ABORTED。

我尝试过几件事:

1.注释掉动态 内存管理:sl_memory_Mgmt_dynamic、  

结果:应用程序能够在第二次调用时解析 IP 地址、但最终失败、因为其他函数无法分配内存。  

2.保持动态存储器以便 OTA 获得足够的存储器- sl_NetAppDnsGetHostByName 返回 sl_API_ABORTED。   

3. 增加堆从- 0x8000到0x10000 -它没有帮助。

如何解决此问题。  

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

    在第二次调用之前是否遇到任何异步事件(SimpleLinkFatalErrorEventHandler 或 SimpleLinkDeviceGeneralEventHandler)?

    您是否可以进入(或在驱动程序中添加打印件)第二个调用以准确地检查 其故障位置以及根本原因是什么?  

    您是否  从 simplelink 事件处理程序调用第二个 sl_NetAppDnsGetHostByName? (如果愿意、尝试在线程上下文中推迟调用)。

    一般而言、我们参考中的云 OTA 使用了 API 两次(一次 用于 CDN 服务器解析、然后用于文件服务器)-因此应该可以正常使用。

     

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

    感谢您的答复。

    我没有收到任何异步事件、但我会重新检查它。  

    关于故障、我收到错误- 2005年。 它在以下位置失败: verify_api_allowed(sl_opcode_silo_netapp);这是 API 函数的第一行。

    netAppDnsGetHostByName 是从线程而不是从事件处理程序调用的。  

    是的、我所使用的 OTA 函数与实施方式相同。 正如我说过的、我只能通过注释动态管理宏来使其运行。

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

    在我 为 SOCK 设置事件处理程序后-我在第一次 DNS 调用后立即看到意外事件:  [SOCK EVENT]-意外事件[200040000x]

    在此处添加更多信息:Ccarti Client_Close 函数在进行第二次调用之前得到调用。 意外事件来自正在关闭的服务器。   

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

    如果 在 netAppDnsGetHostByName 之后延迟对 Cdnb Client_Close 的调用 (或完全避免调用)会发生什么情况?

    您尝试关闭套接字时、它是否可能正忙?  

    我确定什么是200040000x -您可以使用以下代码吗?

    void SimpleLinkSockEventHandler(SlSockEvent_t *pSock)
    {
        if ( pSock->Event == SL_SOCKET_ASYNC_EVENT)
        {
            switch (pSock->SocketAsyncEvent.SockAsyncData.Type)
            {
            case SL_SSL_NOTIFICATION_WRONG_ROOT_CA:
                /* on socket error Restart OTA */
                LOG_INFO("SL_SOCKET_ASYNC_EVENT: ERROR - WRONG ROOT CA");
                LOG_INFO("Please install the following Root Certificate:");
                LOG_INFO(" %s\n\r", pSock->SocketAsyncEvent.SockAsyncData.pExtraInfo);
                break;
            default:
                /* on socket error Restart OTA */
                LOG_INFO("SL_SOCKET_ASYNC_EVENT socket event %d", pSock->Event);
            }
        }
    }

    另外、请尝试捕获 NWP 日志(请参阅 https://www.ti.com/lit/pdf/swru455的第20章)。

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

    添加上述代码并在关闭服务器连接前延迟5秒后、我仍然看到错误。  

    如何确保套接字不忙且可以关闭连接? 我看到 Cinci   Client_Close -呼叫 sl_close 但不确保套接字状态。

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

    在连接繁忙时调用关闭服务器应该是可以的。 只需询问你是否 在调用 closeServer 之前得到所有 HTTP 响应,因为我不知道原因是什么。

    原始 OTA 代码是否会失效? (因为我不熟悉此类问题)、还是只是您的自定义代码?

    您能否注释掉"关闭服务器"并检查 DNS 查询是否有效?

     我们需要 NWP 日志来(希望)获取更多有关 CloseServer 期间错误的信息。 套接字错误代码也可能有用。

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

    我发现了问题。 首先是堆问题。 将其增加到正确的数字可以解决这个问题。

    在我的情况下,我已经做了它,但每次我都在碰堆它 被消耗。 调试后,我发现使用指针调用 free()函数时没有释放内存。  上述函数中的 size 参数超出范围(我想它有一个垃圾编号)、这会阻止整个堆并导致 SL_DEVICE_EVENT_FATAL_DEVICE_ABORT 事件。

    需要修改驱动器函数、以便对以下函数的大小参数进行完整性检查。  

    所以我用 Memory_Free (块、大小)替换它来修复它。  

    /*
    *=========== 免费====
    */
    void free (void *ptr)
    {
    Alloc_Header *packet;

    if (ptr!= NULL){
    数据包=(((457px Alloc_Header *) ptr)-1;

    memory_free (NULL、(void *) packet->header.actualBuf、
    (packet->header.size +)
    ((char*) packet -(char*) packet -> header.actualBuf);

    感谢你的帮助 Kobi。