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.
大家好、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月
您好!
否 您需要直接在 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、他将进一步努力解决这个问题、无论如何、我将根据您的建议继续。
尊敬的 Jan D:
您能不能介绍一下我如何将第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
CC3235SF 是否支持通过 TLS/SSL 的 HTTP 客户端?
此致、
Manish
Manish、您好!
CC32xx SDK 中提供的网络服务 HTTP 客户端库支持此功能。 由于您移植了应用程序和第1代库、您可能错过了一些内容。 您应该检查证书的处理方式。
此致、
Sarah
您好、 Sarah P、
我只是想知道我们如何执行 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 请求。
谢谢你。