您好!
我们将 CC3135MOD 模块与 STM32搭配使用、同时搭配 FreeRTOS。 该模块通过 SPI 连接。 我的应用程序以 HTTPS 客户端的形式运行、并频繁传输数据、例如每10秒传输一次数据。 我想知道处理错误的理想方法。
我的伪代码:
httpTask() { static int16_t retClientConnectStatus{-1}; static int16_t retClientSetHeaderStatus{-1}; static int16_t retClientSendStatus{-1}; static int16_t retClientCreateStatus{-1}; static int16_t retClientDestroyStatus{-1}; HTTPClient_extSecParams esParams; char hostIpAddr[NO_23U_NUMERIC]; std::array<char, NO_62U_NUMERIC> requestURI; requestURI.fill('\0'); if(retClientCreateStatus != 0) { HttpClient::httpClientHandle = HttpClient::CreateHttpClient(0, &retClientCreateStatus); } if(retClientCreateStatus >= 0) { if((retClientConnectStatus < 0)) { esParams.clientCert = nullptr; esParams.privateKey = nullptr; esParams.rootCa = ROOT_CA_CERT; retClientSetHeaderStatus = HttpClient::SetHeaderHttpClient( HttpClient::httpClientHandle, HTTPClient_HFIELD_REQ_USER_AGENT, USER_AGENT, strlen(USER_AGENT) + 1U, HTTPClient_HFIELD_PERSISTENT); retClientSetHeaderStatus = HttpClient::SetHeaderHttpClient( HttpClient::httpClientHandle, HTTPClient_HFIELD_REQ_CONNECTION, CONNECTION_KEEP_ALIVE, strlen(CONNECTION_KEEP_ALIVE) + 1U, HTTPClient_HFIELD_PERSISTENT); retClientSetHeaderStatus = HttpClient::SetHeaderHttpClient( HttpClient::httpClientHandle, HTTPClient_HFIELD_REQ_CONTENT_TYPE, CONTENT_TYPE, strlen(CONTENT_TYPE) + 1U, HTTPClient_HFIELD_PERSISTENT); static_cast<void>(memset(hostIpAddr, '\0', sizeof(hostIpAddr))); static_cast<void>(strcpy(hostIpAddr, HOSTNAME)); retClientConnectStatus = HttpClient::ConnectHttpClient(HttpClient::httpClientHandle, (hostIpAddr), &esParams, 0); static_cast<void>(memset(hostIpAddr, '\0', sizeof(hostIpAddr))); } if(retClientConnectStatus == 0) { switch(msgType) { case wifiDataType::Msg_1: std::copy_n(REQUEST_URI_Msg_1, strlenRequestURIMsg1, requestURI.begin()); break; case wifiDataType::Msg_2: std::copy_n(REQUEST_URI_Msg_2, strlenRequestURIMsg2, requestURI.begin()); break; case wifiDataType::Msg_3 std::copy_n(REQUEST_URI_Msg_3, strlenRequestURIMsg3, requestURI.begin()); break; default: break; } std::copy_n(devName, FindMessageSize(devName), requestURI.begin() + FindMessageSize(&requestURI[0])); retClientSendStatus = HttpClient::SendHttpRequest( HttpClient::httpClientHandle, HTTP_METHOD_POST, &requestURI[0], reinterpret_cast<const char*>(msgToSend), (strlen(msgToSend) + 1U), 0); } if((retClientSendStatus < 0) && ((retClientSendStatus != SL_RET_CODE_INVALID_INPUT) && (retClientSendStatus != SLNETERR_ESEC_HAND_SHAKE_TIMED_OUT)) && (retClientSendStatus != HTTPClient_ERESPONSEINVALID) ) { retClientDestroyStatus = HttpClient::DestroyHttpClient(HttpClient::httpClientHandle); static_cast<void>(memset(hostIpAddr, '\0', sizeof(hostIpAddr))); retClientCreateStatus = -1; retClientConnectStatus = -1; } }
每10秒调用一次 httpTask。
我的问题是:
1.伪代码是否正确?
2. HttpClient_sendRequest 或 HttpClient_connect 中的哪些错误会导致 HttpClient_destroy 和随后 的 HttpClient_create?
我在 SDK 中看到了 HTTPSGET 示例、在该示例中、每次发送操作后客户端都会被破坏。 我不想这样做、除非出现错误、因为我不希望每次发送 HTTP 握手的延迟。
请提供建议。
谢谢、
序列号