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

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

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

2.4 例程運行及效果
進入Release目錄,執(zhí)行下方命令,運行示例程序:
./Release/test-http_server & ./Release/test-http_client
執(zhí)行效果如下所示。
API的詳細說明,以及API的調(diào)用(本例程源碼),詳細信息見下方說明。
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/。用戶可通過源代碼了解接口實現(xiàn),甚至可對源碼進行修改。
3.2 設置證書
設置證書的函數(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:證書所在路徑 |
返回值 | 無 |
注意事項 | 無 |
3.3 向HTTP/HTTPS服務器發(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ù) | 無 |
返回值 | 無 |
注意事項 | form-data的緩存只有一份,無論在何處執(zhí)行,都會把form-data緩存給清空。若在多個線程執(zhí)行此函數(shù),需注意線程同步問題。 |
3.3.2 填充form_data緩存
填充緩存的函數(shù)原型如下所示,傳輸?shù)臄?shù)據(jù)以鍵值對的形式傳輸。
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)容 | |
返回值 | 無 |
注意事項 | form-data的緩存只有一份,一旦執(zhí)行clear_multipart(),之前添加進緩存的form-data數(shù)據(jù)都會被清空,若在多個線程執(zhí)行此函數(shù),需要注意線程同步問題。 |
3.3.3 發(fā)送form-data數(shù)據(jù)
由于HTTP和HTTPS的加密方式有所區(qū)別,故分別定義了兩個函數(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:服務器url |
func:方法 | |
result:用于保存HTTP/HTTPS返回的body數(shù)據(jù) | |
result_lenth:用戶用于給body數(shù)據(jù)分配的最大空間 | |
返回值 | -1:失敗 |
0:成功,函數(shù)內(nèi)部會調(diào)用clear_multipart()清空緩存 | |
注意事項 | 該接口是對HTTP/HTTPS POST請求的封裝,會把form-data的緩存發(fā)送出去,調(diào)用成功后清空form-data緩存,多線程注意線程同步 |
3.4 向HTTP/HTTPS服務器發(fā)送json數(shù)據(jù)
由于HTTP和HTTPS的加密方式有所區(qū)別,故分別定義了兩個函數(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:服務器url |
func:方法 | |
json:待發(fā)送的json字符串 | |
result:用于保存HTTP/HTTPS返回的body數(shù)據(jù) | |
result_lenth:用戶用于給body數(shù)據(jù)分配的最大空間 | |
返回值 | -1:失敗 |
0:成功 | |
注意事項 | 無 |
3.5 向HTTP/HTTPS服務器獲取文件
由于HTTP和HTTPS的加密方式有所區(qū)別,故分別定義了兩個函數(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:服務器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 發(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));
-
服務器
+關(guān)注
關(guān)注
12文章
9618瀏覽量
87070 -
HTTP
+關(guān)注
關(guān)注
0文章
518瀏覽量
32343 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5432瀏覽量
101236 -
rk3576
+關(guān)注
關(guān)注
1文章
125瀏覽量
497
發(fā)布評論請先 登錄
米爾RK3576開發(fā)板特惠活動!

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

評論