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.

[参考译文] LAUNCHXL-CC3235SF:无法使用 HTTP 客户端

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1047339/launchxl-cc3235sf-unable-to-use-http-client

器件型号:LAUNCHXL-CC3235SF
主题中讨论的其他器件:CC3235SFCC3200

大家好、Simplelink 专家、

我们能否使用为 CC3200到 CC3235SF 提供的 httpcli.c 和 httpcli.h。 因为我们一直在将代码从 CC3200迁移到 CC3235SF。 我们的每个功能最近都能正常工作我在 HTTP 服务器中遇到了问题、但我现在也能够解决这个问题、因为我使用它提供的功能是-102

long device_provee_http_api_request()

unsigned long HostIP;
HTTPCLI_StructCLI;
int32_t LRET;
memcpy (((uint8_t *)&stFirmware.url_path、(uint8_t *)&stMqttConfig.Provine_url、strlen (stMqttConfig.Provine_URL));
parse_hostname();
//DBG_MSG ("gethostbyname before \r\n");
lRetVal = sl_NetAppDnsGetHostByName ((signed char *) stFirmware.host_name、strlen ((const char *) stFirmware.host_name)、&HostIP、sl_AF_iNet);
//lRetVal = sl_NetAppDnsGetHostByName ((signed char *)"www.google.com",strlen((const char *)"www.google.com)、&HostIP、sl_AF_iNet);
if (lRetVal < 0)

DBG_MSG ("无法解析主机地址\r\n);


返回-1;

size_t ulLength = sprintf (debug_data、"%d\r\n"、
主机头);
uart1_send_fifo ((uint8_t *) debug_data、ulLength);
DBG_MSG ("gethostbyname IP resolved\r\n);
SlSockAddrIn_t addr;
Addr.Sin_Family = SL_AF_iNet;
Addr.sin 端口= sl_Htons (host_port);
addr.sin addr.s_addr = sl_Htons (HostIP);

HTTPCLI_construct(&CLI);

lRetVal = HTTPCLI_CONNECT (&CLI、(SlSockAddr_t *)&addr、HTTPCL_TYPE_TLS、NULL);
如果(lRetVal < 0)



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


返回-1;


LRET = HTTPPostMethod (&CLI);
HTTPCLI_DISCONNECT (&CLI);
HTTPCL_析 构(&CLI);
if (LRET!= 0)

//HTTPCLI_DISCONNECT (&CLI);
//HTTPCLI_析 构(&CLI);
if (LRET =-2)

DBG_MSG ("无法开机自检\r\n);

返回-1;

返回1;

有人能指出、我们可以将旧版 API 用于 HTTP 客户端吗? 请非常紧急。

谢谢、此致

Manish

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

    您好!

    任何更新都是我提出疑问后两天进行的。 请尽快答复我需要作一些澄清。

    谢谢、

    Manish

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

    Manish、您好!

    您应该使用调试器并查看在 httpcli.c 内从 connect()调用返回的错误代码

    1月

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

    尊敬的

    我遇到-102错误、但相同的代码在 CC3200中工作。

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

    您好!

    否 您需要直接在 httpcli.c 中检查返回代码

    1月

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

    你好 Jan  

    在 sl_Connect 内的 httpcli.c 中、它会重新截断以下内容:  
    HTTPCli_EPROXYTUNNELFAIL  (-111)

    您能否指出我们如何解决这个问题?

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

    您好!

    在您的案例中、错误代码-111表示"连接被拒绝"。 很难说为什么这个错误是从 SL_ API 返回的-这意味着你在代码中还有什么问题。

    也许您应该考虑使用 CC32xx SDK 中的 http 库(\source\ti\net\http\)-请参阅 CC32xx SDK 中的 HttpGet 示例。

    1月

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

    感谢 Jan、他将进一步努力解决这个问题、无论如何、我将根据您的建议继续。

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

    尊敬的

    您能不能介绍一下我如何将第1代 HTTP 客户端重用到第2代设备?

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

    您好!

    很抱歉,我无法提供任何解决办法。 从技术上讲、它应该相对简单、但不幸的是、我无法说出这种情况对您的情况不起作用的原因。 请等待 TI 的回答。

    1月

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

    尊敬的 TI 专家:

    我将 HTTP 客户端代码从 CC3200的工作应用移植到 CC3235SF。 代码

    静态 int HTTPPostMethod (HTTPCL_Handle https 客户端)

    bool MoreFlags = 1;
    bool lastFlag = 1;
    char tmpBuf[4];
    char mac[13]={0}、uded[13]={0};
    long lRetVal = 0、body_len=0;
    HTTPCli_Field field[5]={
    {HTTPCli_field_name_host、host_name}、
    {HTTPCli_field_name_accept、"*/*"}、
    {HTTPCli_field_name_content_type、"application/json"}、
    {"x-API-key"、token}、
    {NULL、NULL}
    };

    /*设置要发送 HTTP 请求的请求标头字段。 *
    HTTPCLI_setRequestFields (https 客户端、字段);


    MoreFlags = 1;
    lRetVal = HTTPCLI_sendRequest (https 客户端、HTTPCLI_METHOD_POST、HOSTNAME、moreFlags);
    if (lRetVal < 0)

    UART_PRINT ("发送 HTTP POST 请求标头失败。\n\n");
    返回 lRetVal;

    memset (stGateway.JSON_Buffer、NULL、sizeof (stGateway.JSON_Buffer));

    body_len =//复制缓冲区

    sprintf ((char *) tmpBuf、"%d"、body_len);
    更多信息、请参阅 HTTP 库 API 文档@参考 HTTPCLI_sendField。
    *
    lastFlag = 1;
    lRetVal = HTTPCli_sendField (https://Client、HTTPCli_field_name_content_length、(const char *) tmpBuf、lastFlag);
    if (lRetVal < 0)

    UART_PRINT ("发送 HTTP POST 请求标头失败。\n\n");
    返回 lRetVal;

    lRetVal = HTTPCli_sendRequestBody (https://Client.stGateway.JSON_Buffer、body_len);
    if (lRetVal < 0)

    UART_PRINT ("发送 HTTP POST 请求正文失败。\n\n");
    返回 lRetVal;


    lRetVal = readResponse (httpClient);

    返回 lRetVal;

    相同代码能够发布 CC3200的请求、但无法在 CC3235中执行。 返回-111。

    请任何人指出、我们如何实现 CC3235SF 的这些功能?

    基本上、我的最终目标是为 CC323SF 实现以下设置

    HTTPCli_Field field[5]={
    {HTTPCli_field_name_host、host_name}、
    {HTTPCli_field_name_accept、"*/*"}、
    {HTTPCli_field_name_content_type、"application/json"}、
    {"x-API-key"、token}、
    {NULL、NULL}
    };

    /*设置要发送 HTTP 请求的请求标头字段。 *
    HTTPCLI_setRequestFields (https 客户端、字段);


    MoreFlags = 1;
    lRetVal = HTTPCLI_sendRequest (https 客户端、HTTPCLI_METHOD_POST、HOSTNAME、moreFlags);

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

    Manish、您好!

    是否设置了代理?

    如果您可以获取监听器捕获、 这可能有助于确定 拒绝连接的原因。

    此致、

    Sarah

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

    Manish、您好!

    正如 Jan 所提到的,我会仔细检查并确保您所得到的错误是从 HTTP 库而不是从底层 sl_connect()调用生成的。

    这是因为 sl_connect 的错误-111是 sl_error_bsd_ECONNREFUSED、这是一个相当常见的错误、比代理错误更常见。

    如果您从 sl_connect 获取-111、那么我建议您检查传入 sl_connect 的数据、以便您的地址和端口+ TLS 证书。 虽然您的 HTTP 应用代码可能相同、但移植的 HTTP 库可能不再完全正确地调用 API。 您可以在调试模式下运行应用程序、以双击您的 sl_connect 调用是否正确。

    在过去、我成功地使 Gen1 HTTP 库在 Gen2+上工作、在这个项目中:https://www.ti.com/tool/TIDEP-0083

    不幸的是、它已经非常过时、因为我几年前就在新的和经过重新设计的 Gen2/3 HTTP 库发布之前就已经在它上工作过。 然后、我之前使用的移植层就可以正常工作了、它可以作为如何将 Gen1 HTTP 库连接到较新 SDK 的指南。

    项目代码位于该 SDK 中、位于名为"voic_ui_demo"的文件夹中

    https://www.ti.com/tool/SPRC133

    也许在你执行 sl_connect 检查后查看我的代码会很有用。

    此致、

    Michael

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="492193" URL"~/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1047339/launchxl-cc3235sf-unable-to-use-http-client/3876582 #3876582"]如果从 sl_connect 获取-111、则我建议您检查传入 SL_connect 的数据、以便您的地址和端口+ TLS 证书

    大家好、

    CC3235SF 是否支持通过 TLS/SSL 的 HTTP 客户端?

    此致、

    Manish

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

    Manish、您好!

    CC32xx SDK 中提供的网络服务 HTTP 客户端库支持此功能。 由于您移植了应用程序和第1代库、您可能错过了一些内容。 您应该检查证书的处理方式。

    此致、

    Sarah

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

    您好、

    我只是想知道我们如何执行 HTTP Post、因为我能够执行 Get 请求。 我需要将一些标头设置为"api-key"、将值设置为一些字符串"abcdefghijklmnopqrstuvwxyz"

    为此、我将使用  

    HttpClient_setHeaderByName (httpClientHandle、HttpClient_request_header_mask、"api-key"、"abcdefghijklmnopqrstuvwnopz"、strlen ("abcdefghijklmrstuvwxyz")、 HttpClient_HFIELD_PERSISTENT);

    之后、我将在作为 POST 请求发送响应中传递长度为正文的正文。 下面显示了一个示例:

    body_len = sprintf (JSON_Buffer、Provine_data、"abcdrfh"、"xxxxxxxxxxxx"、"--- ","******** "、"++++++++++ ");  

    (双引号中的符号是字符串。 我只是不想公开它)
    RET =
    HttpClient_sendRequest (httpClientHandle、HTTP_METHOD_POST、HOSTNAME、
    (char const *) json_Buffer、body_len、
    0);

    但每次我调用 API 时、它都会为我提供400或403。 如果您可以、或者 TI 专家可以指出如何为我在上面所示的 API 密钥设置标头、这将非常有帮助。 实际上,我已经尝试了所有东西,现在太晚了,我需要尽快完成这项工作。

    请给我提供一些答案、我需要对仅使用设置标头和 sendRequest 的 POST 请求进行一些澄清。

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

    我已经解决了我的问题。 感谢大家的支持。

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

    您采取了哪些措施来解决您的问题?
    我也无法使用 HttpClient_Connect()进行连接。

    当我的函数解析 URI 时、我可以看到字符串包括"http 客户端句柄创建失败"。
    我正在尝试连接创建 HTTP 客户端(我认为尽管未返回错误、但仍会失败)、并最终向 AWS API 网关 URL 发送 POST 请求。

    谢谢你。

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

    尊敬的

    确保正确设置了标题、否则很难解决问题。