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.

[参考译文] CC3235MODSF:HTTP:打开套接字时收到-3020无连接错误

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1225792/cc3235modsf-http-getting-a--3020-no-connection-error-when-opening-a-socket

器件型号:CC3235MODSF

您好!

这是我们过去报告过的一个问题、但当我们首次启动支持时、无法重现。 尝试从我们的网关获取令牌时、低电平套接字代码返回-3020。 我们今晚将收集更多数据、并在早上进行更新。 我只是想把这个放在桌面上。

John

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

    我们将等待您收集更多数据。

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

    所以,马蒂和我在这个晚上挖了几个小时。 在我的设备上、问题是间歇性的。 观察结果:

    1)我们关闭了 MQTT,问题仍然存在。 所以、这不是两个函数相互干扰。

    2)似乎有一个对 sprsend 的许多呼叫返回一个-1然后它泡沫向我们作为-3020。  

    3)我们把套接字代码拖回项目,即使这导致了我们过去的问题。 我们希望能够单步执行 C 代码、而不是汇编代码。  

    4)我们确认任务堆栈没有发散。 没有问题,有足够的头空间

    5)当我们看到问题时,堆栈跟踪如下所示:

    6)且 CPU 寄存器如下所示:

    7)在函数 SendRequest 中,代码似乎从导轨上偏离了2244行。 我不是100%有信心、因为调试器有些难以预料。

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

    尊敬的 Kobi:

    马蒂和我今天早上收集了更多的数据。 我们发现了-3020正在出现的地方。 它位于 getStatus (HttpClient_CB *CLI)中。

    以下是我们在发生错误的地方停止的屏幕截图:

    调用堆栈如下所示:

    为了浏览这些寄存器、如下所示:

    此致、

    John

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

    此外、我想下拉套接字代码的下一层以继续单步执行、但这是在我们上次拉入时导致硬故障问题的代码。 如果你们能够提供合适的编译标记、以便我们能够生成合适的代码、这将非常有帮助。

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

    在查看代码之后,我认为您可能还会从 SendRequest 函数中的局部变量中获得值:

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

      当 SlNetSock_recv 返回0时、使用 HttpClient_ENOCONNECTION。 当对等设备(本例中为 HTTP 服务器)关闭连接时、将会发生这种情况。 您可以通过查看监听器日志来验证这一点(您将看到来自服务器的 TCP FIN。  

    您可以从服务器检查日志以查找原因。 通常、它将基于某个空闲超时。

    看看代码-在这种情况下、sendRequest 似乎会尝试重新连接(请参阅 当 CONNECTED_STATE 为0时调用 HttpClient_connect)。

    你看到那个了吗? (即尝试重新连接)?

    也许您可以使 HttpClient_MAX_Request_Attempts 递增或在 HttpClient_sendRequest 的 while 循环中添加睡眠状态、以便服务器有更多时间清除套接字并接受新的连接请求。

    我不确定您是否需要针对该问题调试驱动程序的内部结构(因为这似乎是一种合理的行为)。

    BTW 您无需使用应用程序编译驱动程序代码即可对其进行调试。 我认为预构建的 库 已经支持调试了。 如果不是、您可以导入主机驱动程序项目并构建该项目以进行调试。

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

    尊敬的 Kobi:

    在连接的这一端、我没有数据包监听器。 这是我打算在本周末处理的问题。 但是、我们的网关团队能够同时嗅探和监视服务器上的日志。 他们从未看到任何建立 http 连接的尝试。 Wireshark 和服务器日志是空的。

    我确实看到尝试重新连接。 我将  HttpClient_MAX_Request_Attempts 推高 为20、然后推高为100。 在这两种情况下、我们都继续遇到-3020问题、并且连接失败。

    我们能够使用 Swagger 从我的 PC 连接到服务器、并且我们能够获得一个设备令牌。 所以 、这不是网络问题。

    我之所以想把这个库引入项目中、是因为当我们单步执行库中提供的任何函数时、我们最终只需单步执行汇编代码、这很耗时、而且很难解释清楚、因为我只是不认为 就像一个编译器。

    还有其他想法要尝试一下吗?

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

    您应该可以选择将调试器链接到包含源 C 文件的文件夹、而不是使用汇编语言进行调试。 我不使用 IAR、因此无法向您提供指令。 此外、可以导入 simplelink 项目、并确保它是使用"-g"选项构建的。

    关于服务器端的监听器-他们是否看到成功的连接? (我记得您以前能够连接、并认为这种情况偶尔发生)。 请检查(打印)"SlNetSock_connect"的结果。 我看不到连接如何成功(返回0),如果你必须发送数据,而不去服务器,情况似乎就是这样。

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

    同时检查(打印)来自 SlNetSock_startSec()  的结果- HttpClient_connect2()和 SlNetSock_connectURI ()中的结果。

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

    感谢您提供这些信息。

    我能够让监听器在本地工作。 当我运行我们的应用程序时、我没有看到任何 到我们服务器的流量。 当我收到 Swagger 的令牌时、我的机器和我们的服务器之间存在 TLS 流量和其他流量。 http_connect 表示已成功。  

    John  

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

    我设置断点。 两个函数调用都未被命中。 在 httpclient_connect2()中,此 if 语句返回 false:

    if ((intFlags & ISSECURED)|| getCliState (CLI、ISSECURED_STATE))

    intFlags 的值为0x10、ISSECURED 为0x02

    CLI 状态为0x02、ISSECURED_STATE 为0x80

    在 SlNetSock_connectURI 中、此 if 语句返回的值为 false:

    if (0!=(ISSECURED & URIFlags))&&(NULL!= secAttrib))

    URIFlags 为0x10、ISSECURED 为0x04。 secAttrib 为 NULL

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

    ISSECURED 应为0x04 (您使用的是什么 SDK?) 如果提供的 URI 以"https://"开头,则将其设置为 intFlags。 我相信这应该是你的情况。

    我认为 HTTP 客户端用于工作... 从那以后发生了什么?

    您认为没有调用 SlNetSock_connect?

     

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

    这是我的部分上的一个拼写错误、ISSECURED 确实是一个0x04。 我们使用的是 SDK 版本6.10.0.5

    我们确实使 HTTP 客户端正常工作、但不确定什么发生了变化。 我们的 MQTT 也在工作,实际上昨天我看到一个成功的发布从服务器到我们的设备。

    否、将调用 SlNetSock_connect。 但是、 不会调用前面的 SlNetSock_startSec。

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

    您的 URL 是否以"https://"?开头  

    如果是、则应设置 ISSECURED、然后它应通过  SlNetSock_startSec。

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

    当前传递给 httpdclient_connect2的主机名是硬编码的 IP 地址。 下面是为进行连接而传递的变量的屏幕截图:

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

    即使是硬编码的 IP 地址也应包含"https://",例如"">">https://192.168.1.1"。

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

    好的、这很好知道。 我将主机名设置回符号 "">URE" intelliportgw.eastus.cloudapp.azure.com,现在 URI 标记为0x15,包括设置 ISSECURE 标志。 我会看到发生了什么!

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

    嗯,就是这样。 我不知道它是如何改变的。 但回到符号 URL、使 Get 设备令牌正常工作。 我明天要做更多的测试、如果一切顺利、我会将此问题标记为已解决。 感谢您的支持、今天的节目简直太棒了!