您好!
这是我们过去报告过的一个问题、但当我们首次启动支持时、无法重现。 尝试从我们的网关获取令牌时、低电平套接字代码返回-3020。 我们今晚将收集更多数据、并在早上进行更新。 我只是想把这个放在桌面上。
John
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.
您好!
这是我们过去报告过的一个问题、但当我们首次启动支持时、无法重现。 尝试从我们的网关获取令牌时、低电平套接字代码返回-3020。 我们今晚将收集更多数据、并在早上进行更新。 我只是想把这个放在桌面上。
John
所以,马蒂和我在这个晚上挖了几个小时。 在我的设备上、问题是间歇性的。 观察结果:
1)我们关闭了 MQTT,问题仍然存在。 所以、这不是两个函数相互干扰。
2)似乎有一个对 sprsend 的许多呼叫返回一个-1然后它泡沫向我们作为-3020。
3)我们把套接字代码拖回项目,即使这导致了我们过去的问题。 我们希望能够单步执行 C 代码、而不是汇编代码。
4)我们确认任务堆栈没有发散。 没有问题,有足够的头空间
5)当我们看到问题时,堆栈跟踪如下所示:
6)且 CPU 寄存器如下所示:
7)在函数 SendRequest 中,代码似乎从导轨上偏离了2244行。 我不是100%有信心、因为调试器有些难以预料。
当 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),如果你必须发送数据,而不去服务器,情况似乎就是这样。
我设置断点。 两个函数调用都未被命中。 在 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 版本6.10.0.5
我们确实使 HTTP 客户端正常工作、但不确定什么发生了变化。 我们的 MQTT 也在工作,实际上昨天我看到一个成功的发布从服务器到我们的设备。
否、将调用 SlNetSock_connect。 但是、 不会调用前面的 SlNetSock_startSec。
好的、这很好知道。 我将主机名设置回符号 "">URE" intelliportgw.eastus.cloudapp.azure.com,现在 URI 标记为0x15,包括设置 ISSECURE 标志。 我会看到发生了什么!