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.

[参考译文] RTOS/CC3220MOD:SimpleLinkHttpServerEventHandler、不称为 Wen 使用 Safari 发布

Guru**** 2573695 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/674629/rtos-cc3220mod-simplelinkhttpservereventhandler-not-called-wen-posting-with-safari

器件型号:CC3220MOD

工具/软件:TI-RTOS

您好!

我面临着 Safari 的新问题。

我实现了一个网页、以使用自定义令牌配置一些参数(配置存储在闪存中、以便在重新启动之间保持不变)。

如果我在 Windows 上使用 Google Chrome (64+)或 Firefox (58+)或 Mac 上使用 Firefox (58+)来访问我的页面并填充配置、一切都正常。

但是、如果我尝试在 MacOSX Sierra 和 iPhone 7上使用 Safari 10、当我单击应用时、页面会重新加载、但配置未更改。

我放置了一些调试代码、使用 Safari 时似乎未调用 SimpleLinkHttpServerEventHandler (sl_NetApp_EVENT_HTTP_TOKEN_POST 事件未触发)。

调用 SimpleLinkNetAppRequestEventHandler。

我依赖第一个保存已发布配置、而第二个则是发送元数据、将浏览器重定向到另一个页面。

我感到困惑的是、使用 Safari、我可以使用标准 ROM 配置页面(它可以正常工作)配置器件、并且我尝试在我自己的页面中复制相同的架构、其中使用几个用户令牌__sl_P_Uxx 来管理配置。

Get 替代有效(当我加载页面时、自定义令牌在 SimpleLinkHttpServerEventHandler 中被替换、因此会触发 SL_NetApp_EVENT_HTTP_TOKEN_Get)。

但 Safari 的行为就好像它没有发布任何内容一样、我检查了两次 HTML、(因为它使用我的令牌)它与内置 ROM 配置相同。

正如我说过的、探测只影响非常奇怪的 Safari。

下面是我对 SimpleLinkNetAppRequestEventHandler 中的 POST 事件的响应:

案例 SL_NetApp_Request_HTTP_POST:
{
pNetAppResponse->Status = SL_NetApp_HTTP_RESPONSE_302_MOVE_APTERY;
pNetAppResponse->ResponseData.MetadataLen = preparePostMetadata (pMetadata);
pNetAppResponse->ResponseData.pMetadata = pMetadata;
pNetAppResponse->ResponseData.pPayload =空;
pNetAppResponse->ResponseData.PayloadLen = 0;
pNetAppResponse->ResponseData.Flags = 0;

}
中断; 

下面是 preparePostMetadata 函数:

uint16_t preparePostMetadata (char* pMetadata)
{
/* http 状态*/
char* qMetadata = pMetadata;
//类型
* qMetadata =(uint8_t) sl_netapp_request_metadata_type_status;
qMetadata++;
//长度
*(uint16_t *) qMetadata =(uint16_t) 2;
qMetadata+=2;
//值
*(uint16_t *) qMetadata =(uint16_t) sl_NetApp_HTTP_RESPONSE_302_MOVE_TEMPRATICE_TEMPRAT= /*不需要内容,因此浏览器将保持在同一页上*/
qMetadata+=2;

/*位置*/
//类型
* qMetadata =(uint8_t) sl_netapp_request_metadata_type_http_location;
qMetadata++;
//长度
//char* newaddr ="192.168.1.235:443/MQTT.html";
char* newaddr ="/mqtp.html";
*(uint16_t *) qMetadata =(uint16_t) strlen (newaddr);
qMetadata+=2;
//值
memcpy (qMetadata、newaddr、strlen (newaddr));
qMetadata+= strlen (newaddr);

返回 qMetadata - pMetadata;
} 

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

    我们没有听说过与 Safari 和 CC3220的内部 HTTP 服务器的互操作性问题、但这并不是不可能的。
    因为所有内容都能与 Chrome 和 Firefox 配合使用、并不意味着 Safari 也能正常工作。 浏览器不是很标准化、因此不同的浏览器与网页的交互方式不同。

    如果您在使用 Chrome (或其他工作浏览器)然后使用 Safari (或其他问题浏览器)执行 POST 操作时、在 Mac 上使用 Wireshark 或类似软件捕获 CC3220和浏览器之间的数据包、则可能会使情况更清楚。 查看 HTTP 请求流程以及两个浏览器的不同之处可能会揭示有关 SimpleLinkHttpServerEventHandler 为何不触发的线索。 如果您可以执行这些捕获并共享它们、这将会很有帮助。

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

    您好、Michael、感谢您的回答。

    使用 Safari 保存表单仍然没有成功。 我 现在尝试了11beta 版,但问题仍然存在。

    您会发现随附的 Chrome 64和 Safari 11的 Wireshark 捕获(我将 NWP 网络服务器从 HTTPS 切换为 HTTP、使流量为纯文本)。

    Simplelink 位于地址192.168.100.21。  

    在捕获的文件中、在按下应用按钮后、会尝试更改用于访问 Web 服务器的器件密码(__sl_P_U.P)。 忽略尚未实现的"未知令牌"。

     如果我们找不到解决方案、那么直接在 SimpleLinkNetAppRequestEventHandler 中管理帖子是否可行?

    Damiano

    e2e.ti.com/.../capture.zip

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

    感谢您提供 Wireshark 捕获。 Safari 的问题似乎在于它在 HTTP POST 正文的开头对 TCP 数据包进行分段。 这是另一位客户也遇到的错误、如下所述:
    e2e.ti.com/.../672173

    通过 Wireshark 捕获、我们将有更轻松的时间复制和验证错误、我一定会向网络处理器固件相关人员展示这一点。 遗憾的是、有关此错误修复的计划仍不确定、因此可能需要一段时间才能向 NWP 服务回送添加修补程序。

    同时、如果您需要与 Safari 兼容、则可能需要使用在主机 MCU 上运行的某些 HTTP 服务器实现。 这样做的目的是、您将使用该库来构建 HTTP 服务器响应、这与构建302响应的方式非常相似、并通过通用 TCP 套接字将所有内容推入其中。

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

    我将推迟到发布、等待 TI 同时修复。
    如果没有、由于未调用 SimpleLinkHttpServerEventHandler、但 SimpleLinkNetAppEventHandler 会触发 intad、您认为我可以从 TLV 表中提取 POST 值吗?

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

    是的、可以从 SimpleLinkNetAppRequestEventHandler 中的 HTTP POST 头数据中获取 POST 值。
    当由于 Safari 发出 HTTP POST 请求而触发 NetApp 请求处理程序时,POST 数据将与 netAppRequest->requestData.pMetadata 中的其余元数据一起传递回。 您可以使用字符串查找函数在元数据中搜索预期的令牌、然后以这种方式提取数据。

    我仍在调查并与网络处理器团队合作、看看这是预期行为还是只是针对错误的一些权变措施。

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

    对于 HTTP POST 请求未正确调用 HTTP 服务器事件回调时遇到的问题,已找到解决方法。
    如果将 HTTP POST 请求操作设置为“/api/1/netapp/ping_res”,则令牌将被正确检测并传递到回调。

    正在开发修复程序、但目前计划在今年第三季度进行修复。 如果您可以尝试使用变通办法将您的帖子请求定向到/api/1/netapp/ping_res、并查看该请求是否可以解决您的问题、我们将不胜感激。

    此致、
    Michael