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.

[参考译文] RTOS/CC3200-LAUNCHXL:带有 tirtos 的 HTTPS 客户端

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/565006/rtos-cc3200-launchxl-https-client-with-tirtos

器件型号:CC3200-LAUNCHXL
Thread 中讨论的其他器件:CC3200

工具/软件:TI-RTOS

你(们)好  

我想在设备上实施 https 客户端以连接到以下格式的服务器:[subdomain].firebaseio.com

通过添加相应的掩码、方法和证书、我在使用 cc3200 SDK example-http 客户端演示时成功完成了此操作。

但是当它到 tirtos 时--

httpcli.h 和 httpcli.c 文件不同。 httpcli.h 文件中提供了一个示例、如下所示:

//发出 HTTP 1.1 POST 请求
*//
*//将请求发送到服务器:
*//
*// POST /index.html HTTP/1.1
*//主机:www.example.com
* HTTPCLI_sendRequest (&CLI、HTTPStd_POST、"/index.html"、TRUE);
*
//发送其他字段
*//
*//*//内容长度: 
*// 
* HTTPCLI_sendField (&CLI、HTTPStd_field_name_content_length、len、true);
*
//发送请求正文
*//
*// 
* HTTPCLI_sendRequestBody (&CLI、data、strlen (data));
*
//获取已处理的响应状态
*//
*// HTTP/1.1 200 OK
* status = HTTPCli_getResponseStatus (&CLI);
*
//检查 HTTP 返回状态并处理剩余响应
* if (status = HTTPStd_OK)
执行{
* //过滤响应标头并获取设置响应字段
* //
* //...
* //内容类型:text/xml;charset=UTF-8。\r\n
* //内容长度:34
* //...
* RET = HTTPCli_getResponseField (&CLI、buf、sizeof (buf)、&moreFlag);
*
//如果字段是内容长度
*,则以 buf 为单位处理数据 //零是 respfields 数组
中内容长度的索引* 如果(ret =0){
* len =(int) strtoul (buf、NULL、0);
*}
*
*} while (ret!= HTTPCLI_FIELD_ID_END);
*
while (len > 0){
* len -= HTTPCLI_readRawResponseBody (&CLI、buf、sizeof (buf));
* //... 处理 buf 数据并保存...
*}
*}
*
* HTTPCLI_DISCONNECT (&CLI);
*
HTTPCLI_析 构(&CLI); 

在 tirtos 文件夹中找不到中的 sssl.h 文件。 TIRTOS 版本: tirtos_cc32xx_2_16_01_14

我认为我们必须为此使用 tls.h 文件,我尝试了以下代码,但仍出现错误

