詳解篇 | Air724UG低功耗模組LuatOS開發的HTTP手冊!

电子老师傅發表於2024-12-01

本次我們來學習的是低功耗4G模組Air724UG的LuatOS開發HTTP手冊,我將詳細解析分享給大家。

一、HTTP 概述

此部分內容只是簡單的對HTTP作一個介紹,更詳細的說明或協議文件,請查閱相關網站或文件。

1.1 HTTP 請求方法

HTTP/1.1 協議中共定義了八種方法來以不同方式操作指定的資源。

a.GET

向指定的資源發出請求。使用 GET 方法應該只用在讀取資料。

b.HEAD

與 GET 方法一樣,都是向伺服器發出指定資源的請求。只不過伺服器將不傳回資源的本文部分。

c.POST

向指定資源提交資料,請求伺服器進行處理,例如上傳檔案。

d.PUT

向指定資源位置上傳其最新內容。

e.DELETE

請求伺服器刪除 Request-URI 所標識的資源。

f.TRACE

回顯伺服器收到的請求,主要用於測試或診斷。

g.OPTIONS

這個方法可使伺服器傳回該資源所支援的所有 HTTP 請求方法。用’*'來代替資源名稱,向 Web 伺服器傳送 OPTIONS 請求,可以測試伺服器功能是否正常運作。

h.CONNECT

HTTP/1.1 協議中預留給能夠將連線改為管道方式的代理伺服器。通常用於 SSL 加密伺服器的連結。

HTTP 伺服器至少應該實現 GET 和 HEAD 方法,其他方法都是可選的。

1.2 HTTP 狀態碼

狀態程式碼的第一個數字代表當前響應的型別:

1xx 訊息——請求已被伺服器接收,繼續處理

2xx 成功——請求已成功被伺服器接收、理解、並接受

3xx 重定向——需要後續操作才能完成這一請求

4xx 請求錯誤——請求含有詞法錯誤或者無法被執行

5xx 伺服器錯誤——伺服器在處理某個正確請求時發生錯誤

RFC 2616 中已經推薦了描述狀態的短語,例如"200 OK",“404 Not Found”。

1.3 URL 連結地址

超文字傳輸協議(HTTP)的地址包含五個基本元素,分別是:

