您好!
我们将 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 握手的延迟。
请提供建议。
谢谢、
序列号
