1. HTTP/HTTPS簡介
HTTP(全稱:Hyper Text Transfer Protocol,超文本傳輸協(xié)議)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議,是一個(gè)客戶端和服務(wù)器請(qǐng)求和應(yīng)答標(biāo)準(zhǔn),用于從WWW服務(wù)器傳輸超文本到本地的傳輸協(xié)議。
而HTTPS(全稱:Hyper Text Transfer Protocol over SecureSocket Layer)是以安全為目標(biāo)的HTTP通道,在原有HTTP的基礎(chǔ)上通過傳輸加密和身份認(rèn)證(即增加SSL/TSL安全訪問協(xié)議)保證了傳輸過程的安全性。
1.1 HTTP和HTTPS的區(qū)別
HTTP和HTTPS的區(qū)別如下所示。
協(xié)議 | HTTP | HTTPS |
CA證書 | 不需要 | 需要 |
傳輸加密方式 | 明文傳輸,無加密 | SSL/TSL加密傳輸 |
連接方式 | 端口號(hào)使用80 | 端口號(hào)使用443 |
連接狀態(tài) | 無狀態(tài)的 | 由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議 |
1.2 請(qǐng)求和響應(yīng)
典型的HTTP/HTTPS通訊就是應(yīng)用在瀏覽器與網(wǎng)頁服務(wù)器之間,瀏覽器即為客戶端,負(fù)責(zé)發(fā)出請(qǐng)求,接收?qǐng)?bào)文,渲染顯示效果。網(wǎng)頁服務(wù)器即為服務(wù)器,負(fù)責(zé)應(yīng)答請(qǐng)求,管理服務(wù)器文件、處理具體業(yè)務(wù)。而在某些情況中,HTTP可以作為信息交換的通訊規(guī)則。
客戶端需要資源時(shí)發(fā)送出來的即為請(qǐng)求報(bào)文,服務(wù)器接收到請(qǐng)求后向客戶端返回的就是響應(yīng)報(bào)文,HTTP規(guī)定了請(qǐng)求報(bào)文和響應(yīng)報(bào)文的格式。
請(qǐng)求報(bào)文格式如下所示。
對(duì)于本文而言,我們主要關(guān)注請(qǐng)求方法和URL即可。
請(qǐng)求行 | |
報(bào)文元素 | 描述 |
請(qǐng)求方法 |
常見的方法有: GET:用于檢索和獲取服務(wù)器的資源,請(qǐng)求內(nèi)容會(huì)在URL上顯示; POST:用于創(chuàng)建或更新服務(wù)器的內(nèi)容,請(qǐng)求內(nèi)容不會(huì)在URL上顯示,而是在顯示在主體內(nèi)。 |
URL | 服務(wù)器的虛擬文件路徑,將在下面章節(jié)重點(diǎn)介紹。 |
響應(yīng)報(bào)文示例如下所示,主要組成部分有:
狀態(tài)行(包含協(xié)議版本、狀態(tài)值、狀態(tài)短語);
響應(yīng)消息頭(以鍵值對(duì)的形式存在,例如時(shí)間、數(shù)據(jù)類型、數(shù)據(jù)長度等);
空行(用于區(qū)分報(bào)文頭和響應(yīng)正文);
響應(yīng)正文(對(duì)于網(wǎng)頁而言,常見的是html代碼,也可以是音視頻文件、圖片,通常是消息報(bào)頭的Content-Type指定)。
1.3 URL
假設(shè)我們搭建了一個(gè)環(huán)境檢測(cè)服務(wù)器系統(tǒng),用于采集、記錄全市各個(gè)觀測(cè)點(diǎn)的環(huán)境數(shù)據(jù),假定服務(wù)器的存放結(jié)構(gòu)如下所示,此服務(wù)器在公網(wǎng)上的域名為www.huanjin.com,里面有兩個(gè)設(shè)備,每個(gè)設(shè)備存放了不同日子的氣溫?cái)?shù)據(jù),當(dāng)客戶端需要調(diào)取具體設(shè)備具體數(shù)據(jù)時(shí),則需要提交一個(gè)唯一的路徑給服務(wù)器查找,這個(gè)唯一路徑就是URL。
URL(Uniform Resource Locator,統(tǒng)一資源定位符),存放在請(qǐng)求報(bào)文的請(qǐng)求行內(nèi),充當(dāng)路標(biāo)作用。當(dāng)我們?yōu)g覽網(wǎng)頁時(shí),點(diǎn)擊進(jìn)入不同的組件,瀏覽器就會(huì)自動(dòng)的幫我們填充不同的URL,地址的構(gòu)成如下所示。完整的URL包含:協(xié)議部分、網(wǎng)址部分、文件地址。
具體內(nèi)容如下所示。
組成部分 | 描述 |
協(xié)議 | 以“//”分割,常見的有http和https; |
網(wǎng)址 | 是公網(wǎng)上獨(dú)一無二的域名,即人們常見的www.baidu.com等 |
文件地址 | 從域名后的第一個(gè)“/”到最后一個(gè)“/”前的內(nèi)容,被稱為虛擬目錄 |
從最后一個(gè)“/”后到“#”前,即為文件名 |
例如我們想獲取環(huán)境檢測(cè)服務(wù)器中設(shè)備1的12月25號(hào)數(shù)據(jù),填寫的請(qǐng)求報(bào)文就是,GET請(qǐng)求,URL為“http://www.huanjin.com/Device-1/日期數(shù)據(jù)/20211225”。
URL還可以攜帶變量信息,名稱為URL查詢字符串,形式為:
https://www.Adblock.com/s?a=123&b=234
變量存放在URL結(jié)尾處,以“?”開頭,以“參數(shù)名=值”的鍵值對(duì)形式存放,多個(gè)參數(shù)用“&”分割。
1.4 HTTPS使用要點(diǎn)
通過以上敘述可知,使用HTTPS需要時(shí)刻圍繞以下幾點(diǎn):
CA證書,HTTPS協(xié)議用SSL/TSL;
發(fā)送數(shù)據(jù)使用POST請(qǐng)求,服務(wù)器地址使用URL格式表示;
接收數(shù)據(jù)、文件使用GET請(qǐng)求,服務(wù)器地址使用URL格式表示;
我司的easyeai-api軟件開源庫將復(fù)雜的報(bào)文格式、收發(fā)操作做了統(tǒng)一的封裝,為客戶提供簡單便捷的調(diào)用方式實(shí)現(xiàn)HTTP/HTTPS通訊功能。
2. 快速上手
如果您初次閱讀此文檔,請(qǐng)閱讀:《入門指南/源碼管理及編程介紹/源碼工程管理》,按需管理自己工程源碼(注:此文檔必看,并建議采用【遠(yuǎn)程掛載管理】方式,否則有代碼丟失風(fēng)險(xiǎn)!!!)。
2.1 源碼工程下載
先在PC虛擬機(jī)定位到nfs服務(wù)目錄,再在目錄中創(chuàng)建存放源碼倉庫的管理目錄:
cd ~/nfsroot mkdir GitHub cd GitHub
再通過git工具,在管理目錄內(nèi)克隆遠(yuǎn)程倉庫(需要設(shè)備能對(duì)外網(wǎng)進(jìn)行訪問)
git clone https://github.com/EASY-EAI/EASY-EAI-Toolkit-3576.git

