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.

[参考译文] TM4C129ENCPDT:使用 wolfsl 的 HTTPS 通信- HTTPS POST

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1236170/tm4c129encpdt-https-communication-using-wolfssl---https-post

器件型号:TM4C129ENCPDT
Thread 中讨论的其他器件:SYSBIOS

我 在 CCS 版本12.2.0中使用 TM4C129ENCPDTI、

适用于 TivaC 2.16.01.14的 TI-RTOS、

XDCtools v 3.32.0.06_core 和

编译器 ti-CGT-ARM_20.2.7.LTS

wolfssl-3.9.10-稳态。

我正在尝试 将数据发布到 postman-echo.com, 但  在 HTTPCli_sendRequestBody  ()之后调用 HTTPCli_getResponseStatus ()时出现以下错误。

错误日志:

系统提供商设置为 SysMin。 停止目标以查看 ROV 中的任何 SysMin 内容。
服务状态:DHCPC:已启用:000
服务状态: DHCP:已启用:正在运行: 000
添加的网络:IF-1:192.168.2.74
服务状态:DHCPPC:已启用:正在运行:017
n (int):11
内容长度:11
当前时间:星期五6月9日09:41:43 2023

将 HTTPS POST 请求发送至'https://postman-echo.com'
361:内存不足:handle=0x20021ea4、size=5550
已成功发送数据
错误! 代码=-112、desc = httpsTask:无法获取状态

以下是我的 HTTPS 任务:

#包含
#包含

/* XDCtools 头文件*/
#包含
#包含

/* TI-RTOS 头文件*/
#包含
#包含
#包含
#包含
#包含
#包含
#包含

/*示例/板头文件*/
#include "board.h"

#包含

#define HOSTNAME"">https://postman-echo.com"
#define request_URI "/post"
#define content_type "application/json"
#define Authorization "基本"
#define USER_AGENT "HTTPCli (ARM;TI-RTOS)"

#define NTP_HOSTNAME " pool.ntp.org "
#define ntp_port "123"
#define ntp_servers 3
#define ntp_servers_size (ntp_servers * sizeof (struct sockaddr_in)
#define HTTPTASKSTACKSIZE 32768


/*
*用户步骤:将根 CA 证书中的行复制到
*----- 开始证书-----
*。。
*----- 结束证书-----
*/

uint8_t ca[]="MIIEDzCCAvegAwIBAGIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQGEwJVUzEl\
MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp\
U3RhcmZpZWxIensYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw\
NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQGEWJVUzElMCMGA1UE\
ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp\
ZWxkIensYXNzIDIgQ2VydGlmaWNhdGlvbibBBdXRob3JpdHkwegMA0GCSqGSIb3\
DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf\
8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIR1MvnsoFAZMej2YcOadN\
+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0\
X9tDkYI22WY8sbi5gv2cOj4QyDvBmVmepsZGT3/cVE8MC5fvj13c7JdBmzDI1aa\
K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA\
1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAgEDo4HFMIB0G\
A1UdDgQWBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBICKMIGGBS/X7fR\
zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1BhMCVVMxJTAjBgNVBAoTHFN0\
YXJmaWVsZCBUZWNobm9sb2dpZXMsIluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD\
bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w\
DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3\
L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D\
eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\
xy16paq8U4Zt3VekyvggQqto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp\
VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJuhlbl90TSrE9atvNziPTnNvT51cKEY\
WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=";
//"<---在每一行的末尾添加带斜线的根证书-->";

uint32_t calen = sizeof (ca);
unsigned char ntpServers[ntp_servers_size];
Static Semaphore_handle semHandle = NULL;

