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.

[参考译文] CCS/CC3220SF-LAUNCHXL:HTTP 内部服务器

Guru**** 2562840 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/939775/ccs-cc3220sf-launchxl-http-internal-server

器件型号:CC3220SF-LAUNCHXL

工具/软件:Code Composer Studio

尊敬的先生:

我对 CC3220器件的内部 HTTP 服务器有疑问。 我将按照开箱即用示例进行参考。 正如我在示例中看到的、这里有一个用于器件的 POST 和 Get 方法、我还需要一个 POST 和 Get 方法来获取信息和配置器件。

在这里、我可以按预期运行 GET 方法、并进行响应、但在 POST 方法中、我可以获得有效负载、但无法使用 application/json 将响应发送回客户端。

在这里、我使用的是根据发件箱示例准备元数据、也可以根据示例中的说明使用@sl_NetAppSend API 发送这些元数据。

执行 POST 方法时需要响应,但无法重新生成。

请务必仔细阅读。

在这里、我的示例是发送响应


uint16_t prepareGetMetadata (int32_t parsingStatus、uint32_t contentLen、HttpContentTypeList ContentTypeID)

char * contentType;
uint8_t *pMetadata;
uint16_t metadataLen;

ContentType = g_ContentTypes [ContentTypeID].contentTypeText;

memset ((uint8_t*)&gMetadataBuffer、0x00、sizeof (gMetadataBuffer));

pMetadata = gMetadataBuffer;

/* http 状态*/
pMetadata =(uint8_t) sl_netapp_request_metadata_type_status;
pMetadata++;
*(uint16_t*) pMetadata =(uint16_t) 2;
pMetadata += 2;

如果(parsingStatus < 0)

*(uint16_t*) pMetadata =(uint16_t) sl_NetApp_HTTP_RESPONSE_404_Not _found;

其他

*(uint16_t*) pMetadata =(uint16_t) sl_NetApp_HTTP_RESPONSE_200_OK;

pMetadata += 2;

/*内容类型*/
pMetadata =(uint8_t) sl_netapp_request_metadata_type_http_content_type;
pMetadata++;
(*(uint16_t*) pMetadata)=(uint16_t) strlen ((const char*) contentType);
pMetadata += 2;
sl_memcpy (pMetadata、contentType、strlen ((const char*) contentType));
pMetadata += strlen((const char*) contentType);

/*内容长度*/
pMetadata = sl_NetApp_Request_metadata_type_http_content_LEN;
pMetadata++;
*(uint16_t*) pMetadata =(uint16_t) 4;
pMetadata += 2;
*(uint32_t*) pMetadata =(uint32_t) contentLen;

metadataLen = 5 + 7 + strlen ((const char*) contentType)+ 3;

return (metadataLen);

uint16_t preparePostMetadata (int32_t parsingStatus)

uint8_t *pMetadata;

uint16_t metadataLen;

memset ((uint8_t*)&gMetadataBuffer、0x00、sizeof (gMetadataBuffer));

pMetadata = gMetadataBuffer;

/* http 状态*/
pMetadata =(uint8_t) sl_netapp_request_metadata_type_status;
pMetadata++;
*(uint16_t *) pMetadata =(uint16_t) 2;
pMetadata += 2;

if (parsingStatus < 0)

*(uint16_t *) pMetadata =(uint16_t) sl_NetApp_HTTP_RESPONSE_404_Not _found;

其他

/*不需要内容,因此浏览器将保持在同一页上*/
*(uint16_t *) pMetadata = sl_NetApp_HTTP_RESPONSE_200_OK;//(uint16_t) sl_NetApp_HTTP_RESPONSE_204_OK_NO_content;

pMetadata += 2;

metadataLen = 5;

return (metadataLen);


//如果有效载荷已创建
if (状态>0)

//获取有效载荷长度
len = strlen((const char*)gPayloadBuffer);

if (netAppRequest->Type = sl_NetApp_Request_HTTP_Get)

metadataLen = prepareGetMetadata (0、len、HttpContentTypeList_ApplicationJson);

其他

metadataLen = preparePostMetadata (status);

