今天我們來(lái)學(xué)習(xí)的是我珍藏已久的低功耗模組Air724UG的LuatOS開(kāi)發(fā)HTTP示例,獻(xiàn)給大家。
一、HTTP 概述
此部分內(nèi)容只是簡(jiǎn)單的對(duì)HTTP作一個(gè)介紹,更詳細(xì)的說(shuō)明或協(xié)議文檔,請(qǐng)查閱相關(guān)網(wǎng)站或文檔。
1.1 HTTP 請(qǐng)求方法
HTTP/1.1 協(xié)議中共定義了八種方法來(lái)以不同方式操作指定的資源。
a.GET
向指定的資源發(fā)出請(qǐng)求。使用 GET 方法應(yīng)該只用在讀取數(shù)據(jù)。
b.HEAD
與 GET 方法一樣,都是向服務(wù)器發(fā)出指定資源的請(qǐng)求。只不過(guò)服務(wù)器將不傳回資源的本文部分。
c.POST
向指定資源提交數(shù)據(jù),請(qǐng)求服務(wù)器進(jìn)行處理,例如上傳文件。
d.PUT
向指定資源位置上傳其最新內(nèi)容。
e.DELETE
請(qǐng)求服務(wù)器刪除 Request-URI 所標(biāo)識(shí)的資源。
f.TRACE
回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷。
g.OPTIONS
這個(gè)方法可使服務(wù)器傳回該資源所支持的所有 HTTP 請(qǐng)求方法。用’*'來(lái)代替資源名稱,向 Web 服務(wù)器發(fā)送 OPTIONS 請(qǐng)求,可以測(cè)試服務(wù)器功能是否正常運(yùn)作。
h.CONNECT
HTTP/1.1 協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。通常用于 SSL 加密服務(wù)器的鏈接。
HTTP 服務(wù)器至少應(yīng)該實(shí)現(xiàn) GET 和 HEAD 方法,其他方法都是可選的。
1.2 HTTP 狀態(tài)碼
狀態(tài)代碼的第一個(gè)數(shù)字代表當(dāng)前響應(yīng)的類型:
1xx 消息——請(qǐng)求已被服務(wù)器接收,繼續(xù)處理
2xx 成功——請(qǐng)求已成功被服務(wù)器接收、理解、并接受
3xx 重定向——需要后續(xù)操作才能完成這一請(qǐng)求
4xx 請(qǐng)求錯(cuò)誤——請(qǐng)求含有詞法錯(cuò)誤或者無(wú)法被執(zhí)行
5xx 服務(wù)器錯(cuò)誤——服務(wù)器在處理某個(gè)正確請(qǐng)求時(shí)發(fā)生錯(cuò)誤
RFC 2616 中已經(jīng)推薦了描述狀態(tài)的短語(yǔ),例如"200 OK",“404 Not Found”。
1.3 URL 鏈接地址
超文本傳輸協(xié)議(HTTP)的地址包含五個(gè)基本元素,分別是:
a.傳送協(xié)議, 層級(jí) URL 標(biāo)記符號(hào)(為[//],固定不變) 訪問(wèn)資源需要的憑證信息服務(wù)器,一般情況下為域名,也可以使用 IP 地址。
b.端口號(hào),以數(shù)字方式表示,HTTP 默認(rèn)為”:80“,默認(rèn)值可不給出。
c.路徑,字符“/”區(qū)別路徑中的每一個(gè)目錄名稱。
d.查詢,GET 模式的窗體參數(shù),用“?”字符作為起點(diǎn),每個(gè)參數(shù)用“&”隔開(kāi),再以“=”分開(kāi)參數(shù)名稱與數(shù)據(jù)。
e.片段,以“#”字符為起點(diǎn)。
由于超文本傳輸協(xié)議允許服務(wù)器將瀏覽器重定向到另一個(gè)網(wǎng)頁(yè)地址,因此許多服務(wù)器允許用戶省略網(wǎng)頁(yè)地址中的部分內(nèi)容,比如 www。
本文通過(guò)幾個(gè)具體的例子,演示 http 與 https 協(xié)議的具體實(shí)現(xiàn)。
二、功能演示概述
2.1 演示內(nèi)容
本文通過(guò)作者自身的使用經(jīng)歷與實(shí)踐,給大家演示 http 的常見(jiàn)操作與使用,包括:
a.get 方法的實(shí)現(xiàn);
b.post 方法的實(shí)現(xiàn);
c.文件的上傳操作;
d.文件的下載操作;
e.https 加密通訊;
f.處理 JSON 數(shù)據(jù);
g.gzip 操作。
三、硬件環(huán)境準(zhǔn)備
3.1 開(kāi)發(fā)板準(zhǔn)備
本文所涉及到的所有演示,都使用開(kāi)發(fā)板 EVB_Air724UG_A14 完成
此核心板的詳細(xì)使用說(shuō)明參考:
https://docs.openluat.com/air724ug/product/
此開(kāi)發(fā)板的詳細(xì)使用說(shuō)明參考:Air724UG 產(chǎn)品手冊(cè)中的 《EVB_Air724UG_AXX開(kāi)發(fā)板使用說(shuō)明》,寫這篇文章時(shí)最新版本的使用說(shuō)明為:《EVB_Air724UG_A14開(kāi)發(fā)板使用說(shuō)明》;開(kāi)發(fā)板使用過(guò)程中遇到任何問(wèn)題,可以直接參考這份使用說(shuō)明文檔。
中國(guó)大陸環(huán)境下,可以上網(wǎng)的 sim 卡,一般來(lái)說(shuō),使用移動(dòng),電信,聯(lián)通的物聯(lián)網(wǎng)卡或者手機(jī)卡都行;
3.2 開(kāi)發(fā)板的接線方式
首先將開(kāi)發(fā)板放置好,接上 USB 并連接到電腦,同時(shí),記得將天線也連接好,保證信號(hào)環(huán)境比較良好,比如可以看看手機(jī)信號(hào)來(lái)判斷一下所在環(huán)境的信號(hào)狀況。USB 的連接如上圖所示。
在上圖中,連接 USB 的插口旁邊有一個(gè) USB 字樣,在進(jìn)行腳本下載時(shí),須連接此端口。旁邊另一個(gè) USB 插口是 USB 轉(zhuǎn) UART 的接口,可以通過(guò)串行口工具查看調(diào)試 TRACE 信息。在本文的測(cè)試環(huán)境中,使用 USB 打印 trace,即在 Luatools工具中,將軟件上的"usb 打印 trace"選中即可,不必再另外連接串行口監(jiān)視打印 trace 的相關(guān)信息。
3.3 固件操作相關(guān)內(nèi)容
a.Luatools,是下載固件與腳本必不可少的工具,并且使用其查看 TRACE 調(diào)試信息也非常方便。
https://docs.openluat.com/Luatools/
b.Luatools 工具的使用請(qǐng)參閱:
https://docs.openluat.com/blog/Luatools/
c.遠(yuǎn)程固件升級(jí)請(qǐng)參閱:
https://docs.openluat.com/blog/fota_lesson/
d.USB 驅(qū)動(dòng)安裝請(qǐng)參閱:
https://docs.openluat.com/blog/usb_drv/
四、軟件環(huán)境準(zhǔn)備
4.1 Lua 腳本語(yǔ)言
本文以 Lua 腳本語(yǔ)言為基礎(chǔ),因而需要有 Lua 腳本語(yǔ)言基礎(chǔ),可以通過(guò)下列文檔了解:
Lua 腳本語(yǔ)言的語(yǔ)法,請(qǐng)參閱:
https://wiki.luatos.com/luaGuide/luaReference.html#lua-5-3
https://docs.openluat.com/blog/lua_lesson/
4.2 Lua 腳本語(yǔ)言的 http 接口 API
本文既然是說(shuō) http,除了在 http 概述內(nèi)的簡(jiǎn)單說(shuō)明,還有必要對(duì) Lua 腳本語(yǔ)言的 API 有一個(gè)了解。http 的 API 接口定義如下面的代碼。我之所以貼出下面這段定義代碼,三個(gè)方面的原因。
a.首先當(dāng)然是注釋說(shuō)明中有較明晰的 http 協(xié)議結(jié)構(gòu)的定義;
b.其次對(duì)參數(shù)的解釋說(shuō)明比演示文檔 testHttp.lua 文件內(nèi)容更全面,更有利于讀者對(duì)各個(gè)參數(shù)形式有一個(gè)了解。比如,傳遞證書(shū)就有了較明晰的表達(dá)式形式,這樣也方便大家組織參數(shù)時(shí),能做到心里有數(shù);
c.最后是給出了不少調(diào)用示例,而這些示例在 testHttp.lua 文檔內(nèi)沒(méi)有或者不全面,而此處的示例能起到一個(gè)很好的補(bǔ)充。
關(guān)于 http 接口的具體說(shuō)明,讀者還可以查詢其它相關(guān)資料或參考其它文件檔。
4.3 輔助工具
為了有效的分析開(kāi)發(fā)過(guò)程中可能遇到的問(wèn)題,并能查看數(shù)據(jù),準(zhǔn)備一些輔助工具很有必要,將大大縮短大家解決問(wèn)題的時(shí)間。本文編寫過(guò)程中,使用了幾款工具介紹給大家,本文在后面將使用用或提到這些工具,請(qǐng)大家先了解。
a.Progress Telerik Fiddler Classic,抓包工具。
https://downloads.getfiddler.com/fiddler-classic/FiddlerSetup.5.0.20244.10953-latest.exe
b.Postman,API 調(diào)試平臺(tái)工具,可以方便的驗(yàn)證本文所提到的各種操作。
https://dl.pstmn.io/download/latest/win64
c.httpbin.org,一個(gè)很不錯(cuò)的 API 調(diào)試網(wǎng)站,本文有關(guān) http 的不少內(nèi)容的演示,即使用本網(wǎng)站完成。
五、Luatools 的基本使用
5.1 準(zhǔn)備演示代碼
本文使用 air724 模塊的演示代碼 testHttp 作為藍(lán)本,在此基礎(chǔ)上進(jìn)行修訂刪改,來(lái)完成本文第二章中所提到的內(nèi)容。該演示藍(lán)本有兩個(gè)文件,分別為 main.lua、testHttp.lua 兩個(gè)文件。大家如果了解可以跳過(guò),如果不熟悉又不想去費(fèi)勁下載資源,可以直接復(fù)制使用。testHttp.lua 隨著本文的測(cè)試進(jìn)行,會(huì)有所修訂,本文最后會(huì)給出完整的包含所有修訂的文件。
5.2 使用 Luatools 工具
按照本文的第三章第 2 節(jié)所描述的方式連接好開(kāi)發(fā)板后,確認(rèn)無(wú)誤后,我們就可以啟動(dòng) Luatools 工具,如下圖所示。點(diǎn)擊界面中“項(xiàng)目管理與測(cè)試”按鈕,出現(xiàn)下圖所示的窗口,點(diǎn)擊“創(chuàng)建項(xiàng)目”,并輸入項(xiàng)目名稱,如本文建立的項(xiàng)目名稱為 http_doc。
項(xiàng)目建立完成后,點(diǎn)添加腳本或資源文件,按上節(jié)所說(shuō)將藍(lán)本 main.lua 與 testHttp.lua 添加上去,如圖所示。
將"usb 打印 trace”使能,“添加默認(rèn) lib”選中。
完成上面的操作后,還要選擇底層 CORE。因?yàn)楹现婺K有各種資源,不同的底層 CORE 支持的內(nèi)容不同,這些底層內(nèi)核一般安裝在工具所在目錄的 ressoure 子目錄下。打開(kāi)此目錄,會(huì)有不同的選擇,如圖。因?yàn)?724ug 模塊屬于 8910 平臺(tái),所以我們要選擇 8910 的某一個(gè)內(nèi)核,本文所說(shuō)都是指對(duì)腳本語(yǔ)言 Lua 進(jìn)行開(kāi)發(fā),因而我們選擇 8910_lua_lod 即可。點(diǎn)擊進(jìn)入,有多個(gè)內(nèi)核,我們選擇最基本的 LuatOS-Air_V4028_RDA8910.pac 即可,如果大家手上使用的內(nèi)核進(jìn)行了升級(jí),會(huì)有一些區(qū)別,譬如版本號(hào)變化等,請(qǐng)留意即可。
如果電腦上沒(méi)有上述固件,也可以通過(guò)下載的網(wǎng)址下載。
固件版本和上層腳本:https://docs.openluat.com/air724ug/luatos/firmware/
六、GET 請(qǐng)求演示
6.1 演示網(wǎng)站 httpbin.org
為了使本文的演示可直接使用并能得到結(jié)果,而不是隨便給個(gè)示范文本,有必要找一個(gè)可以進(jìn)行測(cè)試的網(wǎng)站,本文使用上面工具準(zhǔn)備里提到過(guò)的 httpbin.org 給出的 API 來(lái)進(jìn)行測(cè)試。
首先打開(kāi) httpbin.org 網(wǎng)站,并找到 Dynamic data 這一欄,然后點(diǎn)開(kāi)下拉菜單,如圖示。
找到 Dynamic data 這一欄,打開(kāi),如下圖所示。
在上面看到第一項(xiàng)是 GET 方法,url 是/base64/{value},表示使用 GET 方法可以從此連接(url)得到經(jīng)過(guò) base64 編碼的內(nèi)容,也即將 value 還原為實(shí)際內(nèi)容,即解碼。我們來(lái)完成這個(gè)工作。
6.2 用 GET 方法實(shí)現(xiàn) base64 解碼 API
我們可以使用 crypto.base64_encode 函數(shù)來(lái)對(duì)字符完成 base64 的編碼,在 testHttp.lua 中找到 http.request( "GET" , "www.lua.org",nil,nil,nil,nil,cbFnc)這一行語(yǔ)句,在語(yǔ)句前定義一個(gè)本地變量并賦值”用合宙 724ug 模塊完成 http 的 GET 方法“,即 local base64_str = "用合宙 724ug 模塊完成 http 的 GET 方法"。
按 API 的說(shuō)明,將 url 路徑也即將 "www.lua.org" 替換為 "httpbin.org/base64/"..crypto.base64_encode ( base64_str , base64_str:len() )。
修訂完成后是如下這個(gè)樣子,保存文件后我們使用 Luatools 將腳本下載到開(kāi)發(fā)板中,看看結(jié)果如何。
特別注意
如果是第一次下載,要選擇下載底層與腳本,因?yàn)槟愕绞值拈_(kāi)發(fā)板,里面到底是什么內(nèi)核還不清楚,如果內(nèi)核不對(duì),也就運(yùn)行不起來(lái),這一點(diǎn)切記。在完成了底層下載后,如果腳本再有修訂,就不需要再下載底層了,只下載腳本即可。
下載完成后,會(huì)自動(dòng)啟動(dòng),并在 Luatools工具中顯示 trace 信息。直接看結(jié)果吧,如圖所示。
在上圖中,可以看到結(jié)果 true 200,表示正確完成,http 狀態(tài)碼是 200。
同時(shí)返回了解碼的字串”用合宙 724ug 模塊完成 http 的 GET 方法“。
至此,GET 的演示工作順利完成。
6.3 完整代碼的約定
為方便大家取用,本文最后將列出完整的 testHttp.lua 代碼。本文所作的全部修訂,都將保留在 testHttp.lua 文件中,使用注釋符如“--[[”與“]]”的來(lái)進(jìn)行選取使用或不使用。
七、POST 請(qǐng)求演示
7.1 物聯(lián)網(wǎng)卡信息 API 接口
對(duì) get 的演練,感覺(jué)還是挺容易的,一路下來(lái)也沒(méi)有什么障礙。不過(guò) GET 我們使用的還不是真正的應(yīng)用場(chǎng)合,因?yàn)榉?wù)器仍然還只是一個(gè)演示。我們?cè)?POST 就使用一個(gè)真實(shí)的應(yīng)用數(shù)據(jù),算是一個(gè)真實(shí)的項(xiàng)目應(yīng)用。
我們要演示,就得有服務(wù)器可以讓我們來(lái)實(shí)操,上面說(shuō)了,我們要完成一個(gè)真實(shí)的項(xiàng)目。使用 724ug 模塊,就得有上網(wǎng)卡,物聯(lián)網(wǎng)卡是最優(yōu)的選擇。這里有一個(gè)物聯(lián)網(wǎng)卡服務(wù)商提供的物聯(lián)網(wǎng) SIM 卡信息的 API 接口,這個(gè)網(wǎng)站是
http://sim.taoyuan-tech.com。這是一個(gè)真實(shí)的網(wǎng)站,而且給客戶提供一個(gè)測(cè)試賬號(hào),那么我們就使用這個(gè)測(cè)試賬號(hào)來(lái)進(jìn)行 POST 方法的操作,以讀取 SIM 卡的日志
這里測(cè)試賬號(hào)的用戶名:18168967871,密碼:18168967871。登錄進(jìn)去后,是下圖中所示的樣子。
在上圖所示界面中,點(diǎn)擊獲取”APIkey 各 Secret“字樣的按鈕,可得到測(cè)試用戶的 API key 與 API Secret,注意保存這兩個(gè)數(shù)據(jù)備用。點(diǎn)擊”API 文檔“字樣的按鈕,可進(jìn)入詳細(xì)的接口 API 說(shuō)明文檔頁(yè)面,如圖。
看文檔目錄,約定等前面幾項(xiàng)內(nèi)容是要關(guān)注的,好在簡(jiǎn)短,切一張圖也就可以完全看到,列出于下圖。
我們?cè)谏蠄D中看到幾項(xiàng)注意事項(xiàng)。
a.所有請(qǐng)求參數(shù),使用 json 形式發(fā)送。這表示只接收 json 形式的數(shù)據(jù)與內(nèi)容;
b.需要返回狀態(tài)碼 200 才正確;
c.約定了所使用的單位,這樣可以方便的計(jì)算時(shí)間與費(fèi)用;
d.對(duì)認(rèn)證進(jìn)行了說(shuō)明,這很重要,要仔細(xì)閱讀并理解 。認(rèn)證方式為 HTTP Basic Authorization,認(rèn)證信息的形式是 appkey:appsecret。就是前面提到要注意保存的那兩個(gè)數(shù)據(jù);
e.對(duì)可能的錯(cuò)誤碼進(jìn)行了說(shuō)明;
f.給出了主機(jī)地址為 http://api.taoyuan-tech.com/api/open。
所有這些約定及注意事項(xiàng)都很重要,不要忽略,可能后面我們都會(huì)要用到。
這個(gè) API 有好幾個(gè)接口,我們就選第一個(gè)來(lái)實(shí)現(xiàn)即可。就是下面圖中所列出的日志查詢。圖中表格所給出的字段,是我們需要提供的訪問(wèn)參數(shù)及返回結(jié)果。
7.2 使用 postman 工具驗(yàn)證
為了方便,我們可以先使用 postman 組織包內(nèi)容,然后再移植到 testHttp.lua 文件內(nèi)進(jìn)行測(cè)試。查看“物聯(lián)網(wǎng)卡指定日期用量日志查詢 ”API 的說(shuō)明,我們知道此接口的訪問(wèn)的 url 為“/iotcard/usagelog”,所以完整的訪問(wèn)路徑為 http://api.taoyuan-tech.com/api/open/iotcard/usagelog,將此路徑填入到 postman 中,選擇 POST 方法,選擇頭部信息 Auth Type 類型為 Basic Auth。這些內(nèi)容都是 API 文檔約定與注意事項(xiàng)所確定的內(nèi)容。然后點(diǎn)擊 Auth,將前文提到過(guò)的 Apikey 與 Apisecret 分別填入到用戶名與密碼輸入框內(nèi)。如下圖所示。
接著再點(diǎn)擊 Body,輸入以下內(nèi)容:
其中字段的含義在前圖所示的表格中都有說(shuō)明,請(qǐng)大家注意查閱。而 89860403102080512138 為 SIM 卡號(hào)的 iccids 號(hào),此 SIM 卡可在測(cè)試用戶賬號(hào)中的卡片信息中查到。如果卡片信息沒(méi)有此號(hào)碼,可以查閱卡片信息以獲取用戶數(shù)據(jù)庫(kù)中真實(shí)存在的卡片 iccids 號(hào)。從圖中的說(shuō)明中我們還知道,傳入的參數(shù)可以是其它的三種識(shí)別號(hào)碼之一,如 imei 號(hào)。在四個(gè) SIM 卡的關(guān)聯(lián)識(shí)別號(hào)中四選一,本文我們選擇 iccids,想測(cè)試其它參數(shù)形式的,可以自行更改修訂。比如修訂為 imsis,則輸入內(nèi)容就變?yōu)椋?/p>
如下圖所示。
輸入完成,點(diǎn)擊 Send 發(fā)送。即返回如下圖所示的響應(yīng)。
依據(jù)前圖所示的表格內(nèi)容可知,2024-10-10 這一天所消耗的流量為 0M,即"data_usage":0。同時(shí),查看狀態(tài)碼為 200,結(jié)果 OK。這些完成后,我們就可以根據(jù)組包的相關(guān)信息,對(duì) testHttp.lua 進(jìn)行修訂。
7.3 修訂文件內(nèi)容
打開(kāi) testHttp.lua 文件,我們?cè)?77 行與 84 行之間,發(fā)現(xiàn)了一段代碼,使用了 POST 方法,可以在此基礎(chǔ)上進(jìn)行修訂,如下圖。首先將注釋去掉,再查看具體內(nèi)容,我們發(fā)現(xiàn)有幾點(diǎn)存在疑問(wèn)。
a.從上文可知,API 使用的是 Auth Basic 的方式,而且上面組包時(shí),使用的是 Apikey 與 Apisecret 兩個(gè)內(nèi)容,這個(gè)與演示代碼的 ["Authorization]"="Basic jffdsfdsfdsfdsfjakljfdoiuweonlkdsjdsjapodaskdsf",好像相符,但又好像不相符,這里怎么去得到這個(gè)串呢;
b.前文提到,使用的 Content-type 是 application/json,與代碼中所使用的方式有所不同,因而此處需要修訂;
c.同時(shí)請(qǐng)求參數(shù)的內(nèi)容肯定也需要修訂,只是如何組織這個(gè)參數(shù)呢。從 table 類型的各種組織方式看,也沒(méi)有 name:value 這樣的形式。
有問(wèn)題就好,一個(gè)個(gè)解決也就好了。首先我們從第一個(gè)問(wèn)題開(kāi)始,這就要用到本文開(kāi)頭所給出抓包工具了,我們看看實(shí)際的數(shù)據(jù)是什么樣子,不就知道了嗎?直接上圖,如下面圖中所示,可以看到實(shí)際的數(shù)據(jù)包都有哪些內(nèi)容,當(dāng)然,此抓包工具也可以查看 BODY,auth 等各項(xiàng)數(shù)據(jù),可以切換各頁(yè)面看看都有哪些數(shù)據(jù)項(xiàng),以加深理解。
在上圖中,我們看到了一行文字內(nèi)容:Authorization: Basic NkZhbXFsRmZTVmQ4OHNHejpLemt0SW8y ......這個(gè)正是我們所要的內(nèi)容,因而將此項(xiàng)復(fù)制,填入代替。
第二個(gè)問(wèn)題簡(jiǎn)單,直接修訂為['Content-Type']="application/json"即可。
第三個(gè)問(wèn)題,需要調(diào)用 json 的一個(gè)函數(shù)來(lái)解決,就是下面這個(gè)函數(shù),即 json 編碼。
其它的,['Connection']="keep-alive"要不要加上,看示例代碼中有些加了,有些沒(méi)有加。Http 是短連接,但又希望環(huán)境能得到保存,使下次再次發(fā)起 http 請(qǐng)求時(shí),能快速得到反應(yīng),因而才有了這個(gè)['Connection']="keep-alive"的配置項(xiàng),但在 Http 1.1 之后,這個(gè)就是默認(rèn)的值,因而可以加上,也可以不加上,效果一樣。
經(jīng)過(guò)上面的修訂后,代碼成為了下面這樣子。
好了,現(xiàn)在我們將腳本下載到開(kāi)發(fā)板中,看看是什么結(jié)果。
不出意外,如上圖中所示,可以看到返回的狀態(tài)碼是 200,結(jié)果為 true,代碼執(zhí)行正確無(wú)誤,同時(shí),可以看到服務(wù)器返回的數(shù)據(jù),與從 postman 得到的數(shù)據(jù)一致。
到這里,POST 的演示算是完成了,另外要補(bǔ)充說(shuō)明的是,其實(shí)頭部結(jié)構(gòu)里的 Auth Basic 有另一種取得方式,可以直接調(diào)用 crypto 模塊內(nèi)的 base64 函數(shù)來(lái)完成。如下代碼所示。
具體要如何使用,看實(shí)際情況,因?yàn)橛行┚W(wǎng)站的 API 提供的直接就是 BASE64 碼,此時(shí)用第一種顯然省事。本文最后完整源代碼使用生成方式。
八、文件上傳操作
8.1 準(zhǔn)備工作
對(duì)于文件上傳,我們?nèi)允褂?GET 方法時(shí)所使用的測(cè)試服務(wù)器,即 httpbin.org,因?yàn)槲覀兪褂谩眕ost"方法上傳文件,所以 url 為 httpbin.org/post。需要說(shuō)明一點(diǎn)的是,httpbin.org/post 是一個(gè)回環(huán)服務(wù)器,即當(dāng)向其傳輸文件時(shí),服務(wù)器會(huì)將傳輸內(nèi)容作為響應(yīng)返回,因而當(dāng)我們看到響應(yīng)并返回的內(nèi)容后,就可以判斷操作是否正確。其實(shí)我有考慮使用更直接的方式,但幾天下來(lái)找不到合用的服務(wù)器來(lái)進(jìn)行操作,只好以此作為本文的上傳文件演示了。
還是前面的方法,我們先使用 Postman 工具來(lái)組織數(shù)據(jù)包。
a.啟動(dòng) Postman 并將方法選擇為 POST;
b.在主機(jī)欄內(nèi)輸入“httpbin.org/post”;
c.然后選擇 body,選擇 binary;
d.選擇文件,本處為 test.txt,內(nèi)容為“uses post method to upload a file.”;如果沒(méi)有此文件,新建一個(gè)即可;
e.點(diǎn)擊發(fā)送;
f.稍后返回?cái)?shù)據(jù)。
所有操作及數(shù)據(jù)如下圖所示。
在圖中可以清楚地看到 200 OK 字樣,表示操作正確。同時(shí),我們?cè)趫D中 6 號(hào)箭頭所指的文本中,可以發(fā)現(xiàn)一些有用的字串,分別是:
同時(shí),我們也發(fā)現(xiàn)了:
"files":{}
"form":{}
為空,這個(gè)我們可以比對(duì)后面的多文件多參數(shù)上傳時(shí)的內(nèi)容來(lái)進(jìn)行理解。
8.2 文件修訂
如前面的方法,我們來(lái)修訂 testHttp.lua 文件的內(nèi)容。
在 testHttp.lua 的 56 行開(kāi)始,有一處注釋掉了的代碼,可以為我們所用。如下圖。
首先,去掉注釋括號(hào),將 url 替換成“httpbin.org/post”;
其次,將['Content-Type']的值替換成前面所說(shuō)的內(nèi)容,即"text/plain";
最后,將{[1]={['file']="/RecDir/rec001"}}修訂為{[1]={['file']="/luar/test.txt"}}并按保存。
修訂后的文本如列出如下。
8.3 固件下載及運(yùn)行結(jié)果
啟動(dòng) Luatools 固件下載工具,并點(diǎn)擊項(xiàng)目管理測(cè)試按鈕,將文件 main.lua,testHttp.lua 分別添加進(jìn)去,同時(shí)將文件 test.txt 也添加上去,如下圖所示。需要注意,大家建立項(xiàng)目的位置不同,圖中的文件路徑與項(xiàng)目路徑可能有些不同,與自己的實(shí)際內(nèi)容相符即可。
在圖中點(diǎn)下載腳本,然后切換到 Luatools 的 trace 頁(yè)面,等待腳本代碼運(yùn)行結(jié)果。
由圖中內(nèi)容可見(jiàn),腳本復(fù)現(xiàn)了 Postman 演示的內(nèi)容,上文中我們所關(guān)注的內(nèi)容也都從圖中得到印證,見(jiàn)圖中紅框中的內(nèi)容,可以與 postman 的內(nèi)容進(jìn)行比較。
到這里文件上傳可以順利完成??赡苡腥艘獑?wèn)了,文件是上傳了,可是我需要傳二進(jìn)制文件怎么辦,或者我要傳圖片怎么處理。其實(shí)也很簡(jiǎn)單,我們還是用 postman 來(lái)進(jìn)行組包測(cè)試,如下圖。
圖中我們將 test.txt 去掉,使用 test.bin 取代,將腳本的內(nèi)容類型即 Content-Type 修訂為"application/octet-stream"即可,其它不變,其中 application/octet-stream 就表示數(shù)據(jù)內(nèi)容是二進(jìn)制流。點(diǎn)擊 SEND 后,可看到返回信息。修訂后的內(nèi)容如下所示。
使用 Luatools 下載后等待運(yùn)行結(jié)果如圖所示。與 postman 的相關(guān)結(jié)果亦相符。當(dāng)然,這里要特別提示幾點(diǎn)。
a.文件請(qǐng)注意大小,太大的文件可能會(huì)導(dǎo)致內(nèi)存不足,因而太大的文件需要經(jīng)過(guò)其它處理才可以。
b.相關(guān)資源文件請(qǐng)一并加到項(xiàng)目中,與腳本一起下載到模塊中。
c.對(duì)于二進(jìn)制文件,對(duì)內(nèi)容進(jìn)行了 base64 編碼,因而文件上傳后,真正使用時(shí),需要進(jìn)行解碼。
8.4 文件上傳進(jìn)階篇
也許有些用途一方面要上傳文件,一方面又要傳參數(shù),此時(shí)又要如何處理呢。我們查看 testHttp.lua 文件,有一段代碼如下,也就是文件最后面約從 90 行開(kāi)始的部分。我們可以利用此段代碼進(jìn)行比較復(fù)雜的文件上傳操作,比如傳多個(gè)文件,多個(gè)參數(shù)。下面這段代碼即是 testHttp.lua 文件中相應(yīng)的代碼段去掉注釋后的樣子。
在上面的代碼中,傳了兩個(gè)參數(shù),即 imei 卡號(hào)與時(shí)間,傳了一個(gè)文件,即"logo_color.jpg"。我們需要修訂為我們所用。首先我們將 url 修訂為“httpbin.org/post”,同時(shí)我們將上傳文件修訂為 “/lua/text.txt”。除此外,我們還有一個(gè)地方要修訂,即添加一個(gè)文件類型,即 txt = "text/plain"。表示這是一個(gè)文本文件,大抵如果是一個(gè) BIN 文件,需要添加一個(gè) BIN="application/octet-stream"吧,依此類推。
依上面修訂后,testHttp.lua 成為下面這個(gè)樣子。這是進(jìn)階篇完整的代碼,大家可以直接復(fù)制取用,為了節(jié)省篇章,此代碼為傳輸兩個(gè)文件,兩個(gè)參數(shù)的例子,不再一一講解一個(gè)文件,一個(gè)參數(shù)等其它搭配組合情況,請(qǐng)知悉。
將上面代碼修訂后,與 main.lua,text.txt,text.bin 一起添加的項(xiàng)目文件內(nèi),如圖所示。沒(méi)有文本文件可以新建,二進(jìn)制文件可以在電腦上找一個(gè)較小的,比如我就找了一個(gè)單片機(jī)的二進(jìn)制固件 test.bin。文件不要過(guò)大,容易導(dǎo)致內(nèi)存問(wèn)題,這也是我們實(shí)際要考慮的問(wèn)題,即在實(shí)際應(yīng)用中,文件的處理還是要小心對(duì)待。
下載完成,我們查看運(yùn)行結(jié)果,如圖。
我們?cè)谏蠄D中找到了 true 200 表示正確返回,然后我們找到了第一個(gè)文件 test.bin 的相關(guān)數(shù)據(jù),因?yàn)榇翱诖笮≡?,沒(méi)有顯示第二個(gè)文件的內(nèi)容,我們可以翻看到第二個(gè)文件的內(nèi)容,如圖。
我們?cè)趫D中找到了第二個(gè)文件的信息,文本文本并沒(méi)有進(jìn)行 base64 加密處理。同時(shí),兩個(gè)參數(shù)的內(nèi)容也可以找到。
下面說(shuō)說(shuō)文件類型怎么定義的問(wèn)題,因?yàn)槲覀兛吹轿募愋偷亩x有點(diǎn)懵。如下面的代碼中,有 jpg="image/jpeg"這樣的,也有 png ="image/png" 這樣的,而我們自己添加的兩個(gè)文件類型,卻不知這個(gè)類型為什么要這么填。
這個(gè)還是得說(shuō)回 postman,fiddler 兩個(gè)工具,我們?cè)?postman 中組織演示時(shí),發(fā)送后,可以在 fiddler 中看到具體的數(shù)據(jù)形式,在 fiddler 中切換到 WebForms,如下圖。
在圖中,各文件的數(shù)據(jù)轉(zhuǎn)換為了兩個(gè)表格,將 Content-Type 的值,如圖中也就是 application/octet-stream、image/png 分別填入到對(duì)應(yīng)的文件類型后即可。參照如此處理,大抵不會(huì)錯(cuò)了。
九、文件下載
通過(guò) http 文件下載,原則上相對(duì)簡(jiǎn)單,但是由于服務(wù)器難找,平時(shí)的網(wǎng)站的文件又比較大,費(fèi)了不少時(shí)間,好在終于找到了一個(gè)自認(rèn)為比較好用的網(wǎng)站豆子外鏈:http://zuoye.free.fr/index.php,目前網(wǎng)站可用,可以用來(lái)進(jìn)行文件下載的測(cè)試。進(jìn)入網(wǎng)站,便會(huì)出現(xiàn)一個(gè)上傳文件界面,可以上傳一個(gè)自己的文件,然后使用 http 下載此文件進(jìn)行驗(yàn)證。當(dāng)然,也可以使用文件廣場(chǎng)內(nèi)已經(jīng)上傳的文件。
我們將文件外鏈地址復(fù)制下來(lái),然后修訂 testHttp.lua 文件。將其它的測(cè)試演示語(yǔ)句全部注釋掉,然后在文件 testHttp.lua 中添加一行代碼,然后按保存,并通過(guò) Luatools 下載到開(kāi)發(fā)板。
下面是運(yùn)行結(jié)果。
我們可以看到 true 200 的字樣,表示網(wǎng)站正確返回,然后我們看到了文件名稱是 flag.png 及文件大小是 785,文件類型是圖片,然后也顯示了文件內(nèi)容,即 body 部分,只是由于是圖片文件,這里不能顯示出來(lái),但我們可以查看一下我剛上傳的文件屬性比較一下文件大小是否相符,如下圖。當(dāng)然,二進(jìn)制數(shù)據(jù)不能顯示,但我們可以修改回調(diào)函數(shù)并使用 base64 編碼來(lái)顯示數(shù)據(jù),但此內(nèi)容不在本文演示范圍,不作擴(kuò)展顯示,有興趣的朋友可以自行試試。
十、HTTPS 加密通信
加密通信我們使用服務(wù)器"https://airtest.openluat.com 來(lái)進(jìn)行測(cè)試,使用 GET 方法,訪問(wèn)此服務(wù)器將會(huì)返回 hello 字樣。打開(kāi)鏈接 https://doc.openluat.com/share_article/KwExQpfcbL9Fs,是服務(wù)器的使用說(shuō)明與各功能接口的入口,如圖。
點(diǎn)擊 https Server 進(jìn)入相關(guān)說(shuō)明,如圖。
可以看到服務(wù)器的說(shuō)明及啟動(dòng)方式等內(nèi)容,最后有一個(gè) cert.rar 的壓縮文件,點(diǎn)擊下載,里面有三個(gè)證書(shū)文件,解壓保存,并將這三個(gè)文件加入到 Luatools 項(xiàng)目文件內(nèi),如圖所示。
完成上面操作后,接下來(lái)修訂文件 testHttp.lua,添加下面的內(nèi)容后按保存。然后轉(zhuǎn)到 Luatools 工具,點(diǎn)擊下載腳本。
等幾秒后,開(kāi)發(fā)板重啟運(yùn)行,結(jié)果如下。
十一、處理 JSON 數(shù)據(jù)
json 數(shù)據(jù)處理,主要就是兩個(gè)函數(shù),即 json.encode 與 json.decode。其實(shí) json.encode 我們?cè)?post 那一節(jié)中已經(jīng)有使用,因而我們本節(jié)不再就 encode 函數(shù)的講解進(jìn)行說(shuō)明,本節(jié)我們使用直接從網(wǎng)站讀取的 json 數(shù)據(jù),然后調(diào)用 json.decode 解碼。
本次我們?nèi)允褂?httpbin.org 網(wǎng)站來(lái)做這個(gè)事情,此網(wǎng)站有一個(gè)接口可以用于測(cè)試此功能,位于 Dynamic data 的 get 方法內(nèi),有一個(gè) GET/stream/{n}的接口,根據(jù){n}的數(shù)值,返回 n 組 json 數(shù)據(jù),如下圖是 n=4 的情形。
我們將 body 部分 COPY 出來(lái),列出如下:
上面字符串,直接使用 json.decode()解析不了,原因是里面包含多條 json 字符串,因而需要進(jìn)行分解,為此編寫了下面的代碼,以分離字符串。由上面的代碼,1 行的結(jié)尾與 2 行的開(kāi)始是字串”}{“,而且作為 json 文本,這樣的字串也只在兩個(gè) json 字串之間存在,因而我們使用這個(gè)作為子串查找,以準(zhǔn)確找出各個(gè) json 子串。同時(shí)我們將回調(diào)函數(shù)重新編寫一下,為了與原回調(diào)函數(shù)區(qū)別,本回調(diào)函數(shù)使用 cbFncJson 作為函數(shù)名。同時(shí)為了程序清晰,同時(shí)編寫了一個(gè) json 字串解析輸出函數(shù) json_out。代碼列出如下。注:下面的字符串處理函數(shù)僅適用于本文演示的具體數(shù)據(jù),如使用到其它場(chǎng)合,請(qǐng)依據(jù)格式與內(nèi)容進(jìn)行適當(dāng)修訂或補(bǔ)全。
完成上面的代碼編寫后,在 testHttp.lua 中再添加一行代碼,以使用 GET 方法將數(shù)據(jù)取回。
保存文件,并將文件下載到開(kāi)發(fā)板,我們來(lái)看看執(zhí)行結(jié)果。為了方便,我們將解析字串復(fù)制過(guò)來(lái),列出如下,刪除了一些多余的輸出,保留 json 的解析部分,以看得分明。
上面文本的輸出方式,首先輸出 json 字串,然后是 json 字串的解析,將各名稱對(duì)按一定的順序列出。
雖然上面的代碼是 json 的顯示,但其實(shí)綜合使用了 table,json,string 等多種數(shù)據(jù)類型的使用,因而這是一個(gè)綜合性比較強(qiáng)的一次演示,大家可以在此基礎(chǔ)上進(jìn)行更進(jìn)一步的測(cè)試演示,完成更復(fù)雜的內(nèi)容。
十二、gzip 操作
本操作使用下面的代碼進(jìn)行測(cè)試。因 724 尚沒(méi)有合用的解壓工具,因而也不作講解,只列出測(cè)試內(nèi)容與測(cè)試結(jié)果,也不作解壓還原操作。
十三、最終的測(cè)試文件
最終的 testHttp.lua 文件,此文件包含本文所有示例演示內(nèi)容,使用時(shí),將對(duì)應(yīng)的注釋去掉,不使用該功能時(shí),將注釋恢復(fù)即可。
十四、總結(jié)
本文力求從實(shí)際應(yīng)用出發(fā),對(duì) Http 協(xié)議的大部分方法進(jìn)行了演示測(cè)試,每一項(xiàng)操作都經(jīng)過(guò)本人實(shí)際操作。本文中,涉及一些服務(wù)器的選用,也是經(jīng)過(guò)多方的查找,各種比照之后,才決定選用的,具有一定的穩(wěn)定性,就是說(shuō)在一定的時(shí)間范圍內(nèi),相應(yīng)資源都可用。最后,希望本文對(duì)各位讀者有用,并能解決大家一些實(shí)際問(wèn)題。
十五、常見(jiàn)問(wèn)題
15.1 腳本下載后沒(méi)有反應(yīng)。
檢查有沒(méi)有下載底層核心,因?yàn)殚_(kāi)發(fā)板出廠時(shí),一般情況下是 AT 版本,此時(shí)如果不下載底層核心,lua 腳本就運(yùn)行不起來(lái)。
15.2 接上 USB 線后,不能下載,也不閃燈
檢查 USB 線是否連接正確,724 開(kāi)發(fā)板有兩個(gè) USB 口,旁邊有 USB 字樣的,才是下載用的 USB 通訊口,另一個(gè) USB 口是 USB 轉(zhuǎn) TTL 的 UART 通訊端口,此端口不提供電源支持,因而當(dāng)然不會(huì)有反應(yīng)。
15.3 不小心變磚了怎么辦?
在 Luatools 軟件中,點(diǎn)擊下載固件,選擇底層核心文件,使能 USB BOOT 下載,按住開(kāi)發(fā)板上的重啟按鈕,直到聽(tīng)到嘀的一聲后開(kāi)始下載,看到可松開(kāi)按鍵提示后,松開(kāi)按鍵。如下圖。
15.4 一直連接不上網(wǎng)
檢查天線是否連接完好,檢查所在位置信號(hào)是否良好,檢查 SIM 卡是否鎖死,檢查 SIM 卡是否欠費(fèi)等??墒褂米约旱氖謾C(jī)卡換上去進(jìn)行比較檢查。如果手機(jī)卡能上網(wǎng),則與硬件無(wú)關(guān),此時(shí)可檢查 SIM 的相關(guān)內(nèi)容。
分享完畢。
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9123瀏覽量
85322 -
HTTP
+關(guān)注
關(guān)注
0文章
504瀏覽量
31194 -
模組
+關(guān)注
關(guān)注
6文章
1487瀏覽量
30360 -
LuatOS
+關(guān)注
關(guān)注
0文章
76瀏覽量
1936
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論