/*
*=========== printError ====
*/
void printError (char *错误字符串、int 代码)
{
System_printf ("错误! 代码=%d、desc =%s\n"、代码、errString);
// TaskSleep (100);
BIOS_exit (代码);

/*
*=========== timeUpdateHook ===========
* NTP 时间同步后调用
*/
void timeUpdateHook (void *p)
{
Semaphore_post (semHandle);

/*
*=========== startntp ===========
*/
void startNTP (void)
{
Int ret;
内部电流位置;
time_t ts;
结构 Sockaddr_in ntpAddr;
结构 addrinfo 提示;
struct addrinfo *Addrs;
struct addrinfo *currAddr;
Semaphore_Params semParams;

memset (&hints、0、sizeof (struct addrinfo));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;

RET = getaddrinfo (NTP_HOSTNAME、NTP_PORT、NULL、&Addrs);
如果(ret !=0){
printError ("startntp: ntp host cannot be resolved!",ret);

电流 Pos = 0;

for (currAddr = Addrs;currAddr!= NULL;currAddr = currAddr -> ai_next){
if (currPos < ntp_servers_size){
ntpAddr =*(struct sockaddr_in *)(currAddr->ai_addr);
memcpy (ntpServers + currPos、&ntpAddr、sizeof (struct sockaddr_in);
当前位置+= sizeof (结构 Sockaddr_in);

否则{
中断;

freedrinfo(Addrs);

RET = sntp_start (seconds_get、seconds_set、timeUpdateHook、
(struct sockaddr *)&ntpServers、ntp_servers、0);
如果(ret =0){
printError ("startntp: sntp cannot be started!"、-1);

Semaphore_Params_init (&semParams);
semParams.mode = Semaphore_Mode_binary;
semHandle = semaphore_create (0、&semParams、NULL);
if (semHandle == NULL){
printError ("startntp: can't create semaphore!"、-1);

sntp_forceTimeSync();
Semaphore_pend (semHandle、BIOS_wait_forever);

Ts =时间(NULL);
system_printf ("当前时间:%s\n"、ctime (&ts));

空 httpsPostTask (UArg arg0、UArg arg1)
{

bool moreFlag = false;
字符数据[64];
char buf[1024];
Int ret;
内部长度;
字符内容长度[3];
结构 Sockaddr_in 地址;

TLS_Params tlsParams;
TLS_Handle TLS;

//要发送的数据
strcpy (data、"{\"val\":10}");

len = strlen (data);
sprintf (content_length、"%d"、len);

System_printf ("\n 数据:%s\n"、数据);
system_printf ("len (int):%d\n"、len);
system_printf ("content_length:%s\n"、content_length);


HTTPCli_Params 参数;
HTTPCli_Struct CLI;
HTTPCli_Field 字段[5]={
{HTTPStd_field_name_host、HOSTNAME}、
{ HTTPStd_field_name_authorization, Authorization },
{HTTPStd_field_name_content_type、content_type}、
{ NULL,NULL }
};

startntp();

System_printf ("将 HTTPS GET 请求发送到"%s"、HOSTNAME);
system_flush();

TLS_PARAMS_INIT (&tlsParams);
tlsParams.ca =大约;
tlsParams.calen = calen;

TLS = TLS_create (TLS_method_client_TLSv1_2、&tlsParams、NULL);
如果(!TLS){
printError ("httpsTask: TLS create failed"、-1);

//GPIOPinWrite (GPIO_PORth_BASE、GPIO_PIN_2、0);
//GPIOPinWrite (GPIO_PORth_BASE、GPIO_PIN_3、GPIO_PIN_3);

HTTPCli_structure (&cli);

HTTPCli_setRequestFields (&CLI、字段);

RET = HTTPCli_initSockAddr ((struct sockaddr *)&addr、HOSTNAME、0);
如果(ret < 0){
printError("httpsTask:地址解析失败",ret );

HTTPCli_params_init (&params);
params.tls = TLS;

REt = HTTPCli_connect (&CLI、(struct sockaddr *)&addr、0、&params);
如果(ret < 0){
printError ("httpsTask: connect failed"、ret);

RET = HTTPCli_sendRequest (&CLI、HTTPStd_post、request_URI、true);
如果(ret < 0){
printError("httpsTask: send failed",ret );

否则
{
System_printf ("sendRequest successfully\n");

RET = HTTPCli_sendField (&CLI、HTTPStd_field_name_content_length、content_length、false);
如果(ret < 0){
printError ("httpTask: send failed"、ret);

否则{
System_printf ("sendField 成功\n");

RET = HTTPCli_sendField (&CLI、HTTPStd_field_name_content_type、content_type、true);

如果(ret < 0){
printError ("httpTask: send failed"、ret);

否则{
System_printf ("sendField 成功\n");

REt = HTTPCli_sendRequestBody (&CLI、data、strlen (data));
如果(ret < 0){
printError ("httpTask: variable data could not be sent ", ret);

否则{
System_printf ("已成功发送数据\n");

RET = HTTPCli_getResponseStatus (&CLI);
如果(ret!= HTTPStd_OK){
printError ("httpsTask: can't get status", ret);

System_printf ("HTTP 响应状态代码:%d\n"、ret);
// System_flush ();
RET = HTTPCli_getResponseField (&CLI、data、sizeof (data)、&moreFlag);
if (ret != HTTPCli_field_ID_end){
printError("httpsTask:响应字段处理失败",ret );

LEN = 0;
请执行{
RET = HTTPCli_readResponseBody (&CLI、data、sizeof (data)、&moreFlag);
如果(ret < 0){
printError("httpsTask:响应正文处理失败",ret );

len += ret;
} while (moreFlag);

system_printf ("接收到的%d 字节的有效载荷\n"、len);
system_flush();

HTTPCli_disconnect (&cli);
HTTPCli_abusit(&CLI);

TLS_delete (&TLS);

/*
*=========== netIPAddrHook =========
*在添加/删除 IP 地址时调用此函数
*/
void netIPAddrHook (unsigned int ipaddr、unsigned int IfIdx、unsigned int fAdd)
{
静态 Task_handle taskHandle;
Task_Params taskParams;
Error_Block EB;

/*添加 IP 地址后创建 HTTP 任务*/
if (fADD &&!taskHandle){
error_init (&eb);

Task_Params_init (&taskParams);
taskParams.STACKSIZE = HTTPTASKSTACKSIZE;
taskParams.priority = 1;
taskHandle = Task_create ((Task_FuncPtr) httpsPostTask、&taskParams、&eb);
if (taskHandle == NULL){
printError ("netIPAddrHook:无法创建 HTTP 任务\n"、-1);


/*
*=========== 主线====
*/
int main (空)
{
/*调用板初始化函数*/
Board_initGeneral();
Board_initGPIO();
Board_initEMAC();

/*打开用户 LED */
GPIO_WRITE (Board_LED0、BOARD_LED_ON);

system_printf ("启动 HTTPS GET 示例\n 系统提供程序设置为"
"SysMin。 停止目标以查看 ROV 中的任何 SysMin 内容。\n");
/* SysMin 仅在您调用 flush 或 exit 时打印到控制台*/
system_flush();

/*启动 BIOS */
BIOS_start();

返回(0);