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/TI-RTOS-MCU:创建 http 帖子

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/568017/rtos-ti-rtos-mcu-creating-http-post

器件型号:TI-RTOS-MCU

工具/软件:TI-RTOS

您好!

我将 CCS v6.2与 tm41294xl 搭配使用我想像 http get 一样创建"http post "任务、我能否在 TI-RTOS 中获取任何链接或解决方案。  

此致、

Raghu DS

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

    您好 Raghu、


    是的,您可以在网络服务产品的 HTTP 客户端文档中找到一些示例 POST 代码。  例如、它可能位于以下位置:

    C:/ti/tirtos_tivac_2_16_01_14/products/ns_1_11_00_10/docs/html/index.html

    在 HTTP 客户端模块中、您将找到以下示例:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Steven、
    感谢您的回复、这是我的问题的答案、但在 TI_RTOS 或 Tivaware 中没有找到"ssswolfssl.h"和"sssl.h"等标题。
    因此、我遇到了错误#1965、我能不能获得任何建议或替代方法。

    此致、
    Raghu DS
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这些文件应在网络服务产品中找到。 它位于 TIRTOS 安装程序的产品文件夹下。

    C:/tirtos_tivac_2_16_01_14/products/ns_1_11_00_10/

    如果为此更新项目的编译器包含路径、则应找到该路径(例如、添加-ic:/tirtos_tivac_2_16_01_14/products/ns_1_11_00_10/packages、然后 添加#include 应找到)。

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

    您好 Steven、

    感谢您的回复、我提供了编译器的路径、如我的图像所示

    是将我添加到正确的位置、我使用的是 tirtos V 2_16_00_08。 但直到出现相同的错误- #1965无法打开源文件"ti/net/http/sswolfsl.h"。 您能帮我解决问题吗?

    此致、

    Raghu DS

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

    您好 Steven、

    我认为我在上面所做的操作可能是错误的、因为您建议我的项目已经包含路径"C:\ti_tirtos_tivac_2_16_00_08\products\ns_1_11_00_10\packages"

    但我在目录中搜索的 http 文件夹也不包含任何文件 ,如"ssswolfsl.h"和"sssl.h"。 下面是我的目录映像

    我是否需要更新任何内容、正如 tirtos 版本存在的任何问题所说。

    谢谢、

    此致

    Raghu DS

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

    Raghu、


    是的、您实际上非常接近、但这是添加编译器路径的错误位置。  应将其添加到编译器设置的"Include Options"子段下。  请参阅屏幕截图。

    请注意、如果您的应用基于 HttpGet 示例、则应该已经为您正确设置了路径。  但是、如果需要添加它、则应该像屏幕截图所示那样完成。

    我在目录中搜索的还有 http 文件夹不包含任何文件 ,如"ssswolfsl.h"和"sssl.h"

    确定这是问题-文档已过期。 文件“sssl.h”和“ssswolfsl.h”在 TIRTOS 2.16中变为“ti/net/tls.h”。  因此、您应该只需要包含"ti/net/tls.h"

    Steve

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Steven、
    感谢您的回复。 我包括了您说过的路径、现在我的代码是

    HTTPCLI_StructCLI;
    struct sockaddr_in addr;
    INT 状态;
    字符数据[64];
    char buf[64];
    int len;
    内转台;
    bool MoreFlag = false;

    /*请求字段*/
    HTTPCli_Field field[2]={
    { HTTPStd_field_name_host、HOSTNAME}、
    { NULL,NULL }
    };

    /*响应字段筛选器*/
    字符 respFields[2]={
    HTTPStd_field_name_content_length、
    null
    };

    //设置 wolfSSL 上下文
    //对于 SimpleLink,请改用 SSSL_setContext ()
    // SSWolfssl_context (ctx);

    //构造 ststic HTTP 客户端实例
    HTTPCLI_construct(&CLI);
    System_printf ("construction");
    system_flush();

    HTTPCLI_setRequestFields(&CLI);
    System_printf ("setRequestFields \n");
    system_flush();

    HTTPCLi_setResponseFields (&CLI、respFields);
    System_printf ("setResponseFields \n");
    system_flush();

    //安全连接到 HTTP 服务器
    HTTPCL_CONNECT (&CLI、&addr、HTTPCL_TYPE_TLS、NULL);
    System_printf ("connect \n");
    system_flush();

    //make HTTP 1.1 POST 请求
    //
    //向服务器发送请求
    //
    //post /index.html HTTP/1.1
    HTTPCLI_sendRequest (&CLI、HTTPStd_post、"/index.html"、true);
    // HTTPCLI_sendRequest (&CLI、HTTPStd_POST、Request_URI、false);
    System_printf ("sendRequest \n");
    system_flush();

    //发送附加字段
    //
    //内容长度:
    //
    HTTPCL_sendField (&CLI、HTTPStd_field_name_content_length、len、false);
    System_printf ("sendField \n");
    system_flush();

    //发送请求正文
    //
    //
    HTTPCLI_sendRequestBody (&CLI、data、strlen (data));
    System_printf ("sendRequestBody \n");
    system_flush();

    //获取已处理的响应状态
    //
    //HTTP/1.1 200正常
    状态= HTTPCLI_getResponseStatus (&CLI);
    System_printf ("getResponseStatus \n");
    system_flush();

    //检查 HTTP 返回状态并处理剩余响应
    if (status =HTTPStd_OK){
    执行{
    //过滤响应标头并获取设置响应字段
    //
    //...
    //Content-type:text/xml;charset=UTF-8。\r\n
    //内容长度:34.
    //...
    RET = HTTPCLI_getResponseField (&CLI、buf、sizeof (buf)、&moreFlag);

    //如果字段是内容长度,则以 buf 为单位处理数据
    //Zero 是 resfields 数组中内容长度的索引
    if (ret =0){
    len =(int) strtoul (buf、NULL、0);


    }while (ret!= HTTPCLI_FIELD_ID_END);
    while (len >0){
    len -= HTTPCLI_readRawResponseBody (&CLI、buf、sizeof (buf));
    //…… 处理缓冲数据并保存...



    HTTPCLI_DISCONNECT (&CLI);
    HTTPCL_析 构(&CLI);
    system_printf ("http POST 成功\n"\});
    system_flush();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    构建时:
    错误:"#20 identifier "ctx"未定义"

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    包括时、
    int ctx=1;
    错误:"未解析的符号 SSWolfssl_context、首先在./HttpGE.obj 中引用"
    当我运行此操作时、我在控制台上获得了打印件:

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    在注释时:
    // SSWolfssl_context (ctx);

    运行后打印控制台:

    闪存中的 SS
    启动 HTTP GET 示例
    系统提供商设置为 SysMin。 停止目标以查看 ROV 中的任何 SysMin 内容。
    服务状态:DHCP:已启用: :000
    服务状态:DHCP:已启用:正在运行:000
    网络已添加:if-1:192.168.1.33
    服务状态:DHCP:已启用:正在运行:017
    构造
    setRequestFields
    setResponseFields
    连接
    sendRequest
    FSR = 0x0000
    HFSR = 0x40000000
    DFSR = 0x0000000b
    MMAR = 0xffffffff
    BFAR = 0xffffffff
    AFSR = 0x00000000
    正在终止执行...
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

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

    您好 Raghu、

    好的、我看到了问题。  事实证明、该文档中显示的示例未更新以更改 TLS 设置代码。

    您应该能够执行以下操作:

    1.从安全 HTTP GET 示例(针对 TivaC 的 https://get)复制 TLS 设置代码

    2.然后使用文档中示例中的 HTTP 代码进行开机自检

    它应该与此类似(请注意、我没有编译此代码、我只是进行了合并步骤1的代码的工作。 和2. 为您提供):

    空 https://Task (UArg0、UArgarg1)
    {
    bool MoreFlag = false;
    字符数据[64];
    内转台;
    int len;
    struct sockaddr_in addr;
    
    TLS_PARAMS tlsParams;
    TLS_Handle TLS;
    
    HTTPCLI_StructCLI;
    //请求字段
    HTTPCli_Field field[2]={
    {HTTPStd_field_name_host、"www.example.com}、
    { NULL,NULL }
    };
    
    //响应字段过滤器
    字符 respFields[2]={
    HTTPStd_field_name_content_length、
    null
    };
    
    startntp();
    
    TLS_PARAMS_INIT (&tlsParams);
    tlsParams.ca = ca;
    tlsParams.calen = calen;
    
    TLS = TLS_create (TLS_METHOD_CLIENT_TLSv1_2、&tlsParams、NULL);
    如果(!TLS){
    printError ("https://task: TLS create failed"、-1);
    }
    
    //构造静态 HTTP 客户端实例
    HTTPCLI_construct(&CLI);
    HTTPCLI_setRequestFields(&CLI);
    HTTPCLi_setResponseFields (&CLI、respFields);
    //安全连接到 HTTPS 服务器
    HTTPCL_CONNECT (&CLI、&addr、HTTPCL_TYPE_TLS、NULL);
    //发出 HTTP 1.1 POST 请求
    //
    //向服务器发送请求:
    //
    //发布/index.html HTTP/1.1
    //主机:www.example.com
    HTTPCLI_sendRequest (&CLI、HTTPStd_post、"/index.html"、true);
    //发送附加字段
    //
    //内容长度: 
    // 
    HTTPCL_sendField (&CLI、HTTPStd_field_name_content_length、len、true);
    //发送请求正文
    //
    // 
    HTTPCLI_sendRequestBody (&CLI、data、strlen (data));
    //获取已处理的响应状态
    //
    // HTTP/1.1 200正常
    状态= HTTPCLI_getResponseStatus (&CLI);
    //检查 HTTP 返回状态并处理剩余响应
    if (status =HTTPStd_OK){
    执行{
    //过滤响应标头并获取设置响应字段
    //
    //...
    //内容类型:text/xml;charset=UTF-8
    //内容长度:34.
    //...
    RET = HTTPCLI_getResponseField (&CLI、buf、sizeof (buf)、&moreFlag);
    //如果字段是内容长度,则以 buf 为单位处理数据
    //零是 respfields 数组中内容长度的索引
    如果(ret =0){
    len =(int) strtoul (buf、NULL、0);
    }
    } while (ret!= HTTPCLI_FIELD_ID_END);
    while (len >0){
    len -= HTTPCLI_readRawResponseBody (&CLI、buf、sizeof (buf));
    //... 处理缓冲数据并保存...
    }
    }
    HTTPCLI_DISCONNECT (&CLI);
    HTTPCL_析 构(&CLI);
    
    
    

    Steve

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Steven、
    感谢您的支持和回复、
    startntp();
    写入该函数的原因、它的定义是什么。
    我遇到编译错误:
    未解析的符号 startNTP、首先在./ETHController.obj 中引用

    我删除此行,编译已完成,但正在终止执行。

    此致、
    Raghu DS
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    startntp()函数用于启动与 NTP 服务器的通信。 这样做是为了获取当前时间、TLS 需要该时间才能正常工作。

    对 startntp()的调用来自 https://get 示例。

    再想一想、我认为首先成功导入/构建/运行 https://get 示例(它将涵盖 NTP 设置)会对您有很好的帮助、然后、一旦完成后、这些操作就会返回到您的 POST 应用程序。

    Steve
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Steven、
    感谢您的支持和答复,我仔细听取了您的建议,并在所有需要的地方进行了编辑,例如 startntp()定义及其所有内容。
    请阅读我的代码:
    ================================================================================
    bool MoreFlag = false;
    INT 状态;
    字符数据[64];
    int len=0;
    内转台;
    内部 CA;
    int calen;
    struct sockaddr_in addr;

    TLS_PARAMS tlsParams;
    TLS_Handle TLS;

    HTTPCLI_StructCLI;
    /*请求字段*/
    HTTPCli_Field field[3]={
    { HTTPStd_field_name_host、HOSTNAME}、
    {HTTPStd_field_name_user_agent、user_agent}、
    { NULL,NULL }
    };

    /*响应字段筛选器*/
    字符 respFields[2]={
    HTTPStd_field_name_content_length、
    null
    };

    while (WifiAlive!= true){
    Task_sleep (10);


    startntp();

    TLS_PARAMS_INIT (&tlsParams);
    tlsParams.ca = ca;
    tlsParams.calen = calen;

    TLS = TLS_create (TLS_METHOD_CLIENT_TLSv1_2、&tlsParams、"cert");
    if (!TLS){
    System_printf ("https://task: TLS create failed"、-1);


    HTTPCLI_construct(&CLI);

    HTTPCLI_setRequestFields(&CLI);

    HTTPCLi_setResponseFields (&CLI、respFields);

    HTTPCL_CONNECT (&CLI、&addr、HTTPCL_TYPE_TLS、NULL);

    HTTPCLI_sendRequest (&CLI、HTTPStd_post、"/index.html"、false);

    HTTPCL_sendField (&CLI、HTTPStd_field_name_content_length、len、false);

    HTTPCLI_sendRequestBody (&CLI、data、strlen (data));

    状态= HTTPCLI_getResponseStatus (&CLI);

    if (status =HTTPStd_OK){
    执行{
    RET = HTTPCLI_getResponseField (&CLI、buf、sizeof (buf)、&moreFlag);

    if (ret =0){
    len =(int) strtoul (buf、NULL、0);


    }while (ret!= HTTPCLI_FIELD_ID_END);
    while (len >0){
    len -= HTTPCLI_readRawResponseBody (&CLI、buf、sizeof (buf));
    //…… 处理缓冲数据并保存...



    HTTPCLI_DISCONNECT (&CLI);
    HTTPCL_析 构(&CLI);

    system_printf ("http post on wifi sumn");
    system_flush();
    ================================================================================================================
    它运行正常、并在控制台上打印最后一行:
    WiFi 上的 HTTP POST 成功
    ================================================================================================

    我想现在 HTTP 帖子可能会这样做、
    Q1)如何知道它已发布到我的服务器、能否尝试 www.example.com 以外的其他版本、是否需要进行任何更改?
    Q2)它用于 Wifi、如何根据我在以太网上的需要更改以太网、我尝试了突然退出的相同设置?

    感谢您的支持、

    此致、
    Raghu DS
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Steven、
    感谢您的支持和回复,我已经浏览了 https://getwifi,并定义了 startntp()及其所有内容。
    请查看我的代码:
    ===================================
    bool MoreFlag = false;
    INT 状态;
    字符数据[64];
    int len=0;
    内转台;
    内部 CA;
    int calen;
    struct sockaddr_in addr;

    TLS_PARAMS tlsParams;
    TLS_Handle TLS;

    HTTPCLI_StructCLI;
    /*请求字段*/
    HTTPCli_Field field[3]={
    { HTTPStd_field_name_host、HOSTNAME}、
    {HTTPStd_field_name_user_agent、user_agent}、
    { NULL,NULL }
    };

    /*响应字段筛选器*/
    字符 respFields[2]={
    HTTPStd_field_name_content_length、
    null
    };

    while (WifiAlive!= true){
    Task_sleep (10);


    startntp();

    TLS_PARAMS_INIT (&tlsParams);
    tlsParams.ca = ca;
    tlsParams.calen = calen;

    TLS = TLS_create (TLS_METHOD_CLIENT_TLSv1_2、&tlsParams、"cert");
    if (!TLS){
    System_printf ("https://task: TLS create failed"、-1);


    HTTPCLI_construct(&CLI);

    HTTPCLI_setRequestFields(&CLI);

    HTTPCLi_setResponseFields (&CLI、respFields);

    HTTPCL_CONNECT (&CLI、&addr、HTTPCL_TYPE_TLS、NULL);

    HTTPCLI_sendRequest (&CLI、HTTPStd_post、"/index.html"、false);

    HTTPCL_sendField (&CLI、HTTPStd_field_name_content_length、len、false);

    HTTPCLI_sendRequestBody (&CLI、data、strlen (data));

    状态= HTTPCLI_getResponseStatus (&CLI);

    //检查 HTTP 返回状态并处理剩余响应
    if (status =HTTPStd_OK){
    执行{
    //过滤响应标头并获取设置响应字段
    //
    //...
    //Content-type:text/xml;charset=UTF-8。\r\n
    //内容长度:34.
    //...
    RET = HTTPCLI_getResponseField (&CLI、buf、sizeof (buf)、&moreFlag);

    //如果字段是内容长度,则以 buf 为单位处理数据
    //Zero 是 resfields 数组中内容长度的索引
    if (ret =0){
    len =(int) strtoul (buf、NULL、0);


    }while (ret!= HTTPCLI_FIELD_ID_END);
    while (len >0){
    len -= HTTPCLI_readRawResponseBody (&CLI、buf、sizeof (buf));
    //…… 处理缓冲数据并保存...



    HTTPCLI_DISCONNECT (&CLI);
    HTTPCL_析 构(&CLI);

    system_printf ("http post on wifi sumn");
    system_flush();
    ========================================================================================
    控制台打印:
    WiFi 上的 HTTP POST 成功
    ========================================================================================

    我认为这是由 HttpPost 完成的、如果有任何错误、请通知我。
    Q1)以太网如何重复同样的操作、因为我的需求也是以太网。
    Q2)如何知道它发布到我的服务器(www.example.com 除外)、更改主机名是否足以连接到本地服务器或其他任何东西?

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

    有线网络堆栈(称为 NDK)是与无线堆栈(称为 SimpleLink)不同的堆栈。

    如果您想使用有线连接、应该在 Resource Explorer 中的"Ethnet"下导入 TivaC HTTP GET 示例。 这将使您从有线端开始。

    目前不支持同时使用无线和有线堆栈。

    但是、我听说论坛社区中的其他人更新了有线(NDK)驱动程序、以便使用 SimpleLink 原始套接字从无线设备中注销和接收。 您当然可以自己尝试这样做、但支持会受到限制。

    Steve
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Steven、
    感谢您的回复、我在 WiFi 上运行此 HttpPost 时才得到回复:
    响应状态=-104

    我尝试了本地服务器,但它始终提供响应状态=-104,根本没有影响我的服务器。
    您能否使用我的上述发送代码检查一次。
    此致、
    Raghu DS
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Raghu、

    您是否能够获得 Wireshark 对此的捕获? 您是否看到正在从服务器发送 TCP RST 数据包?

    Steve
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Steven、
    感谢您的支持和帮助。
    我们没有使用 Wireshark、现在我可以访问我的服务器并获得响应。
    由于未指定"内容长度"和"内容类型"、因此出现此错误400。

    此致、
    Raghu DS
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、很高兴您能解决这个问题。

    如果您认为您的问题已得到解决、请将此主题标记为"已回答"。