0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于RK3576开发板的http/https通讯

ljx2016 来源:ljx2016 作者:ljx2016 2025-05-10 11:24 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1. HTTP/HTTPS简介

HTTP(全称:Hyper Text Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器请求和应答标准,用于从WWW服务器传输超文本到本地的传输协议。

而HTTPS(全称:Hyper Text Transfer Protocol over SecureSocket Layer)是以安全为目标的HTTP通道,在原有HTTP的基础上通过传输加密和身份认证(即增加SSL/TSL安全访问协议)保证了传输过程的安全性。

1.1 HTTP和HTTPS的区别

HTTP和HTTPS的区别如下所示。

协议 HTTP HTTPS
CA证书 不需要 需要
传输加密方式 明文传输,无加密 SSL/TSL加密传输
连接方式 端口号使用80 端口号使用443
连接状态 无状态的 由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议

1.2 请求和响应

典型的HTTP/HTTPS通讯就是应用在浏览器与网页服务器之间,浏览器即为客户端,负责发出请求,接收报文,渲染显示效果。网页服务器即为服务器,负责应答请求,管理服务器文件、处理具体业务。而在某些情况中,HTTP可以作为信息交换的通讯规则。

客户端需要资源时发送出来的即为请求报文,服务器接收到请求后向客户端返回的就是响应报文,HTTP规定了请求报文和响应报文的格式。

请求报文格式如下所示。

wKgZO2geyZuAesvHAAAurVe-5JM872.png

对于本文而言,我们主要关注请求方法和URL即可。

请求行
报文元素 描述
请求方法 常见的方法有:
GET:用于检索和获取服务器的资源,请求内容会在URL上显示;
POST:用于创建或更新服务器的内容,请求内容不会在URL上显示,而是在显示在主体内。
URL 服务器的虚拟文件路径,将在下面章节重点介绍。

响应报文示例如下所示,主要组成部分有:

状态行(包含协议版本、状态值、状态短语);

响应消息头(以键值对的形式存在,例如时间、数据类型、数据长度等);

空行(用于区分报文头和响应正文);

响应正文(对于网页而言,常见的是html代码,也可以是音视频文件、图片,通常是消息报头的Content-Type指定)。

wKgZPGgeyZyABY9ZAAFXplfSI7E288.png

1.3 URL

假设我们搭建了一个环境检测服务器系统,用于采集、记录全市各个观测点的环境数据,假定服务器的存放结构如下所示,此服务器在公网上的域名为www.huanjin.com,里面有两个设备,每个设备存放了不同日子的气温数据,当客户端需要调取具体设备具体数据时,则需要提交一个唯一的路径给服务器查找,这个唯一路径就是URL。

wKgZO2geyZyAQMp0AADTwIDpPRE470.jpg

URL(Uniform Resource Locator,统一资源定位符),存放在请求报文的请求行内,充当路标作用。当我们浏览网页时,点击进入不同的组件,浏览器就会自动的帮我们填充不同的URL,地址的构成如下所示。完整的URL包含:协议部分、网址部分、文件地址。

wKgZPGgeyZyAYRRKAAB_2ysayqM822.jpg

具体内容如下所示。

组成部分 描述
协议 以“//”分割,常见的有http和https;
网址 是公网上独一无二的域名,即人们常见的www.baidu.com等
文件地址 从域名后的第一个“/”到最后一个“/”前的内容,被称为虚拟目录
从最后一个“/”后到“#”前,即为文件名

例如我们想获取环境检测服务器中设备1的12月25号数据,填写的请求报文就是,GET请求,URL为“http://www.huanjin.com/Device-1/日期数据/20211225”。

URL还可以携带变量信息,名称为URL查询字符串,形式为:

https://www.Adblock.com/s?a=123&b=234

变量存放在URL结尾处,以“?”开头,以“参数名=值”的键值对形式存放,多个参数用“&”分割。

1.4 HTTPS使用要点

通过以上叙述可知,使用HTTPS需要时刻围绕以下几点:

CA证书,HTTPS协议用SSL/TSL;

发送数据使用POST请求,服务器地址使用URL格式表示;

接收数据、文件使用GET请求,服务器地址使用URL格式表示;

我司的easyeai-api软件开源库将复杂的报文格式、收发操作做了统一的封装,为客户提供简单便捷的调用方式实现HTTP/HTTPS通讯功能。

2. 快速上手

如果您初次阅读此文档,请阅读:《入门指南/源码管理及编程介绍/源码工程管理》,按需管理自己工程源码(注:此文档必看,并建议采用【远程挂载管理】方式,否则有代码丢失风险!!!)。

2.1 源码工程下载

先在PC虚拟机定位到nfs服务目录,再在目录中创建存放源码仓库的管理目录:

cd ~/nfsroot
mkdir GitHub
cd GitHub

再通过git工具,在管理目录内克隆远程仓库(需要设备能对外网进行访问)

git clone https://github.com/EASY-EAI/EASY-EAI-Toolkit-3576.git
wKgZO2geyZyANot7AAF0k2vU6rQ345.png

注:

* 此处可能会因网络原因造成卡顿,请耐心等待。

* 如果实在要在gitHub网页上下载,也要把整个仓库下载下来,不能单独下载本实例对应的目录。

2.2 开发环境搭建

通过adb shell进入板卡开发环境,如下图所示。

wKgZPGgeyZ2AWt8AAADSohVEhNc916.png

通过以下命令,把nfs目录挂载上nfs服务器。

mount -t nfs -o nolock < nfs server ip >:< nfs path in server > /home/orin-nano/Desktop/nfs/
wKgZO2geyZ2AU3BAAAEcDIcfp0I783.png

2.3 例程编译

然后定位到nfs的挂载目录,再在目录中创建存放源码仓库的管理目录:

cd /home/orin-nano/Desktop/nfs/GitHub

进入到对应的例程目录执行编译操作,具体命令如下所示:

cd EASY-EAI-Toolkit-3576/Demos/common-http/
./build.sh
wKgZPGgeyZ2ADL80AAIvtPJqQ54056.png

2.4 例程运行及效果

进入Release目录,执行下方命令,运行示例程序:

./Release/test-http_server & 
./Release/test-http_client

执行效果如下所示。

wKgZO2geyZ2APNShAACKJ6Ng2D0775.png

API的详细说明,以及API的调用(本例程源码),详细信息见下方说明。

3. HTTPS库函数说明

本章节介绍EASY EAI的HTTPS库函数的使用方法。

3.1 引用方式

EASY EAI api库位于本仓库的easyeai-api目录中。为方便客户在本地工程中直接调用我们的EASY EAI api库,此处列出工程中需要链接的库以及头文件等,方便用户直接添加。

描述 CMake写法 Makefile写法
api.cmake ${common_root}/http/api.cmake
头文件目录 ${HTTP_INCLUDE_DIRS} -I ../../easyeai-api/common/http
源文件目录 ${HTTP_SOURCE_DIRS} ../../easyeai-api/common/http
库文件目录
库链接参数 ${HTTP_LIBS}

API源代码路径为EASY-EAI-Toolkit-3576/easyeai-api/common/http/。用户可通过源代码了解接口实现,甚至可对源码进行修改。

3.2 设置证书

设置证书的函数原型为:

void set_customer_crt(const char *crt_file);

具体介绍如下所示。

函数名:set_customer_crt()
头文件 easyeai-api/common/http/https_request.h
输入参数 crt_file:证书所在路径
返回值
注意事项

3.3 向HTTP/HTTPS服务器发送form-data数据

3.3.1 清除form_data缓存

清除缓存的函数原型为:

void clear_multipart();

具体介绍如下所示。

函数名:clear_multipart()
头文件 easyeai-api/common/http/https_request.h
输入参数
返回值
注意事项 form-data的缓存只有一份,无论在何处执行,都会把form-data缓存给清空。若在多个线程执行此函数,需注意线程同步问题。

3.3.2 填充form_data缓存

填充缓存的函数原型如下所示,传输的数据以键值对的形式传输。

void add_multipart_form_data(const char *key, const char *value);

具体介绍如下所示。

函数名:add_multipart_form_data()
头文件 easyeai-api/common/http/https_request.h
输入参数 key:form-data数据的键名
value:form-data数据的内容
返回值
注意事项 form-data的缓存只有一份,一旦执行clear_multipart(),之前添加进缓存的form-data数据都会被清空,若在多个线程执行此函数,需要注意线程同步问题。

3.3.3 发送form-data数据

由于HTTP和HTTPS的加密方式有所区别,故分别定义了两个函数,但参数一致,函数原型如下所示。

int32_t send_data_to_Http(const char *server, const char *func, char *result, uint32_t result_lenth);
int32_t send_data_to_Https(const char *server, const char *func, char *result, uint32_t result_lenth);

具体介绍如下所示。

HTTP发送函数:send_data_to_Http()
HTTPS发送函数:send_data_to_Https()
头文件 easyeai-api/netProtocol_api/https/https_request.h
输入参数 server:服务器url
func:方法
result:用于保存HTTP/HTTPS返回的body数据
result_lenth:用户用于给body数据分配的最大空间
返回值 -1:失败
0:成功,函数内部会调用clear_multipart()清空缓存
注意事项 接口是对HTTP/HTTPS POST请求的封装,会把form-data的缓存发送出去,调用成功后清空form-data缓存,多线程注意线程同步

3.4 向HTTP/HTTPS服务器发送json数据

由于HTTP和HTTPS的加密方式有所区别,故分别定义了两个函数,但参数一致,函数原型如下所示。

int32_t send_json_to_Http(const char *server, const char *func, const char *json, char *result, uint32_t result_length);
int32_t send_json_to_Https(const char *server, const char *func, const char *json, char *result, uint32_t result_length);

具体介绍如下所示。

HTTP发送函数:send_json_to_Http()
HTTPS发送函数:send_json_to_Https()
头文件 easyeai-api/netProtocol_api/https/https_request.h
输入参数 server:服务器url
func:方法
json:待发送的json字符串
result:用于保存HTTP/HTTPS返回的body数据
result_lenth:用户用于给body数据分配的最大空间
返回值 -1:失败
0:成功
注意事项

3.5 向HTTP/HTTPS服务器获取文件

由于HTTP和HTTPS的加密方式有所区别,故分别定义了两个函数,但参数一致,函数原型如下所示。

int32_t get_file_from_https(const char *url, const char *func, const char *filePath);
int32_t get_file_from_http(const char *url, const char *func, const char *filePath);

具体介绍如下所示。

HTTP获取文件函数:get_file_from_https()
HTTPS获取文件函数:get_file_from_http()
头文件 easyeai-api/netProtocol_api/https/https_request.h
输入参数 url:服务器url路径
func:方法
filePath:用于存放所获取文件的本地路径
返回值 Success
Unknown
Connection
BindIPAddress
Read
Write
ExceedRedirectCount
Canceled
SSLConnection
SSLLoadingCerts
SSLServerVerification
UnsupportedMultipartBoundaryChars
Compression
注意事项 该接口是对HTTP/HTTPS GET请求的封装

4. 使用实例

示例代码路径为EASY-EAI-Toolkit-3576/Demos/common-http/ test-http_client.c。

4.1 设置CRT密钥文件

设置密钥文件操作如下所示。

set_customer_crt("/userdata/customer.crt");

4.2 发送form_data数据

4.2.1 填充数据

清空form_data数据缓冲区,然后填充form_data缓冲区数据。

clear_multipart();
add_multipart_form_data("name", "gzlmo");
add_multipart_form_data("id", "888888");
add_multipart_form_data("pwd", "123456");

4.2.2 发送数据

发送操作如下所示。

send_data_to_Http("192.168.3.191:50000", "/add", res, sizeof(res));

4.3 发送json数据

发送操作如下所示。

send_json_to_Http("192.168.3.191:50000", "/add", "{name : "gzlmo"}", res, sizeof(res));

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    13

    文章

    10093

    浏览量

    90891
  • HTTP
    +关注

    关注

    0

    文章

    531

    浏览量

    34859
  • 开发板
    +关注

    关注

    25

    文章

    6125

    浏览量

    113380
  • rk3576
    +关注

    关注

    1

    文章

    228

    浏览量

    1371
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于RK3576开发板的WDT看门狗使用说明

    RK3576开发板的WDT使用说明
    的头像 发表于 05-06 17:15 1013次阅读
    基于<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>的WDT看门狗使用说明

    基于RK3576开发板的PCIE固态硬盘使用说明

    RK3576开发板的PICE固态硬盘使用方法
    的头像 发表于 05-06 17:33 1781次阅读
    基于<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>的PCIE固态硬盘使用说明

    基于RK3576开发板的TF卡槽使用说明

    RK3576开发板使用TF卡槽
    的头像 发表于 05-07 09:24 1445次阅读
    基于<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>的TF卡槽使用说明

    基于RK3576开发板的PWN使用说明

    RK3576开发板使用PWN教程及Demo
    的头像 发表于 05-07 14:07 1927次阅读
    基于<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>的PWN使用说明

    基于RK3576开发板的RTC使用说明

    文章主要展示RK3576开发板的RTC信息和快速上手例程
    的头像 发表于 05-07 15:04 1793次阅读
    基于<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>的RTC使用说明

    基于RK3576开发板的人脸识别算法

    RK3576开发板展示人脸识别算法例程和API说明
    的头像 发表于 05-07 16:48 2491次阅读
    基于<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>的人脸识别算法

    【作品合集】米尔RK3576开发板测评

    米尔RK3576开发板测评作品合集 产品介绍: RK3576 是瑞芯微一款面向AI市场推出的高性能处理器,它配备了四核Cortex-A72和四 核Cortex-A53 的 CPU,集成了6TOPS
    发表于 09-11 10:19

    新品体验 | RK3576开发板

    RK3399、RK3566、RK3568、RK3588、RK3576等型号的核心与评估
    的头像 发表于 11-01 08:08 2788次阅读
    新品体验 | <b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>

    米尔RK3576开发板特惠活动!

    近日,米尔电子发布基于瑞芯微RK3576核心开发板RK3576作为国产热门处理器,其高性能数据处理能力、领先的AI智能分析、强大的扩展性与兼容性受到广大
    的头像 发表于 11-12 01:00 1983次阅读
    米尔<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>特惠活动!

    敬请期待 | 迅为RK3576开发板即将发布

    敬请期待 | 迅为RK3576开发板即将发布
    的头像 发表于 11-22 15:13 959次阅读
    敬请期待 | 迅为<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>即将发布

    迅为RK3576开发板核心与底板接口硬件介绍

    迅为RK3576开发板核心与底板接口硬件介绍
    的头像 发表于 01-14 15:15 2354次阅读
    迅为<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>核心<b class='flag-5'>板</b>与底板接口硬件介绍

    迅为RK3576开发板Android 多屏显示

    迅为RK3576开发板Android 多屏显示
    的头像 发表于 01-16 16:58 1619次阅读
    迅为<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>Android 多屏显示

    RK3576开发板技术分享 | Weston 配置技巧:定制你的桌面体验!

    RK3576开发板技术分享 | Weston 配置技巧:定制你的桌面体验!
    的头像 发表于 03-07 10:17 1304次阅读
    <b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>技术分享 | Weston 配置技巧:定制你的桌面体验!

    基于RK3576开发板的MIPI-DSI使用

    MIPI DSI接口是由MIPI联盟下的Display工作组指定的DSI(Display Serial Interface)的接口标准。rk3576开发板使用mipi-dsi教程
    的头像 发表于 05-06 16:11 973次阅读
    基于<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>的MIPI-DSI使用

    基于RK3576开发板的HDMI-OUT使用说明

    RK3576开发板的HDMI-OUT使用说明
    的头像 发表于 05-06 16:48 1102次阅读
    基于<b class='flag-5'>RK3576</b><b class='flag-5'>开发板</b>的HDMI-OUT使用说明