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:增加以 https 为单位的有效负载大小

Guru**** 2539130 points
Other Parts Discussed in Thread: TM4C129ENCPDT, CC3100

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/993984/cc3100-increasing-payload-size-in-https

器件型号:CC3100
主题中讨论的其他器件:TM4C129ENCPDT

大家好、

我将 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的倍数发送它。  

    谢谢

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

    您好、Akhi、

    很高兴听到您通过 MQTT 工作的分块解决方案。 如果您需要有关 CC3100的进一步帮助或对使用所提供的网络库有更多问题、请告诉我。

    此致、

    Michael