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的区别如下所示。1.2 请求和响应典型的HTTP/HTTPS通讯就是应用在浏览器与网页服务器之间浏览器即为客户端负责发出请求接收报文渲染显示效果。网页服务器即为服务器负责应答请求管理服务器文件、处理具体业务。而在某些情况中HTTP可以作为信息交换的通讯规则。客户端需要资源时发送出来的即为请求报文服务器接收到请求后向客户端返回的就是响应报文HTTP规定了请求报文和响应报文的格式。请求报文格式如下所示。对于本文而言我们主要关注请求方法和URL即可。响应报文示例如下所示主要组成部分有l 状态行包含协议版本、状态值、状态短语l 响应消息头以键值对的形式存在例如时间、数据类型、数据长度等l 空行用于区分报文头和响应正文l 响应正文对于网页而言常见的是html代码也可以是音视频文件、图片通常是消息报头的Content-Type指定。1.3 URL假设我们搭建了一个环境检测服务器系统用于采集、记录全市各个观测点的环境数据假定服务器的存放结构如下所示此服务器在公网上的域名为www.huanjin.com里面有两个设备每个设备存放了不同日子的气温数据当客户端需要调取具体设备具体数据时则需要提交一个唯一的路径给服务器查找这个唯一路径就是URL。URLUniform Resource Locator统一资源定位符存放在请求报文的请求行内充当路标作用。当我们浏览网页时点击进入不同的组件浏览器就会自动的帮我们填充不同的URL地址的构成如下所示。完整的URL包含协议部分、网址部分、文件地址具体内容如下所示。例如我们想获取环境检测服务器中设备1的12月25号数据填写的请求报文就是GET请求URL为“http://www.huanjin.com/Device-1/日期数据/20211225”。URL还可以携带变量信息名称为URL查询字符串形式为https://www.Adblock.com/s?a123b234变量存放在URL结尾处以“”开头以“参数名值”的键值对形式存放多个参数用“”分割。1.4 HTTPS使用要点通过以上叙述可知使用HTTPS需要时刻围绕以下几点l CA证书HTTPS协议用SSL/TSLl 发送数据使用POST请求服务器地址使用URL格式表示l 接收数据、文件使用GET请求服务器地址使用URL格式表示我司的easyeai-api软件开源库将复杂的报文格式、收发操作做了统一的封装为客户提供简单便捷的调用方式实现HTTP/HTTPS通讯功能。2. 快速上手2.1 开发环境准备如果您初次阅读此文档请阅读《入门指南/开发环境准备/Easy-Eai编译环境准备与更新》并按照其相关的操作进行编译环境的部署。在PC端Ubuntu系统中执行run脚本进入EASY-EAI编译环境具体如下所示。cd ~/develop_environment ./run.sh 22042.2 源码下载以及例程编译在EASY-EAI编译环境下创建存放源码仓库的管理目录cd /opt mkdir EASY-EAI-Toolkit cd EASY-EAI-Toolkit通过git工具在管理目录内克隆远程仓库git clone https://github.com/EASY-EAI/EASY-EAI-Toolkit-1126B.git注* 此处可能会因网络原因造成卡顿请耐心等待。* 如果实在要在gitHub网页上下载也要把整个仓库下载下来不能单独下载本实例对应的目录。进入到对应的例程目录执行编译操作具体命令如下所示cd EASY-EAI-Toolkit-1126B/Demos/netProtocol-http/ ./build.sh注* 由于依赖库部署在板卡上因此交叉编译过程中必须保持/mnt挂载。2.3 例程运行通过串口调试或ssh调试进入板卡后台定位到例程部署的位置如下所示cd /userdata/Demo/netProtocol-http运行例程命令如下所示./test-http_server ./test-http_client2.4 运行效果执行效果如下所示。3. HTTPS库函数说明本章节介绍EASY EAI的HTTPS库函数的使用方法。3.1 引用方式EASY EAI api库位于本仓库的easyeai-api目录中。为方便客户在本地工程中直接调用我们的EASY EAI api库此处列出工程中需要链接的库以及头文件等方便用户直接添加。API源代码路径为EASY-EAI-Toolkit-1126B/easyeai-api/netProtocol/http/。用户可通过源代码了解接口实现甚至可对源码进行修改。3.2 设置证书设置证书的函数原型为void set_customer_crt(const char *crt_file);具体介绍如下所示。3.3 向HTTP/HTTPS服务器发送form-data数据3.3.1 清除form_data缓存清除缓存的函数原型为void clear_multipart();具体介绍如下所示。3.3.2 填充form_data缓存填充缓存的函数原型如下所示传输的数据以键值对的形式传输。void add_multipart_form_data(const char *key, const char *value);具体介绍如下所示。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);具体介绍如下所示。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);具体介绍如下所示。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);具体介绍如下所示。4. 使用实例示例代码路径为EASY-EAI-Toolkit-1126B/Demos/netProtocol-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));