我们设计了一款采用 CC3220SFMODA 的产品、该产品从休眠状态中唤醒、与 AP 建立连接、然后向我们的服务器发送请求。 服务器以大约1KB 的有效负载进行响应、然后器件返回休眠状态。 作为测试的一部分、我们能够通过端口80、8443和443完成此事务、尽管我们更喜欢使用端口443。
我们注意到、当使用端口443时、来自服务器的响应数据包被延迟、因此我们的代码在 HttpClient_readResponseBody 中挂起、等待它返回。 使用端口80或8443时不会发生这种情况。 我们使用相同的证书来保护端口443和8443。
Wireshark 跟踪端口8443 (“正常”情况):
参考资料2636/2637,.208上服务器的响应是背对背的。 我们的设备在结束时再次休眠、我认为这是 TCP 重新传输的责任。 最终、整个过程在大约3秒内完成、虽然我看到 FIN 和 CC3220的 ACK 存在实际延迟、但这并不是一个关注的领域。
Wireshark 跟踪端口443 (问题案例):
这里的问题是,从服务器在.208上传送两个传输的时间介于271和514之间。 从串行调试中可以看到、HttpClient_readResponseBody 从271行返回预期的服务器响应、代码只是在再次调用后等待函数返回、因为 moreDataFlag 不清零。 当返回时、函数中没有其他数据、因此我们不了解我们在等待什么。 这实际上是数据如何从服务器返回的一个症状,我们正在尝试弄清楚为什么端口443上的操作会导致它以不同的方式运行。 我们还有其他软件产品、当通过端口443连接到同一服务器时、这些产品不存在此异常。
应用代码:
我们按照示例代码建议继续调用 HttpClient_readResponseBody、直到 MoreDataFlag 被清除。 第一个调用返回我们所期望的消息内容,第二个调用处理从服务器发送的其余内容。
包含调试语句的代码部分:
Len = 0;
int rOnce = 0;
操作
{
Display_printf (display、0、0、"do loop start、ReadResponse 读取\r\n);
RET = HttpClient_readResponseBody (httpClientHandle、data、sizeof (data)、
MoreDataFlag (&M);
display_printf (display、0、0、"read response done \r\n);
if (ret > 0){
//循环至少读取一次
ROnce = 1;
Display_printf (display、0、0、"rOnce \r\n");
}
//如果读取响应在此循环中至少返回一次数据并且当前循环为0,则为 True
if (rOnce && ret =0){
//数据数组的前2个元素由于某种原因被垃圾数据覆盖
//在此处手动修复问题
数据[0]='{';
DATA[1]= 0x22;// ASCII 中的双引号
Display_printf (display、0、0、"Manual Fix \r\n);
}
if (ret < 0)
{
printError ("httpTask:Response body processing failed"、ret);
}
display_printf (display、0、0、"display print:%.*s end line \r\n"、ret、data);
len += ret;
display_printf (display、0、0、"display print done LEN =%d \r\n"、len);
Display_printf (display、0、0、"MoreDataFlag =%d \r\n"、MoreDataFlag);
}
while (moreDataFlag);
运行时在端口8443上的串行输出:
执行循环启动、读取 readResponse
读取响应完成
rOnce
手动修复
显示:{"消息":"成功"、"已启用":true、"心轴排定":{"星期日":["10"、"20"、"13"、"16"]、"星期一":["10"、"20"、"20"、"19"、"6"]、"19"、"19"、"19"、"19"、"19"、"2022"、"10"、"6"、"10"、"18"、"2022"、"10"、"10"、"10"、"2022"、"10"、"10"、"10"、"10"、"2022"、"10"、"10"、"10"、"10"10"、10"、10"、10"、10"、10"、10"、10"、10"、10"、"2022"、10"、10"、10"、10"、10"、10"、10"、"2022"、10"、10"、10"、10"、10"、10"、10
显示打印完成 LEN = 339
MoreDataFlag = 1.
执行循环启动、读取 readResponse
读取响应完成
手动修复
显示打印: 结束行
显示打印完成 LEN = 339
MoreDataFlag = 0
运行时在端口443上的串行输出:
执行循环启动、读取 readResponse
读取响应完成
rOnce
手动修复
显示:{"消息":"成功"、"已启用":true、"心跳时间表":{"星期日":["10"、"20"、"13"、"16"]、"星期一":["10"、"20"、"20"、"19"、"6"]、"19"、"2022"、"10"、"17"、"10"、"10"、"2022"、"6"、"10"10"、"2022"、""、"10"、"10"、"10"、"2022"、"10"、"10"、10"、10"、"2022"、"10"、"10"、10"、10"、"2022"、10"、10"、"2022"、10"、10"、10"、10"、10"、10"、10"、10"、10"、10"、10"、10"、10"、10"、"2022"、10"、10"、10"、10"、10"、10"、10
显示打印完成 LEN = 339
MoreDataFlag = 1.
执行循环启动、读取 readResponse
读取响应完成
手动修复
显示打印: 结束行
显示打印完成 LEN = 339
MoreDataFlag = 0
工具版本:
Simplelink 版本:4.40.07
编译器版本:TI v20.2.7.LTS
XDCtools 版本:3.62.1.14_core
我们对如何处理这种情况的任何想法都表示赞赏。