主题中讨论的其他器件:TM4C129ENCPDT、
大家好、
我将 cc3100与 tm4c129encpdt、ti RTOS 版本 2_16_01_14和 httpcli 库搭配使用以执行 https 操作。
我想使用 httpcli 客户端库增加要从设备发送的有效载荷大小。
我看到在 sock.c 文件的库中、我将 MAXSENDLEN 从1460更改为10240、但仍然无法从器件发送超过1460的数据。 如何增加这一侧? 我在进行更改后也尝试编译 RTOS。
请告诉我
谢谢
akhi
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.
大家好、
我将 cc3100与 tm4c129encpdt、ti RTOS 版本 2_16_01_14和 httpcli 库搭配使用以执行 https 操作。
我想使用 httpcli 客户端库增加要从设备发送的有效载荷大小。
我看到在 sock.c 文件的库中、我将 MAXSENDLEN 从1460更改为10240、但仍然无法从器件发送超过1460的数据。 如何增加这一侧? 我在进行更改后也尝试编译 RTOS。
请告诉我
谢谢
akhi
您好、Akhi、
MAXSENDLEN 用于套接字级别、以控制一个数据包中可以发送多少数据。 不应修改此值、因为1460是 底层套接字数据包的最大大小。
您使用的是什么 HTTP 方法? 在 HTTP 库中发送具有任意有效载荷大小的请求不应有任何限制。 这是因为您可以在 HTTP 标头上设置预期的内容长度,然后只需重复使用 HTTPCLI_sendRequestBody(),直到您完成发送所有数据。 因此、您需要循环浏览数据并一次发送 MAXSENDLEN。
下面是一些扩展了库随附的 HTTP POST 实现的示例代码。 我开发的一个示例使用了此代码来连接云服务器、因此您将看到一些额外的功能、但基本概念应演示如何处理 HTTP 应用代码以执行大型负载请求。
int HTTPPostMethod(HTTPCli_Handle httpClient, int postSettings, IBMTestPacket* packetToPost)
{
unsigned char *pucFileBuffer = NULL; // Data read or to be written
unsigned long chunkSize = MAX_BUFF_SIZE;
long pFileHandle; // Pointer to file handle
SlFsFileInfo_t pFsFileInfo;
char *FileRead = FILE_NAME; // File to be read
int fileSize = 0;
char s_fileSize[15];
int uiFileSize;
int i;
bool moreFlags = 0;
long lRetVal = 0;
pucFileBuffer = malloc(chunkSize);
if(NULL == pucFileBuffer)
{
UART_PRINT("Can't Allocate Resources\r\n");
LOOP_FOREVER();
}
memset(pucFileBuffer,'\0',chunkSize);
memset(s_fileSize,'\0',15);
/* Read file size if we are posting a file */
if(postSettings==HTTP_POST_FLACFILE){
/* open audio file */
pFileHandle = sl_FsOpen((unsigned char *)FileRead,SL_FS_READ, \
NULL);
if(lRetVal < 0)
{
free(pucFileBuffer);
ERR_PRINT(lRetVal);
LOOP_FOREVER();
}
lRetVal = sl_FsGetInfo((unsigned char *)FileRead, NULL, &pFsFileInfo);
if(lRetVal < 0)
{
lRetVal = sl_FsClose(pFileHandle,0,0,0);
free(pucFileBuffer);
ERR_PRINT(lRetVal);
LOOP_FOREVER();
}
uiFileSize = (&pFsFileInfo)->Len;
sprintf(s_fileSize, "%d", uiFileSize);
}
/* Get stream size from packet otherwise */
else if((postSettings==HTTP_POST_RAW)||(postSettings==HTTP_POST_RAW_2CH)){
uiFileSize = packetToPost->bytesInBuffer;
sprintf(s_fileSize, "%d", packetToPost->bytesInBuffer);
}
HTTPCli_Field fields[7] = {
{HTTPCli_FIELD_NAME_AUTHORIZATION, AUTHENTICATION},
{HTTPCli_FIELD_NAME_HOST, HOST_NAME},
{HTTPCli_FIELD_NAME_ACCEPT, "*/*"},
{HTTPCli_FIELD_NAME_CONTENT_TYPE, CONTENT_TYPE},
{HTTPCli_FIELD_NAME_CONTENT_LENGTH, s_fileSize},
{HTTPCli_FIELD_NAME_EXPECT, "100-continue"},
{NULL,NULL}
};
if(postSettings==HTTP_POST_RAW){
fields[3].value = CONTENT_TYPE_RAW;
}
else if(postSettings==HTTP_POST_RAW_2CH){
fields[3].value = CONTENT_TYPE_RAW_2CH;
}
/* Set request header fields to be sent for HTTP request. */
HTTPCli_setRequestFields(httpClient, fields);
/* Send POST method request. */
lRetVal = HTTPCli_sendRequest(httpClient, HTTPCli_METHOD_POST, POST_REQUEST_URI, moreFlags);
if(lRetVal < 0)
{
UART_PRINT("Failed to send HTTP POST request header.\n\r");
return lRetVal;
}
if(postSettings==HTTP_POST_FLACFILE){
for (i = 0; i < uiFileSize; i = i + fileSize){
fileSize = sl_FsRead(pFileHandle, i, pucFileBuffer, chunkSize);
if(lRetVal < 0)
{
lRetVal = sl_FsClose(pFileHandle,0,0,0);
free(pucFileBuffer);
ERR_PRINT(lRetVal);
LOOP_FOREVER();
}
/* Send POST data/body */
lRetVal = HTTPCli_sendRequestBody(httpClient, pucFileBuffer, fileSize);
if(lRetVal < 0)
{
UART_PRINT("Failed to send HTTP POST request body.\n\r");
return lRetVal;
}
}
}
else if((postSettings==HTTP_POST_RAW)||(postSettings==HTTP_POST_RAW_2CH)){
lRetVal = HTTPCli_sendRequestBody(httpClient, packetToPost->bufferPointer, packetToPost->bytesInBuffer);
if(lRetVal < 0)
{
UART_PRINT("Failed to send HTTP POST request body.\n\r");
return lRetVal;
}
}
free(pucFileBuffer);
if(postSettings==HTTP_POST_FLACFILE){
lRetVal = sl_FsClose(pFileHandle,0,0,0);
}
lRetVal = readResponse(httpClient);
if(lRetVal < 0)
{
UART_PRINT("Failed to read response.\n\r");
return lRetVal;
}
#if ENABLE_DEBUG_OUTPUT
UART_PRINT("First Response Received.Waiting a few seconds...\n\r");
#endif
//Task_sleep(8000);
int failcounter = 0;
lRetVal = readResponse(httpClient);
while(lRetVal<0&&failcounter<HTTP_RETRY_LIMIT){
//UART_PRINT("Failed to read response.\n\r");
failcounter++;
lRetVal = readResponse(httpClient);
}
// if(lRetVal < 0)
// {
// UART_PRINT("Failed to read response.\n\r");
// return lRetVal;
// }
return lRetVal;
}
如果您需要更多的说明或对使用 HTTP 客户端库有进一步的问题、请告诉我。
此致、
Michael
您好、Michael、
我使用的是使用 https://vli 库的 MQTT。 为此、我需要发送超过1460B 的数据。 这是我的要求。 MQTT 与 HTTP 不同、您可以在其中转储1460B 的大量数据。 我们需要发送1次、我们希望该大小更多、大约为10KB。 如果您帮助我修改此硬编码字段、我可以尝试更改此值。
此外、我将 AWS IOT 用于 MQTT、其中1条消息的最大大小为128KN。 这就是我想增加它的原因。
谢谢
您好、Akhi、
我知道 HTTP 的局限性、以及您通常需要如何在单个请求中为应用程序交互提供所有数据。
现在、HTTP 的底层传输层是 TCP。 TCP 的数据包硬限制仅为64KB、但这不是主要限制、因为 TCP/IP 接口中使用的较低层(如 Wi-Fi MAC 层或 ETH 层)的 MTU 限制较低。 这就是您在库中设置1460B 限制的原因、以考虑 MTU 限制。
由于 HTTP 确实需要较大的有效负载、因此有多种方法可以解决 MTU 限制。 例如,上面我提供的代码在 HTTP 标头中明确提供了内容长度,这样,您连接的 HTTP 服务器将在同一套接字上期望更多数据,并在您针对完整数据有效载荷执行 HTTPCL_sendRequestBody ()时接收 TCP 数据包。 您可以使用的另一种方法是块化数据传输。
您能否为我提供您所使用的服务器的 API 文档? 这将使我能够了解这些变通办法中的哪一种最有效。
此外、如果您使用的是通过 HTTP 传输的 MQTT、是否有理由不只使用 CC3100 SDK 随附的 MQTT 库?
此致、
Michael
您好、Michael、
我知道上述通过在标头中提供内容长度来转储更多数据的方法。 我想知道我们是否可以增加它。
我可以对 MQTT 尝试相同的操作。
对于 MQTT、我将使用 AWS SDK 提供的库。 AWS SDK 提供了一个网络接口层、我们需要在其中提供套接字层。 在该层中、我使用的是 httpcli 库的函数、例如 connect、read_Rawbody、sendrequest 等
我之所以将 httpcli 库用作网络接口、主要是因为它可以在以太网和 WiFi (cc3100)上运行。 因为我们已经为这两个库使用了这个库、所以我使用了这个。
我也可以使用 MQTT 尝试相同的操作、并将更新您的信息。 MQTT 的要点是、我们向某个主题发送内容、并且 MQTT 代理(AWS IoT MQTT 代理)允许的最大数据为128KB。
https://docs.aws.amazon.com/iot/latest/developerguide/what-is-aws-iot.html
谢谢
akhi
您好、Akhi、
要说明、您是否正在尝试在 HTTP 上运行 MQTT? 或者、您是否也只是使用在 MQTT 的 HTTP 库中实现的 TCP 套接字函数?
至于套接字层限制、这是应用程序层(在本例中为 AWS MQTT 库)需要解决的问题。 这不是 CC3100特有的限制-在较低的层次上、每个依赖 ETH 帧的网络应用都需要对数据包进行分段。
实际上、在 CC3100 MQTT 客户端代码中、有一些规定可以将 TX 数据包拆分为多个部分、以便处理网络层仅支持小段的情况。 是否确定 AWS MQTT 代码中不存在此代码?
对于增加每个 HTTP 块的数据量,不幸的是,您当前对块大小的限制无法调整-发送的每个 TCP 数据包最大为1460字节。 我建议您使用固定内容长度标头进行探索、以使用 HTTP 数据块。
此致、
Michael
您好、Michael、
我只是使用在 httpcli 库中实现的 TCP 套接字函数和 TLS、它们是-
HTTPCli_con构、 HTTPCli_setRequestFields、 TLS_create、 HTTPCli_initSockAddr、 HTTPCli_connect、 HTTPCli_getSocketError
HTTPCli_sendRequestBody、 HTTPCL_readRawResponseBody 等... 在 asws MQTT SDK 上有一个接口层、我们必须在其中提供套接字功能。 由于我已经在使用 https 和 FTPS 的 httpcli 库、因此我已将其集成到该库中、并且工作正常。
我使用相同的功能来执行 FTPS。
现在、我要将大缓冲区拆分为1024B 块并通过 MQTT 发送。 这现在运转正常、我认为它将解决我的问题。 我知道存在1460的限制、这是可以的。 我现在可以拆分大块并以1024的倍数发送它。
谢谢