注:
* 此處可能會(huì)因網(wǎng)絡(luò)原因造成卡頓,請(qǐng)耐心等待。
* 如果實(shí)在要在gitHub網(wǎng)頁上下載,也要把整個(gè)倉庫下載下來,不能單獨(dú)下載本實(shí)例對(duì)應(yīng)的目錄。
2.2 開發(fā)環(huán)境搭建
通過adb shell進(jìn)入板卡開發(fā)環(huán)境,如下圖所示。
通過以下命令,把nfs目錄掛載上nfs服務(wù)器。
mount -t nfs -o nolock : /home/orin-nano/Desktop/nfs/

2.3 例程編譯
然后定位到nfs的掛載目錄,再在目錄中創(chuàng)建存放源碼倉庫的管理目錄:
cd /home/orin-nano/Desktop/nfs/GitHub
進(jìn)入到對(duì)應(yīng)的例程目錄執(zhí)行編譯操作,具體命令如下所示:
cd EASY-EAI-Toolkit-3576/Demos/common-http/ ./build.sh

2.4 例程運(yùn)行及效果
進(jìn)入Release目錄,執(zhí)行下方命令,運(yùn)行示例程序:
./Release/test-http_server & ./Release/test-http_client
執(zhí)行效果如下所示。
API的詳細(xì)說明,以及API的調(diào)用(本例程源碼),詳細(xì)信息見下方說明。
3. HTTPS庫函數(shù)說明
本章節(jié)介紹EASY EAI的HTTPS庫函數(shù)的使用方法。
3.1 引用方式
EASY EAI api庫位于本倉庫的easyeai-api目錄中。為方便客戶在本地工程中直接調(diào)用我們的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 |
庫文件目錄 | 無 | 無 |
庫鏈接參數(shù) | ${HTTP_LIBS} | 無 |
API源代碼路徑為EASY-EAI-Toolkit-3576/easyeai-api/common/http/。用戶可通過源代碼了解接口實(shí)現(xiàn),甚至可對(duì)源碼進(jìn)行修改。
3.2 設(shè)置證書
設(shè)置證書的函數(shù)原型為:
void set_customer_crt(const char *crt_file);
具體介紹如下所示。
函數(shù)名:set_customer_crt() | |
頭文件 | easyeai-api/common/http/https_request.h |
輸入?yún)?shù) | crt_file:證書所在路徑 |
返回值 | 無 |
注意事項(xiàng) | 無 |
3.3 向HTTP/HTTPS服務(wù)器發(fā)送form-data數(shù)據(jù)
3.3.1 清除form_data緩存
清除緩存的函數(shù)原型為:
void clear_multipart();
具體介紹如下所示。
函數(shù)名:clear_multipart() | |
頭文件 | easyeai-api/common/http/https_request.h |
輸入?yún)?shù) | 無 |
返回值 | 無 |
注意事項(xiàng) | form-data的緩存只有一份,無論在何處執(zhí)行,都會(huì)把form-data緩存給清空。若在多個(gè)線程執(zhí)行此函數(shù),需注意線程同步問題。 |
3.3.2 填充form_data緩存
填充緩存的函數(shù)原型如下所示,傳輸?shù)臄?shù)據(jù)以鍵值對(duì)的形式傳輸。
void add_multipart_form_data(const char *key, const char *value);
具體介紹如下所示。
函數(shù)名:add_multipart_form_data() | |
頭文件 | easyeai-api/common/http/https_request.h |
輸入?yún)?shù) | key:form-data數(shù)據(jù)的鍵名 |
value:form-data數(shù)據(jù)的內(nèi)容 | |
返回值 | 無 |
注意事項(xiàng) | form-data的緩存只有一份,一旦執(zhí)行clear_multipart(),之前添加進(jìn)緩存的form-data數(shù)據(jù)都會(huì)被清空,若在多個(gè)線程執(zhí)行此函數(shù),需要注意線程同步問題。 |
3.3.3 發(fā)送form-data數(shù)據(jù)
由于HTTP和HTTPS的加密方式有所區(qū)別,故分別定義了兩個(gè)函數(shù),但參數(shù)一致,函數(shù)原型如下所示。
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發(fā)送函數(shù):send_data_to_Http() HTTPS發(fā)送函數(shù):send_data_to_Https() |
|
頭文件 | easyeai-api/netProtocol_api/https/https_request.h |
輸入?yún)?shù) | server:服務(wù)器url |
func:方法 | |
result:用于保存HTTP/HTTPS返回的body數(shù)據(jù) | |
result_lenth:用戶用于給body數(shù)據(jù)分配的最大空間 | |
返回值 | -1:失敗 |
0:成功,函數(shù)內(nèi)部會(huì)調(diào)用clear_multipart()清空緩存 | |
注意事項(xiàng) | 該接口是對(duì)HTTP/HTTPS POST請(qǐng)求的封裝,會(huì)把form-data的緩存發(fā)送出去,調(diào)用成功后清空form-data緩存,多線程注意線程同步 |
3.4 向HTTP/HTTPS服務(wù)器發(fā)送json數(shù)據(jù)
由于HTTP和HTTPS的加密方式有所區(qū)別,故分別定義了兩個(gè)函數(shù),但參數(shù)一致,函數(shù)原型如下所示。
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發(fā)送函數(shù):send_json_to_Http() HTTPS發(fā)送函數(shù):send_json_to_Https() |
|
頭文件 | easyeai-api/netProtocol_api/https/https_request.h |
輸入?yún)?shù) | server:服務(wù)器url |
func:方法 | |
json:待發(fā)送的json字符串 | |
result:用于保存HTTP/HTTPS返回的body數(shù)據(jù) | |
result_lenth:用戶用于給body數(shù)據(jù)分配的最大空間 | |
返回值 | -1:失敗 |
0:成功 | |
注意事項(xiàng) | 無 |
3.5 向HTTP/HTTPS服務(wù)器獲取文件
由于HTTP和HTTPS的加密方式有所區(qū)別,故分別定義了兩個(gè)函數(shù),但參數(shù)一致,函數(shù)原型如下所示。
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獲取文件函數(shù):get_file_from_https() HTTPS獲取文件函數(shù):get_file_from_http() |
|
頭文件 | easyeai-api/netProtocol_api/https/https_request.h |
輸入?yún)?shù) | url:服務(wù)器url路徑 |
func:方法 | |
filePath:用于存放所獲取文件的本地路徑 | |
返回值 | Success |
Unknown | |
Connection | |
BindIPAddress | |
Read | |
Write | |
ExceedRedirectCount | |
Canceled | |
SSLConnection | |
SSLLoadingCerts | |
SSLServerVerification | |
UnsupportedMultipartBoundaryChars | |
Compression | |
注意事項(xiàng) | 該接口是對(duì)HTTP/HTTPS GET請(qǐng)求的封裝 |
4. 使用實(shí)例
示例代碼路徑為EASY-EAI-Toolkit-3576/Demos/common-http/ test-http_client.c。
4.1 設(shè)置CRT密鑰文件
設(shè)置密鑰文件操作如下所示。
set_customer_crt("/userdata/customer.crt");
4.2 發(fā)送form_data數(shù)據(jù)
4.2.1 填充數(shù)據(jù)
清空form_data數(shù)據(jù)緩沖區(qū),然后填充form_data緩沖區(qū)數(shù)據(jù)。
clear_multipart(); add_multipart_form_data("name", "gzlmo"); add_multipart_form_data("id", "888888"); add_multipart_form_data("pwd", "123456");
4.2.2 發(fā)送數(shù)據(jù)
發(fā)送操作如下所示。
send_data_to_Http("192.168.3.191:50000", "/add", res, sizeof(res));
4.3 發(fā)送json數(shù)據(jù)
發(fā)送操作如下所示。
send_json_to_Http("192.168.3.191:50000", "/add", "{name : "gzlmo"}", res, sizeof(res));
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9618瀏覽量
87066 -
HTTP
+關(guān)注
關(guān)注
0文章
518瀏覽量
32338 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5432瀏覽量
101227 -
rk3576
+關(guān)注
關(guān)注
1文章
125瀏覽量
497
發(fā)布評(píng)論請(qǐng)先 登錄
米爾RK3576開發(fā)板特惠活動(dòng)!

RK3576開發(fā)板技術(shù)分享 | Weston 配置技巧:定制你的桌面體驗(yàn)!

基于RK3576開發(fā)板的MIPI-DSI使用

評(píng)論