sl_NetAppSend (netAppRequest->Handle、metadataLen、gMetadataBuffer、(sl_NetApp_Request_Response_FLAGS_Continuation | SL_NetApp_Request_Response_FLAGS_metadata);

/*标记为最后一个句段*/
sl_NetAppSend (netAppRequest->handle、len、gPayloadBuffer、0);

WMLogInfo (debug_log、"用%d 发送有效载荷缓冲区"、len);

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

    您是否在 SimpleLinkNetAppRequestEventHandler 中使用了 RESPONSE_PENDING?

    pNetAppResponse->Status = SL_NetApp_RESPONSE_PENDING;

    如果要在不同的线程上下文中发送响应、则必须执行该操作。

    您是否更改 了 prepareGetMetadata 或 preparePostMetadata 函数中的任何内容?

    请使用参考示例比较 SL_NetAppSend 中发送 的标志和缓冲区。

    有关 HTTP 服务器的更多详细信息、请参阅程序员指南(www.ti.com/.../swru455l.pdf)的第9章。

    BR、

    Kobi

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

    尊敬的 Kobi:

    我没有在@SimpleLinkNetAppRequestEventHandler 处理程序中更改任何内容。

    否我没有更改 PREPARE 元数据函数中的任何内容。

    请查看处理程序函数  

    void SimpleLinkNetAppRequestEventHandler (slNetAppRequest_t * pNetAppRequest、SlNetAppResponse_t * pNetAppResponse)

    slNetAppRequest_t * netAppRequest;
    int32_t msgqRetVal;

    if ((pNetAppRequest->Type =sl_NetApp_Request_HTTP_Get)||(pNetAppRequest->Type =SL_NetApp_Request_HTTP_DELETE)||(pNetAppRequest->Type =sl_NetApp_Request_HTTP_POST)
    ||(pNetAppRequest->Type =sl_NetApp_Request_HTTP_Put)

    /*准备待处理的响应*/
    pNetAppResponse->Status = SL_NetApp_RESPONSE_PENDING;
    pNetAppResponse->ResponseData.pMetadata =空;
    pNetAppResponse->ResponseData.MetadataLen = 0;
    pNetAppResponse->ResponseData.pPayload =空;
    pNetAppResponse->ResponseData.PayloadLen = 0;
    pNetAppResponse->ResponseData.Flags = 0;

    其他

    NetAppRequestErrorResponse (pNetAppResponse);

    返回;

    netAppRequest =(slNetAppRequest_t*) malloc (sizeof (slNetAppRequest_t));
    if (NULL == netAppRequest)

    NetAppRequestErrorResponse (pNetAppResponse);

    返回;

    memset (netAppRequest、0、sizeof (slNetAppRequest_t));
    netAppRequest->AppId = pNetAppRequest->AppId;
    netAppRequest->Type = pNetAppRequest->Type;
    netAppRequest->Handle = pNetAppRequest->Handle;
    netAppRequest->requestData.Flags = pNetAppRequest->requestData.Flags;

    /*复制元数据*/
    if (pNetAppRequest->requestData.MetadataLen >0)

    netAppRequest->requestData.pMetadata =(uint8_t*) malloc (pNetAppRequest->requestData.MetadataLen);
    if (NULL =netAppRequest->requestData.pMetadata)

    NetAppRequestErrorResponse (pNetAppResponse);
    免费(netAppRequest);
    返回;

    sl_memcpy (netAppRequest->requestData.pMetadata、pNetAppRequest->requestData.pMetadata、pNetAppRequest->requestData.MetadataLen);
    netAppRequest->requestData.MetadataLen = pNetAppRequest->requestData.MetadataLen;

    其他

    netAppRequest->requestData.MetadataLen = 0;

    /*复制有效载荷*/
    if (pNetAppRequest->requestData.PayloadLen >0)

    netAppRequest->requestData.pPayload =(uint8_t*) malloc (pNetAppRequest->requestData.PayloadLen);
    if (NULL =netAppRequest->requestData.pPayload)

    NetAppRequestErrorResponse (pNetAppResponse);

    if (netAppRequest->requestData.pMetadata!=空)

    free(netAppRequest->requestData.pMetadata);

    免费(netAppRequest);
    返回;

    sl_memcpy (netAppRequest->requestData.pPayload、pNetAppRequest->requestData.pPayload、pNetAppRequest->requestData.PayloadLen);
    netAppRequest->requestData.PayloadLen = pNetAppRequest->requestData.PayloadLen;

    其他

    netAppRequest->requestData.PayloadLen = 0;

    msgqRetVal = mq_send (linkLocalMQueue、(char*)&netAppRequest、1、0);

    if (msgqRetVal < 0)

    error_on"函数(-1、"mq_send()失败");
    while (1)




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

    我很难理解您在 OOB 示例中所做的工作以及您所做的更改。

    OTA 的序列包含 GET 请求(例如用于读取器件版本)。  

    我的最佳建议是、您尝试使用原始参考代码并了解它(例如、在回调中放置断点或日志消息)、然后进行小幅更改。

    BR、

    Kobi

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

    尊敬的:

    首先、我不使用 OOB 代码、但我用作参考。 这里我有一个 GE 和 POST 请求、用于获取一些内容和配置。 正如我看到的,当我获得方法时,我能够获得响应主体,这意味着我获得了应用程序/json 响应,但如果我执行 POST 方法, 我能够收到 POST 方法请求以处理并提取有效载荷、但当我将应用程序/json 作为响应发送回客户端时、我只得到200Ok、而不是从应用程序/json 主体响应中得到200Ok。

    没有什么像 Rocket science kobi 一样、我只需在请求有效载荷正确的情况下让 POST 生成方法响应和200OK 响应、否则我必须发送错误消息、如404、未找到应用程序/json 类型的响应  

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

    对于 POST 请求,我们不支持 响应机构中的有效载荷(见第9.3.3章)。 https://www.ti.com/lit/ug/swru455l/swru455l.pdf)。

    可以将 HTTP 标头用作元数据的一部分。

    BR、

    Kobi

     

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

    尊敬的

    谢谢您...

    您可以关闭此主题。