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