a.傳送協議, 層級 URL 標記符號(為[//],固定不變) 訪問資源需要的憑證資訊伺服器,一般情況下為域名,也可以使用 IP 地址。

b.埠號,以數字方式表示,HTTP 預設為”:80“,預設值可不給出。

c.路徑,字元“/”區別路徑中的每一個目錄名稱。

d.查詢,GET 模式的窗體引數,用“?”字元作為起點,每個引數用“&”隔開,再以“=”分開引數名稱與資料。

e.片段,以“#”字元為起點。

由於超文字傳輸協議允許伺服器將瀏覽器重定向到另一個網頁地址,因此許多伺服器允許使用者省略網頁地址中的部分內容,比如 www。

本文透過幾個具體的例子,演示 http 與 https 協議的具體實現。

二、功能演示概述

2.1 演示內容

本文透過作者自身的使用經歷與實踐,給大家演示 http 的常見操作與使用,包括:

a.get 方法的實現;

b.post 方法的實現;

c.檔案的上傳操作;

d.檔案的下載操作;

e.https 加密通訊;

f.處理 JSON 資料;

g.gzip 操作。

三、硬體環境準備

3.1 開發板準備

本文所涉及到的所有演示,都使用開發板 EVB_Air724UG_A14 完成

此核心板的詳細使用說明參考:
https://docs.openluat.com/air724ug/product/

此開發板的詳細使用說明參考:Air724UG 產品手冊 中的 《EVB_Air724UG_AXX開發板使用說明》,寫這篇文章時最新版本的使用說明為:《EVB_Air724UG_A14開發板使用說明》;開發板使用過程中遇到任何問題,可以直接參考這份使用說明文件。

中國大陸環境下,可以上網的 sim 卡,一般來說,使用移動,電信,聯通的物聯網路卡或者手機卡都行;

3.2 開發板的接線方式

首先將開發板放置好,接上 USB 並連線到電腦,同時,記得將天線也連線好,保證訊號環境比較良好,比如可以看看手機訊號來判斷一下所在環境的訊號狀況。USB 的連線如上圖所示。

在上圖中,連線 USB 的插口旁邊有一個 USB 字樣,在進行指令碼下載時,須連線此埠。旁邊另一個 USB 插口是 USB 轉 UART 的介面,可以透過序列口工具檢視除錯 TRACE 資訊。在本文的測試環境中,使用 USB 列印 trace,即在 Luatools工具中,將軟體上的"usb 列印 trace"選中即可,不必再另外連線序列口監視列印 trace 的相關資訊。

3.3 韌體操作相關內容

a.Luatools,是下載韌體與指令碼必不可少的工具,並且使用其檢視 TRACE 除錯資訊也非常方便。

https://docs.openluat.com/Luatools/

b.Luatools 工具的使用請參閱:

https://docs.openluat.com/blog/Luatools/

c.遠端韌體升級請參閱:

https://docs.openluat.com/blog/fota_lesson/

d.USB 驅動安裝請參閱:

https://docs.openluat.com/blog/usb_drv/

四、軟體環境準備

4.1 Lua 指令碼語言

本文以 Lua 指令碼語言為基礎,因而需要有 Lua 指令碼語言基礎,可以透過下列文件瞭解:

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 概述內的簡單說明,還有必要對 Lua 指令碼語言的 API 有一個瞭解。http 的 API 介面定義如下面的程式碼。我之所以貼出下面這段定義程式碼,三個方面的原因。

a.首先當然是註釋說明中有較明晰的 http 協議結構的定義;

b.其次對引數的解釋說明比演示文件 testHttp.lua 檔案內容更全面,更有利於讀者對各個引數形式有一個瞭解。比如,傳遞證書就有了較明晰的表示式形式,這樣也方便大家組織引數時,能做到心裡有數;

c.最後是給出了不少呼叫示例,而這些示例在 testHttp.lua 文件內沒有或者不全面,而此處的示例能起到一個很好的補充。

關於 http 介面的具體說明,讀者還可以查詢其它相關資料或參考其它檔案檔。

4.3 輔助工具

為了有效的分析開發過程中可能遇到的問題,並能檢視資料,準備一些輔助工具很有必要,將大大縮短大家解決問題的時間。本文編寫過程中,使用了幾款工具介紹給大家,本文在後面將使用用或提到這些工具,請大家先了解。

a.Progress Telerik Fiddler Classic,抓包工具。

https://downloads.getfiddler.com/fiddler-classic/FiddlerSetup.5.0.20244.10953-latest.exe

b.Postman,API 除錯平臺工具,可以方便的驗證本文所提到的各種操作。

https://dl.pstmn.io/download/latest/win64

c.httpbin.org,一個很不錯的 API 除錯網站,本文有關 http 的不少內容的演示,即使用本網站完成。

五、Luatools 的基本使用

5.1 準備演示程式碼

本文使用 air724 模組的演示程式碼 testHttp 作為藍本,在此基礎上進行修訂刪改,來完成本文第二章中所提到的內容。該演示藍本有兩個檔案,分別為 main.lua、testHttp.lua 兩個檔案。大家如果瞭解可以跳過,如果不熟悉又不想去費勁下載資源,可以直接複製使用。testHttp.lua 隨著本文的測試進行,會有所修訂,本文最後會給出完整的包含所有修訂的檔案。

5.2 使用 Luatools 工具

按照本文的第三章第 2 節所描述的方式連線好開發板後,確認無誤後,我們就可以啟動 Luatools 工具,如下圖所示。點選介面中“專案管理與測試”按鈕,出現下圖所示的視窗,點選“建立專案”,並輸入專案名稱,如本文建立的專案名稱為 http_doc。

專案建立完成後,點新增指令碼或資原始檔,按上節所說將藍本 main.lua 與 testHttp.lua 新增上去,如圖所示。

將"usb 列印 trace”使能,“新增預設 lib”選中。

完成上面的操作後,還要選擇底層 CORE。因為合宙模組有各種資源,不同的底層 CORE 支援的內容不同,這些底層核心一般安裝在工具所在目錄的 ressoure 子目錄下。開啟此目錄,會有不同的選擇,如圖。因為 724ug 模組屬於 8910 平臺,所以我們要選擇 8910 的某一個核心,本文所說都是指對指令碼語言 Lua 進行開發,因而我們選擇 8910_lua_lod 即可。點選進入,有多個核心,我們選擇最基本的 LuatOS-Air_V4028_RDA8910.pac 即可,如果大家手上使用的核心進行了升級,會有一些區別,譬如版本號變化等,請留意即可。

如果電腦上沒有上述韌體,也可以透過下載的網址下載。

韌體版本和上層指令碼:https://docs.openluat.com/air724ug/luatos/firmware/

六、GET 請求演示

6.1 演示網站 httpbin.org

為了使本文的演示可直接使用並能得到結果,而不是隨便給個示範文字,有必要找一個可以進行測試的網站,本文使用上面工具準備裡提到過的 httpbin.org 給出的 API 來進行測試。

首先開啟 httpbin.org 網站,並找到 Dynamic data 這一欄,然後點開下拉選單,如圖示。

找到 Dynamic data 這一欄,開啟,如下圖所示。

在上面看到第一項是 GET 方法,url 是/base64/{value},表示使用 GET 方法可以從此連線(url)得到經過 base64 編碼的內容,也即將 value 還原為實際內容,即解碼。我們來完成這個工作。

6.2 用 GET 方法實現 base64 解碼 API

我們可以使用 crypto.base64_encode 函式來對字元完成 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 將指令碼下載到開發板中,看看結果如何。

特別注意
如果是第一次下載,要選擇下載底層與指令碼,因為你到手的開發板,裡面到底是什麼核心還不清楚,如果核心不對,也就執行不起來,這一點切記。在完成了底層下載後,如果指令碼再有修訂,就不需要再下載底層了,只下載指令碼即可。

下載完成後,會自動啟動,並在 Luatools工具中顯示 trace 資訊。直接看結果吧,如圖所示。

在上圖中,可以看到結果 true 200,表示正確完成,http 狀態碼是 200。

同時返回瞭解碼的字串”用合宙 724ug 模組完成 http 的 GET 方法“。

至此,GET 的演示工作順利完成。

6.3 完整程式碼的約定

為方便大家取用,本文最後將列出完整的 testHttp.lua 程式碼。本文所作的全部修訂,都將保留在 testHttp.lua 檔案中,使用註釋符如“--[[”與“]]”的來進行選取使用或不使用。

七、POST 請求演示

7.1 物聯網路卡資訊 API 介面

對 get 的演練,感覺還是挺容易的,一路下來也沒有什麼障礙。不過 GET 我們使用的還不是真正的應用場合,因為伺服器仍然還只是一個演示。我們在 POST 就使用一個真實的應用資料,算是一個真實的專案應用。

我們要演示,就得有伺服器可以讓我們來實操,上面說了,我們要完成一個真實的專案。使用 724ug 模組,就得有上網路卡,物聯網路卡是最優的選擇。這裡有一個物聯網路卡服務商提供的物聯網 SIM 卡資訊的 API 介面,這個網站是

http://sim.taoyuan-tech.com。這是一個真實的網站,而且給客戶提供一個測試賬號,那麼我們就使用這個測試賬號來進行 POST 方法的操作,以讀取 SIM 卡的日誌

這裡測試賬號的使用者名稱:18168967871,密碼:18168967871。登入進去後,是下圖中所示的樣子。

在上圖所示介面中,點選獲取”APIkey 各 Secret“字樣的按鈕,可得到測試使用者的 API key 與 API Secret,注意儲存這兩個資料備用。點選”API 文件“字樣的按鈕,可進入詳細的介面 API 說明文件頁面,如圖。

看文件目錄,約定等前面幾項內容是要關注的,好在簡短,切一張圖也就可以完全看到,列出於下圖。

我們在上圖中看到幾項注意事項。

a.所有請求引數,使用 json 形式傳送。這表示只接收 json 形式的資料與內容;

b.需要返回狀態碼 200 才正確;

c.約定了所使用的單位,這樣可以方便的計算時間與費用;

d.對認證進行了說明,這很重要,要仔細閱讀並理解 。認證方式為 HTTP Basic Authorization,認證資訊的形式是 appkey:appsecret。就是前面提到要注意儲存的那兩個資料;

e.對可能的錯誤碼進行了說明;

f.給出了主機地址為 http://api.taoyuan-tech.com/api/open。

所有這些約定及注意事項都很重要,不要忽略,可能後面我們都會要用到。

這個 API 有好幾個介面,我們就選第一個來實現即可。就是下面圖中所列出的日誌查詢。圖中表格所給出的欄位,是我們需要提供的訪問引數及返回結果。

7.2 使用 postman 工具驗證

為了方便,我們可以先使用 postman 組織包內容,然後再移植到 testHttp.lua 檔案內進行測試。檢視“物聯網路卡指定日期用量日誌查詢 ”API 的說明,我們知道此介面的訪問的 url 為“/iotcard/usagelog”,所以完整的訪問路徑為 http://api.taoyuan-tech.com/api/open/iotcard/usagelog,將此路徑填入到 postman 中,選擇 POST 方法,選擇頭部資訊 Auth Type 型別為 Basic Auth。這些內容都是 API 文件約定與注意事項所確定的內容。然後點選 Auth,將前文提到過的 Apikey 與 Apisecret 分別填入到使用者名稱與密碼輸入框內。如下圖所示。

接著再點選 Body,輸入以下內容:

其中欄位的含義在前圖所示的表格中都有說明,請大家注意查閱。而 89860403102080512138 為 SIM 卡號的 iccids 號,此 SIM 卡可在測試使用者賬號中的卡片資訊中查到。如果卡片資訊沒有此號碼,可以查閱卡片資訊以獲取使用者資料庫中真實存在的卡片 iccids 號。從圖中的說明中我們還知道,傳入的引數可以是其它的三種識別號碼之一,如 imei 號。在四個 SIM 卡的關聯識別號中四選一,本文我們選擇 iccids,想測試其它引數形式的,可以自行更改修訂。比如修訂為 imsis,則輸入內容就變為:

如下圖所示。

輸入完成,點選 Send 傳送。即返回如下圖所示的響應。

依據前圖所示的表格內容可知,2024-10-10 這一天所消耗的流量為 0M,即"data_usage":0。同時,檢視狀態碼為 200,結果 OK。這些完成後,我們就可以根據組包的相關資訊,對 testHttp.lua 進行修訂。

7.3 修訂檔案內容

開啟 testHttp.lua 檔案,我們在 77 行與 84 行之間,發現了一段程式碼,使用了 POST 方法,可以在此基礎上進行修訂,如下圖。首先將註釋去掉,再檢視具體內容,我們發現有幾點存在疑問。

a.從上文可知,API 使用的是 Auth Basic 的方式,而且上面組包時,使用的是 Apikey 與 Apisecret 兩個內容,這個與演示程式碼的 ["Authorization]"="Basic jffdsfdsfdsfdsfjakljfdoiuweonlkdsjdsjapodaskdsf",好像相符,但又好像不相符,這裡怎麼去得到這個串呢;

b.前文提到,使用的 Content-type 是 application/json,與程式碼中所使用的方式有所不同,因而此處需要修訂;

c.同時請求引數的內容肯定也需要修訂,只是如何組織這個引數呢。從 table 型別的各種組織方式看,也沒有 name:value 這樣的形式。

有問題就好,一個個解決也就好了。首先我們從第一個問題開始,這就要用到本文開頭所給出抓包工具了,我們看看實際的資料是什麼樣子,不就知道了嗎?直接上圖,如下面圖中所示,可以看到實際的資料包都有哪些內容,當然,此抓包工具也可以檢視 BODY,auth 等各項資料,可以切換各頁面看看都有哪些資料項,以加深理解。

在上圖中,我們看到了一行文字內容:Authorization: Basic NkZhbXFsRmZTVmQ4OHNHejpLemt0SW8y ......這個正是我們所要的內容,因而將此項複製,填入代替。

第二個問題簡單,直接修訂為['Content-Type']="application/json"即可。

第三個問題,需要呼叫 json 的一個函式來解決,就是下面這個函式,即 json 編碼。

其它的,['Connection']="keep-alive"要不要加上,看示例程式碼中有些加了,有些沒有加。Http 是短連線,但又希望環境能得到儲存,使下次再次發起 http 請求時,能快速得到反應,因而才有了這個['Connection']="keep-alive"的配置項,但在 Http 1.1 之後,這個就是預設的值,因而可以加上,也可以不加上,效果一樣。

經過上面的修訂後,程式碼成為了下面這樣子。

好了,現在我們將指令碼下載到開發板中,看看是什麼結果。

不出意外,如上圖中所示,可以看到返回的狀態碼是 200,結果為 true,程式碼執行正確無誤,同時,可以看到伺服器返回的資料,與從 postman 得到的資料一致。

到這裡,POST 的演示算是完成了,另外要補充說明的是,其實頭部結構裡的 Auth Basic 有另一種取得方式,可以直接呼叫 crypto 模組內的 base64 函式來完成。如下程式碼所示。

具體要如何使用,看實際情況,因為有些網站的 API 提供的直接就是 BASE64 碼,此時用第一種顯然省事。本文最後完整原始碼使用生成方式。

八、檔案上傳操作

8.1 準備工作

對於檔案上傳,我們仍使用 GET 方法時所使用的測試伺服器,即 httpbin.org,因為我們使用”post"方法上傳檔案,所以 url 為 httpbin.org/post。需要說明一點的是,httpbin.org/post 是一個迴環伺服器,即當向其傳輸檔案時,伺服器會將傳輸內容作為響應返回,因而當我們看到響應並返回的內容後,就可以判斷操作是否正確。其實我有考慮使用更直接的方式,但幾天下來找不到合用的伺服器來進行操作,只好以此作為本文的上傳檔案演示了。

還是前面的方法,我們先使用 Postman 工具來組織資料包。

a.啟動 Postman 並將方法選擇為 POST;

b.在主機欄內輸入“httpbin.org/post”;

c.然後選擇 body,選擇 binary;

d.選擇檔案,本處為 test.txt,內容為“uses post method to upload a file.”;如果沒有此檔案,新建一個即可;

e.點選傳送;

f.稍後返回資料。

所有操作及資料如下圖所示。

在圖中可以清楚地看到 200 OK 字樣,表示操作正確。同時,我們在圖中 6 號箭頭所指的文字中,可以發現一些有用的字串,分別是:

同時,我們也發現了:

"files":{}

"form":{}

為空,這個我們可以比對後面的多檔案多引數上傳時的內容來進行理解。

8.2 檔案修訂

如前面的方法,我們來修訂 testHttp.lua 檔案的內容。

在 testHttp.lua 的 56 行開始,有一處註釋掉了的程式碼,可以為我們所用。如下圖。

首先,去掉註釋括號,將 url 替換成“httpbin.org/post”;

其次,將['Content-Type']的值替換成前面所說的內容,即"text/plain";

最後,將{[1]={['file']="/RecDir/rec001"}}修訂為{[1]={['file']="/luar/test.txt"}}並按儲存。

修訂後的文字如列出如下。

8.3 韌體下載及執行結果

啟動 Luatools 韌體下載工具,並點選專案管理測試按鈕,將檔案 main.lua,testHttp.lua 分別新增進去,同時將檔案 test.txt 也新增上去,如下圖所示。需要注意,大家建立專案的位置不同,圖中的檔案路徑與專案路徑可能有些不同,與自己的實際內容相符即可。

在圖中點下載指令碼,然後切換到 Luatools 的 trace 頁面,等待指令碼程式碼執行結果。

由圖中內容可見,指令碼復現了 Postman 演示的內容,上文中我們所關注的內容也都從圖中得到印證,見圖中紅框中的內容,可以與 postman 的內容進行比較。

到這裡檔案上傳可以順利完成。可能有人要問了,檔案是上傳了,可是我需要傳二進位制檔案怎麼辦,或者我要傳圖片怎麼處理。其實也很簡單,我們還是用 postman 來進行組包測試,如下圖。

圖中我們將 test.txt 去掉,使用 test.bin 取代,將指令碼的內容型別即 Content-Type 修訂為"application/octet-stream"即可,其它不變,其中 application/octet-stream 就表示資料內容是二進位制流。點選 SEND 後,可看到返回資訊。修訂後的內容如下所示。

使用 Luatools 下載後等待執行結果如圖所示。與 postman 的相關結果亦相符。當然,這裡要特別提示幾點。

a.檔案請注意大小,太大的檔案可能會導致記憶體不足,因而太大的檔案需要經過其它處理才可以。

b.相關資原始檔請一併加到專案中,與指令碼一起下載到模組中。

c.對於二進位制檔案,對內容進行了 base64 編碼,因而檔案上傳後,真正使用時,需要進行解碼。

8.4 檔案上傳進階篇

也許有些用途一方面要上傳檔案,一方面又要傳引數,此時又要如何處理呢。我們檢視 testHttp.lua 檔案,有一段程式碼如下,也就是檔案最後面約從 90 行開始的部分。我們可以利用此段程式碼進行比較複雜的檔案上傳操作,比如傳多個檔案,多個引數。下面這段程式碼即是 testHttp.lua 檔案中相應的程式碼段去掉註釋後的樣子。

在上面的程式碼中,傳了兩個引數,即 imei 卡號與時間,傳了一個檔案,即"logo_color.jpg"。我們需要修訂為我們所用。首先我們將 url 修訂為“httpbin.org/post”,同時我們將上傳檔案修訂為 “/lua/text.txt”。除此外,我們還有一個地方要修訂,即新增一個檔案型別,即 txt = "text/plain"。表示這是一個文字檔案,大抵如果是一個 BIN 檔案,需要新增一個 BIN="application/octet-stream"吧,依此類推。

依上面修訂後,testHttp.lua 成為下面這個樣子。這是進階篇完整的程式碼,大家可以直接複製取用,為了節省篇章,此程式碼為傳輸兩個檔案,兩個引數的例子,不再一一講解一個檔案,一個引數等其它搭配組合情況,請知悉。

將上面程式碼修訂後,與 main.lua,text.txt,text.bin 一起新增的專案檔案內,如圖所示。沒有文字檔案可以新建,二進位制檔案可以在電腦上找一個較小的,比如我就找了一個微控制器的二進位制韌體 test.bin。檔案不要過大,容易導致記憶體問題,這也是我們實際要考慮的問題,即在實際應用中,檔案的處理還是要小心對待。

下載完成,我們檢視執行結果,如圖。

我們在上圖中找到了 true 200 表示正確返回,然後我們找到了第一個檔案 test.bin 的相關資料,因為視窗大小原因,沒有顯示第二個檔案的內容,我們可以翻看到第二個檔案的內容,如圖。

我們在圖中找到了第二個檔案的資訊,文字文字並沒有進行 base64 加密處理。同時,兩個引數的內容也可以找到。

下面說說檔案型別怎麼定義的問題,因為我們看到檔案型別的定義有點懵。如下面的程式碼中,有 jpg="image/jpeg"這樣的,也有 png ="image/png" 這樣的,而我們自己新增的兩個檔案型別,卻不知這個型別為什麼要這麼填。

這個還是得說回 postman,fiddler 兩個工具,我們在 postman 中組織演示時,傳送後,可以在 fiddler 中看到具體的資料形式,在 fiddler 中切換到 WebForms,如下圖。

在圖中,各檔案的資料轉換為了兩個表格,將 Content-Type 的值,如圖中也就是 application/octet-stream、image/png 分別填入到對應的檔案型別後即可。參照如此處理,大抵不會錯了。

九、檔案下載

透過 http 檔案下載,原則上相對簡單,但是由於伺服器難找,平時的網站的檔案又比較大,費了不少時間,好在終於找到了一個自認為比較好用的網站豆子外鏈:http://zuoye.free.fr/index.php,目前網站可用,可以用來進行檔案下載的測試。進入網站,便會出現一個上傳檔案介面,可以上傳一個自己的檔案,然後使用 http 下載此檔案進行驗證。當然,也可以使用檔案廣場內已經上傳的檔案。

我們將檔案外鏈地址複製下來,然後修訂 testHttp.lua 檔案。將其它的測試演示語句全部註釋掉,然後在檔案 testHttp.lua 中新增一行程式碼,然後按儲存,並透過 Luatools 下載到開發板。

下面是執行結果。

我們可以看到 true 200 的字樣,表示網站正確返回,然後我們看到了檔名稱是 flag.png 及檔案大小是 785,檔案型別是圖片,然後也顯示了檔案內容,即 body 部分,只是由於是圖片檔案,這裡不能顯示出來,但我們可以檢視一下我剛上傳的檔案屬性比較一下檔案大小是否相符,如下圖。當然,二進位制資料不能顯示,但我們可以修改回撥函式並使用 base64 編碼來顯示資料,但此內容不在本文演示範圍,不作擴充套件顯示,有興趣的朋友可以自行試試。

十、HTTPS 加密通訊

加密通訊我們使用伺服器"https://airtest.openluat.com 來進行測試,使用 GET 方法,訪問此伺服器將會返回 hello 字樣。開啟連結 https://doc.openluat.com/share_article/KwExQpfcbL9Fs,是伺服器的使用說明與各功能介面的入口,如圖。

點選 https Server 進入相關說明,如圖。

可以看到伺服器的說明及啟動方式等內容,最後有一個 cert.rar 的壓縮檔案,點選下載,裡面有三個證書檔案,解壓儲存,並將這三個檔案加入到 Luatools 專案檔案內,如圖所示。

完成上面操作後,接下來修訂檔案 testHttp.lua,新增下面的內容後按儲存。然後轉到 Luatools 工具,點選下載指令碼。

等幾秒後,開發板重啟執行,結果如下。

十一、處理 JSON 資料

json 資料處理,主要就是兩個函式,即 json.encode 與 json.decode。其實 json.encode 我們在 post 那一節中已經有使用,因而我們本節不再就 encode 函式的講解進行說明,本節我們使用直接從網站讀取的 json 資料,然後呼叫 json.decode 解碼。

本次我們仍使用 httpbin.org 網站來做這個事情,此網站有一個介面可以用於測試此功能,位於 Dynamic data 的 get 方法內,有一個 GET/stream/{n}的介面,根據{n}的數值,返回 n 組 json 資料,如下圖是 n=4 的情形。

我們將 body 部分 COPY 出來,列出如下:

上面字串,直接使用 json.decode()解析不了,原因是裡面包含多條 json 字串,因而需要進行分解,為此編寫了下面的程式碼,以分離字串。由上面的程式碼,1 行的結尾與 2 行的開始是字串”}{“,而且作為 json 文字,這樣的字串也只在兩個 json 字串之間存在,因而我們使用這個作為子串查詢,以準確找出各個 json 子串。同時我們將回撥函式重新編寫一下,為了與原回撥函式區別,本回撥函式使用 cbFncJson 作為函式名。同時為了程式清晰,同時編寫了一個 json 字串解析輸出函式 json_out。程式碼列出如下。注:下面的字串處理函式僅適用於本文演示的具體資料,如使用到其它場合,請依據格式與內容進行適當修訂或補全。

完成上面的程式碼編寫後,在 testHttp.lua 中再新增一行程式碼,以使用 GET 方法將資料取回。

儲存檔案,並將檔案下載到開發板,我們來看看執行結果。為了方便,我們將解析字串複製過來,列出如下,刪除了一些多餘的輸出,保留 json 的解析部分,以看得分明。

上面文字的輸出方式,首先輸出 json 字串,然後是 json 字串的解析,將各名稱對按一定的順序列出。

雖然上面的程式碼是 json 的顯示,但其實綜合使用了 table,json,string 等多種資料型別的使用,因而這是一個綜合性比較強的一次演示,大家可以在此基礎上進行更進一步的測試演示,完成更復雜的內容。

十二、gzip 操作

本操作使用下面的程式碼進行測試。因 724 尚沒有合用的解壓工具,因而也不作講解,只列出測試內容與測試結果,也不作解壓還原操作。

十三、最終的測試檔案

最終的 testHttp.lua 檔案,此檔案包含本文所有示例演示內容,使用時,將對應的註釋去掉,不使用該功能時,將註釋恢復即可。

十四、總結

本文力求從實際應用出發,對 Http 協議的大部分方法進行了演示測試,每一項操作都經過本人實際操作。本文中,涉及一些伺服器的選用,也是經過多方的查詢,各種比照之後,才決定選用的,具有一定的穩定性,就是說在一定的時間範圍內,相應資源都可用。最後,希望本文對各位讀者有用,並能解決大家一些實際問題。

十五、常見問題

15.1 指令碼下載後沒有反應。

檢查有沒有下載底層核心,因為開發板出廠時,一般情況下是 AT 版本,此時如果不下載底層核心,lua 指令碼就執行不起來。

15.2 接上 USB 線後,不能下載,也不閃燈

檢查 USB 線是否連線正確,724 開發板有兩個 USB 口,旁邊有 USB 字樣的,才是下載用的 USB 通訊口,另一個 USB 口是 USB 轉 TTL 的 UART 通訊埠,此埠不提供電源支援,因而當然不會有反應。

15.3 不小心變磚了怎麼辦?

在 Luatools 軟體中,點選下載韌體,選擇底層核心檔案,使能 USB BOOT 下載,按住開發板上的重啟按鈕,直到聽到嘀的一聲後開始下載,看到可鬆開按鍵提示後,鬆開按鍵。如下圖。

15.4 一直連線不上網

檢查天線是否連線完好,檢查所在位置訊號是否良好,檢查 SIM 卡是否鎖死,檢查 SIM 卡是否欠費等。可使用自己的手機卡換上去進行比較檢查。如果手機卡能上網,則與硬體無關,此時可檢查 SIM 的相關內容。

分享完畢

相關文章