HTTPCli_StructCLI;
HTTPCli_Params cli_param;
//请求字段
HTTPCL_Field field[4]={
{HTTPCli_field_name_host、host_name}、
{HTTPCL_field_name_accept、"*/*"}、
{HTTPCL_field_name_content_length} "0"}、
{NULL、NULL}
};
//响应字段过滤器
const char * respFields[2]={
HTTPStd_field_name_content_length、
NULL
};
const char * IDs[4]={
HTTPCLI_field_name_content_length、
HTTPCLI_field_name_connection, HTTPCL_name_type_name_connection, HTTPCol_name_name_name_name_type_content_type_type_content_type__content_type__content_type__



moreFlag;
long lRetVal =-1;
struct sockaddr_in addr;
lRetVal = sl_NetAppDnsGetHostByName (signed char *) host_name、
strlen ((const char *) host_name)、
sipg_ulDestinationIP、sl_Af_iNet;
if (lnston_char *)



、host_r_r_r\n al_dr.alt
= r_r_r.alt;


slDateTimer_t dt;
//////*设置当前验证证书的日期*/dt.sl_tm_day
= 4;
dt.sl_tm_mon = 1;
dt.sl_tm_year = 2017;
dt.sl_tm_hour = 9;
dt.sl_tm_min = 39;
dt.sl_tm_sec = 00;
sl_DevSet (sl_device_General_configuration、
sl_device_General_configuration_date_time、
sizeof (SlDateTime_t)、(unsigned char *)(&dt));
TLS_Handle TLS;
#define SL_CA_CERT "cert1.cer"
结构 TLS_PARAMS 参数;
TLS_PARAMS_INIT (&params);
字符存储[10];
memset (storage、0、10);
memcpy (storage、SL_CA_CERT、strlen (sl_CA_CERT));
params.ca=storage;
UART_PRINT ("params.ca=%s\n\r",params.ca);
params.calen=strlen(SL_CA_CERT);
UART_PRINT"("params.calen=%d\n\r",params.calen);
*(params.ca+params.calen)='\0';)
TLS=TLS_create (TLS_METHOD_CLIENT_TLSv1_2、&params、"cert");
if (TLS==NULL)
{
UART_PRINT ("NULL");
}
else
{
UART_PRINT ("TLS handle not null =>");
UART_PRINT ("handle =%p\n"tls"、TLS);
}UART_CLI_param=param.param.param=TLS.param=20


;
UART_PRINT ("cli.tls=%p\n\r"、cli.tls");
//构造静态 HTTP 客户端实例
HTTPCli_construct(&CLI);
//连接到 HTTP 服务器
lRetVal=HTTPCli_connect (&CLI、(struct kadr *)&adVal、HTTPCLI_TYPE_TLS (
如果


未连接)、则为<UART_LPRINT0=HTTCLIF"

输出误差为:

HTTP GET 开始:
dnsipget=0
params.ca=cert1.cer
params.calen=9
TLS handle not null=>TLS handle=2001b440
cli.tls=2001b440
lRetVal=-102not connected
connectval=-102sendreq=-103status=-104HTTP GET 失败。
HTTP GET 结束: 

请指导我进行此操作

谢谢  

AV

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

    大家好、

    您似乎没有设置请求和响应字段、您的代码应如下所示:

    HTTPCLI_construct(&CLI);
    
    HTTPCLI_setRequestFields(&CL, Fields);
    
    HTTPCLI_setResponseFields(&CL, respFields); 

    然后、您可以调用 HTTPCli_connect。

    希望这对您有所帮助、
    Gerardo

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

    你(们)好 Gerardo

    该错误出现在  HTTPCli_connect API 中的 connect (sl_connect)函数处。 我不相信“设置字段”选项会影响这一点。 但是我已经按照您的建议尝试设置请求/响应字段、错误仍然存在。

    在 rtsc 项目中、我还尝试使用 RAW 套接字方法(SSL 演示例中使用的方法)进行连接。 但在这种情况下、sl_connect 仍然会产生-370错误。(我更喜欢使用 https://fchi API)

    但我在使用 http 客户端演示和 SSL 演示(两个 SDK 项目)时成功地使用我的(方法+mask+certificate)配置与服务器连接。对于 tirtos https 客户端、我无法在其中找到足够的文档。

    我是否需要任何其他方加载项或 tirtos 是否支持 SSL/TLS 库?

    如果 tls.h 、tls_sl.h 和 TLS_SL.c (C:\ti_tirtos_cc32xx_2_16_01_14\products\ns_1_11_00_10\packages/ti\net)是设置安全参数所需的文件-您能指导我如何正确使用这些 API。

    再次感谢

    AV

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

    你(们)好


    我能够使用 httpcli API 本身连接到安全服务器。 要设置安全参数,我使用了 tls.h、tls_sl.h 和 TLS_SL.c 中的 TLS API

    现在:

    在 SSL 演示(SDK 项目)中、我找到 了一个用于 SECURE_DOMAIN_NAME_VERIFICATION 的选项。

    但 tirtos 的 socket.h 中不存在此定义(它存在于 cc3200 sdk socket.h 中)

    因此,我将其添加到 socket.h 文件中: #define SO_SECURE_DOMAIN_NAME_VERIFICATION (35)

    这是正确的方法吗? (一旦我这么做、sl_setsockopt 返回0)

    感谢您的帮助和支持
    AV

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

    您正在做的是好的。 我认为这是因为最近更新了 SDK 并添加了这些选项。

    另一个无需执行此操作的选项是在编译器选项中的 TI-RTOS 包含路径之前添加 SDK 包含路径。 这样、它将使用它找到的文件的第一个版本、这将是 SDK 上的文件版本。

    希望这对您有所帮助、
    Gerardo
x 出现错误。请重试或与管理员联系。